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
      3 ; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s \
      4 ; RUN:    -check-prefixes=ALL,NOT-R2-R6,GP32
      5 ; RUN: llc < %s -march=mips -mcpu=mips32r2 | FileCheck %s \
      6 ; RUN:    -check-prefixes=ALL,R2-R6,GP32
      7 ; RUN: llc < %s -march=mips -mcpu=mips32r3 | FileCheck %s \
      8 ; RUN:    -check-prefixes=ALL,R2-R6,GP32
      9 ; RUN: llc < %s -march=mips -mcpu=mips32r5 | FileCheck %s \
     10 ; RUN:    -check-prefixes=ALL,R2-R6,GP32
     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
     15 ; RUN: llc < %s -march=mips64 -mcpu=mips4 | FileCheck %s \
     16 ; RUN:    -check-prefixes=ALL,NOT-R2-R6,GP64
     17 ; RUN: llc < %s -march=mips64 -mcpu=mips64 | FileCheck %s \
     18 ; RUN:    -check-prefixes=ALL,NOT-R2-R6,GP64
     19 ; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | FileCheck %s \
     20 ; RUN:    -check-prefixes=ALL,R2-R6,GP64
     21 ; RUN: llc < %s -march=mips64 -mcpu=mips64r3 | FileCheck %s \
     22 ; RUN:    -check-prefixes=ALL,R2-R6,GP64
     23 ; RUN: llc < %s -march=mips64 -mcpu=mips64r5 | FileCheck %s \
     24 ; RUN:    -check-prefixes=ALL,R2-R6,GP64
     25 ; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s \
     26 ; RUN:    -check-prefixes=ALL,R2-R6,GP64
     27 ; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips -O2 | FileCheck %s \
     28 ; RUN:    -check-prefixes=ALL,MMR6,MM32
     29 ; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips -O2 | FileCheck %s \
     30 ; RUN:    -check-prefixes=ALL,MMR6,MM32
     31 ; RUN: llc < %s -march=mips -mcpu=mips64r6 -target-abi n64 -mattr=+micromips -O2 | FileCheck %s \
     32 ; RUN:    -check-prefixes=ALL,MMR6,MM64
     33 
     34 define signext i1 @add_i1(i1 signext %a, i1 signext %b) {
     35 entry:
     36 ; ALL-LABEL: add_i1:
     37 
     38   ; NOT-R2-R6:  addu    $[[T0:[0-9]+]], $4, $5
     39   ; NOT-R2-R6:  sll     $[[T0]], $[[T0]], 31
     40   ; NOT-R2-R6:  sra     $2, $[[T0]], 31
     41 
     42   ; R2-R6:      addu    $[[T0:[0-9]+]], $4, $5
     43   ; R2-R6:      sll     $[[T0]], $[[T0]], 31
     44   ; R2-R6:      sra     $2, $[[T0]], 31
     45 
     46   ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
     47   ; MMR6:       sll     $[[T1:[0-9]+]], $[[T0]], 31
     48   ; MMR6:       sra     $2, $[[T1]], 31
     49 
     50   %r = add i1 %a, %b
     51   ret i1 %r
     52 }
     53 
     54 define signext i8 @add_i8(i8 signext %a, i8 signext %b) {
     55 entry:
     56 ; ALL-LABEL: add_i8:
     57 
     58   ; NOT-R2-R6:  addu    $[[T0:[0-9]+]], $4, $5
     59   ; NOT-R2-R6:  sll     $[[T0]], $[[T0]], 24
     60   ; NOT-R2-R6:  sra     $2, $[[T0]], 24
     61 
     62   ; R2-R6:      addu    $[[T0:[0-9]+]], $4, $5
     63   ; R2-R6:      seb     $2, $[[T0:[0-9]+]]
     64 
     65   ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
     66   ; MMR6:       seb     $2, $[[T0]]
     67 
     68   %r = add i8 %a, %b
     69   ret i8 %r
     70 }
     71 
     72 define signext i16 @add_i16(i16 signext %a, i16 signext %b) {
     73 entry:
     74 ; ALL-LABEL: add_i16:
     75 
     76   ; NOT-R2-R6:  addu    $[[T0:[0-9]+]], $4, $5
     77   ; NOT-R2-R6:  sll     $[[T0]], $[[T0]], 16
     78   ; NOT-R2-R6:  sra     $2, $[[T0]], 16
     79 
     80   ; R2-R6:      addu    $[[T0:[0-9]+]], $4, $5
     81   ; R2-R6:      seh     $2, $[[T0]]
     82 
     83   ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
     84   ; MMR6:       seh     $2, $[[T0]]
     85 
     86   %r = add i16 %a, %b
     87   ret i16 %r
     88 }
     89 
     90 define signext i32 @add_i32(i32 signext %a, i32 signext %b) {
     91 entry:
     92 ; ALL-LABEL: add_i32:
     93 
     94   ; NOT-R2-R6:  addu    $2, $4, $5
     95   ; R2-R6:      addu    $2, $4, $5
     96 
     97   ; MMR6:       addu16  $[[T0:[0-9]+]], $4, $5
     98 
     99   %r = add i32 %a, %b
    100   ret i32 %r
    101 }
    102 
    103 define signext i64 @add_i64(i64 signext %a, i64 signext %b) {
    104 entry:
    105 ; ALL-LABEL: add_i64:
    106 
    107   ; GP32:       addu    $3, $5, $7
    108   ; GP32:       sltu    $[[T0:[0-9]+]], $3, $7
    109   ; GP32:       addu    $[[T1:[0-9]+]], $[[T0]], $6
    110   ; GP32:       addu    $2, $4, $[[T1]]
    111 
    112   ; GP64:       daddu   $2, $4, $5
    113 
    114   ; MM32:       addu    $3, $5, $7
    115   ; MM32:       sltu    $[[T0:[0-9]+]], $3, $7
    116   ; MM32:       addu    $[[T1:[0-9]+]], $[[T0]], $6
    117   ; MM32:       addu    $2, $4, $[[T1]]
    118 
    119   ; MM64:       daddu   $2, $4, $5
    120 
    121   %r = add i64 %a, %b
    122   ret i64 %r
    123 }
    124 
    125 define signext i128 @add_i128(i128 signext %a, i128 signext %b) {
    126 entry:
    127 ; ALL-LABEL: add_i128:
    128 
    129   ; GP32:       lw        $[[T0:[0-9]+]], 28($sp)
    130   ; GP32:       addu      $[[T1:[0-9]+]], $7, $[[T0]]
    131   ; GP32:       sltu      $[[T2:[0-9]+]], $[[T1]], $[[T0]]
    132   ; GP32:       lw        $[[T3:[0-9]+]], 24($sp)
    133   ; GP32:       addu      $[[T4:[0-9]+]], $[[T2]], $[[T3]]
    134   ; GP32:       addu      $[[T5:[0-9]+]], $6, $[[T4]]
    135   ; GP32:       lw        $[[T6:[0-9]+]], 16($sp)
    136   ; GP32:       lw        $[[T7:[0-9]+]], 20($sp)
    137   ; GP32:       sltu      $[[T8:[0-9]+]], $[[T5]], $[[T3]]
    138   ; GP32:       addu      $[[T9:[0-9]+]], $[[T8]], $[[T7]]
    139   ; GP32:       addu      $3, $5, $[[T8]]
    140   ; GP32:       sltu      $[[T10:[0-9]+]], $3, $[[T7]]
    141   ; GP32:       addu      $[[T11:[0-9]+]], $[[T10]], $[[T6]]
    142   ; GP32:       addu      $2, $4, $[[T11]]
    143   ; GP32:       move      $4, $[[T5]]
    144   ; GP32:       move      $5, $[[T1]]
    145 
    146   ; GP64:       daddu     $3, $5, $7
    147   ; GP64:       sltu      $[[T0:[0-9]+]], $3, $7
    148   ; GP64:       daddu     $[[T1:[0-9]+]], $[[T0]], $6
    149   ; GP64:       daddu     $2, $4, $[[T1]]
    150 
    151   ; MM32:       lw        $[[T0:[0-9]+]], 28($sp)
    152   ; MM32:       addu      $[[T1:[0-9]+]], $7, $[[T0]]
    153   ; MM32:       sltu      $[[T2:[0-9]+]], $[[T1]], $[[T0]]
    154   ; MM32:       lw        $[[T3:[0-9]+]], 24($sp)
    155   ; MM32:       addu      $[[T4:[0-9]+]], $[[T2]], $[[T3]]
    156   ; MM32:       addu      $[[T5:[0-9]+]], $6, $[[T4]]
    157   ; MM32:       sltu      $[[T6:[0-9]+]], $[[T5]], $[[T3]]
    158   ; MM32:       lw        $[[T7:[0-9]+]], 20($sp)
    159   ; MM32:       addu      $[[T8:[0-9]+]], $[[T6]], $[[T7]]
    160   ; MM32:       addu      $[[T9:[0-9]+]], $5, $[[T8]]
    161   ; MM32:       lw        $[[T10:[0-9]+]], 16($sp)
    162   ; MM32:       sltu      $[[T11:[0-9]+]], $[[T9]], $[[T7]]
    163   ; MM32:       addu      $[[T12:[0-9]+]], $[[T11]], $[[T10]]
    164   ; MM32:       addu      $[[T13:[0-9]+]], $4, $[[T12]]
    165   ; MM32:       move      $4, $[[T5]]
    166   ; MM32:       move      $5, $[[T1]]
    167 
    168   ; MM64:       daddu     $3, $5, $7
    169   ; MM64:       sltu      $[[T0:[0-9]+]], $3, $7
    170   ; MM64:       daddu     $[[T1:[0-9]+]], $[[T0]], $6
    171   ; MM64:       daddu     $2, $4, $[[T1]]
    172 
    173   %r = add i128 %a, %b
    174   ret i128 %r
    175 }
    176 
    177 define signext i1 @add_i1_4(i1 signext %a) {
    178 ; ALL-LABEL: add_i1_4:
    179 
    180   ; ALL:        move      $2, $4
    181 
    182   %r = add i1 4, %a
    183   ret i1 %r
    184 }
    185 
    186 define signext i8 @add_i8_4(i8 signext %a) {
    187 ; ALL-LABEL: add_i8_4:
    188 
    189   ; NOT-R2-R6:  sll     $[[T0:[0-9]+]], $4, 24
    190   ; NOT-R2-R6:  lui     $[[T1:[0-9]+]], 1024
    191   ; NOT-R2-R6:  addu    $[[T0]], $[[T0]], $[[T1]]
    192   ; NOT-R2-R6:  sra     $2, $[[T0]], 24
    193 
    194   ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 4
    195   ; R2-R6:      seb     $2, $[[T0]]
    196 
    197   ; MM32:       addiur2 $[[T0:[0-9]+]], $4, 4
    198   ; MM32:       seb     $2, $[[T0]]
    199 
    200   ; MM64:       addiur2 $[[T0:[0-9]+]], $4, 4
    201   ; MM64:       seb     $2, $[[T0]]
    202 
    203   %r = add i8 4, %a
    204   ret i8 %r
    205 }
    206 
    207 define signext i16 @add_i16_4(i16 signext %a) {
    208 ; ALL-LABEL: add_i16_4:
    209 
    210   ; NOT-R2-R6:  sll     $[[T0:[0-9]+]], $4, 16
    211   ; NOT-R2-R6:  lui     $[[T1:[0-9]+]], 4
    212   ; NOT-R2-R6:  addu    $[[T0]], $[[T0]], $[[T1]]
    213   ; NOT-R2-R6:  sra     $2, $[[T0]], 16
    214 
    215   ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 4
    216   ; R2-R6:      seh     $2, $[[T0]]
    217 
    218   ; MM32:       addiur2 $[[T0:[0-9]+]], $4, 4
    219   ; MM32:       seh     $2, $[[T0]]
    220 
    221   ; MM64:       addiur2 $[[T0:[0-9]+]], $4, 4
    222   ; MM64:       seh     $2, $[[T0]]
    223 
    224   %r = add i16 4, %a
    225   ret i16 %r
    226 }
    227 
    228 define signext i32 @add_i32_4(i32 signext %a) {
    229 ; ALL-LABEL: add_i32_4:
    230 
    231   ; GP32:       addiu   $2, $4, 4
    232 
    233   ; GP64:       addiu   $2, $4, 4
    234 
    235   ; MM32:       addiur2 $2, $4, 4
    236 
    237   ; MM64:       addiur2 $2, $4, 4
    238 
    239   %r = add i32 4, %a
    240   ret i32 %r
    241 }
    242 
    243 define signext i64 @add_i64_4(i64 signext %a) {
    244 ; ALL-LABEL: add_i64_4:
    245 
    246   ; GP32:       addiu   $[[T0:[0-9]+]], $5, 4
    247   ; GP32:       addiu   $[[T1:[0-9]+]], $zero, 4
    248   ; GP32:       sltu    $[[T1]], $[[T0]], $[[T1]]
    249   ; GP32:       addu    $2, $4, $[[T1]]
    250 
    251   ; GP64:       daddiu  $2, $4, 4
    252 
    253   ; MM32:       addiu   $[[T0:[0-9]+]], $5, 4
    254   ; MM32:       li16    $[[T1:[0-9]+]], 4
    255   ; MM32:       sltu    $[[T2:[0-9]+]], $[[T0]], $[[T1]]
    256   ; MM32:       addu    $2, $4, $[[T2]]
    257 
    258   ; MM64:       daddiu  $2, $4, 4
    259 
    260   %r = add i64 4, %a
    261   ret i64 %r
    262 }
    263 
    264 define signext i128 @add_i128_4(i128 signext %a) {
    265 ; ALL-LABEL: add_i128_4:
    266 
    267   ; GP32:       addiu   $[[T0:[0-9]+]], $7, 4
    268   ; GP32:       addiu   $[[T1:[0-9]+]], $zero, 4
    269   ; GP32:       sltu    $[[T1]], $[[T0]], $[[T1]]
    270   ; GP32:       addu    $[[T2:[0-9]+]], $6, $[[T1]]
    271   ; GP32:       sltu    $[[T1]], $[[T2]], $zero
    272   ; GP32:       addu    $[[T3:[0-9]+]], $5, $[[T1]]
    273   ; GP32:       sltu    $[[T1]], $[[T3]], $zero
    274   ; GP32:       addu    $[[T1]], $4, $[[T1]]
    275   ; GP32:       move    $4, $[[T2]]
    276   ; GP32:       move    $5, $[[T0]]
    277 
    278   ; GP64:       daddiu  $[[T0:[0-9]+]], $5, 4
    279   ; GP64:       daddiu  $[[T1:[0-9]+]], $zero, 4
    280   ; GP64:       sltu    $[[T1]], $[[T0]], $[[T1]]
    281   ; GP64:       daddu   $2, $4, $[[T1]]
    282 
    283   ; MM32:       addiu   $[[T0:[0-9]+]], $7, 4
    284   ; MM32:       li16    $[[T1:[0-9]+]], 4
    285   ; MM32:       sltu    $[[T1]], $[[T0]], $[[T1]]
    286   ; MM32:       addu    $[[T2:[0-9]+]], $6, $[[T1]]
    287   ; MM32:       lui     $[[T1]], 0
    288   ; MM32:       sltu    $[[T3:[0-9]+]], $[[T2]], $[[T1]]
    289   ; MM32:       addu    $[[T3]], $5, $[[T3]]
    290   ; MM32:       sltu    $[[T1]], $[[T3]], $[[T1]]
    291   ; MM32:       addu    $[[T1]], $4, $[[T1]]
    292   ; MM32:       move    $4, $[[T2]]
    293   ; MM32:       move    $5, $[[T0]]
    294 
    295   ; MM64:       daddiu  $[[T0:[0-9]+]], $5, 4
    296   ; MM64:       daddiu  $[[T1:[0-9]+]], $zero, 4
    297   ; MM64:       sltu    $[[T1]], $[[T0]], $[[T1]]
    298   ; MM64:       daddu   $2, $4, $[[T1]]
    299 
    300   %r = add i128 4, %a
    301   ret i128 %r
    302 }
    303 
    304 define signext i1 @add_i1_3(i1 signext %a) {
    305 ; ALL-LABEL: add_i1_3:
    306 
    307   ; ALL:        sll     $[[T0:[0-9]+]], $4, 31
    308   ; ALL:        lui     $[[T1:[0-9]+]], 32768
    309 
    310   ; GP32:       addu    $[[T0]], $[[T0]], $[[T1]]
    311   ; GP32:       sra     $[[T1]], $[[T0]], 31
    312 
    313   ; GP64:       addu    $[[T0]], $[[T0]], $[[T1]]
    314   ; GP64:       sra     $[[T1]], $[[T0]], 31
    315 
    316   ; MMR6:       addu16  $[[T0]], $[[T0]], $[[T1]]
    317   ; MMR6:       sra     $[[T0]], $[[T0]], 31
    318 
    319   %r = add i1 3, %a
    320   ret i1 %r
    321 }
    322 
    323 define signext i8 @add_i8_3(i8 signext %a) {
    324 ; ALL-LABEL: add_i8_3:
    325 
    326   ; NOT-R2-R6:  sll     $[[T0:[0-9]+]], $4, 24
    327   ; NOT-R2-R6:  lui     $[[T1:[0-9]+]], 768
    328   ; NOT-R2-R6:  addu    $[[T0]], $[[T0]], $[[T1]]
    329   ; NOT-R2-R6:  sra     $2, $[[T0]], 24
    330 
    331   ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 3
    332   ; R2-R6:      seb     $2, $[[T0]]
    333 
    334   ; MMR6:       addius5 $[[T0:[0-9]+]], 3
    335   ; MMR6:       seb     $2, $[[T0]]
    336 
    337   %r = add i8 3, %a
    338   ret i8 %r
    339 }
    340 
    341 define signext i16 @add_i16_3(i16 signext %a) {
    342 ; ALL-LABEL: add_i16_3:
    343 
    344   ; NOT-R2-R6:  sll     $[[T0:[0-9]+]], $4, 16
    345   ; NOT-R2-R6:  lui     $[[T1:[0-9]+]], 3
    346   ; NOT-R2-R6:  addu    $[[T0]], $[[T0]], $[[T1]]
    347   ; NOT-R2-R6:  sra     $2, $[[T0]], 16
    348 
    349   ; R2-R6:      addiu   $[[T0:[0-9]+]], $4, 3
    350   ; R2-R6:      seh     $2, $[[T0]]
    351 
    352   ; MMR6:       addius5 $[[T0:[0-9]+]], 3
    353   ; MMR6:       seh     $2, $[[T0]]
    354 
    355   %r = add i16 3, %a
    356   ret i16 %r
    357 }
    358 
    359 define signext i32 @add_i32_3(i32 signext %a) {
    360 ; ALL-LABEL: add_i32_3:
    361 
    362   ; NOT-R2-R6:  addiu   $2, $4, 3
    363 
    364   ; R2-R6:      addiu   $2, $4, 3
    365 
    366   ; MMR6:       addius5 $[[T0:[0-9]+]], 3
    367   ; MMR6:       move    $2, $[[T0]]
    368 
    369   %r = add i32 3, %a
    370   ret i32 %r
    371 }
    372 
    373 define signext i64 @add_i64_3(i64 signext %a) {
    374 ; ALL-LABEL: add_i64_3:
    375 
    376   ; GP32:       addiu   $[[T0:[0-9]+]], $5, 3
    377   ; GP32:       addiu   $[[T1:[0-9]+]], $zero, 3
    378   ; GP32:       sltu    $[[T1]], $[[T0]], $[[T1]]
    379   ; GP32:       addu    $2, $4, $[[T1]]
    380 
    381   ; GP64:       daddiu  $2, $4, 3
    382 
    383   ; MM32:       addiu   $[[T0:[0-9]+]], $5, 3
    384   ; MM32:       li16    $[[T1:[0-9]+]], 3
    385   ; MM32:       sltu    $[[T2:[0-9]+]], $[[T0]], $[[T1]]
    386   ; MM32:       addu    $2, $4, $[[T2]]
    387 
    388   ; MM64:       daddiu  $2, $4, 3
    389 
    390   %r = add i64 3, %a
    391   ret i64 %r
    392 }
    393 
    394 define signext i128 @add_i128_3(i128 signext %a) {
    395 ; ALL-LABEL: add_i128_3:
    396 
    397   ; GP32:       addiu   $[[T0:[0-9]+]], $7, 3
    398   ; GP32:       addiu   $[[T1:[0-9]+]], $zero, 3
    399   ; GP32:       sltu    $[[T1]], $[[T0]], $[[T1]]
    400   ; GP32:       addu    $[[T2:[0-9]+]], $6, $[[T1]]
    401   ; GP32:       sltu    $[[T3:[0-9]+]], $[[T2]], $zero
    402   ; GP32:       addu    $[[T4:[0-9]+]], $5, $[[T3]]
    403   ; GP32:       sltu    $[[T5:[0-9]+]], $[[T4]], $zero
    404   ; GP32:       addu    $[[T5]], $4, $[[T5]]
    405   ; GP32:       move    $4, $[[T2]]
    406   ; GP32:       move    $5, $[[T0]]
    407 
    408   ; GP64:       daddiu  $[[T0:[0-9]+]], $5, 3
    409   ; GP64:       daddiu  $[[T1:[0-9]+]], $zero, 3
    410   ; GP64:       sltu    $[[T1]], $[[T0]], $[[T1]]
    411   ; GP64:       daddu   $2, $4, $[[T1]]
    412 
    413   ; MM32:       addiu   $[[T0:[0-9]+]], $7, 3
    414   ; MM32:       li16    $[[T1:[0-9]+]], 3
    415   ; MM32:       sltu    $[[T1]], $[[T0]], $[[T1]]
    416   ; MM32:       addu    $[[T2:[0-9]+]], $6, $[[T1]]
    417   ; MM32:       lui     $[[T3:[0-9]+]], 0
    418   ; MM32:       sltu    $[[T4:[0-9]+]], $[[T2]], $[[T3]]
    419   ; MM32:       addu    $[[T4]], $5, $[[T4]]
    420   ; MM32:       sltu    $[[T5:[0-9]+]], $[[T4]], $[[T3]]
    421   ; MM32:       addu    $[[T5]], $4, $[[T5]]
    422   ; MM32:       move    $4, $[[T2]]
    423   ; MM32:       move    $5, $[[T0]]
    424 
    425   ; MM64:       daddiu  $[[T0:[0-9]+]], $5, 3
    426   ; MM64:       daddiu  $[[T1:[0-9]+]], $zero, 3
    427   ; MM64:       sltu    $[[T1]], $[[T0]], $[[T1]]
    428   ; MM64:       daddu   $2, $4, $[[T1]]
    429 
    430   %r = add i128 3, %a
    431   ret i128 %r
    432 }
    433