【问题标题】:What does this inline assembly within an LLVM-IR CodeGen testcase mean?LLVM-IR CodeGen 测试用例中的这个内联程序集是什么意思?
【发布时间】: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


    【解决方案1】:

    我猜这是因为输入操作数 $1 与输出操作数 $0 相同,并且必须在寄存器中。它也被指定为一个常数零。编译器为$0 选择了%eax,因此也选择了$1,并通过xorl %eax, %eax 预先将其归零。

    生成的代码是无效的,我假设它不是用来组装的,大概测试引擎只是检查输出的组装是否是预期的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      相关资源
      最近更新 更多