Home | History | Annotate | Download | only in Fast-ISel
      1 ; RUN: llc -march=mipsel -relocation-model=pic -O0 \
      2 ; RUN:     -fast-isel-abort=1 -mcpu=mips32r2  < %s | FileCheck %s
      3 ; RUN: llc -march=mipsel -relocation-model=pic -O0 \
      4 ; RUN:     -fast-isel-abort=1 -mcpu=mips32 < %s | FileCheck %s
      5 
      6 @s1 = global i16 -89, align 2
      7 @s2 = global i16 4, align 2
      8 @us1 = global i16 -503, align 2
      9 @us2 = global i16 5, align 2
     10 @s3 = common global i16 0, align 2
     11 @us3 = common global i16 0, align 2
     12 
     13 define void @sll() {
     14 entry:
     15   %0 = load i16, i16* @s1, align 2
     16   %1 = load i16, i16* @s2, align 2
     17   %shl = shl i16 %0, %1
     18   store i16 %shl, i16* @s3, align 2
     19 ; CHECK-LABEL:  sll:
     20 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
     21 ; CHECK-DAG:    addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
     22 ; CHECK-DAG:    addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
     23 ; CHECK-DAG:    lw      $[[S3_ADDR:[0-9]+]], %got(s3)($[[REG_GP]])
     24 ; CHECK-DAG:    lw      $[[S2_ADDR:[0-9]+]], %got(s2)($[[REG_GP]])
     25 ; CHECK-DAG:    lw      $[[S1_ADDR:[0-9]+]], %got(s1)($[[REG_GP]])
     26 ; CHECK-DAG:    lhu     $[[S1:[0-9]+]], 0($[[S1_ADDR]])
     27 ; CHECK-DAG:    lhu     $[[S2:[0-9]+]], 0($[[S2_ADDR]])
     28 ; CHECK:        sllv    $[[RES:[0-9]+]], $[[S1]], $[[S2]]
     29 ; CHECK:        sh      $[[RES]], 0($[[S3_ADDR]])
     30   ret void
     31 }
     32 
     33 define void @slli() {
     34 entry:
     35   %0 = load i16, i16* @s1, align 2
     36   %shl = shl i16 %0, 5
     37   store i16 %shl, i16* @s3, align 2
     38 ; CHECK-LABEL:  slli:
     39 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
     40 ; CHECK-DAG:    addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
     41 ; CHECK-DAG:    addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
     42 ; CHECK-DAG:    lw      $[[S3_ADDR:[0-9]+]], %got(s3)($[[REG_GP]])
     43 ; CHECK-DAG:    lw      $[[S1_ADDR:[0-9]+]], %got(s1)($[[REG_GP]])
     44 ; CHECK-DAG:    lhu     $[[S1:[0-9]+]], 0($[[S1_ADDR]])
     45 ; CHECK:        sll     $[[RES:[0-9]+]], $[[S1]],  5
     46 ; CHECK:        sh      $[[RES]], 0($[[S3_ADDR]])
     47   ret void
     48 }
     49 
     50 define void @srl() {
     51 entry:
     52   %0 = load i16, i16* @us1, align 2
     53   %1 = load i16, i16* @us2, align 2
     54   %shr = lshr i16 %0, %1
     55   store i16 %shr, i16* @us3, align 2
     56   ret void
     57 ; CHECK-LABEL:  srl:
     58 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
     59 ; CHECK-DAG:    addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
     60 ; CHECK-DAG:    addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
     61 ; CHECK-DAG:    lw      $[[US3_ADDR:[0-9]+]], %got(us3)($[[REG_GP]])
     62 ; CHECK-DAG:    lw      $[[US2_ADDR:[0-9]+]], %got(us2)($[[REG_GP]])
     63 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
     64 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
     65 ; CHECK-DAG:    lhu     $[[US2:[0-9]+]], 0($[[US2_ADDR]])
     66 ; CHECK:        srlv    $[[RES:[0-9]+]], $[[US1]], $[[US2]]
     67 ; CHECK:        sh      $[[RES]], 0($[[S3_ADDR]])
     68 }
     69 
     70 define void @srli() {
     71 entry:
     72   %0 = load i16, i16* @us1, align 2
     73   %shr = lshr i16 %0, 4
     74   store i16 %shr, i16* @us3, align 2
     75 ; CHECK-LABEL:  srli:
     76 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
     77 ; CHECK-DAG:    addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
     78 ; CHECK-DAG:    addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
     79 ; CHECK-DAG:    lw      $[[US3_ADDR:[0-9]+]], %got(us3)($[[REG_GP]])
     80 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
     81 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
     82 ; CHECK:        srl     $[[RES:[0-9]+]], $[[US1]], 4
     83 ; CHECK:        sh      $[[RES]], 0($[[S3_ADDR]])
     84   ret void
     85 }
     86 
     87 define void @sra() {
     88 entry:
     89   %0 = load i16, i16* @s1, align 2
     90   %1 = load i16, i16* @s2, align 2
     91   %shr = ashr i16 %0, %1
     92   store i16 %shr, i16* @s3, align 2
     93 ; CHECK-LABEL:  sra:
     94 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
     95 ; CHECK-DAG:    addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
     96 ; CHECK-DAG:    addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
     97 ; CHECK-DAG:    lw      $[[S3_ADDR:[0-9]+]], %got(s3)($[[REG_GP]])
     98 ; CHECK-DAG:    lw      $[[S2_ADDR:[0-9]+]], %got(s2)($[[REG_GP]])
     99 ; CHECK-DAG:    lw      $[[S1_ADDR:[0-9]+]], %got(s1)($[[REG_GP]])
    100 ; CHECK-DAG:    lhu     $[[S1:[0-9]+]], 0($[[S1_ADDR]])
    101 ; CHECK-DAG:    lhu     $[[S2:[0-9]+]], 0($[[S2_ADDR]])
    102 ; CHECK:        srav    $[[RES:[0-9]+]], $[[S1]], $[[S2]]
    103 ; CHECK:        sh      $[[RES]], 0($[[S3_ADDR]])
    104   ret void
    105 }
    106 
    107 define void @srai() {
    108 entry:
    109   %0 = load i16, i16* @s1, align 2
    110   %shr = ashr i16 %0, 2
    111   store i16 %shr, i16* @s3, align 2
    112 ; CHECK-LABEL:  srai:
    113 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
    114 ; CHECK-DAG:    addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
    115 ; CHECK-DAG:    addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
    116 ; CHECK-DAG:    lw      $[[S3_ADDR:[0-9]+]], %got(s3)($[[REG_GP]])
    117 ; CHECK-DAG:    lw      $[[S1_ADDR:[0-9]+]], %got(s1)($[[REG_GP]])
    118 ; CHECK-DAG:    lhu     $[[S1:[0-9]+]], 0($[[S1_ADDR]])
    119 ; CHECK:        sra     $[[RES:[0-9]+]], $[[S1]], 2
    120 ; CHECK:        sh      $[[RES]], 0($[[S3_ADDR]])
    121   ret void
    122 }
    123