Я работаю над исследовательским проектом, в котором я используюllvm для создания некоторой сборки для пользовательского isa. Я пока загружаю свою сборку в симулятор. Часть моего isa позволяет использовать 64-битные немедленные значения в кодировке инструкций, я использую модифицированную версию цели sparcv9 с datalayout: Em: e-i64: 64-n64: 64-S128. По какой-то причине, когда я пытаюсь сделать для этого инструкцию, я получаю только младшие 32 бита значения. Когда я ожидаю получить «enter rd, 4629559679448514560», я вместо этого получаю «enter, rd, 0», потому что все младшие 32 бита в этом длинном значении равны 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 недели.