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) {
10 ; LA32-NEXT: add.w $a0, $a0, $a1
15 ; LA64-NEXT: add.d $a0, $a0, $a1
21 define i8 @add_i8(i8 %x, i8 %y) {
24 ; LA32-NEXT: add.w $a0, $a0, $a1
29 ; LA64-NEXT: add.d $a0, $a0, $a1
35 define i16 @add_i16(i16 %x, i16 %y) {
36 ; LA32-LABEL: add_i16:
38 ; LA32-NEXT: add.w $a0, $a0, $a1
41 ; LA64-LABEL: add_i16:
43 ; LA64-NEXT: add.d $a0, $a0, $a1
49 define i32 @add_i32(i32 %x, i32 %y) {
50 ; LA32-LABEL: add_i32:
52 ; LA32-NEXT: add.w $a0, $a0, $a1
55 ; LA64-LABEL: add_i32:
57 ; LA64-NEXT: add.d $a0, $a0, $a1
64 ;; def : PatGprGpr_32<add, ADD_W>;
65 define signext i32 @add_i32_sext(i32 %x, i32 %y) {
66 ; LA32-LABEL: add_i32_sext:
68 ; LA32-NEXT: add.w $a0, $a0, $a1
71 ; LA64-LABEL: add_i32_sext:
73 ; LA64-NEXT: add.w $a0, $a0, $a1
79 define i64 @add_i64(i64 %x, i64 %y) {
80 ; LA32-LABEL: add_i64:
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
89 ; LA64-LABEL: add_i64:
91 ; LA64-NEXT: add.d $a0, $a0, $a1
97 define i1 @add_i1_3(i1 %x) {
98 ; LA32-LABEL: add_i1_3:
100 ; LA32-NEXT: addi.w $a0, $a0, 1
103 ; LA64-LABEL: add_i1_3:
105 ; LA64-NEXT: addi.d $a0, $a0, 1
111 define i8 @add_i8_3(i8 %x) {
112 ; LA32-LABEL: add_i8_3:
114 ; LA32-NEXT: addi.w $a0, $a0, 3
117 ; LA64-LABEL: add_i8_3:
119 ; LA64-NEXT: addi.d $a0, $a0, 3
125 define i16 @add_i16_3(i16 %x) {
126 ; LA32-LABEL: add_i16_3:
128 ; LA32-NEXT: addi.w $a0, $a0, 3
131 ; LA64-LABEL: add_i16_3:
133 ; LA64-NEXT: addi.d $a0, $a0, 3
139 define i32 @add_i32_3(i32 %x) {
140 ; LA32-LABEL: add_i32_3:
142 ; LA32-NEXT: addi.w $a0, $a0, 3
145 ; LA64-LABEL: add_i32_3:
147 ; LA64-NEXT: addi.d $a0, $a0, 3
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:
158 ; LA32-NEXT: addi.w $a0, $a0, 3
161 ; LA64-LABEL: add_i32_3_sext:
163 ; LA64-NEXT: addi.w $a0, $a0, 3
169 define i64 @add_i64_3(i64 %x) {
170 ; LA32-LABEL: add_i64_3:
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
178 ; LA64-LABEL: add_i64_3:
180 ; LA64-NEXT: addi.d $a0, $a0, 3
186 ;; Check that `addu16i.d` is emitted for these cases.
188 define i32 @add_i32_0x12340000(i32 %x) {
189 ; LA32-LABEL: add_i32_0x12340000:
191 ; LA32-NEXT: lu12i.w $a1, 74560
192 ; LA32-NEXT: add.w $a0, $a0, $a1
195 ; LA64-LABEL: add_i32_0x12340000:
197 ; LA64-NEXT: addu16i.d $a0, $a0, 4660
199 %add = add i32 %x, 305397760
203 define signext i32 @add_i32_0x12340000_sext(i32 %x) {
204 ; LA32-LABEL: add_i32_0x12340000_sext:
206 ; LA32-NEXT: lu12i.w $a1, 74560
207 ; LA32-NEXT: add.w $a0, $a0, $a1
210 ; LA64-LABEL: add_i32_0x12340000_sext:
212 ; LA64-NEXT: addu16i.d $a0, $a0, 4660
213 ; LA64-NEXT: addi.w $a0, $a0, 0
215 %add = add i32 %x, 305397760
219 define i64 @add_i64_0x12340000(i64 %x) {
220 ; LA32-LABEL: add_i64_0x12340000:
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
229 ; LA64-LABEL: add_i64_0x12340000:
231 ; LA64-NEXT: addu16i.d $a0, $a0, 4660
233 %add = add i64 %x, 305397760
237 define i32 @add_i32_0x7fff0000(i32 %x) {
238 ; LA32-LABEL: add_i32_0x7fff0000:
240 ; LA32-NEXT: lu12i.w $a1, 524272
241 ; LA32-NEXT: add.w $a0, $a0, $a1
244 ; LA64-LABEL: add_i32_0x7fff0000:
246 ; LA64-NEXT: addu16i.d $a0, $a0, 32767
248 %add = add i32 %x, 2147418112
252 define signext i32 @add_i32_0x7fff0000_sext(i32 %x) {
253 ; LA32-LABEL: add_i32_0x7fff0000_sext:
255 ; LA32-NEXT: lu12i.w $a1, 524272
256 ; LA32-NEXT: add.w $a0, $a0, $a1
259 ; LA64-LABEL: add_i32_0x7fff0000_sext:
261 ; LA64-NEXT: addu16i.d $a0, $a0, 32767
262 ; LA64-NEXT: addi.w $a0, $a0, 0
264 %add = add i32 %x, 2147418112
268 define i64 @add_i64_0x7fff0000(i64 %x) {
269 ; LA32-LABEL: add_i64_0x7fff0000:
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
278 ; LA64-LABEL: add_i64_0x7fff0000:
280 ; LA64-NEXT: addu16i.d $a0, $a0, 32767
282 %add = add i64 %x, 2147418112
286 define i32 @add_i32_minus_0x80000000(i32 %x) {
287 ; LA32-LABEL: add_i32_minus_0x80000000:
289 ; LA32-NEXT: lu12i.w $a1, -524288
290 ; LA32-NEXT: add.w $a0, $a0, $a1
293 ; LA64-LABEL: add_i32_minus_0x80000000:
295 ; LA64-NEXT: addu16i.d $a0, $a0, -32768
297 %add = add i32 %x, -2147483648
301 define signext i32 @add_i32_minus_0x80000000_sext(i32 %x) {
302 ; LA32-LABEL: add_i32_minus_0x80000000_sext:
304 ; LA32-NEXT: lu12i.w $a1, -524288
305 ; LA32-NEXT: add.w $a0, $a0, $a1
308 ; LA64-LABEL: add_i32_minus_0x80000000_sext:
310 ; LA64-NEXT: addu16i.d $a0, $a0, -32768
311 ; LA64-NEXT: addi.w $a0, $a0, 0
313 %add = add i32 %x, -2147483648
317 define i64 @add_i64_minus_0x80000000(i64 %x) {
318 ; LA32-LABEL: add_i64_minus_0x80000000:
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
328 ; LA64-LABEL: add_i64_minus_0x80000000:
330 ; LA64-NEXT: addu16i.d $a0, $a0, -32768
332 %add = add i64 %x, -2147483648
336 define i32 @add_i32_minus_0x10000(i32 %x) {
337 ; LA32-LABEL: add_i32_minus_0x10000:
339 ; LA32-NEXT: lu12i.w $a1, -16
340 ; LA32-NEXT: add.w $a0, $a0, $a1
343 ; LA64-LABEL: add_i32_minus_0x10000:
345 ; LA64-NEXT: addu16i.d $a0, $a0, -1
347 %add = add i32 %x, -65536
351 define signext i32 @add_i32_minus_0x10000_sext(i32 %x) {
352 ; LA32-LABEL: add_i32_minus_0x10000_sext:
354 ; LA32-NEXT: lu12i.w $a1, -16
355 ; LA32-NEXT: add.w $a0, $a0, $a1
358 ; LA64-LABEL: add_i32_minus_0x10000_sext:
360 ; LA64-NEXT: addu16i.d $a0, $a0, -1
361 ; LA64-NEXT: addi.w $a0, $a0, 0
363 %add = add i32 %x, -65536
367 define i64 @add_i64_minus_0x10000(i64 %x) {
368 ; LA32-LABEL: add_i64_minus_0x10000:
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
378 ; LA64-LABEL: add_i64_minus_0x10000:
380 ; LA64-NEXT: addu16i.d $a0, $a0, -1
382 %add = add i64 %x, -65536
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:
391 ; LA32-NEXT: lu12i.w $a1, 524272
392 ; LA32-NEXT: ori $a1, $a1, 2047
393 ; LA32-NEXT: add.w $a0, $a0, $a1
396 ; LA64-LABEL: add_i32_0x7fff07ff:
398 ; LA64-NEXT: addu16i.d $a0, $a0, 32767
399 ; LA64-NEXT: addi.d $a0, $a0, 2047
401 %add = add i32 %x, 2147420159
405 define signext i32 @add_i32_0x7fff07ff_sext(i32 %x) {
406 ; LA32-LABEL: add_i32_0x7fff07ff_sext:
408 ; LA32-NEXT: lu12i.w $a1, 524272
409 ; LA32-NEXT: ori $a1, $a1, 2047
410 ; LA32-NEXT: add.w $a0, $a0, $a1
413 ; LA64-LABEL: add_i32_0x7fff07ff_sext:
415 ; LA64-NEXT: addu16i.d $a0, $a0, 32767
416 ; LA64-NEXT: addi.w $a0, $a0, 2047
418 %add = add i32 %x, 2147420159
422 define i64 @add_i64_0x7fff07ff(i64 %x) {
423 ; LA32-LABEL: add_i64_0x7fff07ff:
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
433 ; LA64-LABEL: add_i64_0x7fff07ff:
435 ; LA64-NEXT: addu16i.d $a0, $a0, 32767
436 ; LA64-NEXT: addi.d $a0, $a0, 2047
438 %add = add i64 %x, 2147420159
442 define i32 @add_i32_0x7ffef800(i32 %x) {
443 ; LA32-LABEL: add_i32_0x7ffef800:
445 ; LA32-NEXT: lu12i.w $a1, 524271
446 ; LA32-NEXT: ori $a1, $a1, 2048
447 ; LA32-NEXT: add.w $a0, $a0, $a1
450 ; LA64-LABEL: add_i32_0x7ffef800:
452 ; LA64-NEXT: addu16i.d $a0, $a0, 32767
453 ; LA64-NEXT: addi.d $a0, $a0, -2048
455 %add = add i32 %x, 2147416064
459 define signext i32 @add_i32_0x7ffef800_sext(i32 %x) {
460 ; LA32-LABEL: add_i32_0x7ffef800_sext:
462 ; LA32-NEXT: lu12i.w $a1, 524271
463 ; LA32-NEXT: ori $a1, $a1, 2048
464 ; LA32-NEXT: add.w $a0, $a0, $a1
467 ; LA64-LABEL: add_i32_0x7ffef800_sext:
469 ; LA64-NEXT: addu16i.d $a0, $a0, 32767
470 ; LA64-NEXT: addi.w $a0, $a0, -2048
472 %add = add i32 %x, 2147416064
476 define i64 @add_i64_0x7ffef800(i64 %x) {
477 ; LA32-LABEL: add_i64_0x7ffef800:
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
487 ; LA64-LABEL: add_i64_0x7ffef800:
489 ; LA64-NEXT: addu16i.d $a0, $a0, 32767
490 ; LA64-NEXT: addi.d $a0, $a0, -2048
492 %add = add i64 %x, 2147416064
496 define i64 @add_i64_minus_0x80000800(i64 %x) {
497 ; LA32-LABEL: add_i64_minus_0x80000800:
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
508 ; LA64-LABEL: add_i64_minus_0x80000800:
510 ; LA64-NEXT: addu16i.d $a0, $a0, -32768
511 ; LA64-NEXT: addi.d $a0, $a0, -2048
513 %add = add i64 %x, -2147485696
517 define i32 @add_i32_minus_0x23450679(i32 %x) {
518 ; LA32-LABEL: add_i32_minus_0x23450679:
520 ; LA32-NEXT: lu12i.w $a1, -144465
521 ; LA32-NEXT: ori $a1, $a1, 2439
522 ; LA32-NEXT: add.w $a0, $a0, $a1
525 ; LA64-LABEL: add_i32_minus_0x23450679:
527 ; LA64-NEXT: addu16i.d $a0, $a0, -9029
528 ; LA64-NEXT: addi.d $a0, $a0, -1657
530 %add = add i32 %x, -591726201
534 define signext i32 @add_i32_minus_0x23450679_sext(i32 %x) {
535 ; LA32-LABEL: add_i32_minus_0x23450679_sext:
537 ; LA32-NEXT: lu12i.w $a1, -144465
538 ; LA32-NEXT: ori $a1, $a1, 2439
539 ; LA32-NEXT: add.w $a0, $a0, $a1
542 ; LA64-LABEL: add_i32_minus_0x23450679_sext:
544 ; LA64-NEXT: addu16i.d $a0, $a0, -9029
545 ; LA64-NEXT: addi.w $a0, $a0, -1657
547 %add = add i32 %x, -591726201
551 define i64 @add_i64_minus_0x23450679(i64 %x) {
552 ; LA32-LABEL: add_i64_minus_0x23450679:
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
563 ; LA64-LABEL: add_i64_minus_0x23450679:
565 ; LA64-NEXT: addu16i.d $a0, $a0, -9029
566 ; LA64-NEXT: addi.d $a0, $a0, -1657
568 %add = add i64 %x, -591726201
572 define i32 @add_i32_minus_0x2345fedd(i32 %x) {
573 ; LA32-LABEL: add_i32_minus_0x2345fedd:
575 ; LA32-NEXT: lu12i.w $a1, -144480
576 ; LA32-NEXT: ori $a1, $a1, 291
577 ; LA32-NEXT: add.w $a0, $a0, $a1
580 ; LA64-LABEL: add_i32_minus_0x2345fedd:
582 ; LA64-NEXT: addu16i.d $a0, $a0, -9030
583 ; LA64-NEXT: addi.d $a0, $a0, 291
585 %add = add i32 %x, -591789789
589 define signext i32 @add_i32_minus_0x2345fedd_sext(i32 %x) {
590 ; LA32-LABEL: add_i32_minus_0x2345fedd_sext:
592 ; LA32-NEXT: lu12i.w $a1, -144480
593 ; LA32-NEXT: ori $a1, $a1, 291
594 ; LA32-NEXT: add.w $a0, $a0, $a1
597 ; LA64-LABEL: add_i32_minus_0x2345fedd_sext:
599 ; LA64-NEXT: addu16i.d $a0, $a0, -9030
600 ; LA64-NEXT: addi.w $a0, $a0, 291
602 %add = add i32 %x, -591789789
606 define i64 @add_i64_minus_0x2345fedd(i64 %x) {
607 ; LA32-LABEL: add_i64_minus_0x2345fedd:
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
618 ; LA64-LABEL: add_i64_minus_0x2345fedd:
620 ; LA64-NEXT: addu16i.d $a0, $a0, -9030
621 ; LA64-NEXT: addi.d $a0, $a0, 291
623 %add = add i64 %x, -591789789
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:
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
639 ; LA64-LABEL: add_i64_0x80000000:
641 ; LA64-NEXT: lu12i.w $a1, -524288
642 ; LA64-NEXT: lu32i.d $a1, 0
643 ; LA64-NEXT: add.d $a0, $a0, $a1
645 %add = add i64 %x, 2147483648
649 define i64 @add_i64_0xffff0000(i64 %x) {
650 ; LA32-LABEL: add_i64_0xffff0000:
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
659 ; LA64-LABEL: add_i64_0xffff0000:
661 ; LA64-NEXT: lu12i.w $a1, -16
662 ; LA64-NEXT: lu32i.d $a1, 0
663 ; LA64-NEXT: add.d $a0, $a0, $a1
665 %add = add i64 %x, 4294901760
669 ;; -0x80000800 is equivalent to +0x7ffff800 in i32, so addu16i.d isn't matched
671 define i32 @add_i32_minus_0x80000800(i32 %x) {
672 ; LA32-LABEL: add_i32_minus_0x80000800:
674 ; LA32-NEXT: lu12i.w $a1, 524287
675 ; LA32-NEXT: ori $a1, $a1, 2048
676 ; LA32-NEXT: add.w $a0, $a0, $a1
679 ; LA64-LABEL: add_i32_minus_0x80000800:
681 ; LA64-NEXT: lu12i.w $a1, 524287
682 ; LA64-NEXT: ori $a1, $a1, 2048
683 ; LA64-NEXT: add.d $a0, $a0, $a1
685 %add = add i32 %x, -2147485696
689 define signext i32 @add_i32_minus_0x80000800_sext(i32 %x) {
690 ; LA32-LABEL: add_i32_minus_0x80000800_sext:
692 ; LA32-NEXT: lu12i.w $a1, 524287
693 ; LA32-NEXT: ori $a1, $a1, 2048
694 ; LA32-NEXT: add.w $a0, $a0, $a1
697 ; LA64-LABEL: add_i32_minus_0x80000800_sext:
699 ; LA64-NEXT: lu12i.w $a1, 524287
700 ; LA64-NEXT: ori $a1, $a1, 2048
701 ; LA64-NEXT: add.w $a0, $a0, $a1
703 %add = add i32 %x, -2147485696
707 define signext i32 @add_i32_4080(i32 %x) {
708 ; LA32-LABEL: add_i32_4080:
710 ; LA32-NEXT: addi.w $a0, $a0, 2047
711 ; LA32-NEXT: addi.w $a0, $a0, 2033
714 ; LA64-LABEL: add_i32_4080:
716 ; LA64-NEXT: addi.w $a0, $a0, 2047
717 ; LA64-NEXT: addi.w $a0, $a0, 2033
719 %add = add i32 %x, 4080
723 define signext i32 @add_i32_minus_4080(i32 %x) {
724 ; LA32-LABEL: add_i32_minus_4080:
726 ; LA32-NEXT: addi.w $a0, $a0, -2048
727 ; LA32-NEXT: addi.w $a0, $a0, -2032
730 ; LA64-LABEL: add_i32_minus_4080:
732 ; LA64-NEXT: addi.w $a0, $a0, -2048
733 ; LA64-NEXT: addi.w $a0, $a0, -2032
735 %add = add i32 %x, -4080
739 define signext i32 @add_i32_2048(i32 %x) {
740 ; LA32-LABEL: add_i32_2048:
742 ; LA32-NEXT: addi.w $a0, $a0, 2047
743 ; LA32-NEXT: addi.w $a0, $a0, 1
746 ; LA64-LABEL: add_i32_2048:
748 ; LA64-NEXT: addi.w $a0, $a0, 2047
749 ; LA64-NEXT: addi.w $a0, $a0, 1
751 %add = add i32 %x, 2048
755 define signext i32 @add_i32_4094(i32 %x) {
756 ; LA32-LABEL: add_i32_4094:
758 ; LA32-NEXT: addi.w $a0, $a0, 2047
759 ; LA32-NEXT: addi.w $a0, $a0, 2047
762 ; LA64-LABEL: add_i32_4094:
764 ; LA64-NEXT: addi.w $a0, $a0, 2047
765 ; LA64-NEXT: addi.w $a0, $a0, 2047
767 %add = add i32 %x, 4094
771 define signext i32 @add_i32_minus_2049(i32 %x) {
772 ; LA32-LABEL: add_i32_minus_2049:
774 ; LA32-NEXT: addi.w $a0, $a0, -2048
775 ; LA32-NEXT: addi.w $a0, $a0, -1
778 ; LA64-LABEL: add_i32_minus_2049:
780 ; LA64-NEXT: addi.w $a0, $a0, -2048
781 ; LA64-NEXT: addi.w $a0, $a0, -1
783 %add = add i32 %x, -2049
787 define signext i32 @add_i32_minus_4096(i32 %x) {
788 ; LA32-LABEL: add_i32_minus_4096:
790 ; LA32-NEXT: addi.w $a0, $a0, -2048
791 ; LA32-NEXT: addi.w $a0, $a0, -2048
794 ; LA64-LABEL: add_i32_minus_4096:
796 ; LA64-NEXT: addi.w $a0, $a0, -2048
797 ; LA64-NEXT: addi.w $a0, $a0, -2048
799 %add = add i32 %x, -4096
803 define i64 @add_i64_4080(i64 %x) {
804 ; LA32-LABEL: add_i64_4080:
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
813 ; LA64-LABEL: add_i64_4080:
815 ; LA64-NEXT: addi.d $a0, $a0, 2047
816 ; LA64-NEXT: addi.d $a0, $a0, 2033
818 %add = add i64 %x, 4080
822 define i64 @add_i64_minus_4080(i64 %x) {
823 ; LA32-LABEL: add_i64_minus_4080:
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
833 ; LA64-LABEL: add_i64_minus_4080:
835 ; LA64-NEXT: addi.d $a0, $a0, -2048
836 ; LA64-NEXT: addi.d $a0, $a0, -2032
838 %add = add i64 %x, -4080
842 define i64 @add_i64_2048(i64 %x) {
843 ; LA32-LABEL: add_i64_2048:
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
852 ; LA64-LABEL: add_i64_2048:
854 ; LA64-NEXT: addi.d $a0, $a0, 2047
855 ; LA64-NEXT: addi.d $a0, $a0, 1
857 %add = add i64 %x, 2048
861 define i64 @add_i64_4094(i64 %x) {
862 ; LA32-LABEL: add_i64_4094:
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
871 ; LA64-LABEL: add_i64_4094:
873 ; LA64-NEXT: addi.d $a0, $a0, 2047
874 ; LA64-NEXT: addi.d $a0, $a0, 2047
876 %add = add i64 %x, 4094
880 define i64 @add_i64_minus_2049(i64 %x) {
881 ; LA32-LABEL: add_i64_minus_2049:
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
891 ; LA64-LABEL: add_i64_minus_2049:
893 ; LA64-NEXT: addi.d $a0, $a0, -2048
894 ; LA64-NEXT: addi.d $a0, $a0, -1
896 %add = add i64 %x, -2049
900 define i64 @add_i64_minus_4096(i64 %x) {
901 ; LA32-LABEL: add_i64_minus_4096:
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
911 ; LA64-LABEL: add_i64_minus_4096:
913 ; LA64-NEXT: addi.d $a0, $a0, -2048
914 ; LA64-NEXT: addi.d $a0, $a0, -2048
916 %add = add i64 %x, -4096