1 /* { dg-do compile } */
2 /* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep " } */
3 /* { dg-additional-options "-fno-pic" { target { ! *-*-darwin* } } } */
4 
5 void func0 (void);
6 void func1 (void);
7 void func2 (void);
8 void func3 (void);
9 void func4 (void);
10 void func4 (void);
11 void func5 (void);
12 
13 __attribute__ ((indirect_branch("thunk-extern")))
14 void
bar(int i)15 bar (int i)
16 {
17   switch (i)
18     {
19     default:
20       func0 ();
21       break;
22     case 1:
23       func1 ();
24       break;
25     case 2:
26       func2 ();
27       break;
28     case 3:
29       func3 ();
30       break;
31     case 4:
32       func4 ();
33       break;
34     case 5:
35       func5 ();
36       break;
37     }
38 }
39 
40 /* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target *-*-linux* } } } */
41 /* { dg-final { scan-assembler {leaq[ \t]*L[0-9]+\(%rip\)} { target { lp64 && *-*-darwin* } } } } */
42 /* { dg-final { scan-assembler {addl[ \t]*L[0-9]+-L[0-9]+\$pb} { target { ia32 && *-*-darwin* } } } } */
43 /* { dg-final { scan-assembler "jmp\[ \t\]*_?__x86_indirect_thunk(_nt|)_(r|e)ax" } } */
44 /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
45 /* { dg-final { scan-assembler-not {jmp[ \t]*\.?LIND} } } */
46 /* { dg-final { scan-assembler-not {call[ \t]*\.?LIND} } } */
47