Home | History | Annotate | Download | only in llvm-ir
      1 ; RUN: llc < %s -march=mips -mcpu=mips2 | FileCheck %s \
      2 ; RUN:    -check-prefix=ALL -check-prefix=GP32 \
      3 ; RUN:    -check-prefix=M2 -check-prefix=NOT-R2-R6
      4 ; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s \
      5 ; RUN:    -check-prefix=ALL -check-prefix=GP32 -check-prefix=NOT-R2-R6 \
      6 ; RUN:    -check-prefix=32R1-R5
      7 ; RUN: llc < %s -march=mips -mcpu=mips32r2 | FileCheck %s \
      8 ; RUN:    -check-prefix=ALL -check-prefix=GP32 \
      9 ; RUN:    -check-prefix=32R1-R5 -check-prefix=R2-R6
     10 ; RUN: llc < %s -march=mips -mcpu=mips32r3 | FileCheck %s \
     11 ; RUN:    -check-prefix=ALL -check-prefix=GP32 \
     12 ; RUN:    -check-prefix=32R1-R5 -check-prefix=R2-R6
     13 ; RUN: llc < %s -march=mips -mcpu=mips32r5 | FileCheck %s \
     14 ; RUN:    -check-prefix=ALL -check-prefix=GP32 \
     15 ; RUN:    -check-prefix=32R1-R5 -check-prefix=R2-R6
     16 ; RUN: llc < %s -march=mips -mcpu=mips32r6 | FileCheck %s \
     17 ; RUN:    -check-prefix=ALL -check-prefix=GP32 \
     18 ; RUN:    -check-prefix=32R6 -check-prefix=R2-R6
     19 ; RUN: llc < %s -march=mips64 -mcpu=mips3 | FileCheck %s \
     20 ; RUN:    -check-prefix=ALL -check-prefix=GP64 \
     21 ; RUN:    -check-prefix=M3 -check-prefix=NOT-R2-R6
     22 ; RUN: llc < %s -march=mips64 -mcpu=mips4 | FileCheck %s \
     23 ; RUN:    -check-prefix=ALL -check-prefix=GP64 \
     24 ; RUN:    -check-prefix=GP64-NOT-R6 -check-prefix=NOT-R2-R6
     25 ; RUN: llc < %s -march=mips64 -mcpu=mips64 | FileCheck %s \
     26 ; RUN:    -check-prefix=ALL -check-prefix=GP64 \
     27 ; RUN:    -check-prefix=GP64-NOT-R6 -check-prefix=NOT-R2-R6
     28 ; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | FileCheck %s \
     29 ; RUN:    -check-prefix=ALL -check-prefix=GP64 \
     30 ; RUN:    -check-prefix=GP64-NOT-R6 -check-prefix R2-R6
     31 ; RUN: llc < %s -march=mips64 -mcpu=mips64r3 | FileCheck %s \
     32 ; RUN:    -check-prefix=ALL -check-prefix=GP64 \
     33 ; RUN:    -check-prefix=GP64-NOT-R6 -check-prefix R2-R6
     34 ; RUN: llc < %s -march=mips64 -mcpu=mips64r5 | FileCheck %s \
     35 ; RUN:    -check-prefix=ALL -check-prefix=GP64 \
     36 ; RUN:    -check-prefix=GP64-NOT-R6 -check-prefix R2-R6
     37 ; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s \
     38 ; RUN:    -check-prefix=ALL -check-prefix=GP64 \
     39 ; RUN:    -check-prefix=64R6 -check-prefix=R2-R6
     40 
     41 define signext i1 @shl_i1(i1 signext %a, i1 signext %b) {
     42 entry:
     43 ; ALL-LABEL: shl_i1:
     44 
     45   ; ALL:        move    $2, $4
     46 
     47   %r = shl i1 %a, %b
     48   ret i1 %r
     49 }
     50 
     51 define signext i8 @shl_i8(i8 signext %a, i8 signext %b) {
     52 entry:
     53 ; ALL-LABEL: shl_i8:
     54 
     55   ; NOT-R2-R6:  andi    $[[T0:[0-9]+]], $5, 255
     56   ; NOT-R2-R6:  sllv    $[[T1:[0-9]+]], $4, $[[T0]]
     57   ; NOT-R2-R6:  sll     $[[T2:[0-9]+]], $[[T1]], 24
     58   ; NOT-R2-R6:  sra     $2, $[[T2]], 24
     59 
     60   ; R2-R6:      andi    $[[T0:[0-9]+]], $5, 255
     61   ; R2-R6:      sllv    $[[T1:[0-9]+]], $4, $[[T0]]
     62   ; R2-R6:      seb     $2, $[[T1]]
     63 
     64   %r = shl i8 %a, %b
     65   ret i8 %r
     66 }
     67 
     68 define signext i16 @shl_i16(i16 signext %a, i16 signext %b) {
     69 entry:
     70 ; ALL-LABEL: shl_i16:
     71 
     72   ; NOT-R2-R6:  andi    $[[T0:[0-9]+]], $5, 65535
     73   ; NOT-R2-R6:  sllv    $[[T1:[0-9]+]], $4, $[[T0]]
     74   ; NOT-R2-R6:  sll     $[[T2:[0-9]+]], $[[T1]], 16
     75   ; NOT-R2-R6:  sra     $2, $[[T2]], 16
     76 
     77   ; R2-R6:      andi    $[[T0:[0-9]+]], $5, 65535
     78   ; R2-R6:      sllv    $[[T1:[0-9]+]], $4, $[[T0]]
     79   ; R2-R6:      seh     $2, $[[T1]]
     80 
     81   %r = shl i16 %a, %b
     82   ret i16 %r
     83 }
     84 
     85 define signext i32 @shl_i32(i32 signext %a, i32 signext %b) {
     86 entry:
     87 ; ALL-LABEL: shl_i32:
     88 
     89   ; ALL:        sllv    $2, $4, $5
     90 
     91   %r = shl i32 %a, %b
     92   ret i32 %r
     93 }
     94 
     95 define signext i64 @shl_i64(i64 signext %a, i64 signext %b) {
     96 entry:
     97 ; ALL-LABEL: shl_i64:
     98 
     99   ; M2:         sllv      $[[T0:[0-9]+]], $5, $7
    100   ; M2:         andi      $[[T1:[0-9]+]], $7, 32
    101   ; M2:         bnez      $[[T1]], $[[BB0:BB[0-9_]+]]
    102   ; M2:         move      $2, $[[T0]]
    103   ; M2:         sllv      $[[T2:[0-9]+]], $4, $7
    104   ; M2:         not       $[[T3:[0-9]+]], $7
    105   ; M2:         srl       $[[T4:[0-9]+]], $5, 1
    106   ; M2:         srlv      $[[T5:[0-9]+]], $[[T4]], $[[T3]]
    107   ; M2:         or        $2, $[[T2]], $[[T3]]
    108   ; M2:         $[[BB0]]:
    109   ; M2:         bnez      $[[T1]], $[[BB1:BB[0-9_]+]]
    110   ; M2:         addiu     $3, $zero, 0
    111   ; M2:         move      $3, $[[T0]]
    112   ; M2:         $[[BB1]]:
    113   ; M2:         jr        $ra
    114   ; M2:         nop
    115 
    116   ; 32R1-R5:    sllv      $[[T0:[0-9]+]], $4, $7
    117   ; 32R1-R5:    not       $[[T1:[0-9]+]], $7
    118   ; 32R1-R5:    srl       $[[T2:[0-9]+]], $5, 1
    119   ; 32R1-R5:    srlv      $[[T3:[0-9]+]], $[[T2]], $[[T1]]
    120   ; 32R1-R5:    or        $2, $[[T0]], $[[T3]]
    121   ; 32R1-R5:    sllv      $[[T4:[0-9]+]], $5, $7
    122   ; 32R1-R5:    andi      $[[T5:[0-9]+]], $7, 32
    123   ; 32R1-R5:    movn      $2, $[[T4]], $[[T5]]
    124   ; 32R1-R5:    jr        $ra
    125   ; 32R1-R5:    movn      $3, $zero, $[[T5]]
    126 
    127   ; 32R6:       sllv      $[[T0:[0-9]+]], $4, $7
    128   ; 32R6:       not       $[[T1:[0-9]+]], $7
    129   ; 32R6:       srl       $[[T2:[0-9]+]], $5, 1
    130   ; 32R6:       srlv      $[[T3:[0-9]+]], $[[T2]], $[[T1]]
    131   ; 32R6:       or        $[[T4:[0-9]+]], $[[T0]], $[[T3]]
    132   ; 32R6:       andi      $[[T5:[0-9]+]], $7, 32
    133   ; 32R6:       seleqz    $[[T6:[0-9]+]], $[[T4]], $[[T2]]
    134   ; 32R6:       sllv      $[[T7:[0-9]+]], $5, $7
    135   ; 32R6:       selnez    $[[T8:[0-9]+]], $[[T7]], $[[T5]]
    136   ; 32R6:       or        $2, $[[T8]], $[[T6]]
    137   ; 32R6:       jr        $ra
    138   ; 32R6:       seleqz    $3, $[[T7]], $[[T5]]
    139 
    140   ; GP64:       dsllv     $2, $4, $5
    141 
    142   %r = shl i64 %a, %b
    143   ret i64 %r
    144 }
    145 
    146 define signext i128 @shl_i128(i128 signext %a, i128 signext %b) {
    147 entry:
    148 ; ALL-LABEL: shl_i128:
    149 
    150   ; GP32:           lw        $25, %call16(__ashlti3)($gp)
    151 
    152   ; M3:             sll       $[[T0:[0-9]+]], $7, 0
    153   ; M3:             dsllv     $[[T1:[0-9]+]], $5, $7
    154   ; M3:             andi      $[[T2:[0-9]+]], $[[T0]], 64
    155   ; M3:             bnez      $[[T3:[0-9]+]], $[[BB0:BB[0-9_]+]]
    156   ; M3:             move      $2, $[[T1]]
    157   ; M3:             dsllv     $[[T4:[0-9]+]], $4, $7
    158   ; M3:             dsrl      $[[T5:[0-9]+]], $5, 1
    159   ; M3:             not       $[[T6:[0-9]+]], $[[T0]]
    160   ; M3:             dsrlv     $[[T7:[0-9]+]], $[[T5]], $[[T6]]
    161   ; M3:             or        $2, $[[T4]], $[[T7]]
    162   ; M3:             $[[BB0]]:
    163   ; M3:             bnez      $[[T3]], $[[BB1:BB[0-9_]+]]
    164   ; M3:             daddiu    $3, $zero, 0
    165   ; M3:             move      $3, $[[T1]]
    166   ; M3:             $[[BB1]]:
    167   ; M3:             jr        $ra
    168   ; M3:             nop
    169 
    170   ; GP64-NOT-R6:    dsllv     $[[T0:[0-9]+]], $4, $7
    171   ; GP64-NOT-R6:    dsrl      $[[T1:[0-9]+]], $5, 1
    172   ; GP64-NOT-R6:    sll       $[[T2:[0-9]+]], $7, 0
    173   ; GP64-NOT-R6:    not       $[[T3:[0-9]+]], $[[T2]]
    174   ; GP64-NOT-R6:    dsrlv     $[[T4:[0-9]+]], $[[T1]], $[[T3]]
    175   ; GP64-NOT-R6:    or        $2, $[[T0]], $[[T4]]
    176   ; GP64-NOT-R6:    dsllv     $3, $5, $7
    177   ; GP64-NOT-R6:    andi      $[[T5:[0-9]+]], $[[T2]], 64
    178   ; GP64-NOT-R6:    movn      $2, $3, $[[T5]]
    179   ; GP64-NOT-R6:    jr        $ra
    180   ; GP64-NOT-R6:    movn      $3, $zero, $1
    181 
    182   ; 64R6:           dsllv     $[[T0:[0-9]+]], $4, $7
    183   ; 64R6:           dsrl      $[[T1:[0-9]+]], $5, 1
    184   ; 64R6:           sll       $[[T2:[0-9]+]], $7, 0
    185   ; 64R6:           not       $[[T3:[0-9]+]], $[[T2]]
    186   ; 64R6:           dsrlv     $[[T4:[0-9]+]], $[[T1]], $[[T3]]
    187   ; 64R6:           or        $[[T5:[0-9]+]], $[[T0]], $[[T4]]
    188   ; 64R6:           andi      $[[T6:[0-9]+]], $[[T2]], 64
    189   ; 64R6:           sll       $[[T7:[0-9]+]], $[[T6]], 0
    190   ; 64R6:           seleqz    $[[T8:[0-9]+]], $[[T5]], $[[T7]]
    191   ; 64R6:           dsllv     $[[T9:[0-9]+]], $5, $7
    192   ; 64R6:           selnez    $[[T10:[0-9]+]], $[[T9]], $[[T7]]
    193   ; 64R6:           or        $2, $[[T10]], $[[T8]]
    194   ; 64R6:           jr        $ra
    195   ; 64R6:           seleqz    $3, $[[T9]], $[[T7]]
    196 
    197   %r = shl i128 %a, %b
    198   ret i128 %r
    199 }
    200