1; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32
2; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64
3
4;; Exercise the 'add' LLVM IR: https://llvm.org/docs/LangRef.html#add-instruction
5
6define i1 @add_i1(i1 %x, i1 %y) {
7; LA32-LABEL: add_i1:
8; LA32:       # %bb.0:
9; LA32-NEXT:    add.w $a0, $a0, $a1
10; LA32-NEXT:    jirl $zero, $ra, 0
11;
12; LA64-LABEL: add_i1:
13; LA64:       # %bb.0:
14; LA64-NEXT:    add.d $a0, $a0, $a1
15; LA64-NEXT:    jirl $zero, $ra, 0
16  %add = add i1 %x, %y
17  ret i1 %add
18}
19
20define i8 @add_i8(i8 %x, i8 %y) {
21; LA32-LABEL: add_i8:
22; LA32:       # %bb.0:
23; LA32-NEXT:    add.w $a0, $a0, $a1
24; LA32-NEXT:    jirl $zero, $ra, 0
25;
26; LA64-LABEL: add_i8:
27; LA64:       # %bb.0:
28; LA64-NEXT:    add.d $a0, $a0, $a1
29; LA64-NEXT:    jirl $zero, $ra, 0
30  %add = add i8 %x, %y
31  ret i8 %add
32}
33
34define i16 @add_i16(i16 %x, i16 %y) {
35; LA32-LABEL: add_i16:
36; LA32:       # %bb.0:
37; LA32-NEXT:    add.w $a0, $a0, $a1
38; LA32-NEXT:    jirl $zero, $ra, 0
39;
40; LA64-LABEL: add_i16:
41; LA64:       # %bb.0:
42; LA64-NEXT:    add.d $a0, $a0, $a1
43; LA64-NEXT:    jirl $zero, $ra, 0
44  %add = add i16 %x, %y
45  ret i16 %add
46}
47
48define i32 @add_i32(i32 %x, i32 %y) {
49; LA32-LABEL: add_i32:
50; LA32:       # %bb.0:
51; LA32-NEXT:    add.w $a0, $a0, $a1
52; LA32-NEXT:    jirl $zero, $ra, 0
53;
54; LA64-LABEL: add_i32:
55; LA64:       # %bb.0:
56; LA64-NEXT:    add.d $a0, $a0, $a1
57; LA64-NEXT:    jirl $zero, $ra, 0
58  %add = add i32 %x, %y
59  ret i32 %add
60}
61
62;; Match the pattern:
63;; def : PatGprGpr_32<add, ADD_W>;
64define signext i32 @add_i32_sext(i32 %x, i32 %y) {
65; LA32-LABEL: add_i32_sext:
66; LA32:       # %bb.0:
67; LA32-NEXT:    add.w $a0, $a0, $a1
68; LA32-NEXT:    jirl $zero, $ra, 0
69;
70; LA64-LABEL: add_i32_sext:
71; LA64:       # %bb.0:
72; LA64-NEXT:    add.w $a0, $a0, $a1
73; LA64-NEXT:    jirl $zero, $ra, 0
74  %add = add i32 %x, %y
75  ret i32 %add
76}
77
78define i64 @add_i64(i64 %x, i64 %y) {
79; LA32-LABEL: add_i64:
80; LA32:       # %bb.0:
81; LA32-NEXT:    add.w $a1, $a1, $a3
82; LA32-NEXT:    add.w $a2, $a0, $a2
83; LA32-NEXT:    sltu $a0, $a2, $a0
84; LA32-NEXT:    add.w $a1, $a1, $a0
85; LA32-NEXT:    move $a0, $a2
86; LA32-NEXT:    jirl $zero, $ra, 0
87;
88; LA64-LABEL: add_i64:
89; LA64:       # %bb.0:
90; LA64-NEXT:    add.d $a0, $a0, $a1
91; LA64-NEXT:    jirl $zero, $ra, 0
92  %add = add i64 %x, %y
93  ret i64 %add
94}
95
96define i1 @add_i1_3(i1 %x) {
97; LA32-LABEL: add_i1_3:
98; LA32:       # %bb.0:
99; LA32-NEXT:    addi.w $a0, $a0, 1
100; LA32-NEXT:    jirl $zero, $ra, 0
101;
102; LA64-LABEL: add_i1_3:
103; LA64:       # %bb.0:
104; LA64-NEXT:    addi.d $a0, $a0, 1
105; LA64-NEXT:    jirl $zero, $ra, 0
106  %add = add i1 %x, 3
107  ret i1 %add
108}
109
110define i8 @add_i8_3(i8 %x) {
111; LA32-LABEL: add_i8_3:
112; LA32:       # %bb.0:
113; LA32-NEXT:    addi.w $a0, $a0, 3
114; LA32-NEXT:    jirl $zero, $ra, 0
115;
116; LA64-LABEL: add_i8_3:
117; LA64:       # %bb.0:
118; LA64-NEXT:    addi.d $a0, $a0, 3
119; LA64-NEXT:    jirl $zero, $ra, 0
120  %add = add i8 %x, 3
121  ret i8 %add
122}
123
124define i16 @add_i16_3(i16 %x) {
125; LA32-LABEL: add_i16_3:
126; LA32:       # %bb.0:
127; LA32-NEXT:    addi.w $a0, $a0, 3
128; LA32-NEXT:    jirl $zero, $ra, 0
129;
130; LA64-LABEL: add_i16_3:
131; LA64:       # %bb.0:
132; LA64-NEXT:    addi.d $a0, $a0, 3
133; LA64-NEXT:    jirl $zero, $ra, 0
134  %add = add i16 %x, 3
135  ret i16 %add
136}
137
138define i32 @add_i32_3(i32 %x) {
139; LA32-LABEL: add_i32_3:
140; LA32:       # %bb.0:
141; LA32-NEXT:    addi.w $a0, $a0, 3
142; LA32-NEXT:    jirl $zero, $ra, 0
143;
144; LA64-LABEL: add_i32_3:
145; LA64:       # %bb.0:
146; LA64-NEXT:    addi.d $a0, $a0, 3
147; LA64-NEXT:    jirl $zero, $ra, 0
148  %add = add i32 %x, 3
149  ret i32 %add
150}
151
152;; Match the pattern:
153;; def : PatGprImm_32<add, ADDI_W, simm12>;
154define signext i32 @add_i32_3_sext(i32 %x) {
155; LA32-LABEL: add_i32_3_sext:
156; LA32:       # %bb.0:
157; LA32-NEXT:    addi.w $a0, $a0, 3
158; LA32-NEXT:    jirl $zero, $ra, 0
159;
160; LA64-LABEL: add_i32_3_sext:
161; LA64:       # %bb.0:
162; LA64-NEXT:    addi.w $a0, $a0, 3
163; LA64-NEXT:    jirl $zero, $ra, 0
164  %add = add i32 %x, 3
165  ret i32 %add
166}
167
168define i64 @add_i64_3(i64 %x) {
169; LA32-LABEL: add_i64_3:
170; LA32:       # %bb.0:
171; LA32-NEXT:    addi.w $a2, $a0, 3
172; LA32-NEXT:    sltu $a0, $a2, $a0
173; LA32-NEXT:    add.w $a1, $a1, $a0
174; LA32-NEXT:    move $a0, $a2
175; LA32-NEXT:    jirl $zero, $ra, 0
176;
177; LA64-LABEL: add_i64_3:
178; LA64:       # %bb.0:
179; LA64-NEXT:    addi.d $a0, $a0, 3
180; LA64-NEXT:    jirl $zero, $ra, 0
181  %add = add i64 %x, 3
182  ret i64 %add
183}
184