[MIPS GlobalISel] Set operand order for G_MERGE and G_UNMERGE
[llvm-complete.git] / test / CodeGen / Mips / GlobalISel / legalizer / add.mir
blobff9ae06a9374cdfb6b485971e0f334aca283be5d
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 --- |
5   define void @add_i32() {entry: ret void}
6   define void @add_i8_sext() {entry: ret void}
7   define void @add_i8_zext() {entry: ret void}
8   define void @add_i8_aext() {entry: ret void}
9   define void @add_i16_sext() {entry: ret void}
10   define void @add_i16_zext() {entry: ret void}
11   define void @add_i16_aext() {entry: ret void}
12   define void @add_i64() {entry: ret void}
14 ...
15 ---
16 name:            add_i32
17 alignment:       2
18 tracksRegLiveness: true
19 body:             |
20   bb.0.entry:
21     liveins: $a0, $a1
23     ; MIPS32-LABEL: name: add_i32
24     ; MIPS32: liveins: $a0, $a1
25     ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
26     ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
27     ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[COPY1]]
28     ; MIPS32: $v0 = COPY [[ADD]](s32)
29     ; MIPS32: RetRA implicit $v0
30     %0:_(s32) = COPY $a0
31     %1:_(s32) = COPY $a1
32     %2:_(s32) = G_ADD %0, %1
33     $v0 = COPY %2(s32)
34     RetRA implicit $v0
36 ...
37 ---
38 name:            add_i8_sext
39 alignment:       2
40 tracksRegLiveness: true
41 body:             |
42   bb.1.entry:
43     liveins: $a0, $a1
45     ; MIPS32-LABEL: name: add_i8_sext
46     ; MIPS32: liveins: $a0, $a1
47     ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
48     ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
49     ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
50     ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
51     ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]]
52     ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
53     ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)
54     ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]]
55     ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]]
56     ; MIPS32: $v0 = COPY [[ASHR]](s32)
57     ; MIPS32: RetRA implicit $v0
58     %2:_(s32) = COPY $a0
59     %0:_(s8) = G_TRUNC %2(s32)
60     %3:_(s32) = COPY $a1
61     %1:_(s8) = G_TRUNC %3(s32)
62     %4:_(s8) = G_ADD %1, %0
63     %5:_(s32) = G_SEXT %4(s8)
64     $v0 = COPY %5(s32)
65     RetRA implicit $v0
67 ...
68 ---
69 name:            add_i8_zext
70 alignment:       2
71 tracksRegLiveness: true
72 body:             |
73   bb.1.entry:
74     liveins: $a0, $a1
76     ; MIPS32-LABEL: name: add_i8_zext
77     ; MIPS32: liveins: $a0, $a1
78     ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
79     ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
80     ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
81     ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
82     ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]]
83     ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
84     ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)
85     ; MIPS32: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY4]], [[C]]
86     ; MIPS32: $v0 = COPY [[AND]](s32)
87     ; MIPS32: RetRA implicit $v0
88     %2:_(s32) = COPY $a0
89     %0:_(s8) = G_TRUNC %2(s32)
90     %3:_(s32) = COPY $a1
91     %1:_(s8) = G_TRUNC %3(s32)
92     %4:_(s8) = G_ADD %1, %0
93     %5:_(s32) = G_ZEXT %4(s8)
94     $v0 = COPY %5(s32)
95     RetRA implicit $v0
97 ...
98 ---
99 name:            add_i8_aext
100 alignment:       2
101 tracksRegLiveness: true
102 body:             |
103   bb.1.entry:
104     liveins: $a0, $a1
106     ; MIPS32-LABEL: name: add_i8_aext
107     ; MIPS32: liveins: $a0, $a1
108     ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
109     ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
110     ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
111     ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
112     ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]]
113     ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)
114     ; MIPS32: $v0 = COPY [[COPY4]](s32)
115     ; MIPS32: RetRA implicit $v0
116     %2:_(s32) = COPY $a0
117     %0:_(s8) = G_TRUNC %2(s32)
118     %3:_(s32) = COPY $a1
119     %1:_(s8) = G_TRUNC %3(s32)
120     %4:_(s8) = G_ADD %1, %0
121     %5:_(s32) = G_ANYEXT %4(s8)
122     $v0 = COPY %5(s32)
123     RetRA implicit $v0
127 name:            add_i16_sext
128 alignment:       2
129 tracksRegLiveness: true
130 body:             |
131   bb.1.entry:
132     liveins: $a0, $a1
134     ; MIPS32-LABEL: name: add_i16_sext
135     ; MIPS32: liveins: $a0, $a1
136     ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
137     ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
138     ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
139     ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
140     ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]]
141     ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
142     ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)
143     ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]]
144     ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]]
145     ; MIPS32: $v0 = COPY [[ASHR]](s32)
146     ; MIPS32: RetRA implicit $v0
147     %2:_(s32) = COPY $a0
148     %0:_(s16) = G_TRUNC %2(s32)
149     %3:_(s32) = COPY $a1
150     %1:_(s16) = G_TRUNC %3(s32)
151     %4:_(s16) = G_ADD %1, %0
152     %5:_(s32) = G_SEXT %4(s16)
153     $v0 = COPY %5(s32)
154     RetRA implicit $v0
158 name:            add_i16_zext
159 alignment:       2
160 tracksRegLiveness: true
161 body:             |
162   bb.1.entry:
163     liveins: $a0, $a1
165     ; MIPS32-LABEL: name: add_i16_zext
166     ; MIPS32: liveins: $a0, $a1
167     ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
168     ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
169     ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
170     ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
171     ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]]
172     ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
173     ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)
174     ; MIPS32: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY4]], [[C]]
175     ; MIPS32: $v0 = COPY [[AND]](s32)
176     ; MIPS32: RetRA implicit $v0
177     %2:_(s32) = COPY $a0
178     %0:_(s16) = G_TRUNC %2(s32)
179     %3:_(s32) = COPY $a1
180     %1:_(s16) = G_TRUNC %3(s32)
181     %4:_(s16) = G_ADD %1, %0
182     %5:_(s32) = G_ZEXT %4(s16)
183     $v0 = COPY %5(s32)
184     RetRA implicit $v0
188 name:            add_i16_aext
189 alignment:       2
190 tracksRegLiveness: true
191 body:             |
192   bb.1.entry:
193     liveins: $a0, $a1
195     ; MIPS32-LABEL: name: add_i16_aext
196     ; MIPS32: liveins: $a0, $a1
197     ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
198     ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
199     ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
200     ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
201     ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]]
202     ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)
203     ; MIPS32: $v0 = COPY [[COPY4]](s32)
204     ; MIPS32: RetRA implicit $v0
205     %2:_(s32) = COPY $a0
206     %0:_(s16) = G_TRUNC %2(s32)
207     %3:_(s32) = COPY $a1
208     %1:_(s16) = G_TRUNC %3(s32)
209     %4:_(s16) = G_ADD %1, %0
210     %5:_(s32) = G_ANYEXT %4(s16)
211     $v0 = COPY %5(s32)
212     RetRA implicit $v0
216 name:            add_i64
217 alignment:       2
218 tracksRegLiveness: true
219 body:             |
220   bb.1.entry:
221     liveins: $a0, $a1, $a2, $a3
223     ; MIPS32-LABEL: name: add_i64
224     ; MIPS32: liveins: $a0, $a1, $a2, $a3
225     ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
226     ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
227     ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY $a2
228     ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY $a3
229     ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY]]
230     ; MIPS32: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY3]], [[COPY1]]
231     ; MIPS32: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD1]](s32), [[COPY3]]
232     ; MIPS32: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[ICMP]]
233     ; MIPS32: $v0 = COPY [[ADD2]](s32)
234     ; MIPS32: $v1 = COPY [[ADD1]](s32)
235     ; MIPS32: RetRA implicit $v0, implicit $v1
236     %2:_(s32) = COPY $a0
237     %3:_(s32) = COPY $a1
238     %0:_(s64) = G_MERGE_VALUES %3(s32), %2(s32)
239     %4:_(s32) = COPY $a2
240     %5:_(s32) = COPY $a3
241     %1:_(s64) = G_MERGE_VALUES %5(s32), %4(s32)
242     %6:_(s64) = G_ADD %1, %0
243     %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64)
244     $v0 = COPY %8(s32)
245     $v1 = COPY %7(s32)
246     RetRA implicit $v0, implicit $v1