LLVM IR 中的 "move" 操作码是什么?

What is a "move" opcode in LLVM IR?

我是 LLVM IR 的新手,我正在尝试在 LLVM IR 中模拟一些 x86 指令。

这是一个简单的案例:

move %eax, %ebx

然而,在here and here查看资料后,我没有找到任何对应的mov操作码。

所以我的问题是:

  1. 如果我想使用 LLVM IR 模拟 mov 操作码?我该怎么办?

  2. 我是 LLVM IR 的新手,可能我会花很长时间在这个 "simulation" 工作上,关于 LLVM IR 最好的参考应该是什么?

如果有人能给我一些帮助,我将不胜感激。谢谢!

没有与mov 指令等效的指令。 LLVM IR在SSA (Static Single Assignment) form中,也就是说每个寄存器恰好被赋值一次。有无限数量的(虚拟)寄存器——每个操作根据需要创建一个新的。

不清楚你所说的模拟 x86 指令是什么意思,但如果它适合你,你可以在堆栈上为每个寄存器的局部变量分配内存(使用 alloca 指令),并使用 loadstore 指令在它们之间复制值。

如果你需要将一个 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