[英]What does this inline assembly within an LLVM-IR CodeGen testcase mean?
我试图了解LLVM CodeGen / Generic测试用例,以便可以将其传递给新处理器的后端。
这是测试用例(llvm / test / CodeGen / Generic / 2007-04-08-MultipleFrameIndices.ll):
; RUN: llc -no-integrated-as < %s
; XFAIL: sparc-sun-solaris2
; PR1308
; PR1557
define i32 @stuff(i32, ...) {
%foo = alloca i8*
%bar = alloca i32*
%A = call i32 asm sideeffect "inline asm $0 $2 $3 $4", "=r,0,i,m,m"( i32 0, i32 1, i8** %foo, i32** %bar )
ret i32 %A
}
我特别想知道这部分:
%A = call i32 asm sideeffect "inline asm $0 $2 $3 $4", "=r,0,i,m,m"( i32 0, i32 1, i8** %foo, i32** %bar )
该内联汇编程序应完成什么工作?
当我按照注释中的指示通过llc运行它时,我在输出中看到了这一点(对于x86_64):
.text
.file "<stdin>"
.globl stuff
.align 16, 0x90
.type stuff,@function
stuff: # @stuff
.cfi_startproc
# BB#0:
leaq -8(%rsp), %rax
movq %rax, -24(%rsp)
leaq -16(%rsp), %rax
movq %rax, -32(%rsp)
xorl %eax, %eax
#APP
inline asm %eax $1 -24(%rsp) -32(%rsp)
#NO_APP
retq
.Ltmp0:
.size stuff, .Ltmp0-stuff
.cfi_endproc
.section ".note.GNU-stack","",@progbits
似乎在输出的asm代码中产生了以下行:
inline asm %eax $1 -24(%rsp) -32(%rsp)
...但是我不完全确定输入是如何产生的。 例如,%eax来自何处? 这条生成的线是什么意思?
我猜想是因为输入操作数$1
与输出操作数$0
在同一位置,并且必须在寄存器中。 它也被指定为常数零。 编译器为$0
选择了%eax
,因此也选择了$1
,并预先通过xorl %eax, %eax
将其xorl %eax, %eax
。
生成的代码无效,我认为它不是要组装的,大概是测试引擎只是检查输出组装是否是预期的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.