2015-09-30 1 views
1

J'essaie de comprendre un testcase LLVM CodeGen/Generic afin que je puisse le faire passer pour un backend pour un nouveau processeur.Que signifie cet assemblage en ligne dans un test LLVM-IR CodeGen?

C'est le cas de test (LLVM/test/CodeGen/Générique/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 
} 

Je me demande spécifiquement sur cette partie:

%A = call i32 asm sideeffect "inline asm $0 $2 $3 $4", "=r,0,i,m,m"(i32 0, i32 1, i8** %foo, i32** %bar) 

Qu'est-ce que exactement asm en ligne devrait accomplir?

Quand je le lance à travers llc comme indiqué dans le commentaire, je vois cela sur la sortie (pour 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 

Il semble avoir pour résultat la ligne suivante dans le code asm de sortie :

inline asm %eax $1 -24(%rsp) -32(%rsp) 

... mais je ne suis pas tout à fait sûr comment cela a été généré à partir de l'entrée. D'où vient le% eax, par exemple? Que signifie cette ligne générée?

Répondre

1

Je devine que c'est parce que l'opérande d'entrée $1 est au même endroit que l'opérande de sortie $0, et doit être dans un registre. Il est également spécifié comme un zéro constant. Le compilateur a choisi %eax pour $0 et donc $1 aussi, et l'a mis à zéro au préalable par le xorl %eax, %eax.

Le code généré est invalide, je suppose qu'il n'est pas destiné à être assemblé, il est probable que le moteur de test vérifie simplement si l'ensemble de sortie est celui attendu.