Home | History | Annotate | Download | only in llvm-ir
      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 
     37 define signext i1 @add_i1(i1 signext %a, i1 signext %b) {
     38 entry:
     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 
     58 define signext i8 @add_i8(i8 signext %a, i8 signext %b) {
     59 entry:
     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 
     76 define signext i16 @add_i16(i16 signext %a, i16 signext %b) {
     77 entry:
     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 
     94 define signext i32 @add_i32(i32 signext %a, i32 signext %b) {
     95 entry:
     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 
    107 define signext i64 @add_i64(i64 signext %a, i64 signext %b) {
    108 entry:
    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 
    127 define signext i128 @add_i128(i128 signext %a, i128 signext %b) {
    128 entry:
    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 
    231 define 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 
    240 define 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 
    258 define 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 
    276 define 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 
    289 define 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 
    307 define 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 
    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]]
    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 
    388 define 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 
    406 define 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 
    424 define 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 
    438 define 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 
    456 define 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