繁体   English   中英

LLVM-IR CodeGen测试用例中的此内联汇编是什么意思?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM