[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / add.ll
blob2c504efca26d13a1ad445bd383713be372765103
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32
3 ; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64
5 ;; Exercise the 'add' LLVM IR: https://llvm.org/docs/LangRef.html#add-instruction
7 define i1 @add_i1(i1 %x, i1 %y) {
8 ; LA32-LABEL: add_i1:
9 ; LA32:       # %bb.0:
10 ; LA32-NEXT:    add.w $a0, $a0, $a1
11 ; LA32-NEXT:    ret
13 ; LA64-LABEL: add_i1:
14 ; LA64:       # %bb.0:
15 ; LA64-NEXT:    add.d $a0, $a0, $a1
16 ; LA64-NEXT:    ret
17   %add = add i1 %x, %y
18   ret i1 %add
21 define i8 @add_i8(i8 %x, i8 %y) {
22 ; LA32-LABEL: add_i8:
23 ; LA32:       # %bb.0:
24 ; LA32-NEXT:    add.w $a0, $a0, $a1
25 ; LA32-NEXT:    ret
27 ; LA64-LABEL: add_i8:
28 ; LA64:       # %bb.0:
29 ; LA64-NEXT:    add.d $a0, $a0, $a1
30 ; LA64-NEXT:    ret
31   %add = add i8 %x, %y
32   ret i8 %add
35 define i16 @add_i16(i16 %x, i16 %y) {
36 ; LA32-LABEL: add_i16:
37 ; LA32:       # %bb.0:
38 ; LA32-NEXT:    add.w $a0, $a0, $a1
39 ; LA32-NEXT:    ret
41 ; LA64-LABEL: add_i16:
42 ; LA64:       # %bb.0:
43 ; LA64-NEXT:    add.d $a0, $a0, $a1
44 ; LA64-NEXT:    ret
45   %add = add i16 %x, %y
46   ret i16 %add
49 define i32 @add_i32(i32 %x, i32 %y) {
50 ; LA32-LABEL: add_i32:
51 ; LA32:       # %bb.0:
52 ; LA32-NEXT:    add.w $a0, $a0, $a1
53 ; LA32-NEXT:    ret
55 ; LA64-LABEL: add_i32:
56 ; LA64:       # %bb.0:
57 ; LA64-NEXT:    add.d $a0, $a0, $a1
58 ; LA64-NEXT:    ret
59   %add = add i32 %x, %y
60   ret i32 %add
63 ;; Match the pattern:
64 ;; def : PatGprGpr_32<add, ADD_W>;
65 define signext i32 @add_i32_sext(i32 %x, i32 %y) {
66 ; LA32-LABEL: add_i32_sext:
67 ; LA32:       # %bb.0:
68 ; LA32-NEXT:    add.w $a0, $a0, $a1
69 ; LA32-NEXT:    ret
71 ; LA64-LABEL: add_i32_sext:
72 ; LA64:       # %bb.0:
73 ; LA64-NEXT:    add.w $a0, $a0, $a1
74 ; LA64-NEXT:    ret
75   %add = add i32 %x, %y
76   ret i32 %add
79 define i64 @add_i64(i64 %x, i64 %y) {
80 ; LA32-LABEL: add_i64:
81 ; LA32:       # %bb.0:
82 ; LA32-NEXT:    add.w $a1, $a1, $a3
83 ; LA32-NEXT:    add.w $a2, $a0, $a2
84 ; LA32-NEXT:    sltu $a0, $a2, $a0
85 ; LA32-NEXT:    add.w $a1, $a1, $a0
86 ; LA32-NEXT:    move $a0, $a2
87 ; LA32-NEXT:    ret
89 ; LA64-LABEL: add_i64:
90 ; LA64:       # %bb.0:
91 ; LA64-NEXT:    add.d $a0, $a0, $a1
92 ; LA64-NEXT:    ret
93   %add = add i64 %x, %y
94   ret i64 %add
97 define i1 @add_i1_3(i1 %x) {
98 ; LA32-LABEL: add_i1_3:
99 ; LA32:       # %bb.0:
100 ; LA32-NEXT:    addi.w $a0, $a0, 1
101 ; LA32-NEXT:    ret
103 ; LA64-LABEL: add_i1_3:
104 ; LA64:       # %bb.0:
105 ; LA64-NEXT:    addi.d $a0, $a0, 1
106 ; LA64-NEXT:    ret
107   %add = add i1 %x, 3
108   ret i1 %add
111 define i8 @add_i8_3(i8 %x) {
112 ; LA32-LABEL: add_i8_3:
113 ; LA32:       # %bb.0:
114 ; LA32-NEXT:    addi.w $a0, $a0, 3
115 ; LA32-NEXT:    ret
117 ; LA64-LABEL: add_i8_3:
118 ; LA64:       # %bb.0:
119 ; LA64-NEXT:    addi.d $a0, $a0, 3
120 ; LA64-NEXT:    ret
121   %add = add i8 %x, 3
122   ret i8 %add
125 define i16 @add_i16_3(i16 %x) {
126 ; LA32-LABEL: add_i16_3:
127 ; LA32:       # %bb.0:
128 ; LA32-NEXT:    addi.w $a0, $a0, 3
129 ; LA32-NEXT:    ret
131 ; LA64-LABEL: add_i16_3:
132 ; LA64:       # %bb.0:
133 ; LA64-NEXT:    addi.d $a0, $a0, 3
134 ; LA64-NEXT:    ret
135   %add = add i16 %x, 3
136   ret i16 %add
139 define i32 @add_i32_3(i32 %x) {
140 ; LA32-LABEL: add_i32_3:
141 ; LA32:       # %bb.0:
142 ; LA32-NEXT:    addi.w $a0, $a0, 3
143 ; LA32-NEXT:    ret
145 ; LA64-LABEL: add_i32_3:
146 ; LA64:       # %bb.0:
147 ; LA64-NEXT:    addi.d $a0, $a0, 3
148 ; LA64-NEXT:    ret
149   %add = add i32 %x, 3
150   ret i32 %add
153 ;; Match the pattern:
154 ;; def : PatGprImm_32<add, ADDI_W, simm12>;
155 define signext i32 @add_i32_3_sext(i32 %x) {
156 ; LA32-LABEL: add_i32_3_sext:
157 ; LA32:       # %bb.0:
158 ; LA32-NEXT:    addi.w $a0, $a0, 3
159 ; LA32-NEXT:    ret
161 ; LA64-LABEL: add_i32_3_sext:
162 ; LA64:       # %bb.0:
163 ; LA64-NEXT:    addi.w $a0, $a0, 3
164 ; LA64-NEXT:    ret
165   %add = add i32 %x, 3
166   ret i32 %add
169 define i64 @add_i64_3(i64 %x) {
170 ; LA32-LABEL: add_i64_3:
171 ; LA32:       # %bb.0:
172 ; LA32-NEXT:    addi.w $a2, $a0, 3
173 ; LA32-NEXT:    sltu $a0, $a2, $a0
174 ; LA32-NEXT:    add.w $a1, $a1, $a0
175 ; LA32-NEXT:    move $a0, $a2
176 ; LA32-NEXT:    ret
178 ; LA64-LABEL: add_i64_3:
179 ; LA64:       # %bb.0:
180 ; LA64-NEXT:    addi.d $a0, $a0, 3
181 ; LA64-NEXT:    ret
182   %add = add i64 %x, 3
183   ret i64 %add
186 ;; Check that `addu16i.d` is emitted for these cases.
188 define i32 @add_i32_0x12340000(i32 %x) {
189 ; LA32-LABEL: add_i32_0x12340000:
190 ; LA32:       # %bb.0:
191 ; LA32-NEXT:    lu12i.w $a1, 74560
192 ; LA32-NEXT:    add.w $a0, $a0, $a1
193 ; LA32-NEXT:    ret
195 ; LA64-LABEL: add_i32_0x12340000:
196 ; LA64:       # %bb.0:
197 ; LA64-NEXT:    addu16i.d $a0, $a0, 4660
198 ; LA64-NEXT:    ret
199   %add = add i32 %x, 305397760
200   ret i32 %add
203 define signext i32 @add_i32_0x12340000_sext(i32 %x) {
204 ; LA32-LABEL: add_i32_0x12340000_sext:
205 ; LA32:       # %bb.0:
206 ; LA32-NEXT:    lu12i.w $a1, 74560
207 ; LA32-NEXT:    add.w $a0, $a0, $a1
208 ; LA32-NEXT:    ret
210 ; LA64-LABEL: add_i32_0x12340000_sext:
211 ; LA64:       # %bb.0:
212 ; LA64-NEXT:    addu16i.d $a0, $a0, 4660
213 ; LA64-NEXT:    addi.w $a0, $a0, 0
214 ; LA64-NEXT:    ret
215   %add = add i32 %x, 305397760
216   ret i32 %add
219 define i64 @add_i64_0x12340000(i64 %x) {
220 ; LA32-LABEL: add_i64_0x12340000:
221 ; LA32:       # %bb.0:
222 ; LA32-NEXT:    lu12i.w $a2, 74560
223 ; LA32-NEXT:    add.w $a2, $a0, $a2
224 ; LA32-NEXT:    sltu $a0, $a2, $a0
225 ; LA32-NEXT:    add.w $a1, $a1, $a0
226 ; LA32-NEXT:    move $a0, $a2
227 ; LA32-NEXT:    ret
229 ; LA64-LABEL: add_i64_0x12340000:
230 ; LA64:       # %bb.0:
231 ; LA64-NEXT:    addu16i.d $a0, $a0, 4660
232 ; LA64-NEXT:    ret
233   %add = add i64 %x, 305397760
234   ret i64 %add
237 define i32 @add_i32_0x7fff0000(i32 %x) {
238 ; LA32-LABEL: add_i32_0x7fff0000:
239 ; LA32:       # %bb.0:
240 ; LA32-NEXT:    lu12i.w $a1, 524272
241 ; LA32-NEXT:    add.w $a0, $a0, $a1
242 ; LA32-NEXT:    ret
244 ; LA64-LABEL: add_i32_0x7fff0000:
245 ; LA64:       # %bb.0:
246 ; LA64-NEXT:    addu16i.d $a0, $a0, 32767
247 ; LA64-NEXT:    ret
248   %add = add i32 %x, 2147418112
249   ret i32 %add
252 define signext i32 @add_i32_0x7fff0000_sext(i32 %x) {
253 ; LA32-LABEL: add_i32_0x7fff0000_sext:
254 ; LA32:       # %bb.0:
255 ; LA32-NEXT:    lu12i.w $a1, 524272
256 ; LA32-NEXT:    add.w $a0, $a0, $a1
257 ; LA32-NEXT:    ret
259 ; LA64-LABEL: add_i32_0x7fff0000_sext:
260 ; LA64:       # %bb.0:
261 ; LA64-NEXT:    addu16i.d $a0, $a0, 32767
262 ; LA64-NEXT:    addi.w $a0, $a0, 0
263 ; LA64-NEXT:    ret
264   %add = add i32 %x, 2147418112
265   ret i32 %add
268 define i64 @add_i64_0x7fff0000(i64 %x) {
269 ; LA32-LABEL: add_i64_0x7fff0000:
270 ; LA32:       # %bb.0:
271 ; LA32-NEXT:    lu12i.w $a2, 524272
272 ; LA32-NEXT:    add.w $a2, $a0, $a2
273 ; LA32-NEXT:    sltu $a0, $a2, $a0
274 ; LA32-NEXT:    add.w $a1, $a1, $a0
275 ; LA32-NEXT:    move $a0, $a2
276 ; LA32-NEXT:    ret
278 ; LA64-LABEL: add_i64_0x7fff0000:
279 ; LA64:       # %bb.0:
280 ; LA64-NEXT:    addu16i.d $a0, $a0, 32767
281 ; LA64-NEXT:    ret
282   %add = add i64 %x, 2147418112
283   ret i64 %add
286 define i32 @add_i32_minus_0x80000000(i32 %x) {
287 ; LA32-LABEL: add_i32_minus_0x80000000:
288 ; LA32:       # %bb.0:
289 ; LA32-NEXT:    lu12i.w $a1, -524288
290 ; LA32-NEXT:    add.w $a0, $a0, $a1
291 ; LA32-NEXT:    ret
293 ; LA64-LABEL: add_i32_minus_0x80000000:
294 ; LA64:       # %bb.0:
295 ; LA64-NEXT:    addu16i.d $a0, $a0, -32768
296 ; LA64-NEXT:    ret
297   %add = add i32 %x, -2147483648
298   ret i32 %add
301 define signext i32 @add_i32_minus_0x80000000_sext(i32 %x) {
302 ; LA32-LABEL: add_i32_minus_0x80000000_sext:
303 ; LA32:       # %bb.0:
304 ; LA32-NEXT:    lu12i.w $a1, -524288
305 ; LA32-NEXT:    add.w $a0, $a0, $a1
306 ; LA32-NEXT:    ret
308 ; LA64-LABEL: add_i32_minus_0x80000000_sext:
309 ; LA64:       # %bb.0:
310 ; LA64-NEXT:    addu16i.d $a0, $a0, -32768
311 ; LA64-NEXT:    addi.w $a0, $a0, 0
312 ; LA64-NEXT:    ret
313   %add = add i32 %x, -2147483648
314   ret i32 %add
317 define i64 @add_i64_minus_0x80000000(i64 %x) {
318 ; LA32-LABEL: add_i64_minus_0x80000000:
319 ; LA32:       # %bb.0:
320 ; LA32-NEXT:    lu12i.w $a2, -524288
321 ; LA32-NEXT:    add.w $a2, $a0, $a2
322 ; LA32-NEXT:    sltu $a0, $a2, $a0
323 ; LA32-NEXT:    add.w $a0, $a1, $a0
324 ; LA32-NEXT:    addi.w $a1, $a0, -1
325 ; LA32-NEXT:    move $a0, $a2
326 ; LA32-NEXT:    ret
328 ; LA64-LABEL: add_i64_minus_0x80000000:
329 ; LA64:       # %bb.0:
330 ; LA64-NEXT:    addu16i.d $a0, $a0, -32768
331 ; LA64-NEXT:    ret
332   %add = add i64 %x, -2147483648
333   ret i64 %add
336 define i32 @add_i32_minus_0x10000(i32 %x) {
337 ; LA32-LABEL: add_i32_minus_0x10000:
338 ; LA32:       # %bb.0:
339 ; LA32-NEXT:    lu12i.w $a1, -16
340 ; LA32-NEXT:    add.w $a0, $a0, $a1
341 ; LA32-NEXT:    ret
343 ; LA64-LABEL: add_i32_minus_0x10000:
344 ; LA64:       # %bb.0:
345 ; LA64-NEXT:    addu16i.d $a0, $a0, -1
346 ; LA64-NEXT:    ret
347   %add = add i32 %x, -65536
348   ret i32 %add
351 define signext i32 @add_i32_minus_0x10000_sext(i32 %x) {
352 ; LA32-LABEL: add_i32_minus_0x10000_sext:
353 ; LA32:       # %bb.0:
354 ; LA32-NEXT:    lu12i.w $a1, -16
355 ; LA32-NEXT:    add.w $a0, $a0, $a1
356 ; LA32-NEXT:    ret
358 ; LA64-LABEL: add_i32_minus_0x10000_sext:
359 ; LA64:       # %bb.0:
360 ; LA64-NEXT:    addu16i.d $a0, $a0, -1
361 ; LA64-NEXT:    addi.w $a0, $a0, 0
362 ; LA64-NEXT:    ret
363   %add = add i32 %x, -65536
364   ret i32 %add
367 define i64 @add_i64_minus_0x10000(i64 %x) {
368 ; LA32-LABEL: add_i64_minus_0x10000:
369 ; LA32:       # %bb.0:
370 ; LA32-NEXT:    lu12i.w $a2, -16
371 ; LA32-NEXT:    add.w $a2, $a0, $a2
372 ; LA32-NEXT:    sltu $a0, $a2, $a0
373 ; LA32-NEXT:    add.w $a0, $a1, $a0
374 ; LA32-NEXT:    addi.w $a1, $a0, -1
375 ; LA32-NEXT:    move $a0, $a2
376 ; LA32-NEXT:    ret
378 ; LA64-LABEL: add_i64_minus_0x10000:
379 ; LA64:       # %bb.0:
380 ; LA64-NEXT:    addu16i.d $a0, $a0, -1
381 ; LA64-NEXT:    ret
382   %add = add i64 %x, -65536
383   ret i64 %add
386 ;; Check that `addu16i.d + addi` is emitted for these cases.
388 define i32 @add_i32_0x7fff07ff(i32 %x) {
389 ; LA32-LABEL: add_i32_0x7fff07ff:
390 ; LA32:       # %bb.0:
391 ; LA32-NEXT:    lu12i.w $a1, 524272
392 ; LA32-NEXT:    ori $a1, $a1, 2047
393 ; LA32-NEXT:    add.w $a0, $a0, $a1
394 ; LA32-NEXT:    ret
396 ; LA64-LABEL: add_i32_0x7fff07ff:
397 ; LA64:       # %bb.0:
398 ; LA64-NEXT:    addu16i.d $a0, $a0, 32767
399 ; LA64-NEXT:    addi.d $a0, $a0, 2047
400 ; LA64-NEXT:    ret
401   %add = add i32 %x, 2147420159
402   ret i32 %add
405 define signext i32 @add_i32_0x7fff07ff_sext(i32 %x) {
406 ; LA32-LABEL: add_i32_0x7fff07ff_sext:
407 ; LA32:       # %bb.0:
408 ; LA32-NEXT:    lu12i.w $a1, 524272
409 ; LA32-NEXT:    ori $a1, $a1, 2047
410 ; LA32-NEXT:    add.w $a0, $a0, $a1
411 ; LA32-NEXT:    ret
413 ; LA64-LABEL: add_i32_0x7fff07ff_sext:
414 ; LA64:       # %bb.0:
415 ; LA64-NEXT:    addu16i.d $a0, $a0, 32767
416 ; LA64-NEXT:    addi.w $a0, $a0, 2047
417 ; LA64-NEXT:    ret
418   %add = add i32 %x, 2147420159
419   ret i32 %add
422 define i64 @add_i64_0x7fff07ff(i64 %x) {
423 ; LA32-LABEL: add_i64_0x7fff07ff:
424 ; LA32:       # %bb.0:
425 ; LA32-NEXT:    lu12i.w $a2, 524272
426 ; LA32-NEXT:    ori $a2, $a2, 2047
427 ; LA32-NEXT:    add.w $a2, $a0, $a2
428 ; LA32-NEXT:    sltu $a0, $a2, $a0
429 ; LA32-NEXT:    add.w $a1, $a1, $a0
430 ; LA32-NEXT:    move $a0, $a2
431 ; LA32-NEXT:    ret
433 ; LA64-LABEL: add_i64_0x7fff07ff:
434 ; LA64:       # %bb.0:
435 ; LA64-NEXT:    addu16i.d $a0, $a0, 32767
436 ; LA64-NEXT:    addi.d $a0, $a0, 2047
437 ; LA64-NEXT:    ret
438   %add = add i64 %x, 2147420159
439   ret i64 %add
442 define i32 @add_i32_0x7ffef800(i32 %x) {
443 ; LA32-LABEL: add_i32_0x7ffef800:
444 ; LA32:       # %bb.0:
445 ; LA32-NEXT:    lu12i.w $a1, 524271
446 ; LA32-NEXT:    ori $a1, $a1, 2048
447 ; LA32-NEXT:    add.w $a0, $a0, $a1
448 ; LA32-NEXT:    ret
450 ; LA64-LABEL: add_i32_0x7ffef800:
451 ; LA64:       # %bb.0:
452 ; LA64-NEXT:    addu16i.d $a0, $a0, 32767
453 ; LA64-NEXT:    addi.d $a0, $a0, -2048
454 ; LA64-NEXT:    ret
455   %add = add i32 %x, 2147416064
456   ret i32 %add
459 define signext i32 @add_i32_0x7ffef800_sext(i32 %x) {
460 ; LA32-LABEL: add_i32_0x7ffef800_sext:
461 ; LA32:       # %bb.0:
462 ; LA32-NEXT:    lu12i.w $a1, 524271
463 ; LA32-NEXT:    ori $a1, $a1, 2048
464 ; LA32-NEXT:    add.w $a0, $a0, $a1
465 ; LA32-NEXT:    ret
467 ; LA64-LABEL: add_i32_0x7ffef800_sext:
468 ; LA64:       # %bb.0:
469 ; LA64-NEXT:    addu16i.d $a0, $a0, 32767
470 ; LA64-NEXT:    addi.w $a0, $a0, -2048
471 ; LA64-NEXT:    ret
472   %add = add i32 %x, 2147416064
473   ret i32 %add
476 define i64 @add_i64_0x7ffef800(i64 %x) {
477 ; LA32-LABEL: add_i64_0x7ffef800:
478 ; LA32:       # %bb.0:
479 ; LA32-NEXT:    lu12i.w $a2, 524271
480 ; LA32-NEXT:    ori $a2, $a2, 2048
481 ; LA32-NEXT:    add.w $a2, $a0, $a2
482 ; LA32-NEXT:    sltu $a0, $a2, $a0
483 ; LA32-NEXT:    add.w $a1, $a1, $a0
484 ; LA32-NEXT:    move $a0, $a2
485 ; LA32-NEXT:    ret
487 ; LA64-LABEL: add_i64_0x7ffef800:
488 ; LA64:       # %bb.0:
489 ; LA64-NEXT:    addu16i.d $a0, $a0, 32767
490 ; LA64-NEXT:    addi.d $a0, $a0, -2048
491 ; LA64-NEXT:    ret
492   %add = add i64 %x, 2147416064
493   ret i64 %add
496 define i64 @add_i64_minus_0x80000800(i64 %x) {
497 ; LA32-LABEL: add_i64_minus_0x80000800:
498 ; LA32:       # %bb.0:
499 ; LA32-NEXT:    lu12i.w $a2, 524287
500 ; LA32-NEXT:    ori $a2, $a2, 2048
501 ; LA32-NEXT:    add.w $a2, $a0, $a2
502 ; LA32-NEXT:    sltu $a0, $a2, $a0
503 ; LA32-NEXT:    add.w $a0, $a1, $a0
504 ; LA32-NEXT:    addi.w $a1, $a0, -1
505 ; LA32-NEXT:    move $a0, $a2
506 ; LA32-NEXT:    ret
508 ; LA64-LABEL: add_i64_minus_0x80000800:
509 ; LA64:       # %bb.0:
510 ; LA64-NEXT:    addu16i.d $a0, $a0, -32768
511 ; LA64-NEXT:    addi.d $a0, $a0, -2048
512 ; LA64-NEXT:    ret
513   %add = add i64 %x, -2147485696
514   ret i64 %add
517 define i32 @add_i32_minus_0x23450679(i32 %x) {
518 ; LA32-LABEL: add_i32_minus_0x23450679:
519 ; LA32:       # %bb.0:
520 ; LA32-NEXT:    lu12i.w $a1, -144465
521 ; LA32-NEXT:    ori $a1, $a1, 2439
522 ; LA32-NEXT:    add.w $a0, $a0, $a1
523 ; LA32-NEXT:    ret
525 ; LA64-LABEL: add_i32_minus_0x23450679:
526 ; LA64:       # %bb.0:
527 ; LA64-NEXT:    addu16i.d $a0, $a0, -9029
528 ; LA64-NEXT:    addi.d $a0, $a0, -1657
529 ; LA64-NEXT:    ret
530   %add = add i32 %x, -591726201
531   ret i32 %add
534 define signext i32 @add_i32_minus_0x23450679_sext(i32 %x) {
535 ; LA32-LABEL: add_i32_minus_0x23450679_sext:
536 ; LA32:       # %bb.0:
537 ; LA32-NEXT:    lu12i.w $a1, -144465
538 ; LA32-NEXT:    ori $a1, $a1, 2439
539 ; LA32-NEXT:    add.w $a0, $a0, $a1
540 ; LA32-NEXT:    ret
542 ; LA64-LABEL: add_i32_minus_0x23450679_sext:
543 ; LA64:       # %bb.0:
544 ; LA64-NEXT:    addu16i.d $a0, $a0, -9029
545 ; LA64-NEXT:    addi.w $a0, $a0, -1657
546 ; LA64-NEXT:    ret
547   %add = add i32 %x, -591726201
548   ret i32 %add
551 define i64 @add_i64_minus_0x23450679(i64 %x) {
552 ; LA32-LABEL: add_i64_minus_0x23450679:
553 ; LA32:       # %bb.0:
554 ; LA32-NEXT:    lu12i.w $a2, -144465
555 ; LA32-NEXT:    ori $a2, $a2, 2439
556 ; LA32-NEXT:    add.w $a2, $a0, $a2
557 ; LA32-NEXT:    sltu $a0, $a2, $a0
558 ; LA32-NEXT:    add.w $a0, $a1, $a0
559 ; LA32-NEXT:    addi.w $a1, $a0, -1
560 ; LA32-NEXT:    move $a0, $a2
561 ; LA32-NEXT:    ret
563 ; LA64-LABEL: add_i64_minus_0x23450679:
564 ; LA64:       # %bb.0:
565 ; LA64-NEXT:    addu16i.d $a0, $a0, -9029
566 ; LA64-NEXT:    addi.d $a0, $a0, -1657
567 ; LA64-NEXT:    ret
568   %add = add i64 %x, -591726201
569   ret i64 %add
572 define i32 @add_i32_minus_0x2345fedd(i32 %x) {
573 ; LA32-LABEL: add_i32_minus_0x2345fedd:
574 ; LA32:       # %bb.0:
575 ; LA32-NEXT:    lu12i.w $a1, -144480
576 ; LA32-NEXT:    ori $a1, $a1, 291
577 ; LA32-NEXT:    add.w $a0, $a0, $a1
578 ; LA32-NEXT:    ret
580 ; LA64-LABEL: add_i32_minus_0x2345fedd:
581 ; LA64:       # %bb.0:
582 ; LA64-NEXT:    addu16i.d $a0, $a0, -9030
583 ; LA64-NEXT:    addi.d $a0, $a0, 291
584 ; LA64-NEXT:    ret
585   %add = add i32 %x, -591789789
586   ret i32 %add
589 define signext i32 @add_i32_minus_0x2345fedd_sext(i32 %x) {
590 ; LA32-LABEL: add_i32_minus_0x2345fedd_sext:
591 ; LA32:       # %bb.0:
592 ; LA32-NEXT:    lu12i.w $a1, -144480
593 ; LA32-NEXT:    ori $a1, $a1, 291
594 ; LA32-NEXT:    add.w $a0, $a0, $a1
595 ; LA32-NEXT:    ret
597 ; LA64-LABEL: add_i32_minus_0x2345fedd_sext:
598 ; LA64:       # %bb.0:
599 ; LA64-NEXT:    addu16i.d $a0, $a0, -9030
600 ; LA64-NEXT:    addi.w $a0, $a0, 291
601 ; LA64-NEXT:    ret
602   %add = add i32 %x, -591789789
603   ret i32 %add
606 define i64 @add_i64_minus_0x2345fedd(i64 %x) {
607 ; LA32-LABEL: add_i64_minus_0x2345fedd:
608 ; LA32:       # %bb.0:
609 ; LA32-NEXT:    lu12i.w $a2, -144480
610 ; LA32-NEXT:    ori $a2, $a2, 291
611 ; LA32-NEXT:    add.w $a2, $a0, $a2
612 ; LA32-NEXT:    sltu $a0, $a2, $a0
613 ; LA32-NEXT:    add.w $a0, $a1, $a0
614 ; LA32-NEXT:    addi.w $a1, $a0, -1
615 ; LA32-NEXT:    move $a0, $a2
616 ; LA32-NEXT:    ret
618 ; LA64-LABEL: add_i64_minus_0x2345fedd:
619 ; LA64:       # %bb.0:
620 ; LA64-NEXT:    addu16i.d $a0, $a0, -9030
621 ; LA64-NEXT:    addi.d $a0, $a0, 291
622 ; LA64-NEXT:    ret
623   %add = add i64 %x, -591789789
624   ret i64 %add
627 ;; Check that `addu16i.d` isn't used for the following cases.
629 define i64 @add_i64_0x80000000(i64 %x) {
630 ; LA32-LABEL: add_i64_0x80000000:
631 ; LA32:       # %bb.0:
632 ; LA32-NEXT:    lu12i.w $a2, -524288
633 ; LA32-NEXT:    add.w $a2, $a0, $a2
634 ; LA32-NEXT:    sltu $a0, $a2, $a0
635 ; LA32-NEXT:    add.w $a1, $a1, $a0
636 ; LA32-NEXT:    move $a0, $a2
637 ; LA32-NEXT:    ret
639 ; LA64-LABEL: add_i64_0x80000000:
640 ; LA64:       # %bb.0:
641 ; LA64-NEXT:    lu12i.w $a1, -524288
642 ; LA64-NEXT:    lu32i.d $a1, 0
643 ; LA64-NEXT:    add.d $a0, $a0, $a1
644 ; LA64-NEXT:    ret
645   %add = add i64 %x, 2147483648
646   ret i64 %add
649 define i64 @add_i64_0xffff0000(i64 %x) {
650 ; LA32-LABEL: add_i64_0xffff0000:
651 ; LA32:       # %bb.0:
652 ; LA32-NEXT:    lu12i.w $a2, -16
653 ; LA32-NEXT:    add.w $a2, $a0, $a2
654 ; LA32-NEXT:    sltu $a0, $a2, $a0
655 ; LA32-NEXT:    add.w $a1, $a1, $a0
656 ; LA32-NEXT:    move $a0, $a2
657 ; LA32-NEXT:    ret
659 ; LA64-LABEL: add_i64_0xffff0000:
660 ; LA64:       # %bb.0:
661 ; LA64-NEXT:    lu12i.w $a1, -16
662 ; LA64-NEXT:    lu32i.d $a1, 0
663 ; LA64-NEXT:    add.d $a0, $a0, $a1
664 ; LA64-NEXT:    ret
665   %add = add i64 %x, 4294901760
666   ret i64 %add
669 ;; -0x80000800 is equivalent to +0x7ffff800 in i32, so addu16i.d isn't matched
670 ;; in this case.
671 define i32 @add_i32_minus_0x80000800(i32 %x) {
672 ; LA32-LABEL: add_i32_minus_0x80000800:
673 ; LA32:       # %bb.0:
674 ; LA32-NEXT:    lu12i.w $a1, 524287
675 ; LA32-NEXT:    ori $a1, $a1, 2048
676 ; LA32-NEXT:    add.w $a0, $a0, $a1
677 ; LA32-NEXT:    ret
679 ; LA64-LABEL: add_i32_minus_0x80000800:
680 ; LA64:       # %bb.0:
681 ; LA64-NEXT:    lu12i.w $a1, 524287
682 ; LA64-NEXT:    ori $a1, $a1, 2048
683 ; LA64-NEXT:    add.d $a0, $a0, $a1
684 ; LA64-NEXT:    ret
685   %add = add i32 %x, -2147485696
686   ret i32 %add
689 define signext i32 @add_i32_minus_0x80000800_sext(i32 %x) {
690 ; LA32-LABEL: add_i32_minus_0x80000800_sext:
691 ; LA32:       # %bb.0:
692 ; LA32-NEXT:    lu12i.w $a1, 524287
693 ; LA32-NEXT:    ori $a1, $a1, 2048
694 ; LA32-NEXT:    add.w $a0, $a0, $a1
695 ; LA32-NEXT:    ret
697 ; LA64-LABEL: add_i32_minus_0x80000800_sext:
698 ; LA64:       # %bb.0:
699 ; LA64-NEXT:    lu12i.w $a1, 524287
700 ; LA64-NEXT:    ori $a1, $a1, 2048
701 ; LA64-NEXT:    add.w $a0, $a0, $a1
702 ; LA64-NEXT:    ret
703   %add = add i32 %x, -2147485696
704   ret i32 %add
707 define signext i32 @add_i32_4080(i32 %x) {
708 ; LA32-LABEL: add_i32_4080:
709 ; LA32:       # %bb.0:
710 ; LA32-NEXT:    addi.w $a0, $a0, 2047
711 ; LA32-NEXT:    addi.w $a0, $a0, 2033
712 ; LA32-NEXT:    ret
714 ; LA64-LABEL: add_i32_4080:
715 ; LA64:       # %bb.0:
716 ; LA64-NEXT:    addi.w $a0, $a0, 2047
717 ; LA64-NEXT:    addi.w $a0, $a0, 2033
718 ; LA64-NEXT:    ret
719   %add = add i32 %x, 4080
720   ret i32 %add
723 define signext i32 @add_i32_minus_4080(i32 %x) {
724 ; LA32-LABEL: add_i32_minus_4080:
725 ; LA32:       # %bb.0:
726 ; LA32-NEXT:    addi.w $a0, $a0, -2048
727 ; LA32-NEXT:    addi.w $a0, $a0, -2032
728 ; LA32-NEXT:    ret
730 ; LA64-LABEL: add_i32_minus_4080:
731 ; LA64:       # %bb.0:
732 ; LA64-NEXT:    addi.w $a0, $a0, -2048
733 ; LA64-NEXT:    addi.w $a0, $a0, -2032
734 ; LA64-NEXT:    ret
735   %add = add i32 %x, -4080
736   ret i32 %add
739 define signext i32 @add_i32_2048(i32 %x) {
740 ; LA32-LABEL: add_i32_2048:
741 ; LA32:       # %bb.0:
742 ; LA32-NEXT:    addi.w $a0, $a0, 2047
743 ; LA32-NEXT:    addi.w $a0, $a0, 1
744 ; LA32-NEXT:    ret
746 ; LA64-LABEL: add_i32_2048:
747 ; LA64:       # %bb.0:
748 ; LA64-NEXT:    addi.w $a0, $a0, 2047
749 ; LA64-NEXT:    addi.w $a0, $a0, 1
750 ; LA64-NEXT:    ret
751   %add = add i32 %x, 2048
752   ret i32 %add
755 define signext i32 @add_i32_4094(i32 %x) {
756 ; LA32-LABEL: add_i32_4094:
757 ; LA32:       # %bb.0:
758 ; LA32-NEXT:    addi.w $a0, $a0, 2047
759 ; LA32-NEXT:    addi.w $a0, $a0, 2047
760 ; LA32-NEXT:    ret
762 ; LA64-LABEL: add_i32_4094:
763 ; LA64:       # %bb.0:
764 ; LA64-NEXT:    addi.w $a0, $a0, 2047
765 ; LA64-NEXT:    addi.w $a0, $a0, 2047
766 ; LA64-NEXT:    ret
767   %add = add i32 %x, 4094
768   ret i32 %add
771 define signext i32 @add_i32_minus_2049(i32 %x) {
772 ; LA32-LABEL: add_i32_minus_2049:
773 ; LA32:       # %bb.0:
774 ; LA32-NEXT:    addi.w $a0, $a0, -2048
775 ; LA32-NEXT:    addi.w $a0, $a0, -1
776 ; LA32-NEXT:    ret
778 ; LA64-LABEL: add_i32_minus_2049:
779 ; LA64:       # %bb.0:
780 ; LA64-NEXT:    addi.w $a0, $a0, -2048
781 ; LA64-NEXT:    addi.w $a0, $a0, -1
782 ; LA64-NEXT:    ret
783   %add = add i32 %x, -2049
784   ret i32 %add
787 define signext i32 @add_i32_minus_4096(i32 %x) {
788 ; LA32-LABEL: add_i32_minus_4096:
789 ; LA32:       # %bb.0:
790 ; LA32-NEXT:    addi.w $a0, $a0, -2048
791 ; LA32-NEXT:    addi.w $a0, $a0, -2048
792 ; LA32-NEXT:    ret
794 ; LA64-LABEL: add_i32_minus_4096:
795 ; LA64:       # %bb.0:
796 ; LA64-NEXT:    addi.w $a0, $a0, -2048
797 ; LA64-NEXT:    addi.w $a0, $a0, -2048
798 ; LA64-NEXT:    ret
799   %add = add i32 %x, -4096
800   ret i32 %add
803 define i64 @add_i64_4080(i64 %x) {
804 ; LA32-LABEL: add_i64_4080:
805 ; LA32:       # %bb.0:
806 ; LA32-NEXT:    addi.w $a2, $a0, 2047
807 ; LA32-NEXT:    addi.w $a2, $a2, 2033
808 ; LA32-NEXT:    sltu $a0, $a2, $a0
809 ; LA32-NEXT:    add.w $a1, $a1, $a0
810 ; LA32-NEXT:    move $a0, $a2
811 ; LA32-NEXT:    ret
813 ; LA64-LABEL: add_i64_4080:
814 ; LA64:       # %bb.0:
815 ; LA64-NEXT:    addi.d $a0, $a0, 2047
816 ; LA64-NEXT:    addi.d $a0, $a0, 2033
817 ; LA64-NEXT:    ret
818   %add = add i64 %x, 4080
819   ret i64 %add
822 define i64 @add_i64_minus_4080(i64 %x) {
823 ; LA32-LABEL: add_i64_minus_4080:
824 ; LA32:       # %bb.0:
825 ; LA32-NEXT:    addi.w $a2, $a0, -2048
826 ; LA32-NEXT:    addi.w $a2, $a2, -2032
827 ; LA32-NEXT:    sltu $a0, $a2, $a0
828 ; LA32-NEXT:    add.w $a0, $a1, $a0
829 ; LA32-NEXT:    addi.w $a1, $a0, -1
830 ; LA32-NEXT:    move $a0, $a2
831 ; LA32-NEXT:    ret
833 ; LA64-LABEL: add_i64_minus_4080:
834 ; LA64:       # %bb.0:
835 ; LA64-NEXT:    addi.d $a0, $a0, -2048
836 ; LA64-NEXT:    addi.d $a0, $a0, -2032
837 ; LA64-NEXT:    ret
838   %add = add i64 %x, -4080
839   ret i64 %add
842 define i64 @add_i64_2048(i64 %x) {
843 ; LA32-LABEL: add_i64_2048:
844 ; LA32:       # %bb.0:
845 ; LA32-NEXT:    addi.w $a2, $a0, 2047
846 ; LA32-NEXT:    addi.w $a2, $a2, 1
847 ; LA32-NEXT:    sltu $a0, $a2, $a0
848 ; LA32-NEXT:    add.w $a1, $a1, $a0
849 ; LA32-NEXT:    move $a0, $a2
850 ; LA32-NEXT:    ret
852 ; LA64-LABEL: add_i64_2048:
853 ; LA64:       # %bb.0:
854 ; LA64-NEXT:    addi.d $a0, $a0, 2047
855 ; LA64-NEXT:    addi.d $a0, $a0, 1
856 ; LA64-NEXT:    ret
857   %add = add i64 %x, 2048
858   ret i64 %add
861 define i64 @add_i64_4094(i64 %x) {
862 ; LA32-LABEL: add_i64_4094:
863 ; LA32:       # %bb.0:
864 ; LA32-NEXT:    addi.w $a2, $a0, 2047
865 ; LA32-NEXT:    addi.w $a2, $a2, 2047
866 ; LA32-NEXT:    sltu $a0, $a2, $a0
867 ; LA32-NEXT:    add.w $a1, $a1, $a0
868 ; LA32-NEXT:    move $a0, $a2
869 ; LA32-NEXT:    ret
871 ; LA64-LABEL: add_i64_4094:
872 ; LA64:       # %bb.0:
873 ; LA64-NEXT:    addi.d $a0, $a0, 2047
874 ; LA64-NEXT:    addi.d $a0, $a0, 2047
875 ; LA64-NEXT:    ret
876   %add = add i64 %x, 4094
877   ret i64 %add
880 define i64 @add_i64_minus_2049(i64 %x) {
881 ; LA32-LABEL: add_i64_minus_2049:
882 ; LA32:       # %bb.0:
883 ; LA32-NEXT:    addi.w $a2, $a0, -2048
884 ; LA32-NEXT:    addi.w $a2, $a2, -1
885 ; LA32-NEXT:    sltu $a0, $a2, $a0
886 ; LA32-NEXT:    add.w $a0, $a1, $a0
887 ; LA32-NEXT:    addi.w $a1, $a0, -1
888 ; LA32-NEXT:    move $a0, $a2
889 ; LA32-NEXT:    ret
891 ; LA64-LABEL: add_i64_minus_2049:
892 ; LA64:       # %bb.0:
893 ; LA64-NEXT:    addi.d $a0, $a0, -2048
894 ; LA64-NEXT:    addi.d $a0, $a0, -1
895 ; LA64-NEXT:    ret
896   %add = add i64 %x, -2049
897   ret i64 %add
900 define i64 @add_i64_minus_4096(i64 %x) {
901 ; LA32-LABEL: add_i64_minus_4096:
902 ; LA32:       # %bb.0:
903 ; LA32-NEXT:    addi.w $a2, $a0, -2048
904 ; LA32-NEXT:    addi.w $a2, $a2, -2048
905 ; LA32-NEXT:    sltu $a0, $a2, $a0
906 ; LA32-NEXT:    add.w $a0, $a1, $a0
907 ; LA32-NEXT:    addi.w $a1, $a0, -1
908 ; LA32-NEXT:    move $a0, $a2
909 ; LA32-NEXT:    ret
911 ; LA64-LABEL: add_i64_minus_4096:
912 ; LA64:       # %bb.0:
913 ; LA64-NEXT:    addi.d $a0, $a0, -2048
914 ; LA64-NEXT:    addi.d $a0, $a0, -2048
915 ; LA64-NEXT:    ret
916   %add = add i64 %x, -4096
917   ret i64 %add