From 954ec09aed4f2be04bb5f4e10dbb4ea8bd19ef9a Mon Sep 17 00:00:00 2001 From: Jennifer Yu Date: Thu, 30 May 2019 01:05:46 +0000 Subject: clang support gnu asm goto. 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 --- clang/test/CodeGen/asm.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'clang/test/CodeGen/asm.c') diff --git a/clang/test/CodeGen/asm.c b/clang/test/CodeGen/asm.c index 038d346e999..7de79639bfd 100644 --- a/clang/test/CodeGen/asm.c +++ b/clang/test/CodeGen/asm.c @@ -262,3 +262,15 @@ void t31(int len) { // CHECK: @t31 // CHECK: call void asm sideeffect "", "=*%rm,=*rm,0,1,~{dirflag},~{fpsr},~{flags}" } + +// CHECK: @t32 +int t32(int cond) +{ + asm goto("testl %0, %0; jne %l1;" :: "r"(cond)::label_true, loop); + // CHECK: callbr void asm sideeffect "testl $0, $0; jne ${1:l};", "r,X,X,~{dirflag},~{fpsr},~{flags}"(i32 %0, i8* blockaddress(@t32, %label_true), i8* blockaddress(@t32, %loop)) #1 + return 0; +loop: + return 0; +label_true: + return 1; +} -- cgit v1.2.3