Что такое код операции "move" в LLVM IR?

Я новичок в LLVM IRи я пытаюсь смоделировать некоторые инструкции x86 в LLVM IR,

Вот простой случай:

move %eax, %ebx

Однако я не нашел соответствующего mov Опкод после просмотра материалов здесь и здесь.

Итак, мой вопрос:

  1. Если я хочу смоделировать mov код операции с использованием LLVM IR? Что я должен делать?

  2. Я новичок в LLVM IRи, возможно, я бы потратил много времени на эту "симуляционную" работу, что должно быть лучшим справочником по LLVM IR?

Я очень ценю, если кто-нибудь может мне помочь. Спасибо!

2 ответа

Решение

Там нет эквивалента mov инструкция. IR LLVM имеет форму SSA (статическое одиночное назначение), что означает, что каждому регистру присваивается значение только один раз. Существует неограниченное количество (виртуальных) регистров - каждая операция создает новый по мере необходимости.

Непонятно, что вы подразумеваете под симуляцией инструкций x86, но если вам это подходит, вы можете выделить память в стеке для локальной переменной для каждого регистра (используя alloca инструкция), и используйте load а также store инструкции для копирования значений между ними.

Если вам нужно переместить значение одного регистра LLVM IR в другой, вы можете использовать bitcast инструкция:

      ; %a contains 64bit integer value
%a = i64 ...

; Copy / move the value of %a into %b
%b = bitcast i64 %a to i64

Подробнее см. Https://llvm.org/docs/LangRef.html#bitcast-to-instruction.

Другие вопросы по тегам