xref: /llvm-project/llvm/test/CodeGen/PowerPC/aix-lower-jump-table.ll (revision e3cf80c5c1fe55efd8216575ccadea0ab087e79c)
1; RUN: llc -mtriple powerpc-ibm-aix-xcoff -ppc-min-jump-table-entries=4 -code-model=small < %s | FileCheck \
2; RUN: --check-prefixes=32SMALL-ASM,SMALL-ASM %s
3
4; RUN: llc -mtriple powerpc-ibm-aix-xcoff -ppc-min-jump-table-entries=4 -code-model=large < %s | FileCheck \
5; RUN: --check-prefixes=32LARGE-ASM,LARGE-ASM %s
6
7; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -ppc-min-jump-table-entries=4 -code-model=small < %s | FileCheck \
8; RUN: --check-prefixes=64SMALL-ASM,SMALL-ASM %s
9
10; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -ppc-min-jump-table-entries=4 -code-model=large < %s | FileCheck \
11; RUN: --check-prefixes=64LARGE-ASM,LARGE-ASM %s
12
13; RUN: llc -mtriple powerpc-ibm-aix-xcoff -ppc-min-jump-table-entries=4 -function-sections < %s | FileCheck \
14; RUN: --check-prefix=FUNC-ASM %s
15
16; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -ppc-min-jump-table-entries=4 -function-sections < %s | FileCheck \
17; RUN: --check-prefix=FUNC-ASM %s
18
19define i32 @jump_table(i32 %a) {
20entry:
21  switch i32 %a, label %sw.epilog [
22    i32 1, label %sw.bb
23    i32 2, label %sw.bb1
24    i32 3, label %sw.bb2
25    i32 4, label %sw.bb3
26  ]
27
28sw.bb:
29  tail call void asm sideeffect "", ""()
30  br label %sw.epilog
31
32sw.bb1:
33  tail call void asm sideeffect "", ""()
34  br label %sw.epilog
35
36sw.bb2:
37  tail call void asm sideeffect "", ""()
38  br label %sw.epilog
39
40sw.bb3:
41  tail call void asm sideeffect "", ""()
42  br label %sw.epilog
43
44sw.epilog:
45  ret i32 0
46}
47; 32SMALL-ASM-LABEL: jump_table
48; 32SMALL-ASM: .jump_table:
49; 32SMALL-ASM:      addi 3, 3, -1
50; 32SMALL-ASM: 	    cmplwi 3, 3
51; 32SMALL-ASM: 	    bgt	0, L..BB0_3
52; 32SMALL-ASM: 	    lwz 4, L..C0(2)
53; 32SMALL-ASM: 	    slwi 3, 3, 2
54; 32SMALL-ASM: 	    lwzx 3, 3, 4
55; 32SMALL-ASM: 	    add 3, 3, 4
56; 32SMALL-ASM: 	    mtctr 3
57; 32SMALL-ASM: 	    bctr
58; 32SMALL-ASM: L..BB0_2:
59; 32SMALL-ASM: L..BB0_3:
60; 32SMALL-ASM: L..BB0_4:
61; 32SMALL-ASM: L..BB0_5:
62; 32SMALL-ASM: L..BB0_6:
63; 32SMALL-ASM: 	    li 3, 0
64; 32SMALL-ASM: 	    blr
65; 32SMALL-ASM: 	    .csect .rodata[RO],2
66; 32SMALL-ASM: 	    .align  2
67; 32SMALL-ASM: L..JTI0_0:
68; 32SMALL-ASM: 	    .vbyte	4, L..BB0_2-L..JTI0_0
69; 32SMALL-ASM: 	    .vbyte	4, L..BB0_6-L..JTI0_0
70; 32SMALL-ASM: 	    .vbyte	4, L..BB0_4-L..JTI0_0
71; 32SMALL-ASM: 	    .vbyte	4, L..BB0_5-L..JTI0_0
72
73; 32LARGE-ASM-LABEL: jump_table
74; 32LARGE-ASM: .jump_table:
75; 32LARGE-ASM:      addi 3, 3, -1
76; 32LARGE-ASM:      cmplwi  3, 3
77; 32LARGE-ASM:      bgt     0, L..BB0_3
78; 32LARGE-ASM: 	    addis 4, L..C0@u(2)
79; 32LARGE-ASM: 	    slwi 3, 3, 2
80; 32LARGE-ASM:      lwz 4, L..C0@l(4)
81; 32LARGE-ASM:      lwzx 3, 3, 4
82; 32LARGE-ASM:      add 3, 3, 4
83; 32LARGE-ASM:      mtctr 3
84; 32LARGE-ASM:      bctr
85; 32LARGE-ASM: L..BB0_2:
86; 32LARGE-ASM: L..BB0_3:
87; 32LARGE-ASM: L..BB0_4:
88; 32LARGE-ASM: L..BB0_5:
89; 32LARGE-ASM: L..BB0_6:
90; 32LARGE-ASM:      li 3, 0
91; 32LARGE-ASM:      blr
92; 32LARGE-ASM:      .csect .rodata[RO],2
93; 32LARGE-ASM:      .align  2
94; 32LARGE-ASM: L..JTI0_0:
95; 32LARGE-ASM:      .vbyte	4, L..BB0_2-L..JTI0_0
96; 32LARGE-ASM:      .vbyte	4, L..BB0_6-L..JTI0_0
97; 32LARGE-ASM:      .vbyte	4, L..BB0_4-L..JTI0_0
98; 32LARGE-ASM:      .vbyte	4, L..BB0_5-L..JTI0_0
99
100; 64SMALL-ASM-LABEL: jump_table
101; 64SMALL-ASM: .jump_table:
102; 64SMALL-ASM:      addi 3, 3, -1
103; 64SMALL-ASM:      cmplwi  3, 3
104; 64SMALL-ASM:      bgt     0, L..BB0_3
105; 64SMALL-ASM:      ld 4, L..C0(2)
106; 64SMALL-ASM:      rldic 3, 3, 2, 30
107; 64SMALL-ASM:      lwax 3, 3, 4
108; 64SMALL-ASM:      add 3, 3, 4
109; 64SMALL-ASM:      mtctr 3
110; 64SMALL-ASM:      bctr
111; 64SMALL-ASM: L..BB0_2:
112; 64SMALL-ASM: L..BB0_3:
113; 64SMALL-ASM: L..BB0_4:
114; 64SMALL-ASM: L..BB0_5:
115; 64SMALL-ASM: L..BB0_6:
116; 64SMALL-ASM:      li 3, 0
117; 64SMALL-ASM:      blr
118; 64SMALL-ASM:      .csect .rodata[RO],2
119; 64SMALL-ASM:      .align  2
120; 64SMALL-ASM: L..JTI0_0:
121; 64SMALL-ASM:      .vbyte	4, L..BB0_2-L..JTI0_0
122; 64SMALL-ASM:      .vbyte	4, L..BB0_6-L..JTI0_0
123; 64SMALL-ASM:      .vbyte	4, L..BB0_4-L..JTI0_0
124; 64SMALL-ASM:      .vbyte	4, L..BB0_5-L..JTI0_0
125
126; 64LARGE-ASM-LABEL: jump_table
127; 64LARGE-ASM: .jump_table:
128; 64LARGE-ASM:      addi 3, 3, -1
129; 64LARGE-ASM:      cmplwi  3, 3
130; 64LARGE-ASM:      bgt     0, L..BB0_3
131; 64LARGE-ASM:      addis 4, L..C0@u(2)
132; 64LARGE-ASM:      rldic 3, 3, 2, 30
133; 64LARGE-ASM:      ld 4, L..C0@l(4)
134; 64LARGE-ASM:      lwax 3, 3, 4
135; 64LARGE-ASM:      add 3, 3, 4
136; 64LARGE-ASM:      mtctr 3
137; 64LARGE-ASM:      bctr
138; 64LARGE-ASM: L..BB0_2:
139; 64LARGE-ASM: L..BB0_3:
140; 64LARGE-ASM: L..BB0_4:
141; 64LARGE-ASM: L..BB0_5:
142; 64LARGE-ASM: L..BB0_6:
143; 64LARGE-ASM:      li 3, 0
144; 64LARGE-ASM:      blr
145; 64LARGE-ASM:      .csect .rodata[RO],2
146; 64LARGE-ASM:      .align  2
147; 64LARGE-ASM: L..JTI0_0:
148; 64LARGE-ASM:      .vbyte	4, L..BB0_2-L..JTI0_0
149; 64LARGE-ASM:      .vbyte	4, L..BB0_6-L..JTI0_0
150; 64LARGE-ASM:      .vbyte	4, L..BB0_4-L..JTI0_0
151; 64LARGE-ASM:      .vbyte	4, L..BB0_5-L..JTI0_0
152
153; FUNC-ASM:         .csect .jump_table[PR],5
154; FUNC-ASM: L..BB0_2:
155; FUNC-ASM: L..BB0_3:
156; FUNC-ASM: L..BB0_4:
157; FUNC-ASM: L..BB0_5:
158; FUNC-ASM: L..BB0_6:
159; FUNC-ASM:         li 3, 0
160; FUNC-ASM:         blr
161; FUNC-ASM:         .csect .rodata.jmp..jump_table[RO],2
162; FUNC-ASM:         .align  2
163; FUNC-ASM: L..JTI0_0:
164; FUNC-ASM:         .vbyte  4, L..BB0_2-L..JTI0_0
165; FUNC-ASM:         .vbyte  4, L..BB0_6-L..JTI0_0
166; FUNC-ASM:         .vbyte  4, L..BB0_4-L..JTI0_0
167; FUNC-ASM:         .vbyte  4, L..BB0_5-L..JTI0_0
168
169; SMALL-ASM: .toc
170; SMALL-ASM: .tc L..JTI0_0[TC],L..JTI0_0
171
172; LARGE-ASM: .toc
173; LARGE-ASM: .tc L..JTI0_0[TE],L..JTI0_0
174