llvm 目标代码生成中的 64 位立即数
64 bit immediates in llvm target code generation
我正在进行一个研究项目,我正在使用 llvm 为自定义 isa 生成一些程序集。我暂时将我的程序集输入模拟器。我的 isa 的一部分允许在指令编码中使用 64 位立即值,我正在使用带有数据布局的 sparcv9 目标的修改版本:E-m:e-i64:64-n64:64-S128。
出于某种原因,当我尝试为此制定指令时,我只获得了该值的低 32 位。
当我期望得到“enter rd, 4629559679448514560”时,我却得到了“enter, rd, 0”,因为低 32 位在这个 long 中都是 0。
def ENTER64 : SDNodeXForm<imm, [{
printf("enter64: N: %lu\n", N->getZExtValue());
uint64_t Val = N->getZExtValue();
SDValue temp = CurDAG->getTargetConstant(Val, SDLoc(N),
MVT::i64);
return temp;
}]>;
def ENTERimm : PatLeaf<(imm), [{
printf("enterimm: N: %lu\n", N->getZExtValue()); // debug
return true; // was isInt<64>(N->getSEztValue());
}], ENTER64>;
def ENTER: Instruction<
(outs I64Regs:$rd), (ins i64imm:$imm),
"enter $rd, $imm",
[(set i64:$rd, ENTERimm:$imm)],
IIC_iu_instr>;
这里有人用过 64 位立即数和 llvm 并使它工作吗?我已经坚持了将近 2 周了。
可能问题出在其他地方,您需要检查如何将立即数打印到汇编文件中?检查步骤:
- 检查 SDAG 是如何创建的
- 检查指令是如何选择的以及 MI 中的 imm 是什么
- 检查MI=>MC降低
- 检查组件打印。
PS:这里不需要 PatLeaf。只使用 imm:$imm
应该可以,没有什么可检查的。
我正在进行一个研究项目,我正在使用 llvm 为自定义 isa 生成一些程序集。我暂时将我的程序集输入模拟器。我的 isa 的一部分允许在指令编码中使用 64 位立即值,我正在使用带有数据布局的 sparcv9 目标的修改版本:E-m:e-i64:64-n64:64-S128。 出于某种原因,当我尝试为此制定指令时,我只获得了该值的低 32 位。 当我期望得到“enter rd, 4629559679448514560”时,我却得到了“enter, rd, 0”,因为低 32 位在这个 long 中都是 0。
def ENTER64 : SDNodeXForm<imm, [{
printf("enter64: N: %lu\n", N->getZExtValue());
uint64_t Val = N->getZExtValue();
SDValue temp = CurDAG->getTargetConstant(Val, SDLoc(N),
MVT::i64);
return temp;
}]>;
def ENTERimm : PatLeaf<(imm), [{
printf("enterimm: N: %lu\n", N->getZExtValue()); // debug
return true; // was isInt<64>(N->getSEztValue());
}], ENTER64>;
def ENTER: Instruction<
(outs I64Regs:$rd), (ins i64imm:$imm),
"enter $rd, $imm",
[(set i64:$rd, ENTERimm:$imm)],
IIC_iu_instr>;
这里有人用过 64 位立即数和 llvm 并使它工作吗?我已经坚持了将近 2 周了。
可能问题出在其他地方,您需要检查如何将立即数打印到汇编文件中?检查步骤:
- 检查 SDAG 是如何创建的
- 检查指令是如何选择的以及 MI 中的 imm 是什么
- 检查MI=>MC降低
- 检查组件打印。
PS:这里不需要 PatLeaf。只使用 imm:$imm
应该可以,没有什么可检查的。