aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/s390/nobp-table-jump-inline-z10.c
blob: 8dfd7e4c7861356ee83a448b9c78a145a2460cb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* { dg-do run } */
/* { dg-options "-O3 -march=z10 -mzarch --save-temps -mindirect-branch-jump=thunk-inline -mindirect-branch-table" } */

/* case-values-threshold will be set to 20 by the back-end when jump
   thunk are requested.  */

int __attribute__((noinline,noclone)) foo1 (void) { return 1; }
int __attribute__((noinline,noclone)) foo2 (void) { return 2; }
int __attribute__((noinline,noclone)) foo3 (void) { return 3; }
int __attribute__((noinline,noclone)) foo4 (void) { return 4; }
int __attribute__((noinline,noclone)) foo5 (void) { return 5; }
int __attribute__((noinline,noclone)) foo6 (void) { return 6; }
int __attribute__((noinline,noclone)) foo7 (void) { return 7; }
int __attribute__((noinline,noclone)) foo8 (void) { return 8; }
int __attribute__((noinline,noclone)) foo9 (void) { return 9; }
int __attribute__((noinline,noclone)) foo10 (void) { return 10; }
int __attribute__((noinline,noclone)) foo11 (void) { return 11; }
int __attribute__((noinline,noclone)) foo12 (void) { return 12; }
int __attribute__((noinline,noclone)) foo13 (void) { return 13; }
int __attribute__((noinline,noclone)) foo14 (void) { return 14; }
int __attribute__((noinline,noclone)) foo15 (void) { return 15; }
int __attribute__((noinline,noclone)) foo16 (void) { return 16; }
int __attribute__((noinline,noclone)) foo17 (void) { return 17; }
int __attribute__((noinline,noclone)) foo18 (void) { return 18; }
int __attribute__((noinline,noclone)) foo19 (void) { return 19; }
int __attribute__((noinline,noclone)) foo20 (void) { return 20; }


int __attribute__((noinline,noclone))
bar (int a)
{
  int ret = 0;

  switch (a)
    {
    case 1: ret = foo1 (); break;
    case 2: ret = foo2 (); break;
    case 3: ret = foo3 (); break;
    case 4: ret = foo4 (); break;
    case 5: ret = foo5 (); break;
    case 6: ret = foo6 (); break;
    case 7: ret = foo7 (); break;
    case 8: ret = foo8 (); break;
    case 9: ret = foo9 (); break;
    case 10: ret = foo10 (); break;
    case 11: ret = foo11 (); break;
    case 12: ret = foo12 (); break;
    case 13: ret = foo13 (); break;
    case 14: ret = foo14 (); break;
    case 15: ret = foo15 (); break;
    case 16: ret = foo16 (); break;
    case 17: ret = foo17 (); break;
    case 18: ret = foo18 (); break;
    case 19: ret = foo19 (); break;
    case 20: ret = foo20 (); break;
    default:
      __builtin_abort ();
    }

  return ret;
}

int
main ()
{
  if (bar (3) != 3)
    __builtin_abort ();

  return 0;
}

/* 1 x bar
/* { dg-final { scan-assembler-times "exrl" 1 } } */

/* { dg-final { scan-assembler     "section\t.s390_indirect_jump" } } */
/* { dg-final { scan-assembler-not "section\t.s390_indirect_call" } } */
/* { dg-final { scan-assembler-not "section\t.s390_return_fromreg" } } */
/* { dg-final { scan-assembler-not "section\t.s390_return_frommem" } } */