Home | History | Annotate | Download | only in llvm-ir
      1 ; RUN: llc < %s -march=mips -mcpu=mips2 | FileCheck %s -check-prefixes=ALL,GP32
      2 ; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s -check-prefixes=ALL,GP32
      3 ; RUN: llc < %s -march=mips -mcpu=mips32r2 | FileCheck %s -check-prefixes=ALL,GP32
      4 ; RUN: llc < %s -march=mips -mcpu=mips32r3 | FileCheck %s -check-prefixes=ALL,GP32
      5 ; RUN: llc < %s -march=mips -mcpu=mips32r5 | FileCheck %s -check-prefixes=ALL,GP32
      6 ; RUN: llc < %s -march=mips -mcpu=mips32r6 | FileCheck %s -check-prefixes=ALL,GP32
      7 ; RUN: llc < %s -march=mips64 -mcpu=mips3 | FileCheck %s -check-prefixes=ALL,GP64
      8 ; RUN: llc < %s -march=mips64 -mcpu=mips4 | FileCheck %s -check-prefixes=ALL,GP64
      9 ; RUN: llc < %s -march=mips64 -mcpu=mips64 | FileCheck %s -check-prefixes=ALL,GP64
     10 ; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | FileCheck %s -check-prefixes=ALL,GP64
     11 ; RUN: llc < %s -march=mips64 -mcpu=mips64r3 | FileCheck %s -check-prefixes=ALL,GP64
     12 ; RUN: llc < %s -march=mips64 -mcpu=mips64r5 | FileCheck %s -check-prefixes=ALL,GP64
     13 ; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s -check-prefixes=ALL,GP64
     14 ; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips | FileCheck %s \
     15 ; RUN:    -check-prefixes=ALL,MM,MM32
     16 ; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips | FileCheck %s \
     17 ; RUN:    -check-prefixes=ALL,MM,MM32
     18 ; RUN: llc < %s -march=mips -mcpu=mips64r6 -target-abi n64 -mattr=+micromips | FileCheck %s \
     19 ; RUN:    -check-prefixes=ALL,MM,MM64
     20 
     21 define signext i1 @or_i1(i1 signext %a, i1 signext %b) {
     22 entry:
     23 ; ALL-LABEL: or_i1:
     24 
     25   ; GP32:         or      $2, $4, $5
     26 
     27   ; GP64:         or      $2, $4, $5
     28 
     29   ; MM:           or16    $[[T0:[0-9]+]], $5
     30   ; MM:           move    $2, $[[T0]]
     31 
     32   %r = or i1 %a, %b
     33   ret i1 %r
     34 }
     35 
     36 define signext i8 @or_i8(i8 signext %a, i8 signext %b) {
     37 entry:
     38 ; ALL-LABEL: or_i8:
     39 
     40   ; GP32:         or      $2, $4, $5
     41 
     42   ; GP64:         or      $2, $4, $5
     43 
     44   ; MM:           or16    $[[T0:[0-9]+]], $5
     45   ; MM:           move    $2, $[[T0]]
     46 
     47   %r = or i8 %a, %b
     48   ret i8 %r
     49 }
     50 
     51 define signext i16 @or_i16(i16 signext %a, i16 signext %b) {
     52 entry:
     53 ; ALL-LABEL: or_i16:
     54 
     55   ; GP32:         or      $2, $4, $5
     56 
     57   ; GP64:         or      $2, $4, $5
     58 
     59   ; MM:           or16    $[[T0:[0-9]+]], $5
     60   ; MM:           move    $2, $[[T0]]
     61 
     62   %r = or i16 %a, %b
     63   ret i16 %r
     64 }
     65 
     66 define signext i32 @or_i32(i32 signext %a, i32 signext %b) {
     67 entry:
     68 ; ALL-LABEL: or_i32:
     69 
     70   ; GP32:         or      $2, $4, $5
     71 
     72   ; GP64:         or      $[[T0:[0-9]+]], $4, $5
     73   ; FIXME: The sll instruction below is redundant.
     74   ; GP64:         sll     $2, $[[T0]], 0
     75 
     76   ; MM32:         or16    $[[T0:[0-9]+]], $5
     77   ; MM32:         move    $2, $[[T0]]
     78 
     79   ; MM64:         or      $[[T0:[0-9]+]], $4, $5
     80   ; MM64:         sll     $2, $[[T0]], 0
     81 
     82   %r = or i32 %a, %b
     83   ret i32 %r
     84 }
     85 
     86 define signext i64 @or_i64(i64 signext %a, i64 signext %b) {
     87 entry:
     88 ; ALL-LABEL: or_i64:
     89 
     90   ; GP32:         or      $2, $4, $6
     91   ; GP32:         or      $3, $5, $7
     92 
     93   ; GP64:         or      $2, $4, $5
     94 
     95   ; MM32:         or16    $[[T0:[0-9]+]], $6
     96   ; MM32:         or16    $[[T1:[0-9]+]], $7
     97   ; MM32:         move    $2, $[[T0]]
     98   ; MM32:         move    $3, $[[T1]]
     99 
    100   ; MM64:         or      $2, $4, $5
    101 
    102   %r = or i64 %a, %b
    103   ret i64 %r
    104 }
    105 
    106 define signext i128 @or_i128(i128 signext %a, i128 signext %b) {
    107 entry:
    108 ; ALL-LABEL: or_i128:
    109 
    110   ; GP32:         lw      $[[T0:[0-9]+]], 24($sp)
    111   ; GP32:         lw      $[[T1:[0-9]+]], 20($sp)
    112   ; GP32:         lw      $[[T2:[0-9]+]], 16($sp)
    113   ; GP32:         or      $2, $4, $[[T2]]
    114   ; GP32:         or      $3, $5, $[[T1]]
    115   ; GP32:         or      $4, $6, $[[T0]]
    116   ; GP32:         lw      $[[T3:[0-9]+]], 28($sp)
    117   ; GP32:         or      $5, $7, $[[T3]]
    118 
    119   ; GP64:         or      $2, $4, $6
    120   ; GP64:         or      $3, $5, $7
    121 
    122   ; MM32:         lw      $[[T0:[0-9]+]], 20($sp)
    123   ; MM32:         lw      $[[T1:[0-9]+]], 16($sp)
    124   ; MM32:         or16    $[[T1]], $4
    125   ; MM32:         or16    $[[T0]], $5
    126   ; MM32:         lw      $[[T2:[0-9]+]], 24($sp)
    127   ; MM32:         or16    $[[T2]], $6
    128   ; MM32:         lw      $[[T3:[0-9]+]], 28($sp)
    129   ; MM32:         or16    $[[T3]], $7
    130 
    131   ; MM64:         or      $2, $4, $6
    132   ; MM64:         or      $3, $5, $7
    133 
    134   %r = or i128 %a, %b
    135   ret i128 %r
    136 }
    137 
    138 define signext i1 @or_i1_4(i1 signext %b) {
    139 entry:
    140 ; ALL-LABEL: or_i1_4:
    141 
    142   ; ALL:          move    $2, $4
    143 
    144   %r = or i1 4, %b
    145   ret i1 %r
    146 }
    147 
    148 define signext i8 @or_i8_4(i8 signext %b) {
    149 entry:
    150 ; ALL-LABEL: or_i8_4:
    151 
    152   ; ALL:          ori     $2, $4, 4
    153 
    154   %r = or i8 4, %b
    155   ret i8 %r
    156 }
    157 
    158 define signext i16 @or_i16_4(i16 signext %b) {
    159 entry:
    160 ; ALL-LABEL: or_i16_4:
    161 
    162   ; ALL:          ori     $2, $4, 4
    163 
    164   %r = or i16 4, %b
    165   ret i16 %r
    166 }
    167 
    168 define signext i32 @or_i32_4(i32 signext %b) {
    169 entry:
    170 ; ALL-LABEL: or_i32_4:
    171 
    172   ; ALL:          ori     $2, $4, 4
    173 
    174   %r = or i32 4, %b
    175   ret i32 %r
    176 }
    177 
    178 define signext i64 @or_i64_4(i64 signext %b) {
    179 entry:
    180 ; ALL-LABEL: or_i64_4:
    181 
    182   ; GP32:         ori     $3, $5, 4
    183   ; GP32:         move    $2, $4
    184 
    185   ; GP64:         ori     $2, $4, 4
    186 
    187   ; MM32:         ori     $3, $5, 4
    188   ; MM32:         move    $2, $4
    189 
    190   ; MM64:         ori     $2, $4, 4
    191 
    192   %r = or i64 4, %b
    193   ret i64 %r
    194 }
    195 
    196 define signext i128 @or_i128_4(i128 signext %b) {
    197 entry:
    198 ; ALL-LABEL: or_i128_4:
    199 
    200   ; GP32:         ori     $[[T0:[0-9]+]], $7, 4
    201   ; GP32:         move    $2, $4
    202   ; GP32:         move    $3, $5
    203   ; GP32:         move    $4, $6
    204   ; GP32:         move    $5, $[[T0]]
    205 
    206   ; GP64:         ori     $3, $5, 4
    207   ; GP64:         move    $2, $4
    208 
    209   ; MM32:         ori     $[[T0:[0-9]+]], $7, 4
    210   ; MM32:         move    $2, $4
    211   ; MM32:         move    $3, $5
    212   ; MM32:         move    $4, $6
    213   ; MM32:         move    $5, $[[T0]]
    214 
    215   ; MM64:         ori     $3, $5, 4
    216   ; MM64:         move    $2, $4
    217 
    218   %r = or i128 4, %b
    219   ret i128 %r
    220 }
    221 
    222 define signext i1 @or_i1_31(i1 signext %b) {
    223 entry:
    224 ; ALL-LABEL: or_i1_31:
    225 
    226   ; GP32:         addiu   $2, $zero, -1
    227 
    228   ; GP64:         addiu   $2, $zero, -1
    229 
    230   ; MM:           li16    $2, -1
    231 
    232   %r = or i1 31, %b
    233   ret i1 %r
    234 }
    235 
    236 define signext i8 @or_i8_31(i8 signext %b) {
    237 entry:
    238 ; ALL-LABEL: or_i8_31:
    239 
    240   ; ALL:          ori     $2, $4, 31
    241 
    242   %r = or i8 31, %b
    243   ret i8 %r
    244 }
    245 
    246 define signext i16 @or_i16_31(i16 signext %b) {
    247 entry:
    248 ; ALL-LABEL: or_i16_31:
    249 
    250   ; ALL:          ori     $2, $4, 31
    251 
    252   %r = or i16 31, %b
    253   ret i16 %r
    254 }
    255 
    256 define signext i32 @or_i32_31(i32 signext %b) {
    257 entry:
    258 ; ALL-LABEL: or_i32_31:
    259 
    260   ; ALL:          ori     $2, $4, 31
    261 
    262   %r = or i32 31, %b
    263   ret i32 %r
    264 }
    265 
    266 define signext i64 @or_i64_31(i64 signext %b) {
    267 entry:
    268 ; ALL-LABEL: or_i64_31:
    269 
    270   ; GP32:         ori     $3, $5, 31
    271   ; GP32:         move    $2, $4
    272 
    273   ; GP64:         ori     $2, $4, 31
    274 
    275   ; MM32:         ori     $3, $5, 31
    276   ; MM32:         move    $2, $4
    277 
    278   ; MM64:         ori     $2, $4, 31
    279 
    280   %r = or i64 31, %b
    281   ret i64 %r
    282 }
    283 
    284 define signext i128 @or_i128_31(i128 signext %b) {
    285 entry:
    286 ; ALL-LABEL: or_i128_31:
    287 
    288   ; GP32:         ori     $[[T0:[0-9]+]], $7, 31
    289   ; GP32:         move    $2, $4
    290   ; GP32:         move    $3, $5
    291   ; GP32:         move    $4, $6
    292   ; GP32:         move    $5, $[[T0]]
    293 
    294   ; GP64:         ori     $3, $5, 31
    295   ; GP64:         move    $2, $4
    296 
    297   ; MM32:         ori     $[[T0:[0-9]+]], $7, 31
    298   ; MM32:         move    $2, $4
    299   ; MM32:         move    $3, $5
    300   ; MM32:         move    $4, $6
    301   ; MM32:         move    $5, $[[T0]]
    302 
    303   ; MM64:         ori     $3, $5, 31
    304   ; MM64:         move    $2, $4
    305 
    306   %r = or i128 31, %b
    307   ret i128 %r
    308 }
    309 
    310 define signext i1 @or_i1_255(i1 signext %b) {
    311 entry:
    312 ; ALL-LABEL: or_i1_255:
    313 
    314   ; GP32:         addiu   $2, $zero, -1
    315 
    316   ; GP64:         addiu   $2, $zero, -1
    317 
    318   ; MM:           li16    $2, -1
    319 
    320   %r = or i1 255, %b
    321   ret i1 %r
    322 }
    323 
    324 define signext i8 @or_i8_255(i8 signext %b) {
    325 entry:
    326 ; ALL-LABEL: or_i8_255:
    327 
    328   ; GP32:         addiu   $2, $zero, -1
    329 
    330   ; GP64:         addiu   $2, $zero, -1
    331 
    332   ; MM:           li16    $2, -1
    333 
    334   %r = or i8 255, %b
    335   ret i8 %r
    336 }
    337 
    338 define signext i16 @or_i16_255(i16 signext %b) {
    339 entry:
    340 ; ALL-LABEL: or_i16_255:
    341 
    342   ; ALL:          ori     $2, $4, 255
    343 
    344   %r = or i16 255, %b
    345   ret i16 %r
    346 }
    347 
    348 define signext i32 @or_i32_255(i32 signext %b) {
    349 entry:
    350 ; ALL-LABEL: or_i32_255:
    351 
    352   ; ALL:          ori     $2, $4, 255
    353 
    354   %r = or i32 255, %b
    355   ret i32 %r
    356 }
    357 
    358 define signext i64 @or_i64_255(i64 signext %b) {
    359 entry:
    360 ; ALL-LABEL: or_i64_255:
    361 
    362   ; GP32:         ori     $3, $5, 255
    363   ; GP32:         move    $2, $4
    364 
    365   ; GP64:         ori     $2, $4, 255
    366 
    367   ; MM32:         ori     $3, $5, 255
    368   ; MM32:         move    $2, $4
    369 
    370   ; MM64:         ori     $2, $4, 255
    371 
    372   %r = or i64 255, %b
    373   ret i64 %r
    374 }
    375 
    376 define signext i128 @or_i128_255(i128 signext %b) {
    377 entry:
    378 ; ALL-LABEL: or_i128_255:
    379 
    380   ; GP32:         ori     $[[T0:[0-9]+]], $7, 255
    381   ; GP32:         move    $2, $4
    382   ; GP32:         move    $3, $5
    383   ; GP32:         move    $4, $6
    384   ; GP32:         move    $5, $[[T0]]
    385 
    386   ; GP64:         ori     $3, $5, 255
    387   ; GP64:         move    $2, $4
    388 
    389   ; MM32:         ori     $[[T0:[0-9]+]], $7, 255
    390   ; MM32:         move    $2, $4
    391   ; MM32:         move    $3, $5
    392   ; MM32:         move    $4, $6
    393   ; MM32:         move    $5, $[[T0]]
    394 
    395   ; MM64:         ori     $3, $5, 255
    396   ; MM64:         move    $2, $4
    397 
    398   %r = or i128 255, %b
    399   ret i128 %r
    400 }
    401 
    402 define signext i1 @or_i1_32768(i1 signext %b) {
    403 entry:
    404 ; ALL-LABEL: or_i1_32768:
    405 
    406   ; ALL:          move    $2, $4
    407 
    408   %r = or i1 32768, %b
    409   ret i1 %r
    410 }
    411 
    412 define signext i8 @or_i8_32768(i8 signext %b) {
    413 entry:
    414 ; ALL-LABEL: or_i8_32768:
    415 
    416   ; ALL:          move    $2, $4
    417 
    418   %r = or i8 32768, %b
    419   ret i8 %r
    420 }
    421 
    422 define signext i16 @or_i16_32768(i16 signext %b) {
    423 entry:
    424 ; ALL-LABEL: or_i16_32768:
    425 
    426   ; GP32:         addiu   $[[T0:[0-9]+]], $zero, -32768
    427   ; GP32:         or      $2, $4, $[[T0]]
    428 
    429   ; GP64:         addiu   $[[T0:[0-9]+]], $zero, -32768
    430   ; GP64:         or      $2, $4, $[[T0]]
    431 
    432   ; MM:           addiu   $2, $zero, -32768
    433   ; MM:           or16    $2, $4
    434 
    435   %r = or i16 32768, %b
    436   ret i16 %r
    437 }
    438 
    439 define signext i32 @or_i32_32768(i32 signext %b) {
    440 entry:
    441 ; ALL-LABEL: or_i32_32768:
    442 
    443   ; ALL:          ori     $2, $4, 32768
    444 
    445   %r = or i32 32768, %b
    446   ret i32 %r
    447 }
    448 
    449 define signext i64 @or_i64_32768(i64 signext %b) {
    450 entry:
    451 ; ALL-LABEL: or_i64_32768:
    452 
    453   ; GP32:         ori     $3, $5, 32768
    454   ; GP32:         move    $2, $4
    455 
    456   ; GP64:         ori     $2, $4, 32768
    457 
    458   ; MM32:         ori     $3, $5, 32768
    459   ; MM32:         move    $2, $4
    460 
    461   ; MM64:         ori     $2, $4, 32768
    462 
    463   %r = or i64 32768, %b
    464   ret i64 %r
    465 }
    466 
    467 define signext i128 @or_i128_32768(i128 signext %b) {
    468 entry:
    469 ; ALL-LABEL: or_i128_32768:
    470 
    471   ; GP32:         ori     $[[T0:[0-9]+]], $7, 32768
    472   ; GP32:         move    $2, $4
    473   ; GP32:         move    $3, $5
    474   ; GP32:         move    $4, $6
    475   ; GP32:         move    $5, $[[T0]]
    476 
    477   ; GP64:         ori     $3, $5, 32768
    478   ; GP64:         move    $2, $4
    479 
    480   ; MM32:         ori     $[[T0:[0-9]+]], $7, 32768
    481   ; MM32:         move    $2, $4
    482   ; MM32:         move    $3, $5
    483   ; MM32:         move    $4, $6
    484   ; MM32:         move    $5, $[[T0]]
    485 
    486   ; MM64:         ori     $3, $5, 32768
    487   ; MM64:         move    $2, $4
    488 
    489   %r = or i128 32768, %b
    490   ret i128 %r
    491 }
    492 
    493 define signext i1 @or_i1_65(i1 signext %b) {
    494 entry:
    495 ; ALL-LABEL: or_i1_65:
    496 
    497   ; GP32:         addiu   $2, $zero, -1
    498 
    499   ; GP64:         addiu   $2, $zero, -1
    500 
    501   ; MM:           li16    $2, -1
    502 
    503   %r = or i1 65, %b
    504   ret i1 %r
    505 }
    506 
    507 define signext i8 @or_i8_65(i8 signext %b) {
    508 entry:
    509 ; ALL-LABEL: or_i8_65:
    510 
    511   ; ALL:          ori     $2, $4, 65
    512 
    513   %r = or i8 65, %b
    514   ret i8 %r
    515 }
    516 
    517 define signext i16 @or_i16_65(i16 signext %b) {
    518 entry:
    519 ; ALL-LABEL: or_i16_65:
    520 
    521   ; ALL:          ori     $2, $4, 65
    522 
    523   %r = or i16 65, %b
    524   ret i16 %r
    525 }
    526 
    527 define signext i32 @or_i32_65(i32 signext %b) {
    528 entry:
    529 ; ALL-LABEL: or_i32_65:
    530 
    531   ; ALL:          ori     $2, $4, 65
    532 
    533   %r = or i32 65, %b
    534   ret i32 %r
    535 }
    536 
    537 define signext i64 @or_i64_65(i64 signext %b) {
    538 entry:
    539 ; ALL-LABEL: or_i64_65:
    540 
    541   ; GP32:         ori     $3, $5, 65
    542   ; GP32:         move    $2, $4
    543 
    544   ; GP64:         ori     $2, $4, 65
    545 
    546   ; MM32:         ori     $3, $5, 65
    547   ; MM32:         move    $2, $4
    548 
    549   ; MM64:         ori     $2, $4, 65
    550 
    551   %r = or i64 65, %b
    552   ret i64 %r
    553 }
    554 
    555 define signext i128 @or_i128_65(i128 signext %b) {
    556 entry:
    557 ; ALL-LABEL: or_i128_65:
    558 
    559   ; GP32:         ori     $[[T0:[0-9]+]], $7, 65
    560   ; GP32:         move    $2, $4
    561   ; GP32:         move    $3, $5
    562   ; GP32:         move    $4, $6
    563   ; GP32:         move    $5, $[[T0]]
    564 
    565   ; GP64:         ori     $3, $5, 65
    566   ; GP64:         move    $2, $4
    567 
    568   ; MM32:         ori     $[[T0:[0-9]+]], $7, 65
    569   ; MM32:         move    $2, $4
    570   ; MM32:         move    $3, $5
    571   ; MM32:         move    $4, $6
    572   ; MM32:         move    $5, $[[T0]]
    573 
    574   ; MM64:         ori     $3, $5, 65
    575   ; MM64:         move    $2, $4
    576 
    577   %r = or i128 65, %b
    578   ret i128 %r
    579 }
    580 
    581 define signext i1 @or_i1_256(i1 signext %b) {
    582 entry:
    583 ; ALL-LABEL: or_i1_256:
    584 
    585   ; ALL:          move    $2, $4
    586 
    587   %r = or i1 256, %b
    588   ret i1 %r
    589 }
    590 
    591 define signext i8 @or_i8_256(i8 signext %b) {
    592 entry:
    593 ; ALL-LABEL: or_i8_256:
    594 
    595   ; ALL:          move    $2, $4
    596 
    597   %r = or i8 256, %b
    598   ret i8 %r
    599 }
    600 
    601 define signext i16 @or_i16_256(i16 signext %b) {
    602 entry:
    603 ; ALL-LABEL: or_i16_256:
    604 
    605   ; ALL:          ori     $2, $4, 256
    606 
    607   %r = or i16 256, %b
    608   ret i16 %r
    609 }
    610 
    611 define signext i32 @or_i32_256(i32 signext %b) {
    612 entry:
    613 ; ALL-LABEL: or_i32_256:
    614 
    615   ; ALL:          ori     $2, $4, 256
    616 
    617   %r = or i32 256, %b
    618   ret i32 %r
    619 }
    620 
    621 define signext i64 @or_i64_256(i64 signext %b) {
    622 entry:
    623 ; ALL-LABEL: or_i64_256:
    624 
    625   ; GP32:         ori     $3, $5, 256
    626   ; GP32:         move    $2, $4
    627 
    628   ; GP64:         ori     $2, $4, 256
    629 
    630   ; MM32:         ori     $3, $5, 256
    631   ; MM32:         move    $2, $4
    632 
    633   ; MM64:         ori     $2, $4, 256
    634 
    635   %r = or i64 256, %b
    636   ret i64 %r
    637 }
    638 
    639 define signext i128 @or_i128_256(i128 signext %b) {
    640 entry:
    641 ; ALL-LABEL: or_i128_256:
    642 
    643   ; GP32:         ori     $[[T0:[0-9]+]], $7, 256
    644   ; GP32:         move    $2, $4
    645   ; GP32:         move    $3, $5
    646   ; GP32:         move    $4, $6
    647   ; GP32:         move    $5, $[[T0]]
    648 
    649   ; GP64:         ori     $3, $5, 256
    650   ; GP64:         move    $2, $4
    651 
    652   ; MM32:         ori     $[[T0:[0-9]+]], $7, 256
    653   ; MM32:         move    $2, $4
    654   ; MM32:         move    $3, $5
    655   ; MM32:         move    $4, $6
    656   ; MM32:         move    $5, $[[T0]]
    657 
    658   ; MM64:         ori     $3, $5, 256
    659   ; MM64:         move    $2, $4
    660 
    661   %r = or i128 256, %b
    662   ret i128 %r
    663 }
    664