xref: /llvm-project/clang/test/Parser/asm-goto.c (revision 54186d33c3a0d4834d2e5f95640b63677f5b5142)
1b8fee677SJennifer Yu // RUN: %clang_cc1 -triple i386-pc-linux-gnu -fsyntax-only -verify %s
2b8fee677SJennifer Yu // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -verify %s
3b8fee677SJennifer Yu 
4b8fee677SJennifer Yu #if !__has_extension(gnu_asm)
5b8fee677SJennifer Yu #error Extension 'gnu_asm' should be available by default
6b8fee677SJennifer Yu #endif
750cac248SBill Wendling #if !__has_extension(gnu_asm_goto_with_outputs)
850cac248SBill Wendling #error Extension 'gnu_asm_goto_with_outputs' should be available by default
950cac248SBill Wendling #endif
10*54186d33SNick Desaulniers #if !__has_extension(gnu_asm_goto_with_outputs_full)
11*54186d33SNick Desaulniers #error Extension 'gnu_asm_goto_with_outputs_full' should be available by default
12*54186d33SNick Desaulniers #endif
13b8fee677SJennifer Yu 
14b8fee677SJennifer Yu int a, b, c, d, e, f, g, h, i, j, k, l;
15b8fee677SJennifer Yu 
test(void)1650cac248SBill Wendling void test(void) {
17b8fee677SJennifer Yu   __asm__ volatile goto (""
18b8fee677SJennifer Yu             :: [a] "r" (a), [b] "r" (b), [c] "r" (c), [d] "r" (d),
19b8fee677SJennifer Yu                [e] "r" (e), [f] "r" (f), [g] "r" (g), [h] "r" (h),
20b8fee677SJennifer Yu                [i] "r" (i), [j] "r" (j), [k] "r" (k), [l] "r" (l)
21b8fee677SJennifer Yu             ::lab1,lab2);
22b8fee677SJennifer Yu lab1: return;
23b8fee677SJennifer Yu lab2: return;
24b8fee677SJennifer Yu }
25b8fee677SJennifer Yu 
test2(void)2650cac248SBill Wendling void test2(void) {
27b8fee677SJennifer Yu   __asm__ volatile goto (""
28b8fee677SJennifer Yu             :: [a] "r,m" (a), [b] "r,m" (b), [c] "r,m" (c), [d] "r,m" (d),
29b8fee677SJennifer Yu                [e] "r,m" (e), [f] "r,m" (f), [g] "r,m" (g), [h] "r,m" (h),
30b8fee677SJennifer Yu                [i] "r,m" (i), [j] "r,m" (j), [k] "r,m" (k), [l] "r,m" (l)
31b8fee677SJennifer Yu             :: lab);
32b8fee677SJennifer Yu   lab: return;
33b8fee677SJennifer Yu }
34b8fee677SJennifer Yu 
test3(int x)3550cac248SBill Wendling int test3(int x) {
3650cac248SBill Wendling   __asm__ volatile goto ("decl %0; jnz %l[a]"
3750cac248SBill Wendling                          : "=r" (x) : "m" (x) : "memory" : a);
3850cac248SBill Wendling a:
3950cac248SBill Wendling   return -x;
4050cac248SBill Wendling }
4150cac248SBill Wendling 
test4(int x)4250cac248SBill Wendling int test4(int x) {
4350cac248SBill Wendling   int y;
4450cac248SBill Wendling   if (x > 42)
4550cac248SBill Wendling     __asm__ volatile goto ("decl %0; jnz %l[a]"
4650cac248SBill Wendling                            : "=r" (x), "=r" (y) : "m" (x) : "memory" : a);
4750cac248SBill Wendling   else
4850cac248SBill Wendling     __asm__ volatile goto ("decl %0; jnz %l[b]"
4950cac248SBill Wendling                            : "=r" (x), "=r" (y) : "m" (x) : "memory" : b);
5050cac248SBill Wendling   x = y + 42;
5150cac248SBill Wendling a:
5250cac248SBill Wendling   return -x;
5350cac248SBill Wendling b:
5450cac248SBill Wendling   return +x;
5550cac248SBill Wendling }
5650cac248SBill Wendling 
test5(void)5750cac248SBill Wendling int test5(void) {
58b8fee677SJennifer Yu   int x,cond,*e;
59b8fee677SJennifer Yu   // expected-error@+1 {{expected ')'}}
60b8fee677SJennifer Yu   asm ("mov %[e], %[e]" : : [e] "rm" (*e)::a)
6150cac248SBill Wendling   // expected-error@+1 {{expected identifier}}
62b8fee677SJennifer Yu   asm goto ("decl %0;" :: "m"(x) : "memory" : );
63b8fee677SJennifer Yu   // expected-error@+1 {{expected ':'}}
64b8fee677SJennifer Yu   asm goto ("decl %0;" :: "m"(x) : "memory" );
65b8fee677SJennifer Yu   // expected-error@+1 {{use of undeclared label 'x'}}
66b8fee677SJennifer Yu   asm goto ("decl %0;" :: "m"(x) : "memory" :x);
67b8fee677SJennifer Yu   // expected-error@+1 {{use of undeclared label 'b'}}
68b8fee677SJennifer Yu   asm goto ("decl %0;" :: "m"(x) : "memory" :b);
69b8fee677SJennifer Yu   // expected-error@+1 {{invalid operand number in inline asm string}}
70b8fee677SJennifer Yu   asm goto ("testl %0, %0; jne %l3;" :: "r"(cond)::label_true, loop);
71b8fee677SJennifer Yu   // expected-error@+1 {{unknown symbolic operand name in inline assembly string}}
72b8fee677SJennifer Yu   asm goto ("decl %0; jnz %l[b]" :: "m"(x) : "memory" : a);
73b8fee677SJennifer Yu a:
74b8fee677SJennifer Yu label_true:
75b8fee677SJennifer Yu loop:
76b8fee677SJennifer Yu   return 0;
77b8fee677SJennifer Yu }
7850cac248SBill Wendling 
test6(int y)7950cac248SBill Wendling int test6(int y) {
8050cac248SBill Wendling   int x,cond,*e;
8150cac248SBill Wendling   // expected-error@+1 {{expected ')'}}
8250cac248SBill Wendling   asm ("mov %[e], %[e]" : "=r" (y) : [e] "rm" (*e), "r" (y) :: a)
8350cac248SBill Wendling   // expected-error@+1 {{expected identifier}}
8450cac248SBill Wendling   asm goto ("decl %0;" : "=r" (y) : "m" (x), "r" (y) : "memory" :);
8550cac248SBill Wendling   // expected-error@+1  {{expected ':'}}
8650cac248SBill Wendling   asm goto ("decl %0;" : "=r" (y) : "m" (x), "r" (y) : "memory");
8750cac248SBill Wendling   // expected-error@+1 {{use of undeclared label 'x'}}
8850cac248SBill Wendling   asm goto ("decl %0;" : "=r" (y) : "m" (x), "r" (y) : "memory" : x);
8950cac248SBill Wendling   // expected-error@+1 {{use of undeclared label 'b'}}
9050cac248SBill Wendling   asm goto ("decl %0;" : "=r" (y) : "m" (x), "r" (y) : "memory" : b);
9150cac248SBill Wendling   // expected-error@+1 {{invalid operand number in inline asm string}}
9250cac248SBill Wendling   asm goto ("testl %0, %0; jne %l5;" : "=r" (y) : "r" (cond), "r" (y) :: label_true, loop);
9350cac248SBill Wendling   // expected-error@+1 {{unknown symbolic operand name in inline assembly string}}
9450cac248SBill Wendling   asm goto ("decl %0; jnz %l[b]" : "=r" (y) : "m" (x), "r" (y) : "memory" : a);
9550cac248SBill Wendling label_true:
9650cac248SBill Wendling loop:
9750cac248SBill Wendling a:
9850cac248SBill Wendling   return 0;
9950cac248SBill Wendling }
100