LLVM IR 中的 "move" 操作码是什么?
What is a "move" opcode in LLVM IR?
我是 LLVM IR
的新手,我正在尝试在 LLVM IR
中模拟一些 x86 指令。
这是一个简单的案例:
move %eax, %ebx
然而,在here and here查看资料后,我没有找到任何对应的mov
操作码。
所以我的问题是:
如果我想使用 LLVM IR 模拟 mov
操作码?我该怎么办?
我是 LLVM IR
的新手,可能我会花很长时间在这个 "simulation" 工作上,关于 LLVM IR 最好的参考应该是什么?
如果有人能给我一些帮助,我将不胜感激。谢谢!
没有与mov
指令等效的指令。 LLVM IR在SSA (Static Single Assignment) form中,也就是说每个寄存器恰好被赋值一次。有无限数量的(虚拟)寄存器——每个操作根据需要创建一个新的。
不清楚你所说的模拟 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
我是 LLVM IR
的新手,我正在尝试在 LLVM IR
中模拟一些 x86 指令。
这是一个简单的案例:
move %eax, %ebx
然而,在here and here查看资料后,我没有找到任何对应的mov
操作码。
所以我的问题是:
如果我想使用 LLVM IR 模拟
mov
操作码?我该怎么办?我是
LLVM IR
的新手,可能我会花很长时间在这个 "simulation" 工作上,关于 LLVM IR 最好的参考应该是什么?
如果有人能给我一些帮助,我将不胜感激。谢谢!
没有与mov
指令等效的指令。 LLVM IR在SSA (Static Single Assignment) form中,也就是说每个寄存器恰好被赋值一次。有无限数量的(虚拟)寄存器——每个操作根据需要创建一个新的。
不清楚你所说的模拟 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