[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / ARM / GlobalISel / thumb-select-arithmetic-ops.mir
blobf760af5e0c78cb33f8b5dc855ad4b7f934595fbf
1 # RUN: llc -O0 -mtriple thumb-- -mattr=+v6t2,+hwdiv -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
2 --- |
3   define void @test_add_regs() { ret void }
4   define void @test_add_fold_imm() { ret void }
5   define void @test_add_fold_imm12() { ret void }
6   define void @test_add_no_fold_imm() { ret void }
8   define void @test_sub_imm_lhs() { ret void }
9   define void @test_sub_imm_rhs() { ret void }
11   define void @test_mul() { ret void }
12   define void @test_mla() { ret void }
14   define void @test_sdiv() { ret void }
15   define void @test_udiv() { ret void }
16 ...
17 ---
18 name:            test_add_regs
19 # CHECK-LABEL: name: test_add_regs
20 legalized:       true
21 regBankSelected: true
22 selected:        false
23 # CHECK: selected: true
24 registers:
25   - { id: 0, class: gprb }
26   - { id: 1, class: gprb }
27   - { id: 2, class: gprb }
28 body:             |
29   bb.0:
30     liveins: $r0, $r1
32     %0(s32) = COPY $r0
33     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
35     %1(s32) = COPY $r1
36     ; CHECK: [[VREGY:%[0-9]+]]:rgpr = COPY $r1
38     %2(s32) = G_ADD %0, %1
39     ; CHECK: [[VREGRES:%[0-9]+]]:gprnopc = t2ADDrr [[VREGX]], [[VREGY]], 14, $noreg, $noreg
41     $r0 = COPY %2(s32)
42     ; CHECK: $r0 = COPY [[VREGRES]]
44     BX_RET 14, $noreg, implicit $r0
45     ; CHECK: BX_RET 14, $noreg, implicit $r0
46 ...
47 ---
48 name:            test_add_fold_imm
49 # CHECK-LABEL: name: test_add_fold_imm
50 legalized:       true
51 regBankSelected: true
52 selected:        false
53 # CHECK: selected: true
54 registers:
55   - { id: 0, class: gprb }
56   - { id: 1, class: gprb }
57   - { id: 2, class: gprb }
58 body:             |
59   bb.0:
60     liveins: $r0
62     %0(s32) = COPY $r0
63     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
65     %1(s32) = G_CONSTANT i32 786444 ; 0x000c000c
66     %2(s32) = G_ADD %0, %1
67     ; CHECK: [[VREGRES:%[0-9]+]]:gprnopc = t2ADDri [[VREGX]], 786444, 14, $noreg, $noreg
69     $r0 = COPY %2(s32)
70     ; CHECK: $r0 = COPY [[VREGRES]]
72     BX_RET 14, $noreg, implicit $r0
73     ; CHECK: BX_RET 14, $noreg, implicit $r0
74 ...
75 ---
76 name:            test_add_fold_imm12
77 # CHECK-LABEL: name: test_add_fold_imm12
78 legalized:       true
79 regBankSelected: true
80 selected:        false
81 # CHECK: selected: true
82 registers:
83   - { id: 0, class: gprb }
84   - { id: 1, class: gprb }
85   - { id: 2, class: gprb }
86 body:             |
87   bb.0:
88     liveins: $r0
90     %0(s32) = COPY $r0
91     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
93     %1(s32) = G_CONSTANT i32 4093
94     %2(s32) = G_ADD %0, %1
95     ; CHECK: [[VREGRES:%[0-9]+]]:gprnopc = t2ADDri12 [[VREGX]], 4093, 14, $noreg
97     $r0 = COPY %2(s32)
98     ; CHECK: $r0 = COPY [[VREGRES]]
100     BX_RET 14, $noreg, implicit $r0
101     ; CHECK: BX_RET 14, $noreg, implicit $r0
104 name:            test_add_no_fold_imm
105 # CHECK-LABEL: name: test_add_no_fold_imm
106 legalized:       true
107 regBankSelected: true
108 selected:        false
109 # CHECK: selected: true
110 registers:
111   - { id: 0, class: gprb }
112   - { id: 1, class: gprb }
113   - { id: 2, class: gprb }
114 body:             |
115   bb.0:
116     liveins: $r0
118     %0(s32) = COPY $r0
119     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
121     %1(s32) = G_CONSTANT i32 185470479 ; 0x0b0e0e0f
122     ; CHECK: [[VREGY:%[0-9]+]]:rgpr = t2MOVi32imm 185470479
124     %2(s32) = G_ADD %0, %1
125     ; CHECK: [[VREGRES:%[0-9]+]]:gprnopc = t2ADDrr [[VREGX]], [[VREGY]], 14, $noreg, $noreg
127     $r0 = COPY %2(s32)
128     ; CHECK: $r0 = COPY [[VREGRES]]
130     BX_RET 14, $noreg, implicit $r0
131     ; CHECK: BX_RET 14, $noreg, implicit $r0
134 name:            test_sub_imm_lhs
135 # CHECK-LABEL: name: test_sub_imm_lhs
136 legalized:       true
137 regBankSelected: true
138 selected:        false
139 # CHECK: selected: true
140 registers:
141   - { id: 0, class: gprb }
142   - { id: 1, class: gprb }
143   - { id: 2, class: gprb }
144 body:             |
145   bb.0:
146     liveins: $r0
148     %0(s32) = COPY $r0
149     ; CHECK: [[VREGX:%[0-9]+]]:rgpr = COPY $r0
151     %1(s32) = G_CONSTANT i32 786444 ; 0x000c000c
152     %2(s32) = G_SUB %1, %0
153     ; CHECK: [[VREGRES:%[0-9]+]]:rgpr = t2RSBri [[VREGX]], 786444, 14, $noreg, $noreg
155     $r0 = COPY %2(s32)
156     ; CHECK: $r0 = COPY [[VREGRES]]
158     BX_RET 14, $noreg, implicit $r0
159     ; CHECK: BX_RET 14, $noreg, implicit $r0
162 name:            test_sub_imm_rhs
163 # CHECK-LABEL: name: test_sub_imm_rhs
164 legalized:       true
165 regBankSelected: true
166 selected:        false
167 # CHECK: selected: true
168 registers:
169   - { id: 0, class: gprb }
170   - { id: 1, class: gprb }
171   - { id: 2, class: gprb }
172 body:             |
173   bb.0:
174     liveins: $r0
176     %0(s32) = COPY $r0
177     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
179     %1(s32) = G_CONSTANT i32 786444 ; 0x000c000c
180     %2(s32) = G_SUB %0, %1
181     ; CHECK: [[VREGRES:%[0-9]+]]:gprnopc = t2SUBri [[VREGX]], 786444, 14, $noreg, $noreg
183     $r0 = COPY %2(s32)
184     ; CHECK: $r0 = COPY [[VREGRES]]
186     BX_RET 14, $noreg, implicit $r0
187     ; CHECK: BX_RET 14, $noreg, implicit $r0
190 name:            test_mul
191 # CHECK-LABEL: name: test_mul
192 legalized:       true
193 regBankSelected: true
194 selected:        false
195 # CHECK: selected: true
196 registers:
197   - { id: 0, class: gprb }
198   - { id: 1, class: gprb }
199   - { id: 2, class: gprb }
200 body:             |
201   bb.0:
202     liveins: $r0, $r1
204     %0(s32) = COPY $r0
205     ; CHECK: [[VREGX:%[0-9]+]]:rgpr = COPY $r0
207     %1(s32) = COPY $r1
208     ; CHECK: [[VREGY:%[0-9]+]]:rgpr = COPY $r1
210     %2(s32) = G_MUL %0, %1
211     ; CHECK: [[VREGRES:%[0-9]+]]:rgpr = t2MUL [[VREGX]], [[VREGY]], 14, $noreg
213     $r0 = COPY %2(s32)
214     ; CHECK: $r0 = COPY [[VREGRES]]
216     BX_RET 14, $noreg, implicit $r0
217     ; CHECK: BX_RET 14, $noreg, implicit $r0
220 name:            test_mla
221 # CHECK-LABEL: name: test_mla
222 legalized:       true
223 regBankSelected: true
224 selected:        false
225 # CHECK: selected: true
226 registers:
227   - { id: 0, class: gprb }
228   - { id: 1, class: gprb }
229   - { id: 2, class: gprb }
230   - { id: 3, class: gprb }
231   - { id: 4, class: gprb }
232 body:             |
233   bb.0:
234     liveins: $r0, $r1, $r2
236     %0(s32) = COPY $r0
237     ; CHECK: [[VREGX:%[0-9]+]]:rgpr = COPY $r0
239     %1(s32) = COPY $r1
240     ; CHECK: [[VREGY:%[0-9]+]]:rgpr = COPY $r1
242     %2(s32) = COPY $r2
243     ; CHECK: [[VREGZ:%[0-9]+]]:rgpr = COPY $r2
245     %3(s32) = G_MUL %0, %1
246     %4(s32) = G_ADD %3, %2
247     ; CHECK: [[VREGRES:%[0-9]+]]:rgpr = t2MLA [[VREGX]], [[VREGY]], [[VREGZ]], 14, $noreg
249     $r0 = COPY %4(s32)
250     ; CHECK: $r0 = COPY [[VREGRES]]
252     BX_RET 14, $noreg, implicit $r0
253     ; CHECK: BX_RET 14, $noreg, implicit $r0
256 name:            test_sdiv
257 # CHECK-LABEL: name: test_sdiv
258 legalized:       true
259 regBankSelected: true
260 selected:        false
261 # CHECK: selected: true
262 registers:
263   - { id: 0, class: gprb }
264   - { id: 1, class: gprb }
265   - { id: 2, class: gprb }
266 body:             |
267   bb.0:
268     liveins: $r0, $r1
270     %0(s32) = COPY $r0
271     ; CHECK: [[VREGX:%[0-9]+]]:rgpr = COPY $r0
273     %1(s32) = COPY $r1
274     ; CHECK: [[VREGY:%[0-9]+]]:rgpr = COPY $r1
276     %2(s32) = G_SDIV %0, %1
277     ; CHECK: [[VREGRES:%[0-9]+]]:rgpr = t2SDIV [[VREGX]], [[VREGY]], 14, $noreg
279     $r0 = COPY %2(s32)
280     ; CHECK: $r0 = COPY [[VREGRES]]
282     BX_RET 14, $noreg, implicit $r0
283     ; CHECK: BX_RET 14, $noreg, implicit $r0
286 name:            test_udiv
287 # CHECK-LABEL: name: test_udiv
288 legalized:       true
289 regBankSelected: true
290 selected:        false
291 # CHECK: selected: true
292 registers:
293   - { id: 0, class: gprb }
294   - { id: 1, class: gprb }
295   - { id: 2, class: gprb }
296 body:             |
297   bb.0:
298     liveins: $r0, $r1
300     %0(s32) = COPY $r0
301     ; CHECK: [[VREGX:%[0-9]+]]:rgpr = COPY $r0
303     %1(s32) = COPY $r1
304     ; CHECK: [[VREGY:%[0-9]+]]:rgpr = COPY $r1
306     %2(s32) = G_UDIV %0, %1
307     ; CHECK: [[VREGRES:%[0-9]+]]:rgpr = t2UDIV [[VREGX]], [[VREGY]], 14, $noreg
309     $r0 = COPY %2(s32)
310     ; CHECK: $r0 = COPY [[VREGRES]]
312     BX_RET 14, $noreg, implicit $r0
313     ; CHECK: BX_RET 14, $noreg, implicit $r0