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