64-битная версия сразу после генерации целевого кода llvm - PullRequest
0 голосов
/ 04 августа 2020

Я работаю над исследовательским проектом, в котором я использую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 недели.

1 Ответ

0 голосов
/ 04 августа 2020

Вероятно, проблема в другом, и вам нужно проверить, как непосредственно печатается в файл сборки? Шаги для проверки:

  1. Проверить, как создается SDAG
  2. Проверить, как выбирается инструкция и что такое неизменяемый в MI
  3. Проверить MI => M C опускание
  4. Проверить печать сборки.

PS: PatLeaf здесь не нужен. Использование только imm:$imm должно работать, проверять нечего.

...