1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -O0 -mtriple=mipsel-linux-gnu -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=MIPS32
3--- |
4
5  define void @sub_i32() {entry: ret void}
6  define void @sub_i8_sext() {entry: ret void}
7  define void @sub_i8_zext() {entry: ret void}
8  define void @sub_i8_aext() {entry: ret void}
9  define void @sub_i16_sext() {entry: ret void}
10  define void @sub_i16_zext() {entry: ret void}
11  define void @sub_i16_aext() {entry: ret void}
12  define void @sub_i64() {entry: ret void}
13  define void @sub_i128() {entry: ret void}
14
15...
16---
17name:            sub_i32
18alignment:       4
19tracksRegLiveness: true
20body:             |
21  bb.1.entry:
22    liveins: $a0, $a1
23
24    ; MIPS32-LABEL: name: sub_i32
25    ; MIPS32: liveins: $a0, $a1
26    ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
27    ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
28    ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY]], [[COPY1]]
29    ; MIPS32: $v0 = COPY [[SUB]](s32)
30    ; MIPS32: RetRA implicit $v0
31    %0:_(s32) = COPY $a0
32    %1:_(s32) = COPY $a1
33    %2:_(s32) = G_SUB %0, %1
34    $v0 = COPY %2(s32)
35    RetRA implicit $v0
36
37...
38---
39name:            sub_i8_sext
40alignment:       4
41tracksRegLiveness: true
42body:             |
43  bb.1.entry:
44    liveins: $a0, $a1
45
46    ; MIPS32-LABEL: name: sub_i8_sext
47    ; MIPS32: liveins: $a0, $a1
48    ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
49    ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
50    ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
51    ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
52    ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]]
53    ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32)
54    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
55    ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]](s32)
56    ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)
57    ; MIPS32: $v0 = COPY [[ASHR]](s32)
58    ; MIPS32: RetRA implicit $v0
59    %2:_(s32) = COPY $a0
60    %0:_(s8) = G_TRUNC %2(s32)
61    %3:_(s32) = COPY $a1
62    %1:_(s8) = G_TRUNC %3(s32)
63    %4:_(s8) = G_SUB %1, %0
64    %5:_(s32) = G_SEXT %4(s8)
65    $v0 = COPY %5(s32)
66    RetRA implicit $v0
67
68...
69---
70name:            sub_i8_zext
71alignment:       4
72tracksRegLiveness: true
73body:             |
74  bb.1.entry:
75    liveins: $a0, $a1
76
77    ; MIPS32-LABEL: name: sub_i8_zext
78    ; MIPS32: liveins: $a0, $a1
79    ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
80    ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
81    ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
82    ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
83    ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]]
84    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
85    ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32)
86    ; MIPS32: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY4]], [[C]]
87    ; MIPS32: $v0 = COPY [[AND]](s32)
88    ; MIPS32: RetRA implicit $v0
89    %2:_(s32) = COPY $a0
90    %0:_(s8) = G_TRUNC %2(s32)
91    %3:_(s32) = COPY $a1
92    %1:_(s8) = G_TRUNC %3(s32)
93    %4:_(s8) = G_SUB %1, %0
94    %5:_(s32) = G_ZEXT %4(s8)
95    $v0 = COPY %5(s32)
96    RetRA implicit $v0
97
98...
99---
100name:            sub_i8_aext
101alignment:       4
102tracksRegLiveness: true
103body:             |
104  bb.1.entry:
105    liveins: $a0, $a1
106
107    ; MIPS32-LABEL: name: sub_i8_aext
108    ; MIPS32: liveins: $a0, $a1
109    ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
110    ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
111    ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
112    ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
113    ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]]
114    ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32)
115    ; MIPS32: $v0 = COPY [[COPY4]](s32)
116    ; MIPS32: RetRA implicit $v0
117    %2:_(s32) = COPY $a0
118    %0:_(s8) = G_TRUNC %2(s32)
119    %3:_(s32) = COPY $a1
120    %1:_(s8) = G_TRUNC %3(s32)
121    %4:_(s8) = G_SUB %1, %0
122    %5:_(s32) = G_ANYEXT %4(s8)
123    $v0 = COPY %5(s32)
124    RetRA implicit $v0
125
126...
127---
128name:            sub_i16_sext
129alignment:       4
130tracksRegLiveness: true
131body:             |
132  bb.1.entry:
133    liveins: $a0, $a1
134
135    ; MIPS32-LABEL: name: sub_i16_sext
136    ; MIPS32: liveins: $a0, $a1
137    ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
138    ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
139    ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
140    ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
141    ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]]
142    ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32)
143    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
144    ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]](s32)
145    ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)
146    ; MIPS32: $v0 = COPY [[ASHR]](s32)
147    ; MIPS32: RetRA implicit $v0
148    %2:_(s32) = COPY $a0
149    %0:_(s16) = G_TRUNC %2(s32)
150    %3:_(s32) = COPY $a1
151    %1:_(s16) = G_TRUNC %3(s32)
152    %4:_(s16) = G_SUB %1, %0
153    %5:_(s32) = G_SEXT %4(s16)
154    $v0 = COPY %5(s32)
155    RetRA implicit $v0
156
157...
158---
159name:            sub_i16_zext
160alignment:       4
161tracksRegLiveness: true
162body:             |
163  bb.1.entry:
164    liveins: $a0, $a1
165
166    ; MIPS32-LABEL: name: sub_i16_zext
167    ; MIPS32: liveins: $a0, $a1
168    ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
169    ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
170    ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
171    ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
172    ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]]
173    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
174    ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32)
175    ; MIPS32: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY4]], [[C]]
176    ; MIPS32: $v0 = COPY [[AND]](s32)
177    ; MIPS32: RetRA implicit $v0
178    %2:_(s32) = COPY $a0
179    %0:_(s16) = G_TRUNC %2(s32)
180    %3:_(s32) = COPY $a1
181    %1:_(s16) = G_TRUNC %3(s32)
182    %4:_(s16) = G_SUB %1, %0
183    %5:_(s32) = G_ZEXT %4(s16)
184    $v0 = COPY %5(s32)
185    RetRA implicit $v0
186
187...
188---
189name:            sub_i16_aext
190alignment:       4
191tracksRegLiveness: true
192body:             |
193  bb.1.entry:
194    liveins: $a0, $a1
195
196    ; MIPS32-LABEL: name: sub_i16_aext
197    ; MIPS32: liveins: $a0, $a1
198    ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
199    ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
200    ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
201    ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
202    ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]]
203    ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32)
204    ; MIPS32: $v0 = COPY [[COPY4]](s32)
205    ; MIPS32: RetRA implicit $v0
206    %2:_(s32) = COPY $a0
207    %0:_(s16) = G_TRUNC %2(s32)
208    %3:_(s32) = COPY $a1
209    %1:_(s16) = G_TRUNC %3(s32)
210    %4:_(s16) = G_SUB %1, %0
211    %5:_(s32) = G_ANYEXT %4(s16)
212    $v0 = COPY %5(s32)
213    RetRA implicit $v0
214
215...
216---
217name:            sub_i64
218alignment:       4
219tracksRegLiveness: true
220body:             |
221  bb.1.entry:
222    liveins: $a0, $a1, $a2, $a3
223
224    ; MIPS32-LABEL: name: sub_i64
225    ; MIPS32: liveins: $a0, $a1, $a2, $a3
226    ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
227    ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
228    ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY $a2
229    ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY $a3
230    ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY3]], [[COPY1]]
231    ; MIPS32: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY3]](s32), [[COPY1]]
232    ; MIPS32: [[SUB1:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY]]
233    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
234    ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ICMP]](s32)
235    ; MIPS32: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY4]], [[C]]
236    ; MIPS32: [[SUB2:%[0-9]+]]:_(s32) = G_SUB [[SUB1]], [[AND]]
237    ; MIPS32: $v0 = COPY [[SUB2]](s32)
238    ; MIPS32: $v1 = COPY [[SUB]](s32)
239    ; MIPS32: RetRA implicit $v0, implicit $v1
240    %2:_(s32) = COPY $a0
241    %3:_(s32) = COPY $a1
242    %0:_(s64) = G_MERGE_VALUES %3(s32), %2(s32)
243    %4:_(s32) = COPY $a2
244    %5:_(s32) = COPY $a3
245    %1:_(s64) = G_MERGE_VALUES %5(s32), %4(s32)
246    %6:_(s64) = G_SUB %1, %0
247    %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64)
248    $v0 = COPY %8(s32)
249    $v1 = COPY %7(s32)
250    RetRA implicit $v0, implicit $v1
251
252...
253---
254name:            sub_i128
255alignment:       4
256tracksRegLiveness: true
257fixedStack:
258  - { id: 0, offset: 28, size: 4, alignment: 4, stack-id: default, isImmutable: true }
259  - { id: 1, offset: 24, size: 4, alignment: 8, stack-id: default, isImmutable: true }
260  - { id: 2, offset: 20, size: 4, alignment: 4, stack-id: default, isImmutable: true }
261  - { id: 3, offset: 16, size: 4, alignment: 8, stack-id: default, isImmutable: true }
262body:             |
263  bb.1.entry:
264    liveins: $a0, $a1, $a2, $a3
265
266    ; MIPS32-LABEL: name: sub_i128
267    ; MIPS32: liveins: $a0, $a1, $a2, $a3
268    ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
269    ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
270    ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY $a2
271    ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY $a3
272    ; MIPS32: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
273    ; MIPS32: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (load 4 from %fixed-stack.0, align 8)
274    ; MIPS32: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1
275    ; MIPS32: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX1]](p0) :: (load 4 from %fixed-stack.1)
276    ; MIPS32: [[FRAME_INDEX2:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.2
277    ; MIPS32: [[LOAD2:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX2]](p0) :: (load 4 from %fixed-stack.2, align 8)
278    ; MIPS32: [[FRAME_INDEX3:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.3
279    ; MIPS32: [[LOAD3:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX3]](p0) :: (load 4 from %fixed-stack.3)
280    ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[LOAD]], [[COPY]]
281    ; MIPS32: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[LOAD]](s32), [[COPY]]
282    ; MIPS32: [[SUB1:%[0-9]+]]:_(s32) = G_SUB [[LOAD1]], [[COPY1]]
283    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
284    ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ICMP]](s32)
285    ; MIPS32: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY4]], [[C]]
286    ; MIPS32: [[SUB2:%[0-9]+]]:_(s32) = G_SUB [[SUB1]], [[AND]]
287    ; MIPS32: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[LOAD1]](s32), [[COPY1]]
288    ; MIPS32: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[LOAD1]](s32), [[COPY1]]
289    ; MIPS32: [[COPY5:%[0-9]+]]:_(s32) = COPY [[ICMP]](s32)
290    ; MIPS32: [[COPY6:%[0-9]+]]:_(s32) = COPY [[ICMP2]](s32)
291    ; MIPS32: [[COPY7:%[0-9]+]]:_(s32) = COPY [[ICMP1]](s32)
292    ; MIPS32: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY7]], [[C]]
293    ; MIPS32: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[AND1]](s32), [[COPY5]], [[COPY6]]
294    ; MIPS32: [[SUB3:%[0-9]+]]:_(s32) = G_SUB [[LOAD2]], [[COPY2]]
295    ; MIPS32: [[COPY8:%[0-9]+]]:_(s32) = COPY [[SELECT]](s32)
296    ; MIPS32: [[AND2:%[0-9]+]]:_(s32) = G_AND [[COPY8]], [[C]]
297    ; MIPS32: [[SUB4:%[0-9]+]]:_(s32) = G_SUB [[SUB3]], [[AND2]]
298    ; MIPS32: [[ICMP3:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[LOAD2]](s32), [[COPY2]]
299    ; MIPS32: [[ICMP4:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[LOAD2]](s32), [[COPY2]]
300    ; MIPS32: [[COPY9:%[0-9]+]]:_(s32) = COPY [[SELECT]](s32)
301    ; MIPS32: [[COPY10:%[0-9]+]]:_(s32) = COPY [[ICMP4]](s32)
302    ; MIPS32: [[COPY11:%[0-9]+]]:_(s32) = COPY [[ICMP3]](s32)
303    ; MIPS32: [[AND3:%[0-9]+]]:_(s32) = G_AND [[COPY11]], [[C]]
304    ; MIPS32: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[AND3]](s32), [[COPY9]], [[COPY10]]
305    ; MIPS32: [[SUB5:%[0-9]+]]:_(s32) = G_SUB [[LOAD3]], [[COPY3]]
306    ; MIPS32: [[COPY12:%[0-9]+]]:_(s32) = COPY [[SELECT1]](s32)
307    ; MIPS32: [[AND4:%[0-9]+]]:_(s32) = G_AND [[COPY12]], [[C]]
308    ; MIPS32: [[SUB6:%[0-9]+]]:_(s32) = G_SUB [[SUB5]], [[AND4]]
309    ; MIPS32: $v0 = COPY [[SUB]](s32)
310    ; MIPS32: $v1 = COPY [[SUB2]](s32)
311    ; MIPS32: $a0 = COPY [[SUB4]](s32)
312    ; MIPS32: $a1 = COPY [[SUB6]](s32)
313    ; MIPS32: RetRA implicit $v0, implicit $v1, implicit $a0, implicit $a1
314    %2:_(s32) = COPY $a0
315    %3:_(s32) = COPY $a1
316    %4:_(s32) = COPY $a2
317    %5:_(s32) = COPY $a3
318    %0:_(s128) = G_MERGE_VALUES %2(s32), %3(s32), %4(s32), %5(s32)
319    %10:_(p0) = G_FRAME_INDEX %fixed-stack.3
320    %6:_(s32) = G_LOAD %10(p0) :: (load 4 from %fixed-stack.3, align 8)
321    %11:_(p0) = G_FRAME_INDEX %fixed-stack.2
322    %7:_(s32) = G_LOAD %11(p0) :: (load 4 from %fixed-stack.2, align 4)
323    %12:_(p0) = G_FRAME_INDEX %fixed-stack.1
324    %8:_(s32) = G_LOAD %12(p0) :: (load 4 from %fixed-stack.1, align 8)
325    %13:_(p0) = G_FRAME_INDEX %fixed-stack.0
326    %9:_(s32) = G_LOAD %13(p0) :: (load 4 from %fixed-stack.0, align 4)
327    %1:_(s128) = G_MERGE_VALUES %6(s32), %7(s32), %8(s32), %9(s32)
328    %14:_(s128) = G_SUB %1, %0
329    %15:_(s32), %16:_(s32), %17:_(s32), %18:_(s32) = G_UNMERGE_VALUES %14(s128)
330    $v0 = COPY %15(s32)
331    $v1 = COPY %16(s32)
332    $a0 = COPY %17(s32)
333    $a1 = COPY %18(s32)
334    RetRA implicit $v0, implicit $v1, implicit $a0, implicit $a1
335
336...
337