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