[TableGen] Fix validateOperandClass for non Phyical Reg (#118146)
[llvm-project.git] / llvm / test / CodeGen / Mips / llvm-ir / add.ll
blob84c4bf677f945574d328d183d45efd012bd26f5f
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
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.
37 define signext i1 @add_i1(i1 signext %a, i1 signext %b) {
38 entry:
39 ; ALL-LABEL: add_i1:
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]]
45   ; R2-R6:      addu   $[[T0:[0-9]+]], $4, $5
46   ; R2-R6:      andi   $[[T0]], $[[T0]], 1
47   ; R2-R6:      negu   $2, $[[T0]]
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]]
54   %r = add i1 %a, %b
55   ret i1 %r
58 define signext i8 @add_i8(i8 signext %a, i8 signext %b) {
59 entry:
60 ; ALL-LABEL: add_i8:
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
66   ; R2-R6:      addu    $[[T0:[0-9]+]], $4, $5
67   ; R2-R6:      seb     $2, $[[T0:[0-9]+]]
69   ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
70   ; MMR6:       seb     $2, $[[T0]]
72   %r = add i8 %a, %b
73   ret i8 %r
76 define signext i16 @add_i16(i16 signext %a, i16 signext %b) {
77 entry:
78 ; ALL-LABEL: add_i16:
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
84   ; R2-R6:      addu    $[[T0:[0-9]+]], $4, $5
85   ; R2-R6:      seh     $2, $[[T0]]
87   ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
88   ; MMR6:       seh     $2, $[[T0]]
90   %r = add i16 %a, %b
91   ret i16 %r
94 define signext i32 @add_i32(i32 signext %a, i32 signext %b) {
95 entry:
96 ; ALL-LABEL: add_i32:
98   ; NOT-R2-R6:  addu    $2, $4, $5
99   ; R2-R6:      addu    $2, $4, $5
101   ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
103   %r = add i32 %a, %b
104   ret i32 %r
107 define signext i64 @add_i64(i64 signext %a, i64 signext %b) {
108 entry:
109 ; ALL-LABEL: add_i64:
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]]
116   ; GP64:       daddu   $2, $4, $5
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]]
123   %r = add i64 %a, %b
124   ret i64 %r
127 define signext i128 @add_i128(i128 signext %a, i128 signext %b) {
128 entry:
129 ; ALL-LABEL: add_i128:
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]]
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]]
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
181   ; GP64:           daddu   $2, $[[T0]], $[[T4]]
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]]
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]]
227   %r = add i128 %a, %b
228   ret i128 %r
231 define signext i1 @add_i1_4(i1 signext %a) {
232 ; ALL-LABEL: add_i1_4:
234   ; ALL:        move      $2, $4
236   %r = add i1 4, %a
237   ret i1 %r
240 define signext i8 @add_i8_4(i8 signext %a) {
241 ; ALL-LABEL: add_i8_4:
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
248   ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 4
249   ; R2-R6:      seb     $2, $[[T0]]
251   ; MM32:       addiur2 $[[T0:[0-9]+]], $4, 4
252   ; MM32:       seb     $2, $[[T0]]
254   %r = add i8 4, %a
255   ret i8 %r
258 define signext i16 @add_i16_4(i16 signext %a) {
259 ; ALL-LABEL: add_i16_4:
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
266   ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 4
267   ; R2-R6:      seh     $2, $[[T0]]
269   ; MM32:       addiur2 $[[T0:[0-9]+]], $4, 4
270   ; MM32:       seh     $2, $[[T0]]
272   %r = add i16 4, %a
273   ret i16 %r
276 define signext i32 @add_i32_4(i32 signext %a) {
277 ; ALL-LABEL: add_i32_4:
279   ; GP32:       addiu   $2, $4, 4
281   ; GP64:       addiu   $2, $4, 4
283   ; MM32:       addiur2 $2, $4, 4
285   %r = add i32 4, %a
286   ret i32 %r
289 define signext i64 @add_i64_4(i64 signext %a) {
290 ; ALL-LABEL: add_i64_4:
292   ; GP32:       addiu   $3, $5, 4
293   ; GP32:       sltu    $[[T0:[0-9]+]], $3, $5
294   ; GP32:       addu    $2, $4, $[[T0]]
296   ; MM32:       addiur2 $[[T1:[0-9]+]], $5, 4
297   ; MM32:       sltu    $[[T2:[0-9]+]], $[[T1]], $5
298   ; MM32:       addu16  $2, $4, $[[T2]]
300   ; GP64:       daddiu  $2, $4, 4
303   %r = add i64 4, %a
304   ret i64 %r
307 define signext i128 @add_i128_4(i128 signext %a) {
308 ; ALL-LABEL: add_i128_4:
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]]
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]]
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
340   ; GP64:           daddu   $2, $4, $[[T3]]
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]]
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]]
365   %r = add i128 4, %a
366   ret i128 %r
369 define 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]]
375   ; GP64:        addiu  $[[T0:[0-9]+]], $4, 1
376   ; GP64:        andi   $[[T0]], $[[T0]], 1
377   ; GP64:        negu   $2, $[[T0]]
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]]
384   %r = add i1 3, %a
385   ret i1 %r
388 define signext i8 @add_i8_3(i8 signext %a) {
389 ; ALL-LABEL: add_i8_3:
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
396   ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 3
397   ; R2-R6:      seb     $2, $[[T0]]
399   ; MMR6:       addius5 $[[T0:[0-9]+]], 3
400   ; MMR6:       seb     $2, $[[T0]]
402   %r = add i8 3, %a
403   ret i8 %r
406 define signext i16 @add_i16_3(i16 signext %a) {
407 ; ALL-LABEL: add_i16_3:
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
414   ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 3
415   ; R2-R6:      seh     $2, $[[T0]]
417   ; MMR6:       addius5 $[[T0:[0-9]+]], 3
418   ; MMR6:       seh     $2, $[[T0]]
420   %r = add i16 3, %a
421   ret i16 %r
424 define signext i32 @add_i32_3(i32 signext %a) {
425 ; ALL-LABEL: add_i32_3:
427   ; NOT-R2-R6:  addiu   $2, $4, 3
429   ; R2-R6:      addiu   $2, $4, 3
431   ; MMR6:       addius5 $[[T0:[0-9]+]], 3
432   ; MMR6:       move    $2, $[[T0]]
434   %r = add i32 3, %a
435   ret i32 %r
438 define signext i64 @add_i64_3(i64 signext %a) {
439 ; ALL-LABEL: add_i64_3:
441   ; GP32:       addiu   $[[T0:[0-9]+]], $5, 3
442   ; GP32:       sltu    $[[T1:[0-9]+]], $[[T0]], $5
443   ; GP32:       addu    $2, $4, $[[T1]]
445   ; GP64:       daddiu  $2, $4, 3
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]]
452   %r = add i64 3, %a
453   ret i64 %r
456 define signext i128 @add_i128_3(i128 signext %a) {
457 ; ALL-LABEL: add_i128_3:
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]]
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]]
483   ; GP64:           daddiu  $[[T0:[0-9]+]], $5, 3
484   ; GP64:           sltu    $[[T1:[0-9]+]], $[[T0]], $5
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
490   ; GP64:           daddu   $2, $4, $[[T3]]
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]]
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]]
517   %r = add i128 3, %a
518   ret i128 %r