1; RUN: llc < %s -march=mips -mcpu=mips2 | FileCheck %s \
2; RUN:    -check-prefixes=ALL,NOT-R2-R6,GP32,PRE4
3; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s \
4; RUN:    -check-prefixes=ALL,NOT-R2-R6,GP32,GP32-CMOV
5; RUN: llc < %s -march=mips -mcpu=mips32r2 | FileCheck %s \
6; RUN:    -check-prefixes=ALL,R2-R6,GP32,GP32-CMOV
7; RUN: llc < %s -march=mips -mcpu=mips32r3 | FileCheck %s \
8; RUN:    -check-prefixes=ALL,R2-R6,GP32,GP32-CMOV
9; RUN: llc < %s -march=mips -mcpu=mips32r5 | FileCheck %s \
10; RUN:    -check-prefixes=ALL,R2-R6,GP32,GP32-CMOV
11; RUN: llc < %s -march=mips -mcpu=mips32r6 | FileCheck %s \
12; RUN:    -check-prefixes=ALL,R2-R6,GP32
13; RUN: llc < %s -march=mips64 -mcpu=mips3 | FileCheck %s \
14; RUN:    -check-prefixes=ALL,NOT-R2-R6,GP64,GP64-NOT-R2-R6
15; RUN: llc < %s -march=mips64 -mcpu=mips4 | FileCheck %s \
16; RUN:    -check-prefixes=ALL,NOT-R2-R6,GP64,GP64-NOT-R2-R6
17; RUN: llc < %s -march=mips64 -mcpu=mips64 | FileCheck %s \
18; RUN:    -check-prefixes=ALL,NOT-R2-R6,GP64,GP64-NOT-R2-R6
19; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | FileCheck %s \
20; RUN:    -check-prefixes=ALL,R2-R6,GP64,GP64-R2-R6
21; RUN: llc < %s -march=mips64 -mcpu=mips64r3 | FileCheck %s \
22; RUN:    -check-prefixes=ALL,R2-R6,GP64,GP64-R2-R6
23; RUN: llc < %s -march=mips64 -mcpu=mips64r5 | FileCheck %s \
24; RUN:    -check-prefixes=ALL,R2-R6,GP64,GP64-R2-R6
25; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s \
26; RUN:    -check-prefixes=ALL,R2-R6,GP64,GP64-R2-R6
27; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips -O2 -verify-machineinstrs | FileCheck %s \
28; RUN:    -check-prefixes=ALL,MMR3,MM32
29; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips -O2 | FileCheck %s \
30; RUN:    -check-prefixes=ALL,MMR6,MM32
31
32
33; FIXME: This code sequence is inefficient as it should be 'subu $[[T0]], $zero, $[[T0]'.
34; This sequence is even better as it's a single instruction. See D25485 for the rest of
35; the cases where this sequence occurs.
36
37define signext i1 @add_i1(i1 signext %a, i1 signext %b) {
38entry:
39; ALL-LABEL: add_i1:
40
41  ; NOT-R2-R6:  addu   $[[T0:[0-9]+]], $4, $5
42  ; NOT-R2-R6:  andi   $[[T0]], $[[T0]], 1
43  ; NOT-R2-R6:  negu   $2, $[[T0]]
44
45  ; R2-R6:      addu   $[[T0:[0-9]+]], $4, $5
46  ; R2-R6:      andi   $[[T0]], $[[T0]], 1
47  ; R2-R6:      negu   $2, $[[T0]]
48
49  ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
50  ; MMR6:       andi16  $[[T0]], $[[T0]], 1
51  ; MMR6:       li16    $[[T1:[0-9]+]], 0
52  ; MMR6:       subu16  $[[T0]], $[[T1]], $[[T0]]
53
54  %r = add i1 %a, %b
55  ret i1 %r
56}
57
58define signext i8 @add_i8(i8 signext %a, i8 signext %b) {
59entry:
60; ALL-LABEL: add_i8:
61
62  ; NOT-R2-R6:  addu    $[[T0:[0-9]+]], $4, $5
63  ; NOT-R2-R6:  sll     $[[T0]], $[[T0]], 24
64  ; NOT-R2-R6:  sra     $2, $[[T0]], 24
65
66  ; R2-R6:      addu    $[[T0:[0-9]+]], $4, $5
67  ; R2-R6:      seb     $2, $[[T0:[0-9]+]]
68
69  ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
70  ; MMR6:       seb     $2, $[[T0]]
71
72  %r = add i8 %a, %b
73  ret i8 %r
74}
75
76define signext i16 @add_i16(i16 signext %a, i16 signext %b) {
77entry:
78; ALL-LABEL: add_i16:
79
80  ; NOT-R2-R6:  addu    $[[T0:[0-9]+]], $4, $5
81  ; NOT-R2-R6:  sll     $[[T0]], $[[T0]], 16
82  ; NOT-R2-R6:  sra     $2, $[[T0]], 16
83
84  ; R2-R6:      addu    $[[T0:[0-9]+]], $4, $5
85  ; R2-R6:      seh     $2, $[[T0]]
86
87  ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
88  ; MMR6:       seh     $2, $[[T0]]
89
90  %r = add i16 %a, %b
91  ret i16 %r
92}
93
94define signext i32 @add_i32(i32 signext %a, i32 signext %b) {
95entry:
96; ALL-LABEL: add_i32:
97
98  ; NOT-R2-R6:  addu    $2, $4, $5
99  ; R2-R6:      addu    $2, $4, $5
100
101  ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
102
103  %r = add i32 %a, %b
104  ret i32 %r
105}
106
107define signext i64 @add_i64(i64 signext %a, i64 signext %b) {
108entry:
109; ALL-LABEL: add_i64:
110
111  ; GP32-DAG:   addu    $[[T0:[0-9]+]], $4, $6
112  ; GP32-DAG:   addu    $3, $5, $7
113  ; GP32:       sltu    $[[T1:[0-9]+]], $3, $5
114  ; GP32:       addu    $2, $[[T0]], $[[T1]]
115
116  ; GP64:       daddu   $2, $4, $5
117
118  ; MM32-DAG:   addu16  $3, $5, $7
119  ; MM32-DAG:   addu16  $[[T0:[0-9]+]], $4, $6
120  ; MM32:       sltu    $[[T1:[0-9]+]], $3, $5
121  ; MM32:       addu16  $2, $[[T0]], $[[T1]]
122
123  %r = add i64 %a, %b
124  ret i64 %r
125}
126
127define signext i128 @add_i128(i128 signext %a, i128 signext %b) {
128entry:
129; ALL-LABEL: add_i128:
130
131  ; PRE4:       move    $[[R1:[0-9]+]], $5
132  ; PRE4:       move    $[[R2:[0-9]+]], $4
133  ; PRE4:       lw   $[[R3:[0-9]+]], 24($sp)
134  ; PRE4:       addu   $[[R4:[0-9]+]], $6, $[[R3]]
135  ; PRE4:       lw   $[[R5:[0-9]+]], 28($sp)
136  ; PRE4:       addu   $[[R6:[0-9]+]], $7, $[[R5]]
137  ; PRE4:       sltu   $[[R7:[0-9]+]], $[[R6]], $7
138  ; PRE4:       addu   $[[R8:[0-9]+]], $[[R4]], $[[R7]]
139  ; PRE4:       xor   $[[R9:[0-9]+]], $[[R8]], $6
140  ; PRE4:       sltiu   $[[R10:[0-9]+]], $[[R9]], 1
141  ; PRE4:       bnez   $[[R10]], $BB5_2
142  ; PRE4:       sltu   $[[R7]], $[[R8]], $6
143  ; PRE4:       lw   $[[R12:[0-9]+]], 20($sp)
144  ; PRE4:       addu   $[[R13:[0-9]+]], $[[R1]], $[[R12]]
145  ; PRE4:       lw   $[[R14:[0-9]+]], 16($sp)
146  ; PRE4:       addu   $[[R15:[0-9]+]], $[[R13]], $[[R7]]
147  ; PRE4:       addu   $[[R16:[0-9]+]], $[[R2]], $[[R14]]
148  ; PRE4:       sltu   $[[R17:[0-9]+]], $[[R15]], $[[R13]]
149  ; PRE4:       sltu   $[[R18:[0-9]+]], $[[R13]], $[[R1]]
150  ; PRE4:       addu   $[[R19:[0-9]+]], $[[R16]], $[[R18]]
151  ; PRE4:       addu   $2, $[[R19]], $[[R17]]
152
153  ; GP32-CMOV:  lw        $[[T0:[0-9]+]], 24($sp)
154  ; GP32-CMOV:  addu      $[[T1:[0-9]+]], $6, $[[T0]]
155  ; GP32-CMOV:  lw        $[[T2:[0-9]+]], 28($sp)
156  ; GP32-CMOV:  addu      $[[T3:[0-9]+]], $7, $[[T2]]
157  ; GP32-CMOV:  sltu      $[[T4:[0-9]+]], $[[T3]], $7
158  ; GP32-CMOV:  addu      $[[T5:[0-9]+]], $[[T1]], $[[T4]]
159  ; GP32-CMOV:  sltu      $[[T6:[0-9]+]], $[[T5]], $6
160  ; GP32-CMOV:  xor       $[[T7:[0-9]+]], $[[T5]], $6
161  ; GP32-CMOV:  movz      $[[T8:[0-9]+]], $[[T4]], $[[T7]]
162  ; GP32-CMOV:  lw        $[[T9:[0-9]+]], 20($sp)
163  ; GP32-CMOV:  addu      $[[T10:[0-9]+]], $5, $[[T4]]
164  ; GP32-CMOV:  addu      $[[T11:[0-9]+]], $[[T10]], $[[T8]]
165  ; GP32-CMOV:  lw        $[[T12:[0-9]+]], 16($sp)
166  ; GP32-CMOV:  sltu      $[[T13:[0-9]+]], $[[T11]], $[[T10]]
167  ; GP32-CMOV:  addu      $[[T14:[0-9]+]], $4, $[[T12]]
168  ; GP32-CMOV:  sltu      $[[T15:[0-9]+]], $[[T10]], $5
169  ; GP32-CMOV:  addu      $[[T16:[0-9]+]], $[[T14]], $[[T15]]
170  ; GP32-CMOV:  addu      $[[T17:[0-9]+]], $[[T16]], $[[T13]]
171  ; GP32-CMOV:  move      $4, $[[T5]]
172  ; GP32-CMOV:  move      $5, $[[T3]]
173
174  ; GP64:           daddu   $[[T0:[0-9]+]], $4, $6
175  ; GP64:           daddu   $[[T1:[0-9]+]], $5, $7
176  ; GP64:           sltu    $[[T2:[0-9]+]], $[[T1]], $5
177  ; GP64-NOT-R2-R6: dsll    $[[T3:[0-9]+]], $[[T2]], 32
178  ; GP64-NOT-R2-R6: dsrl    $[[T4:[0-9]+]], $[[T3]], 32
179  ; GP64-R2-R6:     dext    $[[T4:[0-9]+]], $[[T2]], 0, 32
180
181  ; GP64:           daddu   $2, $[[T0]], $[[T4]]
182
183  ; MMR3:       move      $[[T1:[0-9]+]], $5
184  ; MMR3-DAG:   lw        $[[T2:[0-9]+]], 32($sp)
185  ; MMR3:       addu16    $[[T3:[0-9]+]], $6, $[[T2]]
186  ; MMR3-DAG:   lw        $[[T4:[0-9]+]], 36($sp)
187  ; MMR3:       addu16    $[[T5:[0-9]+]], $7, $[[T4]]
188  ; MMR3:       sltu      $[[T6:[0-9]+]], $[[T5]], $7
189  ; MMR3:       addu16    $[[T7:[0-9]+]], $[[T3]], $[[T6]]
190  ; MMR3:       sltu      $[[T8:[0-9]+]], $[[T7]], $6
191  ; MMR3:       xor       $[[T9:[0-9]+]], $[[T7]], $6
192  ; MMR3:       movz      $[[T8]], $[[T6]], $[[T9]]
193  ; MMR3:       lw        $[[T10:[0-9]+]], 28($sp)
194  ; MMR3:       addu16    $[[T11:[0-9]+]], $[[T1]], $[[T10]]
195  ; MMR3:       addu16    $[[T12:[0-9]+]], $[[T11]], $[[T8]]
196  ; MMR3:       lw        $[[T13:[0-9]+]], 24($sp)
197  ; MMR3:       sltu      $[[T14:[0-9]+]], $[[T12]], $[[T11]]
198  ; MMR3:       addu16    $[[T15:[0-9]+]], $4, $[[T13]]
199  ; MMR3:       sltu      $[[T16:[0-9]+]], $[[T11]], $[[T1]]
200  ; MMR3:       addu16    $[[T17:[0-9]+]], $[[T15]], $[[T16]]
201  ; MMR3:       addu16    $2, $2, $[[T14]]
202
203  ; MMR6:        move      $[[T1:[0-9]+]], $5
204  ; MMR6:        move      $[[T2:[0-9]+]], $4
205  ; MMR6:        lw        $[[T3:[0-9]+]], 32($sp)
206  ; MMR6:        addu16    $[[T4:[0-9]+]], $6, $[[T3]]
207  ; MMR6:        lw        $[[T5:[0-9]+]], 36($sp)
208  ; MMR6:        addu16    $[[T6:[0-9]+]], $7, $[[T5]]
209  ; MMR6:        sltu      $[[T7:[0-9]+]], $[[T6]], $7
210  ; MMR6:        addu16    $[[T8:[0-9]+]], $[[T4]], $7
211  ; MMR6:        sltu      $[[T9:[0-9]+]], $[[T8]], $6
212  ; MMR6:        xor       $[[T10:[0-9]+]], $[[T4]], $6
213  ; MMR6:        sltiu     $[[T11:[0-9]+]], $[[T10]], 1
214  ; MMR6:        seleqz    $[[T12:[0-9]+]], $[[T9]], $[[T11]]
215  ; MMR6:        selnez    $[[T13:[0-9]+]], $[[T7]], $[[T11]]
216  ; MMR6:        lw        $[[T14:[0-9]+]], 24($sp)
217  ; MMR6:        or        $[[T15:[0-9]+]], $[[T13]], $[[T12]]
218  ; MMR6:        addu16    $[[T16:[0-9]+]], $[[T2]], $[[T14]]
219  ; MMR6:        lw        $[[T17:[0-9]+]], 28($sp)
220  ; MMR6:        addu16    $[[T18:[0-9]+]], $[[T1]], $[[T17]]
221  ; MMR6:        addu16    $[[T19:[0-9]+]], $[[T18]], $[[T15]]
222  ; MMR6:        sltu      $[[T20:[0-9]+]], $[[T18]], $[[T1]]
223  ; MMR6:        sltu      $[[T21:[0-9]+]], $[[T17]], $[[T18]]
224  ; MMR6:        addu16    $2, $[[T16]], $[[T20]]
225  ; MMR6:        addu16    $2, $[[T20]], $[[T21]]
226
227  %r = add i128 %a, %b
228  ret i128 %r
229}
230
231define signext i1 @add_i1_4(i1 signext %a) {
232; ALL-LABEL: add_i1_4:
233
234  ; ALL:        move      $2, $4
235
236  %r = add i1 4, %a
237  ret i1 %r
238}
239
240define signext i8 @add_i8_4(i8 signext %a) {
241; ALL-LABEL: add_i8_4:
242
243  ; NOT-R2-R6:  sll     $[[T0:[0-9]+]], $4, 24
244  ; NOT-R2-R6:  lui     $[[T1:[0-9]+]], 1024
245  ; NOT-R2-R6:  addu    $[[T0]], $[[T0]], $[[T1]]
246  ; NOT-R2-R6:  sra     $2, $[[T0]], 24
247
248  ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 4
249  ; R2-R6:      seb     $2, $[[T0]]
250
251  ; MM32:       addiur2 $[[T0:[0-9]+]], $4, 4
252  ; MM32:       seb     $2, $[[T0]]
253
254  %r = add i8 4, %a
255  ret i8 %r
256}
257
258define signext i16 @add_i16_4(i16 signext %a) {
259; ALL-LABEL: add_i16_4:
260
261  ; NOT-R2-R6:  sll     $[[T0:[0-9]+]], $4, 16
262  ; NOT-R2-R6:  lui     $[[T1:[0-9]+]], 4
263  ; NOT-R2-R6:  addu    $[[T0]], $[[T0]], $[[T1]]
264  ; NOT-R2-R6:  sra     $2, $[[T0]], 16
265
266  ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 4
267  ; R2-R6:      seh     $2, $[[T0]]
268
269  ; MM32:       addiur2 $[[T0:[0-9]+]], $4, 4
270  ; MM32:       seh     $2, $[[T0]]
271
272  %r = add i16 4, %a
273  ret i16 %r
274}
275
276define signext i32 @add_i32_4(i32 signext %a) {
277; ALL-LABEL: add_i32_4:
278
279  ; GP32:       addiu   $2, $4, 4
280
281  ; GP64:       addiu   $2, $4, 4
282
283  ; MM32:       addiur2 $2, $4, 4
284
285  %r = add i32 4, %a
286  ret i32 %r
287}
288
289define signext i64 @add_i64_4(i64 signext %a) {
290; ALL-LABEL: add_i64_4:
291
292  ; GP32:       addiu   $3, $5, 4
293  ; GP32:       sltu    $[[T0:[0-9]+]], $3, $5
294  ; GP32:       addu    $2, $4, $[[T0]]
295
296  ; MM32:       addiur2 $[[T1:[0-9]+]], $5, 4
297  ; MM32:       sltu    $[[T2:[0-9]+]], $[[T1]], $5
298  ; MM32:       addu16  $2, $4, $[[T2]]
299
300  ; GP64:       daddiu  $2, $4, 4
301
302
303  %r = add i64 4, %a
304  ret i64 %r
305}
306
307define signext i128 @add_i128_4(i128 signext %a) {
308; ALL-LABEL: add_i128_4:
309
310  ; PRE4:       move   $[[T0:[0-9]+]], $5
311  ; PRE4:       addiu  $[[T1:[0-9]+]], $7, 4
312  ; PRE4:       sltu   $[[T2:[0-9]+]], $[[T1]], $7
313  ; PRE4:       xori   $[[T3:[0-9]+]], $[[T2]], 1
314  ; PRE4:       bnez   $[[T3]], $BB[[BB0:[0-9_]+]]
315  ; PRE4:       addu   $[[T4:[0-9]+]], $6, $[[T2]]
316  ; PRE4:       sltu   $[[T5:[0-9]+]], $[[T4]], $6
317  ; PRE4;       $BB[[BB0:[0-9]+]]:
318  ; PRE4:       addu   $[[T6:[0-9]+]], $[[T0]], $[[T5]]
319  ; PRE4:       sltu   $[[T7:[0-9]+]], $[[T6]], $[[T0]]
320  ; PRE4:       addu   $[[T8:[0-9]+]], $4, $[[T7]]
321  ; PRE4:       move    $4, $[[T4]]
322
323  ; GP32-CMOV:  addiu   $[[T0:[0-9]+]], $7, 4
324  ; GP32-CMOV:  sltu    $[[T1:[0-9]+]], $[[T0]], $7
325  ; GP32-CMOV:  addu    $[[T2:[0-9]+]], $6, $[[T1]]
326  ; GP32-CMOV:  sltu    $[[T3:[0-9]+]], $[[T2]], $6
327  ; GP32-CMOV:  movz    $[[T3]], $[[T1]], $[[T1]]
328  ; GP32-CMOV:  addu    $[[T4:[0-9]+]], $5, $[[T3]]
329  ; GP32-CMOV:  sltu    $[[T5:[0-9]+]], $[[T4]], $5
330  ; GP32-CMOV:  addu    $[[T7:[0-9]+]], $4, $[[T5]]
331  ; GP32-CMOV:  move    $4, $[[T2]]
332  ; GP32-CMOV:  move    $5, $[[T0]]
333
334  ; GP64:           daddiu  $[[T0:[0-9]+]], $5, 4
335  ; GP64:           sltu    $[[T1:[0-9]+]], $[[T0]], $5
336  ; GP64-NOT-R2-R6: dsll    $[[T2:[0-9]+]], $[[T1]], 32
337  ; GP64-NOT-R2-R6: dsrl    $[[T3:[0-9]+]], $[[T2]], 32
338  ; GP64-R2-R6:     dext    $[[T3:[0-9]+]], $[[T1]], 0, 32
339
340  ; GP64:           daddu   $2, $4, $[[T3]]
341
342  ; MMR3:       addiur2 $[[T0:[0-9]+]], $7, 4
343  ; MMR3:       sltu    $[[T1:[0-9]+]], $[[T0]], $7
344  ; MMR3:       addu16  $[[T2:[0-9]+]], $6, $[[T1]]
345  ; MMR3:       sltu    $[[T3:[0-9]+]], $[[T2]], $6
346  ; MMR3:       movz    $[[T3]], $[[T1]], $[[T1]]
347  ; MMR3:       addu16  $[[T6:[0-9]+]], $5, $[[T3]]
348  ; MMR3:       sltu    $[[T7:[0-9]+]], $[[T6]], $5
349  ; MMR3:       addu16  $2, $4, $[[T7]]
350
351  ; MMR6: addiur2 $[[T1:[0-9]+]], $7, 4
352  ; MMR6: sltu    $[[T2:[0-9]+]], $[[T1]], $7
353  ; MMR6: xori    $[[T3:[0-9]+]], $[[T2]], 1
354  ; MMR6: selnez  $[[T4:[0-9]+]], $[[T2]], $[[T3]]
355  ; MMR6: addu16  $[[T5:[0-9]+]], $6, $[[T2]]
356  ; MMR6: sltu    $[[T6:[0-9]+]], $[[T5]], $6
357  ; MMR6: seleqz  $[[T7:[0-9]+]], $[[T6]], $[[T3]]
358  ; MMR6: or      $[[T8:[0-9]+]], $[[T4]], $[[T7]]
359  ; MMR6: addu16  $[[T9:[0-9]+]], $5, $[[T8]]
360  ; MMR6: sltu    $[[T10:[0-9]+]], $[[T9]], $5
361  ; MMR6: addu16  $[[T11:[0-9]+]], $4, $[[T10]]
362  ; MMR6: move    $4, $7
363  ; MMR6: move    $5, $[[T1]]
364
365  %r = add i128 4, %a
366  ret i128 %r
367}
368
369define signext i1 @add_i1_3(i1 signext %a) {
370; ALL-LABEL: add_i1_3:
371  ; GP32:        addiu  $[[T0:[0-9]+]], $4, 1
372  ; GP32:        andi   $[[T0]], $[[T0]], 1
373  ; GP32:        negu   $2, $[[T0]]
374
375  ; GP64:        addiu  $[[T0:[0-9]+]], $4, 1
376  ; GP64:        andi   $[[T0]], $[[T0]], 1
377  ; GP64:        negu   $2, $[[T0]]
378
379  ; MMR6:        addiur2 $[[T0:[0-9]+]], $4, 1
380  ; MMR6:        andi16  $[[T0]], $[[T0]], 1
381  ; MMR6:        li16    $[[T1:[0-9]+]], 0
382  ; MMR6:        subu16  $2, $[[T1]], $[[T0]]
383
384  %r = add i1 3, %a
385  ret i1 %r
386}
387
388define signext i8 @add_i8_3(i8 signext %a) {
389; ALL-LABEL: add_i8_3:
390
391  ; NOT-R2-R6:  sll     $[[T0:[0-9]+]], $4, 24
392  ; NOT-R2-R6:  lui     $[[T1:[0-9]+]], 768
393  ; NOT-R2-R6:  addu    $[[T0]], $[[T0]], $[[T1]]
394  ; NOT-R2-R6:  sra     $2, $[[T0]], 24
395
396  ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 3
397  ; R2-R6:      seb     $2, $[[T0]]
398
399  ; MMR6:       addius5 $[[T0:[0-9]+]], 3
400  ; MMR6:       seb     $2, $[[T0]]
401
402  %r = add i8 3, %a
403  ret i8 %r
404}
405
406define signext i16 @add_i16_3(i16 signext %a) {
407; ALL-LABEL: add_i16_3:
408
409  ; NOT-R2-R6:  sll     $[[T0:[0-9]+]], $4, 16
410  ; NOT-R2-R6:  lui     $[[T1:[0-9]+]], 3
411  ; NOT-R2-R6:  addu    $[[T0]], $[[T0]], $[[T1]]
412  ; NOT-R2-R6:  sra     $2, $[[T0]], 16
413
414  ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 3
415  ; R2-R6:      seh     $2, $[[T0]]
416
417  ; MMR6:       addius5 $[[T0:[0-9]+]], 3
418  ; MMR6:       seh     $2, $[[T0]]
419
420  %r = add i16 3, %a
421  ret i16 %r
422}
423
424define signext i32 @add_i32_3(i32 signext %a) {
425; ALL-LABEL: add_i32_3:
426
427  ; NOT-R2-R6:  addiu   $2, $4, 3
428
429  ; R2-R6:      addiu   $2, $4, 3
430
431  ; MMR6:       addius5 $[[T0:[0-9]+]], 3
432  ; MMR6:       move    $2, $[[T0]]
433
434  %r = add i32 3, %a
435  ret i32 %r
436}
437
438define signext i64 @add_i64_3(i64 signext %a) {
439; ALL-LABEL: add_i64_3:
440
441  ; GP32:       addiu   $[[T0:[0-9]+]], $5, 3
442  ; GP32:       sltu    $[[T1:[0-9]+]], $[[T0]], $5
443  ; GP32:       addu    $2, $4, $[[T1]]
444
445  ; GP64:       daddiu  $2, $4, 3
446
447  ; MM32:       move    $[[T1:[0-9]+]], $5
448  ; MM32:       addius5 $[[T1]], 3
449  ; MM32:       sltu    $[[T2:[0-9]+]], $[[T1]], $5
450  ; MM32:       addu16  $2, $4, $[[T2]]
451
452  %r = add i64 3, %a
453  ret i64 %r
454}
455
456define signext i128 @add_i128_3(i128 signext %a) {
457; ALL-LABEL: add_i128_3:
458
459  ; PRE4:       move   $[[T0:[0-9]+]], $5
460  ; PRE4:       addiu  $[[T1:[0-9]+]], $7, 3
461  ; PRE4:       sltu   $[[T2:[0-9]+]], $[[T1]], $7
462  ; PRE4:       xori   $[[T3:[0-9]+]], $[[T2]], 1
463  ; PRE4:       bnez   $[[T3]], $BB[[BB0:[0-9_]+]]
464  ; PRE4:       addu   $[[T4:[0-9]+]], $6, $[[T2]]
465  ; PRE4:       sltu   $[[T5:[0-9]+]], $[[T4]], $6
466  ; PRE4;       $BB[[BB0:[0-9]+]]:
467  ; PRE4:       addu   $[[T6:[0-9]+]], $[[T0]], $[[T5]]
468  ; PRE4:       sltu   $[[T7:[0-9]+]], $[[T6]], $[[T0]]
469  ; PRE4:       addu   $[[T8:[0-9]+]], $4, $[[T7]]
470  ; PRE4:       move    $4, $[[T4]]
471
472  ; GP32-CMOV:  addiu   $[[T0:[0-9]+]], $7, 3
473  ; GP32-CMOV:  sltu    $[[T1:[0-9]+]], $[[T0]], $7
474  ; GP32-CMOV:  addu    $[[T2:[0-9]+]], $6, $[[T1]]
475  ; GP32-CMOV:  sltu    $[[T3:[0-9]+]], $[[T2]], $6
476  ; GP32-CMOV:  movz    $[[T3]], $[[T1]], $[[T1]]
477  ; GP32-CMOV:  addu    $[[T4:[0-9]+]], $5, $[[T3]]
478  ; GP32-CMOV:  sltu    $[[T5:[0-9]+]], $[[T4]], $5
479  ; GP32-CMOV:  addu    $[[T7:[0-9]+]], $4, $[[T5]]
480  ; GP32-CMOV:  move    $4, $[[T2]]
481  ; GP32-CMOV:  move    $5, $[[T0]]
482
483  ; GP64:           daddiu  $[[T0:[0-9]+]], $5, 3
484  ; GP64:           sltu    $[[T1:[0-9]+]], $[[T0]], $5
485
486  ; GP64-NOT-R2-R6: dsll    $[[T2:[0-9]+]], $[[T1]], 32
487  ; GP64-NOT-R2-R6: dsrl    $[[T3:[0-9]+]], $[[T2]], 32
488  ; GP64-R2-R6:     dext    $[[T3:[0-9]+]], $[[T1]], 0, 32
489
490  ; GP64:           daddu   $2, $4, $[[T3]]
491
492  ; MMR3:       move    $[[T1:[0-9]+]], $7
493  ; MMR3:       addius5 $[[T1]], 3
494  ; MMR3:       sltu    $[[T2:[0-9]+]], $[[T1]], $7
495  ; MMR3:       addu16  $[[T3:[0-9]+]], $6, $[[T2]]
496  ; MMR3:       sltu    $[[T4:[0-9]+]], $[[T3]], $6
497  ; MMR3:       movz    $[[T4]], $[[T2]], $[[T2]]
498  ; MMR3:       addu16  $[[T5:[0-9]+]], $5, $[[T4]]
499  ; MMR3:       sltu    $[[T6:[0-9]+]], $[[T5]], $5
500  ; MMR3:       addu16  $2, $4, $[[T6]]
501
502  ; MMR6: move    $[[T1:[0-9]+]], $7
503  ; MMR6: addius5 $[[T1]], 3
504  ; MMR6: sltu    $[[T2:[0-9]+]], $[[T1]], $7
505  ; MMR6: xori    $[[T3:[0-9]+]], $[[T2]], 1
506  ; MMR6: selnez  $[[T4:[0-9]+]], $[[T2]], $[[T3]]
507  ; MMR6: addu16  $[[T5:[0-9]+]], $6, $[[T2]]
508  ; MMR6: sltu    $[[T6:[0-9]+]], $[[T5]], $6
509  ; MMR6: seleqz  $[[T7:[0-9]+]], $[[T6]], $[[T3]]
510  ; MMR6: or      $[[T8:[0-9]+]], $[[T4]], $[[T7]]
511  ; MMR6: addu16  $[[T9:[0-9]+]], $5, $[[T8]]
512  ; MMR6: sltu    $[[T10:[0-9]+]], $[[T9]], $5
513  ; MMR6: addu16  $[[T11:[0-9]+]], $4, $[[T10]]
514  ; MMR6: move    $4, $[[T5]]
515  ; MMR6: move    $5, $[[T1]]
516
517  %r = add i128 3, %a
518  ret i128 %r
519}
520