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