xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/add.ll (revision 718331f55529469586c99a55e4b382a1c7485842)
1ed078c48SWANG Xuerui; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
29d4f7f44Swanglei; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
39d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4a1c67439Swanglei
5a9921155SWeining Lu;; Exercise the 'add' LLVM IR: https://llvm.org/docs/LangRef.html#add-instruction
6a9921155SWeining Lu
7a9921155SWeining Ludefine i1 @add_i1(i1 %x, i1 %y) {
8a9921155SWeining Lu; LA32-LABEL: add_i1:
9a9921155SWeining Lu; LA32:       # %bb.0:
10a9921155SWeining Lu; LA32-NEXT:    add.w $a0, $a0, $a1
11ed078c48SWANG Xuerui; LA32-NEXT:    ret
12a1c67439Swanglei;
13a9921155SWeining Lu; LA64-LABEL: add_i1:
14a9921155SWeining Lu; LA64:       # %bb.0:
15a9921155SWeining Lu; LA64-NEXT:    add.d $a0, $a0, $a1
16ed078c48SWANG Xuerui; LA64-NEXT:    ret
17a9921155SWeining Lu  %add = add i1 %x, %y
18a9921155SWeining Lu  ret i1 %add
19a9921155SWeining Lu}
20a9921155SWeining Lu
21a9921155SWeining Ludefine i8 @add_i8(i8 %x, i8 %y) {
22a9921155SWeining Lu; LA32-LABEL: add_i8:
23a9921155SWeining Lu; LA32:       # %bb.0:
24a9921155SWeining Lu; LA32-NEXT:    add.w $a0, $a0, $a1
25ed078c48SWANG Xuerui; LA32-NEXT:    ret
26a9921155SWeining Lu;
27a9921155SWeining Lu; LA64-LABEL: add_i8:
28a9921155SWeining Lu; LA64:       # %bb.0:
29a9921155SWeining Lu; LA64-NEXT:    add.d $a0, $a0, $a1
30ed078c48SWANG Xuerui; LA64-NEXT:    ret
31a9921155SWeining Lu  %add = add i8 %x, %y
32a9921155SWeining Lu  ret i8 %add
33a9921155SWeining Lu}
34a9921155SWeining Lu
35a9921155SWeining Ludefine i16 @add_i16(i16 %x, i16 %y) {
36a9921155SWeining Lu; LA32-LABEL: add_i16:
37a9921155SWeining Lu; LA32:       # %bb.0:
38a9921155SWeining Lu; LA32-NEXT:    add.w $a0, $a0, $a1
39ed078c48SWANG Xuerui; LA32-NEXT:    ret
40a9921155SWeining Lu;
41a9921155SWeining Lu; LA64-LABEL: add_i16:
42a9921155SWeining Lu; LA64:       # %bb.0:
43a9921155SWeining Lu; LA64-NEXT:    add.d $a0, $a0, $a1
44ed078c48SWANG Xuerui; LA64-NEXT:    ret
45a9921155SWeining Lu  %add = add i16 %x, %y
46a9921155SWeining Lu  ret i16 %add
47a9921155SWeining Lu}
48a9921155SWeining Lu
49a9921155SWeining Ludefine i32 @add_i32(i32 %x, i32 %y) {
50a9921155SWeining Lu; LA32-LABEL: add_i32:
51a9921155SWeining Lu; LA32:       # %bb.0:
52a9921155SWeining Lu; LA32-NEXT:    add.w $a0, $a0, $a1
53ed078c48SWANG Xuerui; LA32-NEXT:    ret
54a9921155SWeining Lu;
55a9921155SWeining Lu; LA64-LABEL: add_i32:
56a9921155SWeining Lu; LA64:       # %bb.0:
57*718331f5Shev; LA64-NEXT:    add.w $a0, $a0, $a1
58ed078c48SWANG Xuerui; LA64-NEXT:    ret
59a9921155SWeining Lu  %add = add i32 %x, %y
60a1c67439Swanglei  ret i32 %add
61a1c67439Swanglei}
62a9921155SWeining Lu
63a9921155SWeining Lu;; Match the pattern:
64a9921155SWeining Lu;; def : PatGprGpr_32<add, ADD_W>;
65a9921155SWeining Ludefine signext i32 @add_i32_sext(i32 %x, i32 %y) {
66a9921155SWeining Lu; LA32-LABEL: add_i32_sext:
67a9921155SWeining Lu; LA32:       # %bb.0:
68a9921155SWeining Lu; LA32-NEXT:    add.w $a0, $a0, $a1
69ed078c48SWANG Xuerui; LA32-NEXT:    ret
70a9921155SWeining Lu;
71a9921155SWeining Lu; LA64-LABEL: add_i32_sext:
72a9921155SWeining Lu; LA64:       # %bb.0:
73a9921155SWeining Lu; LA64-NEXT:    add.w $a0, $a0, $a1
74ed078c48SWANG Xuerui; LA64-NEXT:    ret
75a9921155SWeining Lu  %add = add i32 %x, %y
76a9921155SWeining Lu  ret i32 %add
77a9921155SWeining Lu}
78a9921155SWeining Lu
79a9921155SWeining Ludefine i64 @add_i64(i64 %x, i64 %y) {
80a9921155SWeining Lu; LA32-LABEL: add_i64:
81a9921155SWeining Lu; LA32:       # %bb.0:
82a9921155SWeining Lu; LA32-NEXT:    add.w $a1, $a1, $a3
83a9921155SWeining Lu; LA32-NEXT:    add.w $a2, $a0, $a2
84a9921155SWeining Lu; LA32-NEXT:    sltu $a0, $a2, $a0
85a9921155SWeining Lu; LA32-NEXT:    add.w $a1, $a1, $a0
86a9921155SWeining Lu; LA32-NEXT:    move $a0, $a2
87ed078c48SWANG Xuerui; LA32-NEXT:    ret
88a9921155SWeining Lu;
89a9921155SWeining Lu; LA64-LABEL: add_i64:
90a9921155SWeining Lu; LA64:       # %bb.0:
91a9921155SWeining Lu; LA64-NEXT:    add.d $a0, $a0, $a1
92ed078c48SWANG Xuerui; LA64-NEXT:    ret
93a9921155SWeining Lu  %add = add i64 %x, %y
94a9921155SWeining Lu  ret i64 %add
95a9921155SWeining Lu}
96a9921155SWeining Lu
97a9921155SWeining Ludefine i1 @add_i1_3(i1 %x) {
98a9921155SWeining Lu; LA32-LABEL: add_i1_3:
99a9921155SWeining Lu; LA32:       # %bb.0:
100a9921155SWeining Lu; LA32-NEXT:    addi.w $a0, $a0, 1
101ed078c48SWANG Xuerui; LA32-NEXT:    ret
102a9921155SWeining Lu;
103a9921155SWeining Lu; LA64-LABEL: add_i1_3:
104a9921155SWeining Lu; LA64:       # %bb.0:
105a9921155SWeining Lu; LA64-NEXT:    addi.d $a0, $a0, 1
106ed078c48SWANG Xuerui; LA64-NEXT:    ret
107a9921155SWeining Lu  %add = add i1 %x, 3
108a9921155SWeining Lu  ret i1 %add
109a9921155SWeining Lu}
110a9921155SWeining Lu
111a9921155SWeining Ludefine i8 @add_i8_3(i8 %x) {
112a9921155SWeining Lu; LA32-LABEL: add_i8_3:
113a9921155SWeining Lu; LA32:       # %bb.0:
114a9921155SWeining Lu; LA32-NEXT:    addi.w $a0, $a0, 3
115ed078c48SWANG Xuerui; LA32-NEXT:    ret
116a9921155SWeining Lu;
117a9921155SWeining Lu; LA64-LABEL: add_i8_3:
118a9921155SWeining Lu; LA64:       # %bb.0:
119a9921155SWeining Lu; LA64-NEXT:    addi.d $a0, $a0, 3
120ed078c48SWANG Xuerui; LA64-NEXT:    ret
121a9921155SWeining Lu  %add = add i8 %x, 3
122a9921155SWeining Lu  ret i8 %add
123a9921155SWeining Lu}
124a9921155SWeining Lu
125a9921155SWeining Ludefine i16 @add_i16_3(i16 %x) {
126a9921155SWeining Lu; LA32-LABEL: add_i16_3:
127a9921155SWeining Lu; LA32:       # %bb.0:
128a9921155SWeining Lu; LA32-NEXT:    addi.w $a0, $a0, 3
129ed078c48SWANG Xuerui; LA32-NEXT:    ret
130a9921155SWeining Lu;
131a9921155SWeining Lu; LA64-LABEL: add_i16_3:
132a9921155SWeining Lu; LA64:       # %bb.0:
133a9921155SWeining Lu; LA64-NEXT:    addi.d $a0, $a0, 3
134ed078c48SWANG Xuerui; LA64-NEXT:    ret
135a9921155SWeining Lu  %add = add i16 %x, 3
136a9921155SWeining Lu  ret i16 %add
137a9921155SWeining Lu}
138a9921155SWeining Lu
139a9921155SWeining Ludefine i32 @add_i32_3(i32 %x) {
140a9921155SWeining Lu; LA32-LABEL: add_i32_3:
141a9921155SWeining Lu; LA32:       # %bb.0:
142a9921155SWeining Lu; LA32-NEXT:    addi.w $a0, $a0, 3
143ed078c48SWANG Xuerui; LA32-NEXT:    ret
144a9921155SWeining Lu;
145a9921155SWeining Lu; LA64-LABEL: add_i32_3:
146a9921155SWeining Lu; LA64:       # %bb.0:
147*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, 3
148ed078c48SWANG Xuerui; LA64-NEXT:    ret
149a9921155SWeining Lu  %add = add i32 %x, 3
150a9921155SWeining Lu  ret i32 %add
151a9921155SWeining Lu}
152a9921155SWeining Lu
153a9921155SWeining Lu;; Match the pattern:
154a9921155SWeining Lu;; def : PatGprImm_32<add, ADDI_W, simm12>;
155a9921155SWeining Ludefine signext i32 @add_i32_3_sext(i32 %x) {
156a9921155SWeining Lu; LA32-LABEL: add_i32_3_sext:
157a9921155SWeining Lu; LA32:       # %bb.0:
158a9921155SWeining Lu; LA32-NEXT:    addi.w $a0, $a0, 3
159ed078c48SWANG Xuerui; LA32-NEXT:    ret
160a9921155SWeining Lu;
161a9921155SWeining Lu; LA64-LABEL: add_i32_3_sext:
162a9921155SWeining Lu; LA64:       # %bb.0:
163a9921155SWeining Lu; LA64-NEXT:    addi.w $a0, $a0, 3
164ed078c48SWANG Xuerui; LA64-NEXT:    ret
165a9921155SWeining Lu  %add = add i32 %x, 3
166a9921155SWeining Lu  ret i32 %add
167a9921155SWeining Lu}
168a9921155SWeining Lu
169a9921155SWeining Ludefine i64 @add_i64_3(i64 %x) {
170a9921155SWeining Lu; LA32-LABEL: add_i64_3:
171a9921155SWeining Lu; LA32:       # %bb.0:
172a9921155SWeining Lu; LA32-NEXT:    addi.w $a2, $a0, 3
173a9921155SWeining Lu; LA32-NEXT:    sltu $a0, $a2, $a0
174a9921155SWeining Lu; LA32-NEXT:    add.w $a1, $a1, $a0
175a9921155SWeining Lu; LA32-NEXT:    move $a0, $a2
176ed078c48SWANG Xuerui; LA32-NEXT:    ret
177a9921155SWeining Lu;
178a9921155SWeining Lu; LA64-LABEL: add_i64_3:
179a9921155SWeining Lu; LA64:       # %bb.0:
180a9921155SWeining Lu; LA64-NEXT:    addi.d $a0, $a0, 3
181ed078c48SWANG Xuerui; LA64-NEXT:    ret
182a9921155SWeining Lu  %add = add i64 %x, 3
183a9921155SWeining Lu  ret i64 %add
184a9921155SWeining Lu}
185dcf9c60aSWANG Xuerui
1862b8cb7d8SWANG Xuerui;; Check that `addu16i.d` is emitted for these cases.
187dcf9c60aSWANG Xuerui
188dcf9c60aSWANG Xueruidefine i32 @add_i32_0x12340000(i32 %x) {
189dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_0x12340000:
190dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
191dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 74560
192dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
193dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
194dcf9c60aSWANG Xuerui;
195dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_0x12340000:
196dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
1972b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 4660
198*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, 0
199dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
200dcf9c60aSWANG Xuerui  %add = add i32 %x, 305397760
201dcf9c60aSWANG Xuerui  ret i32 %add
202dcf9c60aSWANG Xuerui}
203dcf9c60aSWANG Xuerui
204dcf9c60aSWANG Xueruidefine signext i32 @add_i32_0x12340000_sext(i32 %x) {
205dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_0x12340000_sext:
206dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
207dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 74560
208dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
209dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
210dcf9c60aSWANG Xuerui;
211dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_0x12340000_sext:
212dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
2132b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 4660
2142b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.w $a0, $a0, 0
215dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
216dcf9c60aSWANG Xuerui  %add = add i32 %x, 305397760
217dcf9c60aSWANG Xuerui  ret i32 %add
218dcf9c60aSWANG Xuerui}
219dcf9c60aSWANG Xuerui
220dcf9c60aSWANG Xueruidefine i64 @add_i64_0x12340000(i64 %x) {
221dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_0x12340000:
222dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
223dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, 74560
224dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
225dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
226dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a1, $a1, $a0
227dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
228dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
229dcf9c60aSWANG Xuerui;
230dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_0x12340000:
231dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
2322b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 4660
233dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
234dcf9c60aSWANG Xuerui  %add = add i64 %x, 305397760
235dcf9c60aSWANG Xuerui  ret i64 %add
236dcf9c60aSWANG Xuerui}
237dcf9c60aSWANG Xuerui
238dcf9c60aSWANG Xueruidefine i32 @add_i32_0x7fff0000(i32 %x) {
239dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_0x7fff0000:
240dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
241dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 524272
242dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
243dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
244dcf9c60aSWANG Xuerui;
245dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_0x7fff0000:
246dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
2472b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 32767
248*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, 0
249dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
250dcf9c60aSWANG Xuerui  %add = add i32 %x, 2147418112
251dcf9c60aSWANG Xuerui  ret i32 %add
252dcf9c60aSWANG Xuerui}
253dcf9c60aSWANG Xuerui
254dcf9c60aSWANG Xueruidefine signext i32 @add_i32_0x7fff0000_sext(i32 %x) {
255dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_0x7fff0000_sext:
256dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
257dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 524272
258dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
259dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
260dcf9c60aSWANG Xuerui;
261dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_0x7fff0000_sext:
262dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
2632b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 32767
2642b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.w $a0, $a0, 0
265dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
266dcf9c60aSWANG Xuerui  %add = add i32 %x, 2147418112
267dcf9c60aSWANG Xuerui  ret i32 %add
268dcf9c60aSWANG Xuerui}
269dcf9c60aSWANG Xuerui
270dcf9c60aSWANG Xueruidefine i64 @add_i64_0x7fff0000(i64 %x) {
271dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_0x7fff0000:
272dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
273dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, 524272
274dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
275dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
276dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a1, $a1, $a0
277dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
278dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
279dcf9c60aSWANG Xuerui;
280dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_0x7fff0000:
281dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
2822b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 32767
283dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
284dcf9c60aSWANG Xuerui  %add = add i64 %x, 2147418112
285dcf9c60aSWANG Xuerui  ret i64 %add
286dcf9c60aSWANG Xuerui}
287dcf9c60aSWANG Xuerui
288dcf9c60aSWANG Xueruidefine i32 @add_i32_minus_0x80000000(i32 %x) {
289dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x80000000:
290dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
291dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, -524288
292dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
293dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
294dcf9c60aSWANG Xuerui;
295dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x80000000:
296dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
2972b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -32768
298*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, 0
299dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
300dcf9c60aSWANG Xuerui  %add = add i32 %x, -2147483648
301dcf9c60aSWANG Xuerui  ret i32 %add
302dcf9c60aSWANG Xuerui}
303dcf9c60aSWANG Xuerui
304dcf9c60aSWANG Xueruidefine signext i32 @add_i32_minus_0x80000000_sext(i32 %x) {
305dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x80000000_sext:
306dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
307dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, -524288
308dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
309dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
310dcf9c60aSWANG Xuerui;
311dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x80000000_sext:
312dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
3132b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -32768
3142b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.w $a0, $a0, 0
315dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
316dcf9c60aSWANG Xuerui  %add = add i32 %x, -2147483648
317dcf9c60aSWANG Xuerui  ret i32 %add
318dcf9c60aSWANG Xuerui}
319dcf9c60aSWANG Xuerui
320dcf9c60aSWANG Xueruidefine i64 @add_i64_minus_0x80000000(i64 %x) {
321dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_minus_0x80000000:
322dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
323dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, -524288
324dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
325dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
326dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a1, $a0
327dcf9c60aSWANG Xuerui; LA32-NEXT:    addi.w $a1, $a0, -1
328dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
329dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
330dcf9c60aSWANG Xuerui;
331dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_minus_0x80000000:
332dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
3332b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -32768
334dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
335dcf9c60aSWANG Xuerui  %add = add i64 %x, -2147483648
336dcf9c60aSWANG Xuerui  ret i64 %add
337dcf9c60aSWANG Xuerui}
338dcf9c60aSWANG Xuerui
339dcf9c60aSWANG Xueruidefine i32 @add_i32_minus_0x10000(i32 %x) {
340dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x10000:
341dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
342dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, -16
343dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
344dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
345dcf9c60aSWANG Xuerui;
346dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x10000:
347dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
3482b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -1
349*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, 0
350dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
351dcf9c60aSWANG Xuerui  %add = add i32 %x, -65536
352dcf9c60aSWANG Xuerui  ret i32 %add
353dcf9c60aSWANG Xuerui}
354dcf9c60aSWANG Xuerui
355dcf9c60aSWANG Xueruidefine signext i32 @add_i32_minus_0x10000_sext(i32 %x) {
356dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x10000_sext:
357dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
358dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, -16
359dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
360dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
361dcf9c60aSWANG Xuerui;
362dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x10000_sext:
363dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
3642b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -1
3652b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.w $a0, $a0, 0
366dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
367dcf9c60aSWANG Xuerui  %add = add i32 %x, -65536
368dcf9c60aSWANG Xuerui  ret i32 %add
369dcf9c60aSWANG Xuerui}
370dcf9c60aSWANG Xuerui
371dcf9c60aSWANG Xueruidefine i64 @add_i64_minus_0x10000(i64 %x) {
372dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_minus_0x10000:
373dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
374dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, -16
375dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
376dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
377dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a1, $a0
378dcf9c60aSWANG Xuerui; LA32-NEXT:    addi.w $a1, $a0, -1
379dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
380dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
381dcf9c60aSWANG Xuerui;
382dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_minus_0x10000:
383dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
3842b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -1
385dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
386dcf9c60aSWANG Xuerui  %add = add i64 %x, -65536
387dcf9c60aSWANG Xuerui  ret i64 %add
388dcf9c60aSWANG Xuerui}
389dcf9c60aSWANG Xuerui
3902b8cb7d8SWANG Xuerui;; Check that `addu16i.d + addi` is emitted for these cases.
391dcf9c60aSWANG Xuerui
392dcf9c60aSWANG Xueruidefine i32 @add_i32_0x7fff07ff(i32 %x) {
393dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_0x7fff07ff:
394dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
395dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 524272
396dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 2047
397dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
398dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
399dcf9c60aSWANG Xuerui;
400dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_0x7fff07ff:
401dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
4022b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 32767
403*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, 2047
404dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
405dcf9c60aSWANG Xuerui  %add = add i32 %x, 2147420159
406dcf9c60aSWANG Xuerui  ret i32 %add
407dcf9c60aSWANG Xuerui}
408dcf9c60aSWANG Xuerui
409dcf9c60aSWANG Xueruidefine signext i32 @add_i32_0x7fff07ff_sext(i32 %x) {
410dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_0x7fff07ff_sext:
411dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
412dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 524272
413dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 2047
414dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
415dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
416dcf9c60aSWANG Xuerui;
417dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_0x7fff07ff_sext:
418dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
4192b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 32767
4202b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.w $a0, $a0, 2047
421dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
422dcf9c60aSWANG Xuerui  %add = add i32 %x, 2147420159
423dcf9c60aSWANG Xuerui  ret i32 %add
424dcf9c60aSWANG Xuerui}
425dcf9c60aSWANG Xuerui
426dcf9c60aSWANG Xueruidefine i64 @add_i64_0x7fff07ff(i64 %x) {
427dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_0x7fff07ff:
428dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
429dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, 524272
430dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a2, $a2, 2047
431dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
432dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
433dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a1, $a1, $a0
434dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
435dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
436dcf9c60aSWANG Xuerui;
437dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_0x7fff07ff:
438dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
4392b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 32767
4402b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.d $a0, $a0, 2047
441dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
442dcf9c60aSWANG Xuerui  %add = add i64 %x, 2147420159
443dcf9c60aSWANG Xuerui  ret i64 %add
444dcf9c60aSWANG Xuerui}
445dcf9c60aSWANG Xuerui
446dcf9c60aSWANG Xueruidefine i32 @add_i32_0x7ffef800(i32 %x) {
447dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_0x7ffef800:
448dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
449dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 524271
450dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 2048
451dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
452dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
453dcf9c60aSWANG Xuerui;
454dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_0x7ffef800:
455dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
4562b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 32767
457*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, -2048
458dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
459dcf9c60aSWANG Xuerui  %add = add i32 %x, 2147416064
460dcf9c60aSWANG Xuerui  ret i32 %add
461dcf9c60aSWANG Xuerui}
462dcf9c60aSWANG Xuerui
463dcf9c60aSWANG Xueruidefine signext i32 @add_i32_0x7ffef800_sext(i32 %x) {
464dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_0x7ffef800_sext:
465dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
466dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 524271
467dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 2048
468dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
469dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
470dcf9c60aSWANG Xuerui;
471dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_0x7ffef800_sext:
472dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
4732b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 32767
4742b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.w $a0, $a0, -2048
475dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
476dcf9c60aSWANG Xuerui  %add = add i32 %x, 2147416064
477dcf9c60aSWANG Xuerui  ret i32 %add
478dcf9c60aSWANG Xuerui}
479dcf9c60aSWANG Xuerui
480dcf9c60aSWANG Xueruidefine i64 @add_i64_0x7ffef800(i64 %x) {
481dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_0x7ffef800:
482dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
483dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, 524271
484dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a2, $a2, 2048
485dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
486dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
487dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a1, $a1, $a0
488dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
489dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
490dcf9c60aSWANG Xuerui;
491dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_0x7ffef800:
492dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
4932b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, 32767
4942b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.d $a0, $a0, -2048
495dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
496dcf9c60aSWANG Xuerui  %add = add i64 %x, 2147416064
497dcf9c60aSWANG Xuerui  ret i64 %add
498dcf9c60aSWANG Xuerui}
499dcf9c60aSWANG Xuerui
500dcf9c60aSWANG Xueruidefine i64 @add_i64_minus_0x80000800(i64 %x) {
501dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_minus_0x80000800:
502dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
503dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, 524287
504dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a2, $a2, 2048
505dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
506dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
507dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a1, $a0
508dcf9c60aSWANG Xuerui; LA32-NEXT:    addi.w $a1, $a0, -1
509dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
510dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
511dcf9c60aSWANG Xuerui;
512dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_minus_0x80000800:
513dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
5142b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -32768
5152b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.d $a0, $a0, -2048
516dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
517dcf9c60aSWANG Xuerui  %add = add i64 %x, -2147485696
518dcf9c60aSWANG Xuerui  ret i64 %add
519dcf9c60aSWANG Xuerui}
520dcf9c60aSWANG Xuerui
521dcf9c60aSWANG Xueruidefine i32 @add_i32_minus_0x23450679(i32 %x) {
522dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x23450679:
523dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
524dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, -144465
525dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 2439
526dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
527dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
528dcf9c60aSWANG Xuerui;
529dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x23450679:
530dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
5312b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -9029
532*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, -1657
533dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
534dcf9c60aSWANG Xuerui  %add = add i32 %x, -591726201
535dcf9c60aSWANG Xuerui  ret i32 %add
536dcf9c60aSWANG Xuerui}
537dcf9c60aSWANG Xuerui
538dcf9c60aSWANG Xueruidefine signext i32 @add_i32_minus_0x23450679_sext(i32 %x) {
539dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x23450679_sext:
540dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
541dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, -144465
542dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 2439
543dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
544dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
545dcf9c60aSWANG Xuerui;
546dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x23450679_sext:
547dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
5482b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -9029
5492b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.w $a0, $a0, -1657
550dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
551dcf9c60aSWANG Xuerui  %add = add i32 %x, -591726201
552dcf9c60aSWANG Xuerui  ret i32 %add
553dcf9c60aSWANG Xuerui}
554dcf9c60aSWANG Xuerui
555dcf9c60aSWANG Xueruidefine i64 @add_i64_minus_0x23450679(i64 %x) {
556dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_minus_0x23450679:
557dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
558dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, -144465
559dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a2, $a2, 2439
560dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
561dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
562dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a1, $a0
563dcf9c60aSWANG Xuerui; LA32-NEXT:    addi.w $a1, $a0, -1
564dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
565dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
566dcf9c60aSWANG Xuerui;
567dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_minus_0x23450679:
568dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
5692b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -9029
5702b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.d $a0, $a0, -1657
571dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
572dcf9c60aSWANG Xuerui  %add = add i64 %x, -591726201
573dcf9c60aSWANG Xuerui  ret i64 %add
574dcf9c60aSWANG Xuerui}
575dcf9c60aSWANG Xuerui
576dcf9c60aSWANG Xueruidefine i32 @add_i32_minus_0x2345fedd(i32 %x) {
577dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x2345fedd:
578dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
579dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, -144480
580dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 291
581dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
582dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
583dcf9c60aSWANG Xuerui;
584dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x2345fedd:
585dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
5862b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -9030
587*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, 291
588dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
589dcf9c60aSWANG Xuerui  %add = add i32 %x, -591789789
590dcf9c60aSWANG Xuerui  ret i32 %add
591dcf9c60aSWANG Xuerui}
592dcf9c60aSWANG Xuerui
593dcf9c60aSWANG Xueruidefine signext i32 @add_i32_minus_0x2345fedd_sext(i32 %x) {
594dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x2345fedd_sext:
595dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
596dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, -144480
597dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 291
598dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
599dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
600dcf9c60aSWANG Xuerui;
601dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x2345fedd_sext:
602dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
6032b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -9030
6042b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.w $a0, $a0, 291
605dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
606dcf9c60aSWANG Xuerui  %add = add i32 %x, -591789789
607dcf9c60aSWANG Xuerui  ret i32 %add
608dcf9c60aSWANG Xuerui}
609dcf9c60aSWANG Xuerui
610dcf9c60aSWANG Xueruidefine i64 @add_i64_minus_0x2345fedd(i64 %x) {
611dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_minus_0x2345fedd:
612dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
613dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, -144480
614dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a2, $a2, 291
615dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
616dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
617dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a1, $a0
618dcf9c60aSWANG Xuerui; LA32-NEXT:    addi.w $a1, $a0, -1
619dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
620dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
621dcf9c60aSWANG Xuerui;
622dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_minus_0x2345fedd:
623dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
6242b8cb7d8SWANG Xuerui; LA64-NEXT:    addu16i.d $a0, $a0, -9030
6252b8cb7d8SWANG Xuerui; LA64-NEXT:    addi.d $a0, $a0, 291
626dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
627dcf9c60aSWANG Xuerui  %add = add i64 %x, -591789789
628dcf9c60aSWANG Xuerui  ret i64 %add
629dcf9c60aSWANG Xuerui}
630dcf9c60aSWANG Xuerui
631dcf9c60aSWANG Xuerui;; Check that `addu16i.d` isn't used for the following cases.
632dcf9c60aSWANG Xuerui
633dcf9c60aSWANG Xueruidefine i64 @add_i64_0x80000000(i64 %x) {
634dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_0x80000000:
635dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
636dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, -524288
637dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
638dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
639dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a1, $a1, $a0
640dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
641dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
642dcf9c60aSWANG Xuerui;
643dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_0x80000000:
644dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
645dcf9c60aSWANG Xuerui; LA64-NEXT:    lu12i.w $a1, -524288
646dcf9c60aSWANG Xuerui; LA64-NEXT:    lu32i.d $a1, 0
647dcf9c60aSWANG Xuerui; LA64-NEXT:    add.d $a0, $a0, $a1
648dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
649dcf9c60aSWANG Xuerui  %add = add i64 %x, 2147483648
650dcf9c60aSWANG Xuerui  ret i64 %add
651dcf9c60aSWANG Xuerui}
652dcf9c60aSWANG Xuerui
653dcf9c60aSWANG Xueruidefine i64 @add_i64_0xffff0000(i64 %x) {
654dcf9c60aSWANG Xuerui; LA32-LABEL: add_i64_0xffff0000:
655dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
656dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a2, -16
657dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a2, $a0, $a2
658dcf9c60aSWANG Xuerui; LA32-NEXT:    sltu $a0, $a2, $a0
659dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a1, $a1, $a0
660dcf9c60aSWANG Xuerui; LA32-NEXT:    move $a0, $a2
661dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
662dcf9c60aSWANG Xuerui;
663dcf9c60aSWANG Xuerui; LA64-LABEL: add_i64_0xffff0000:
664dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
665dcf9c60aSWANG Xuerui; LA64-NEXT:    lu12i.w $a1, -16
666dcf9c60aSWANG Xuerui; LA64-NEXT:    lu32i.d $a1, 0
667dcf9c60aSWANG Xuerui; LA64-NEXT:    add.d $a0, $a0, $a1
668dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
669dcf9c60aSWANG Xuerui  %add = add i64 %x, 4294901760
670dcf9c60aSWANG Xuerui  ret i64 %add
671dcf9c60aSWANG Xuerui}
672dcf9c60aSWANG Xuerui
673dcf9c60aSWANG Xuerui;; -0x80000800 is equivalent to +0x7ffff800 in i32, so addu16i.d isn't matched
674dcf9c60aSWANG Xuerui;; in this case.
675dcf9c60aSWANG Xueruidefine i32 @add_i32_minus_0x80000800(i32 %x) {
676dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x80000800:
677dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
678dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 524287
679dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 2048
680dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
681dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
682dcf9c60aSWANG Xuerui;
683dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x80000800:
684dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
685dcf9c60aSWANG Xuerui; LA64-NEXT:    lu12i.w $a1, 524287
686dcf9c60aSWANG Xuerui; LA64-NEXT:    ori $a1, $a1, 2048
687*718331f5Shev; LA64-NEXT:    add.w $a0, $a0, $a1
688dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
689dcf9c60aSWANG Xuerui  %add = add i32 %x, -2147485696
690dcf9c60aSWANG Xuerui  ret i32 %add
691dcf9c60aSWANG Xuerui}
692dcf9c60aSWANG Xuerui
693dcf9c60aSWANG Xueruidefine signext i32 @add_i32_minus_0x80000800_sext(i32 %x) {
694dcf9c60aSWANG Xuerui; LA32-LABEL: add_i32_minus_0x80000800_sext:
695dcf9c60aSWANG Xuerui; LA32:       # %bb.0:
696dcf9c60aSWANG Xuerui; LA32-NEXT:    lu12i.w $a1, 524287
697dcf9c60aSWANG Xuerui; LA32-NEXT:    ori $a1, $a1, 2048
698dcf9c60aSWANG Xuerui; LA32-NEXT:    add.w $a0, $a0, $a1
699dcf9c60aSWANG Xuerui; LA32-NEXT:    ret
700dcf9c60aSWANG Xuerui;
701dcf9c60aSWANG Xuerui; LA64-LABEL: add_i32_minus_0x80000800_sext:
702dcf9c60aSWANG Xuerui; LA64:       # %bb.0:
703dcf9c60aSWANG Xuerui; LA64-NEXT:    lu12i.w $a1, 524287
704dcf9c60aSWANG Xuerui; LA64-NEXT:    ori $a1, $a1, 2048
705dcf9c60aSWANG Xuerui; LA64-NEXT:    add.w $a0, $a0, $a1
706dcf9c60aSWANG Xuerui; LA64-NEXT:    ret
707dcf9c60aSWANG Xuerui  %add = add i32 %x, -2147485696
708dcf9c60aSWANG Xuerui  ret i32 %add
709dcf9c60aSWANG Xuerui}
710777318dfSBen Shi
711777318dfSBen Shidefine signext i32 @add_i32_4080(i32 %x) {
712777318dfSBen Shi; LA32-LABEL: add_i32_4080:
713777318dfSBen Shi; LA32:       # %bb.0:
714ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, 2047
715ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, 2033
716777318dfSBen Shi; LA32-NEXT:    ret
717777318dfSBen Shi;
718777318dfSBen Shi; LA64-LABEL: add_i32_4080:
719777318dfSBen Shi; LA64:       # %bb.0:
720e9bcd2bfShev; LA64-NEXT:    addi.d $a0, $a0, 2047
721ec37a35aSBen Shi; LA64-NEXT:    addi.w $a0, $a0, 2033
722777318dfSBen Shi; LA64-NEXT:    ret
723777318dfSBen Shi  %add = add i32 %x, 4080
724777318dfSBen Shi  ret i32 %add
725777318dfSBen Shi}
726777318dfSBen Shi
727777318dfSBen Shidefine signext i32 @add_i32_minus_4080(i32 %x) {
728777318dfSBen Shi; LA32-LABEL: add_i32_minus_4080:
729777318dfSBen Shi; LA32:       # %bb.0:
730ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, -2048
731ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, -2032
732777318dfSBen Shi; LA32-NEXT:    ret
733777318dfSBen Shi;
734777318dfSBen Shi; LA64-LABEL: add_i32_minus_4080:
735777318dfSBen Shi; LA64:       # %bb.0:
736e9bcd2bfShev; LA64-NEXT:    addi.d $a0, $a0, -2048
737ec37a35aSBen Shi; LA64-NEXT:    addi.w $a0, $a0, -2032
738777318dfSBen Shi; LA64-NEXT:    ret
739777318dfSBen Shi  %add = add i32 %x, -4080
740777318dfSBen Shi  ret i32 %add
741777318dfSBen Shi}
742777318dfSBen Shi
743777318dfSBen Shidefine signext i32 @add_i32_2048(i32 %x) {
744777318dfSBen Shi; LA32-LABEL: add_i32_2048:
745777318dfSBen Shi; LA32:       # %bb.0:
746ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, 2047
747ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, 1
748777318dfSBen Shi; LA32-NEXT:    ret
749777318dfSBen Shi;
750777318dfSBen Shi; LA64-LABEL: add_i32_2048:
751777318dfSBen Shi; LA64:       # %bb.0:
752e9bcd2bfShev; LA64-NEXT:    addi.d $a0, $a0, 2047
753ec37a35aSBen Shi; LA64-NEXT:    addi.w $a0, $a0, 1
754777318dfSBen Shi; LA64-NEXT:    ret
755777318dfSBen Shi  %add = add i32 %x, 2048
756777318dfSBen Shi  ret i32 %add
757777318dfSBen Shi}
758777318dfSBen Shi
759777318dfSBen Shidefine signext i32 @add_i32_4094(i32 %x) {
760777318dfSBen Shi; LA32-LABEL: add_i32_4094:
761777318dfSBen Shi; LA32:       # %bb.0:
762ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, 2047
763ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, 2047
764777318dfSBen Shi; LA32-NEXT:    ret
765777318dfSBen Shi;
766777318dfSBen Shi; LA64-LABEL: add_i32_4094:
767777318dfSBen Shi; LA64:       # %bb.0:
768e9bcd2bfShev; LA64-NEXT:    addi.d $a0, $a0, 2047
769ec37a35aSBen Shi; LA64-NEXT:    addi.w $a0, $a0, 2047
770777318dfSBen Shi; LA64-NEXT:    ret
771777318dfSBen Shi  %add = add i32 %x, 4094
772777318dfSBen Shi  ret i32 %add
773777318dfSBen Shi}
774777318dfSBen Shi
775777318dfSBen Shidefine signext i32 @add_i32_minus_2049(i32 %x) {
776777318dfSBen Shi; LA32-LABEL: add_i32_minus_2049:
777777318dfSBen Shi; LA32:       # %bb.0:
778ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, -2048
779ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, -1
780777318dfSBen Shi; LA32-NEXT:    ret
781777318dfSBen Shi;
782777318dfSBen Shi; LA64-LABEL: add_i32_minus_2049:
783777318dfSBen Shi; LA64:       # %bb.0:
784e9bcd2bfShev; LA64-NEXT:    addi.d $a0, $a0, -2048
785ec37a35aSBen Shi; LA64-NEXT:    addi.w $a0, $a0, -1
786777318dfSBen Shi; LA64-NEXT:    ret
787777318dfSBen Shi  %add = add i32 %x, -2049
788777318dfSBen Shi  ret i32 %add
789777318dfSBen Shi}
790777318dfSBen Shi
791777318dfSBen Shidefine signext i32 @add_i32_minus_4096(i32 %x) {
792777318dfSBen Shi; LA32-LABEL: add_i32_minus_4096:
793777318dfSBen Shi; LA32:       # %bb.0:
794ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, -2048
795ec37a35aSBen Shi; LA32-NEXT:    addi.w $a0, $a0, -2048
796777318dfSBen Shi; LA32-NEXT:    ret
797777318dfSBen Shi;
798777318dfSBen Shi; LA64-LABEL: add_i32_minus_4096:
799777318dfSBen Shi; LA64:       # %bb.0:
800e9bcd2bfShev; LA64-NEXT:    addi.d $a0, $a0, -2048
801ec37a35aSBen Shi; LA64-NEXT:    addi.w $a0, $a0, -2048
802777318dfSBen Shi; LA64-NEXT:    ret
803777318dfSBen Shi  %add = add i32 %x, -4096
804777318dfSBen Shi  ret i32 %add
805777318dfSBen Shi}
806777318dfSBen Shi
807777318dfSBen Shidefine i64 @add_i64_4080(i64 %x) {
808777318dfSBen Shi; LA32-LABEL: add_i64_4080:
809777318dfSBen Shi; LA32:       # %bb.0:
810ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a0, 2047
811ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a2, 2033
812777318dfSBen Shi; LA32-NEXT:    sltu $a0, $a2, $a0
813777318dfSBen Shi; LA32-NEXT:    add.w $a1, $a1, $a0
814777318dfSBen Shi; LA32-NEXT:    move $a0, $a2
815777318dfSBen Shi; LA32-NEXT:    ret
816777318dfSBen Shi;
817777318dfSBen Shi; LA64-LABEL: add_i64_4080:
818777318dfSBen Shi; LA64:       # %bb.0:
819ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, 2047
820ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, 2033
821777318dfSBen Shi; LA64-NEXT:    ret
822777318dfSBen Shi  %add = add i64 %x, 4080
823777318dfSBen Shi  ret i64 %add
824777318dfSBen Shi}
825777318dfSBen Shi
826777318dfSBen Shidefine i64 @add_i64_minus_4080(i64 %x) {
827777318dfSBen Shi; LA32-LABEL: add_i64_minus_4080:
828777318dfSBen Shi; LA32:       # %bb.0:
829ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a0, -2048
830ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a2, -2032
831777318dfSBen Shi; LA32-NEXT:    sltu $a0, $a2, $a0
832777318dfSBen Shi; LA32-NEXT:    add.w $a0, $a1, $a0
833777318dfSBen Shi; LA32-NEXT:    addi.w $a1, $a0, -1
834777318dfSBen Shi; LA32-NEXT:    move $a0, $a2
835777318dfSBen Shi; LA32-NEXT:    ret
836777318dfSBen Shi;
837777318dfSBen Shi; LA64-LABEL: add_i64_minus_4080:
838777318dfSBen Shi; LA64:       # %bb.0:
839ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, -2048
840ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, -2032
841777318dfSBen Shi; LA64-NEXT:    ret
842777318dfSBen Shi  %add = add i64 %x, -4080
843777318dfSBen Shi  ret i64 %add
844777318dfSBen Shi}
845777318dfSBen Shi
846777318dfSBen Shidefine i64 @add_i64_2048(i64 %x) {
847777318dfSBen Shi; LA32-LABEL: add_i64_2048:
848777318dfSBen Shi; LA32:       # %bb.0:
849ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a0, 2047
850ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a2, 1
851777318dfSBen Shi; LA32-NEXT:    sltu $a0, $a2, $a0
852777318dfSBen Shi; LA32-NEXT:    add.w $a1, $a1, $a0
853777318dfSBen Shi; LA32-NEXT:    move $a0, $a2
854777318dfSBen Shi; LA32-NEXT:    ret
855777318dfSBen Shi;
856777318dfSBen Shi; LA64-LABEL: add_i64_2048:
857777318dfSBen Shi; LA64:       # %bb.0:
858ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, 2047
859ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, 1
860777318dfSBen Shi; LA64-NEXT:    ret
861777318dfSBen Shi  %add = add i64 %x, 2048
862777318dfSBen Shi  ret i64 %add
863777318dfSBen Shi}
864777318dfSBen Shi
865777318dfSBen Shidefine i64 @add_i64_4094(i64 %x) {
866777318dfSBen Shi; LA32-LABEL: add_i64_4094:
867777318dfSBen Shi; LA32:       # %bb.0:
868ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a0, 2047
869ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a2, 2047
870777318dfSBen Shi; LA32-NEXT:    sltu $a0, $a2, $a0
871777318dfSBen Shi; LA32-NEXT:    add.w $a1, $a1, $a0
872777318dfSBen Shi; LA32-NEXT:    move $a0, $a2
873777318dfSBen Shi; LA32-NEXT:    ret
874777318dfSBen Shi;
875777318dfSBen Shi; LA64-LABEL: add_i64_4094:
876777318dfSBen Shi; LA64:       # %bb.0:
877ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, 2047
878ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, 2047
879777318dfSBen Shi; LA64-NEXT:    ret
880777318dfSBen Shi  %add = add i64 %x, 4094
881777318dfSBen Shi  ret i64 %add
882777318dfSBen Shi}
883777318dfSBen Shi
884777318dfSBen Shidefine i64 @add_i64_minus_2049(i64 %x) {
885777318dfSBen Shi; LA32-LABEL: add_i64_minus_2049:
886777318dfSBen Shi; LA32:       # %bb.0:
887ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a0, -2048
888ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a2, -1
889777318dfSBen Shi; LA32-NEXT:    sltu $a0, $a2, $a0
890777318dfSBen Shi; LA32-NEXT:    add.w $a0, $a1, $a0
891777318dfSBen Shi; LA32-NEXT:    addi.w $a1, $a0, -1
892777318dfSBen Shi; LA32-NEXT:    move $a0, $a2
893777318dfSBen Shi; LA32-NEXT:    ret
894777318dfSBen Shi;
895777318dfSBen Shi; LA64-LABEL: add_i64_minus_2049:
896777318dfSBen Shi; LA64:       # %bb.0:
897ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, -2048
898ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, -1
899777318dfSBen Shi; LA64-NEXT:    ret
900777318dfSBen Shi  %add = add i64 %x, -2049
901777318dfSBen Shi  ret i64 %add
902777318dfSBen Shi}
903777318dfSBen Shi
904777318dfSBen Shidefine i64 @add_i64_minus_4096(i64 %x) {
905777318dfSBen Shi; LA32-LABEL: add_i64_minus_4096:
906777318dfSBen Shi; LA32:       # %bb.0:
907ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a0, -2048
908ec37a35aSBen Shi; LA32-NEXT:    addi.w $a2, $a2, -2048
909777318dfSBen Shi; LA32-NEXT:    sltu $a0, $a2, $a0
910777318dfSBen Shi; LA32-NEXT:    add.w $a0, $a1, $a0
911777318dfSBen Shi; LA32-NEXT:    addi.w $a1, $a0, -1
912777318dfSBen Shi; LA32-NEXT:    move $a0, $a2
913777318dfSBen Shi; LA32-NEXT:    ret
914777318dfSBen Shi;
915777318dfSBen Shi; LA64-LABEL: add_i64_minus_4096:
916777318dfSBen Shi; LA64:       # %bb.0:
917ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, -2048
918ec37a35aSBen Shi; LA64-NEXT:    addi.d $a0, $a0, -2048
919777318dfSBen Shi; LA64-NEXT:    ret
920777318dfSBen Shi  %add = add i64 %x, -4096
921777318dfSBen Shi  ret i64 %add
922777318dfSBen Shi}
923