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 周了。

可能问题出在其他地方,您需要检查如何将立即数打印到汇编文件中?检查步骤:

  1. 检查 SDAG 是如何创建的
  2. 检查指令是如何选择的以及 MI 中的 imm 是什么
  3. 检查MI=>MC降低
  4. 检查组件打印。

PS:这里不需要 PatLeaf。只使用 imm:$imm 应该可以,没有什么可检查的。