【发布时间】:2015-09-30 23:13:31
【问题描述】:
我正在尝试了解 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 来自哪里?这个生成的线是什么意思/做什么?
【问题讨论】:
标签: assembly llvm inline-assembly llvm-ir