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 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,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 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 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 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 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 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 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 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 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 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 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 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 @lshr_i1(i1 signext %a, i1 signext %b) { 33*9880d681SAndroid Build Coastguard Workerentry: 34*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: lshr_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 = lshr 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 zeroext i8 @lshr_i8(i8 zeroext %a, i8 zeroext %b) { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: lshr_i8: 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker ; ALL: srlv $[[T0:[0-9]+]], $4, $5 47*9880d681SAndroid Build Coastguard Worker ; GP32: andi $2, $[[T0]], 255 48*9880d681SAndroid Build Coastguard Worker ; GP64: andi $2, $[[T0]], 255 49*9880d681SAndroid Build Coastguard Worker ; MM: andi16 $2, $[[T0]], 255 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker %r = lshr i8 %a, %b 52*9880d681SAndroid Build Coastguard Worker ret i8 %r 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @lshr_i16(i16 zeroext %a, i16 zeroext %b) { 56*9880d681SAndroid Build Coastguard Workerentry: 57*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: lshr_i16: 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker ; ALL: srlv $[[T0:[0-9]+]], $4, $5 60*9880d681SAndroid Build Coastguard Worker ; GP32: andi $2, $[[T0]], 65535 61*9880d681SAndroid Build Coastguard Worker ; GP64: andi $2, $[[T0]], 65535 62*9880d681SAndroid Build Coastguard Worker ; MM: andi16 $2, $[[T0]], 65535 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker %r = lshr i16 %a, %b 65*9880d681SAndroid Build Coastguard Worker ret i16 %r 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine signext i32 @lshr_i32(i32 signext %a, i32 signext %b) { 69*9880d681SAndroid Build Coastguard Workerentry: 70*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: lshr_i32: 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker ; ALL: srlv $2, $4, $5 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker %r = lshr i32 %a, %b 75*9880d681SAndroid Build Coastguard Worker ret i32 %r 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine signext i64 @lshr_i64(i64 signext %a, i64 signext %b) { 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: lshr_i64: 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker ; M2: srlv $[[T0:[0-9]+]], $4, $7 83*9880d681SAndroid Build Coastguard Worker ; M2: andi $[[T1:[0-9]+]], $7, 32 84*9880d681SAndroid Build Coastguard Worker ; M2: bnez $[[T1]], $[[BB0:BB[0-9_]+]] 85*9880d681SAndroid Build Coastguard Worker ; M2: move $3, $[[T0]] 86*9880d681SAndroid Build Coastguard Worker ; M2: srlv $[[T2:[0-9]+]], $5, $7 87*9880d681SAndroid Build Coastguard Worker ; M2: not $[[T3:[0-9]+]], $7 88*9880d681SAndroid Build Coastguard Worker ; M2: sll $[[T4:[0-9]+]], $4, 1 89*9880d681SAndroid Build Coastguard Worker ; M2: sllv $[[T5:[0-9]+]], $[[T4]], $[[T3]] 90*9880d681SAndroid Build Coastguard Worker ; M2: or $3, $[[T3]], $[[T2]] 91*9880d681SAndroid Build Coastguard Worker ; M2: $[[BB0]]: 92*9880d681SAndroid Build Coastguard Worker ; M2: bnez $[[T1]], $[[BB1:BB[0-9_]+]] 93*9880d681SAndroid Build Coastguard Worker ; M2: addiu $2, $zero, 0 94*9880d681SAndroid Build Coastguard Worker ; M2: move $2, $[[T0]] 95*9880d681SAndroid Build Coastguard Worker ; M2: $[[BB1]]: 96*9880d681SAndroid Build Coastguard Worker ; M2: jr $ra 97*9880d681SAndroid Build Coastguard Worker ; M2: nop 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: srlv $[[T0:[0-9]+]], $5, $7 100*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: not $[[T1:[0-9]+]], $7 101*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: sll $[[T2:[0-9]+]], $4, 1 102*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: sllv $[[T3:[0-9]+]], $[[T2]], $[[T1]] 103*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: or $3, $[[T3]], $[[T0]] 104*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: srlv $[[T4:[0-9]+]], $4, $7 105*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: andi $[[T5:[0-9]+]], $7, 32 106*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: movn $3, $[[T4]], $[[T5]] 107*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: jr $ra 108*9880d681SAndroid Build Coastguard Worker ; 32R1-R5: movn $2, $zero, $[[T5]] 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker ; 32R6: srlv $[[T0:[0-9]+]], $5, $7 111*9880d681SAndroid Build Coastguard Worker ; 32R6: not $[[T1:[0-9]+]], $7 112*9880d681SAndroid Build Coastguard Worker ; 32R6: sll $[[T2:[0-9]+]], $4, 1 113*9880d681SAndroid Build Coastguard Worker ; 32R6: sllv $[[T3:[0-9]+]], $[[T2]], $[[T1]] 114*9880d681SAndroid Build Coastguard Worker ; 32R6: or $[[T4:[0-9]+]], $[[T3]], $[[T0]] 115*9880d681SAndroid Build Coastguard Worker ; 32R6: andi $[[T5:[0-9]+]], $7, 32 116*9880d681SAndroid Build Coastguard Worker ; 32R6: seleqz $[[T6:[0-9]+]], $[[T4]], $[[T3]] 117*9880d681SAndroid Build Coastguard Worker ; 32R6: srlv $[[T7:[0-9]+]], $4, $7 118*9880d681SAndroid Build Coastguard Worker ; 32R6: selnez $[[T8:[0-9]+]], $[[T7]], $[[T5]] 119*9880d681SAndroid Build Coastguard Worker ; 32R6: or $3, $[[T8]], $[[T6]] 120*9880d681SAndroid Build Coastguard Worker ; 32R6: jr $ra 121*9880d681SAndroid Build Coastguard Worker ; 32R6: seleqz $2, $[[T7]], $[[T5]] 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker ; GP64: dsrlv $2, $4, $5 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker ; MMR3: srlv $[[T0:[0-9]+]], $5, $7 126*9880d681SAndroid Build Coastguard Worker ; MMR3: sll16 $[[T1:[0-9]+]], $4, 1 127*9880d681SAndroid Build Coastguard Worker ; MMR3: not16 $[[T2:[0-9]+]], $7 128*9880d681SAndroid Build Coastguard Worker ; MMR3: sllv $[[T3:[0-9]+]], $[[T1]], $[[T2]] 129*9880d681SAndroid Build Coastguard Worker ; MMR3: or16 $[[T4:[0-9]+]], $[[T0]] 130*9880d681SAndroid Build Coastguard Worker ; MMR3: srlv $[[T5:[0-9]+]], $4, $7 131*9880d681SAndroid Build Coastguard Worker ; MMR3: andi16 $[[T6:[0-9]+]], $7, 32 132*9880d681SAndroid Build Coastguard Worker ; MMR3: movn $[[T7:[0-9]+]], $[[T5]], $[[T6]] 133*9880d681SAndroid Build Coastguard Worker ; MMR3: lui $[[T8:[0-9]+]], 0 134*9880d681SAndroid Build Coastguard Worker ; MMR3: movn $2, $[[T8]], $[[T6]] 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker ; MMR6: srlv $[[T0:[0-9]+]], $5, $7 137*9880d681SAndroid Build Coastguard Worker ; MMR6: sll16 $[[T1:[0-9]+]], $4, 1 138*9880d681SAndroid Build Coastguard Worker ; MMR6: not16 $[[T2:[0-9]+]], $7 139*9880d681SAndroid Build Coastguard Worker ; MMR6: sllv $[[T3:[0-9]+]], $[[T1]], $[[T2]] 140*9880d681SAndroid Build Coastguard Worker ; MMR6: or16 $[[T4:[0-9]+]], $[[T0]] 141*9880d681SAndroid Build Coastguard Worker ; MMR6: andi16 $[[T5:[0-9]+]], $7, 32 142*9880d681SAndroid Build Coastguard Worker ; MMR6: seleqz $[[T6:[0-9]+]], $[[T4]], $[[T5]] 143*9880d681SAndroid Build Coastguard Worker ; MMR6: srlv $[[T7:[0-9]+]], $4, $7 144*9880d681SAndroid Build Coastguard Worker ; MMR6: selnez $[[T8:[0-9]+]], $[[T7]], $[[T5]] 145*9880d681SAndroid Build Coastguard Worker ; MMR6: or $3, $[[T8]], $[[T6]] 146*9880d681SAndroid Build Coastguard Worker ; MMR6: seleqz $2, $[[T7]], $[[T5]] 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker %r = lshr i64 %a, %b 149*9880d681SAndroid Build Coastguard Worker ret i64 %r 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine signext i128 @lshr_i128(i128 signext %a, i128 signext %b) { 153*9880d681SAndroid Build Coastguard Workerentry: 154*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: lshr_i128: 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker ; GP32: lw $25, %call16(__lshrti3)($gp) 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker ; M3: sll $[[T0:[0-9]+]], $7, 0 159*9880d681SAndroid Build Coastguard Worker ; M3: dsrlv $[[T1:[0-9]+]], $4, $7 160*9880d681SAndroid Build Coastguard Worker ; M3: andi $[[T2:[0-9]+]], $[[T0]], 64 161*9880d681SAndroid Build Coastguard Worker ; M3: bnez $[[T3:[0-9]+]], $[[BB0:BB[0-9_]+]] 162*9880d681SAndroid Build Coastguard Worker ; M3: move $3, $[[T1]] 163*9880d681SAndroid Build Coastguard Worker ; M3: dsrlv $[[T4:[0-9]+]], $5, $7 164*9880d681SAndroid Build Coastguard Worker ; M3: dsll $[[T5:[0-9]+]], $4, 1 165*9880d681SAndroid Build Coastguard Worker ; M3: not $[[T6:[0-9]+]], $[[T0]] 166*9880d681SAndroid Build Coastguard Worker ; M3: dsllv $[[T7:[0-9]+]], $[[T5]], $[[T6]] 167*9880d681SAndroid Build Coastguard Worker ; M3: or $3, $[[T7]], $[[T4]] 168*9880d681SAndroid Build Coastguard Worker ; M3: $[[BB0]]: 169*9880d681SAndroid Build Coastguard Worker ; M3: bnez $[[T3]], $[[BB1:BB[0-9_]+]] 170*9880d681SAndroid Build Coastguard Worker ; M3: daddiu $2, $zero, 0 171*9880d681SAndroid Build Coastguard Worker ; M3: move $2, $[[T1]] 172*9880d681SAndroid Build Coastguard Worker ; M3: $[[BB1]]: 173*9880d681SAndroid Build Coastguard Worker ; M3: jr $ra 174*9880d681SAndroid Build Coastguard Worker ; M3: nop 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: dsrlv $[[T0:[0-9]+]], $5, $7 177*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: dsll $[[T1:[0-9]+]], $4, 1 178*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: sll $[[T2:[0-9]+]], $7, 0 179*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: not $[[T3:[0-9]+]], $[[T2]] 180*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: dsllv $[[T4:[0-9]+]], $[[T1]], $[[T3]] 181*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: or $3, $[[T4]], $[[T0]] 182*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: dsrlv $2, $4, $7 183*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: andi $[[T5:[0-9]+]], $[[T2]], 64 184*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: movn $3, $2, $[[T5]] 185*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: jr $ra 186*9880d681SAndroid Build Coastguard Worker ; GP64-NOT-R6: movn $2, $zero, $1 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker ; 64R6: dsrlv $[[T0:[0-9]+]], $5, $7 189*9880d681SAndroid Build Coastguard Worker ; 64R6: dsll $[[T1:[0-9]+]], $4, 1 190*9880d681SAndroid Build Coastguard Worker ; 64R6: sll $[[T2:[0-9]+]], $7, 0 191*9880d681SAndroid Build Coastguard Worker ; 64R6: not $[[T3:[0-9]+]], $[[T2]] 192*9880d681SAndroid Build Coastguard Worker ; 64R6: dsllv $[[T4:[0-9]+]], $[[T1]], $[[T3]] 193*9880d681SAndroid Build Coastguard Worker ; 64R6: or $[[T5:[0-9]+]], $[[T4]], $[[T0]] 194*9880d681SAndroid Build Coastguard Worker ; 64R6: andi $[[T6:[0-9]+]], $[[T2]], 64 195*9880d681SAndroid Build Coastguard Worker ; 64R6: sll $[[T7:[0-9]+]], $[[T6]], 0 196*9880d681SAndroid Build Coastguard Worker ; 64R6: seleqz $[[T8:[0-9]+]], $[[T5]], $[[T7]] 197*9880d681SAndroid Build Coastguard Worker ; 64R6: dsrlv $[[T9:[0-9]+]], $4, $7 198*9880d681SAndroid Build Coastguard Worker ; 64R6: selnez $[[T10:[0-9]+]], $[[T9]], $[[T7]] 199*9880d681SAndroid Build Coastguard Worker ; 64R6: or $3, $[[T10]], $[[T8]] 200*9880d681SAndroid Build Coastguard Worker ; 64R6: jr $ra 201*9880d681SAndroid Build Coastguard Worker ; 64R6: seleqz $2, $[[T9]], $[[T7]] 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker ; MM: lw $25, %call16(__lshrti3)($2) 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker %r = lshr i128 %a, %b 206*9880d681SAndroid Build Coastguard Worker ret i128 %r 207*9880d681SAndroid Build Coastguard Worker} 208