mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 05:26:06 +00:00

Syntax: asm [volatile] goto ( AssemblerTemplate : : InputOperands : Clobbers : GotoLabels) https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html New llvm IR is "callbr" for inline asm goto instead "call" for inline asm For: asm goto("testl %0, %0; jne %l1;" :: "r"(cond)::label_true, loop); IR: callbr void asm sideeffect "testl $0, $0; jne ${1:l};", "r,X,X,~{dirflag},~{fpsr},~{flags}"(i32 %0, i8* blockaddress(@foo, %label_true), i8* blockaddress(@foo, %loop)) #1 to label %asm.fallthrough [label %label_true, label %loop], !srcloc !3 asm.fallthrough: Compiler need to generate: 1> a dummy constarint 'X' for each label. 2> an unique fallthrough label for each asm goto stmt " asm.fallthrough%number". Diagnostic 1> duplicate asm operand name are used in output, input and label. 2> goto out of scope. llvm-svn: 362045
19 lines
413 B
C
19 lines
413 B
C
// Header for the PCH test asm.c
|
|
|
|
void f() {
|
|
int i,cond;
|
|
|
|
asm ("foo\n" : : "a" (i + 2));
|
|
asm ("foo\n" : [symbolic_name] "=a" (i) : "[symbolic_name]" (i));
|
|
asm volatile goto("testl %0, %0; jne %l1;" :: "r"(cond)::label_true, loop);
|
|
label_true:
|
|
loop:
|
|
return;
|
|
}
|
|
|
|
void clobbers() {
|
|
asm ("nop" : : : "ax", "#ax", "%ax");
|
|
asm ("nop" : : : "eax", "rax", "ah", "al");
|
|
asm ("nop" : : : "0", "%0", "#0");
|
|
}
|