1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sdiv24_i8: 6*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 7*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 8*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 9*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_i32_f32 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; EG: INT_TO_FLT 12*9880d681SAndroid Build Coastguard Worker; EG-DAG: INT_TO_FLT 13*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 14*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_INT 15*9880d681SAndroid Build Coastguard Workerdefine void @sdiv24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) { 16*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i8, i8 addrspace(1)* %in, i8 1 17*9880d681SAndroid Build Coastguard Worker %num = load i8, i8 addrspace(1) * %in 18*9880d681SAndroid Build Coastguard Worker %den = load i8, i8 addrspace(1) * %den_ptr 19*9880d681SAndroid Build Coastguard Worker %result = sdiv i8 %num, %den 20*9880d681SAndroid Build Coastguard Worker store i8 %result, i8 addrspace(1)* %out 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sdiv24_i16: 25*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 26*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 27*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 28*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_i32_f32 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; EG: INT_TO_FLT 31*9880d681SAndroid Build Coastguard Worker; EG-DAG: INT_TO_FLT 32*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 33*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_INT 34*9880d681SAndroid Build Coastguard Workerdefine void @sdiv24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) { 35*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1 36*9880d681SAndroid Build Coastguard Worker %num = load i16, i16 addrspace(1) * %in, align 2 37*9880d681SAndroid Build Coastguard Worker %den = load i16, i16 addrspace(1) * %den_ptr, align 2 38*9880d681SAndroid Build Coastguard Worker %result = sdiv i16 %num, %den 39*9880d681SAndroid Build Coastguard Worker store i16 %result, i16 addrspace(1)* %out, align 2 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sdiv24_i32: 44*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 45*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 46*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 47*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_i32_f32 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; EG: INT_TO_FLT 50*9880d681SAndroid Build Coastguard Worker; EG-DAG: INT_TO_FLT 51*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 52*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_INT 53*9880d681SAndroid Build Coastguard Workerdefine void @sdiv24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 54*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 55*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 56*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 57*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 58*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 59*9880d681SAndroid Build Coastguard Worker %num.i24 = ashr i32 %num.i24.0, 8 60*9880d681SAndroid Build Coastguard Worker %den.i24 = ashr i32 %den.i24.0, 8 61*9880d681SAndroid Build Coastguard Worker %result = sdiv i32 %num.i24, %den.i24 62*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 63*9880d681SAndroid Build Coastguard Worker ret void 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sdiv25_i32: 67*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cvt_f32_i32 68*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; EG-NOT: INT_TO_FLT 71*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 72*9880d681SAndroid Build Coastguard Workerdefine void @sdiv25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 73*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 74*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 75*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 76*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 7 77*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 7 78*9880d681SAndroid Build Coastguard Worker %num.i24 = ashr i32 %num.i24.0, 7 79*9880d681SAndroid Build Coastguard Worker %den.i24 = ashr i32 %den.i24.0, 7 80*9880d681SAndroid Build Coastguard Worker %result = sdiv i32 %num.i24, %den.i24 81*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 82*9880d681SAndroid Build Coastguard Worker ret void 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_sdiv24_i32_1: 86*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cvt_f32_i32 87*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; EG-NOT: INT_TO_FLT 90*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 91*9880d681SAndroid Build Coastguard Workerdefine void @test_no_sdiv24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 92*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 93*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 94*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 95*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 96*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 7 97*9880d681SAndroid Build Coastguard Worker %num.i24 = ashr i32 %num.i24.0, 8 98*9880d681SAndroid Build Coastguard Worker %den.i24 = ashr i32 %den.i24.0, 7 99*9880d681SAndroid Build Coastguard Worker %result = sdiv i32 %num.i24, %den.i24 100*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 101*9880d681SAndroid Build Coastguard Worker ret void 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_sdiv24_i32_2: 105*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cvt_f32_i32 106*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; EG-NOT: INT_TO_FLT 109*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 110*9880d681SAndroid Build Coastguard Workerdefine void @test_no_sdiv24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 111*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 112*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 113*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 114*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 7 115*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 116*9880d681SAndroid Build Coastguard Worker %num.i24 = ashr i32 %num.i24.0, 7 117*9880d681SAndroid Build Coastguard Worker %den.i24 = ashr i32 %den.i24.0, 8 118*9880d681SAndroid Build Coastguard Worker %result = sdiv i32 %num.i24, %den.i24 119*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 120*9880d681SAndroid Build Coastguard Worker ret void 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}srem24_i8: 124*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 125*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 126*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 127*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_i32_f32 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; EG: INT_TO_FLT 130*9880d681SAndroid Build Coastguard Worker; EG-DAG: INT_TO_FLT 131*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 132*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_INT 133*9880d681SAndroid Build Coastguard Workerdefine void @srem24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) { 134*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i8, i8 addrspace(1)* %in, i8 1 135*9880d681SAndroid Build Coastguard Worker %num = load i8, i8 addrspace(1) * %in 136*9880d681SAndroid Build Coastguard Worker %den = load i8, i8 addrspace(1) * %den_ptr 137*9880d681SAndroid Build Coastguard Worker %result = srem i8 %num, %den 138*9880d681SAndroid Build Coastguard Worker store i8 %result, i8 addrspace(1)* %out 139*9880d681SAndroid Build Coastguard Worker ret void 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}srem24_i16: 143*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 144*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 145*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 146*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_i32_f32 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; EG: INT_TO_FLT 149*9880d681SAndroid Build Coastguard Worker; EG-DAG: INT_TO_FLT 150*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 151*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_INT 152*9880d681SAndroid Build Coastguard Workerdefine void @srem24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) { 153*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1 154*9880d681SAndroid Build Coastguard Worker %num = load i16, i16 addrspace(1) * %in, align 2 155*9880d681SAndroid Build Coastguard Worker %den = load i16, i16 addrspace(1) * %den_ptr, align 2 156*9880d681SAndroid Build Coastguard Worker %result = srem i16 %num, %den 157*9880d681SAndroid Build Coastguard Worker store i16 %result, i16 addrspace(1)* %out, align 2 158*9880d681SAndroid Build Coastguard Worker ret void 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}srem24_i32: 162*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 163*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 164*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 165*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_i32_f32 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker; EG: INT_TO_FLT 168*9880d681SAndroid Build Coastguard Worker; EG-DAG: INT_TO_FLT 169*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 170*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_INT 171*9880d681SAndroid Build Coastguard Workerdefine void @srem24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 172*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 173*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 174*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 175*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 176*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 177*9880d681SAndroid Build Coastguard Worker %num.i24 = ashr i32 %num.i24.0, 8 178*9880d681SAndroid Build Coastguard Worker %den.i24 = ashr i32 %den.i24.0, 8 179*9880d681SAndroid Build Coastguard Worker %result = srem i32 %num.i24, %den.i24 180*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 181*9880d681SAndroid Build Coastguard Worker ret void 182*9880d681SAndroid Build Coastguard Worker} 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_srem25_i32: 185*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cvt_f32_i32 186*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; EG-NOT: INT_TO_FLT 189*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 190*9880d681SAndroid Build Coastguard Workerdefine void @no_srem25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 191*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 192*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 193*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 194*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 7 195*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 7 196*9880d681SAndroid Build Coastguard Worker %num.i24 = ashr i32 %num.i24.0, 7 197*9880d681SAndroid Build Coastguard Worker %den.i24 = ashr i32 %den.i24.0, 7 198*9880d681SAndroid Build Coastguard Worker %result = srem i32 %num.i24, %den.i24 199*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 200*9880d681SAndroid Build Coastguard Worker ret void 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_sdiv25_i24_i25_i32: 204*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cvt_f32_i32 205*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; EG-NOT: INT_TO_FLT 208*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 209*9880d681SAndroid Build Coastguard Workerdefine void @no_sdiv25_i24_i25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 210*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 211*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 212*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 213*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 214*9880d681SAndroid Build Coastguard Worker %den.i25.0 = shl i32 %den, 7 215*9880d681SAndroid Build Coastguard Worker %num.i24 = ashr i32 %num.i24.0, 8 216*9880d681SAndroid Build Coastguard Worker %den.i25 = ashr i32 %den.i25.0, 7 217*9880d681SAndroid Build Coastguard Worker %result = sdiv i32 %num.i24, %den.i25 218*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 219*9880d681SAndroid Build Coastguard Worker ret void 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_sdiv25_i25_i24_i32: 223*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cvt_f32_i32 224*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker; EG-NOT: INT_TO_FLT 227*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 228*9880d681SAndroid Build Coastguard Workerdefine void @no_sdiv25_i25_i24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 229*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 230*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 231*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 232*9880d681SAndroid Build Coastguard Worker %num.i25.0 = shl i32 %num, 7 233*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 234*9880d681SAndroid Build Coastguard Worker %num.i25 = ashr i32 %num.i25.0, 7 235*9880d681SAndroid Build Coastguard Worker %den.i24 = ashr i32 %den.i24.0, 8 236*9880d681SAndroid Build Coastguard Worker %result = sdiv i32 %num.i25, %den.i24 237*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 238*9880d681SAndroid Build Coastguard Worker ret void 239*9880d681SAndroid Build Coastguard Worker} 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_srem25_i24_i25_i32: 242*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cvt_f32_i32 243*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker; EG-NOT: INT_TO_FLT 246*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 247*9880d681SAndroid Build Coastguard Workerdefine void @no_srem25_i24_i25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 248*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 249*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 250*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 251*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 252*9880d681SAndroid Build Coastguard Worker %den.i25.0 = shl i32 %den, 7 253*9880d681SAndroid Build Coastguard Worker %num.i24 = ashr i32 %num.i24.0, 8 254*9880d681SAndroid Build Coastguard Worker %den.i25 = ashr i32 %den.i25.0, 7 255*9880d681SAndroid Build Coastguard Worker %result = srem i32 %num.i24, %den.i25 256*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 257*9880d681SAndroid Build Coastguard Worker ret void 258*9880d681SAndroid Build Coastguard Worker} 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_srem25_i25_i24_i32: 261*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_cvt_f32_i32 262*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker; EG-NOT: INT_TO_FLT 265*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 266*9880d681SAndroid Build Coastguard Workerdefine void @no_srem25_i25_i24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 267*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 268*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 269*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 270*9880d681SAndroid Build Coastguard Worker %num.i25.0 = shl i32 %num, 7 271*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 272*9880d681SAndroid Build Coastguard Worker %num.i25 = ashr i32 %num.i25.0, 7 273*9880d681SAndroid Build Coastguard Worker %den.i24 = ashr i32 %den.i24.0, 8 274*9880d681SAndroid Build Coastguard Worker %result = srem i32 %num.i25, %den.i24 275*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 276*9880d681SAndroid Build Coastguard Worker ret void 277*9880d681SAndroid Build Coastguard Worker} 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}srem25_i24_i11_i32: 280*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 281*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 282*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 24 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Worker; EG: INT_TO_FLT 285*9880d681SAndroid Build Coastguard Worker; EG: RECIP_IEEE 286*9880d681SAndroid Build Coastguard Workerdefine void @srem25_i24_i11_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 287*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 288*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 289*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 290*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 291*9880d681SAndroid Build Coastguard Worker %den.i11.0 = shl i32 %den, 21 292*9880d681SAndroid Build Coastguard Worker %num.i24 = ashr i32 %num.i24.0, 8 293*9880d681SAndroid Build Coastguard Worker %den.i11 = ashr i32 %den.i11.0, 21 294*9880d681SAndroid Build Coastguard Worker %result = srem i32 %num.i24, %den.i11 295*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 296*9880d681SAndroid Build Coastguard Worker ret void 297*9880d681SAndroid Build Coastguard Worker} 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}srem25_i11_i24_i32: 300*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 301*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 302*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 24 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Worker; EG: INT_TO_FLT 305*9880d681SAndroid Build Coastguard Worker; EG: RECIP_IEEE 306*9880d681SAndroid Build Coastguard Workerdefine void @srem25_i11_i24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 307*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 308*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 309*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 310*9880d681SAndroid Build Coastguard Worker %num.i11.0 = shl i32 %num, 21 311*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 312*9880d681SAndroid Build Coastguard Worker %num.i11 = ashr i32 %num.i11.0, 21 313*9880d681SAndroid Build Coastguard Worker %den.i24 = ashr i32 %den.i24.0, 8 314*9880d681SAndroid Build Coastguard Worker %result = srem i32 %num.i11, %den.i24 315*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 316*9880d681SAndroid Build Coastguard Worker ret void 317*9880d681SAndroid Build Coastguard Worker} 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}srem25_i17_i12_i32: 320*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_i32 321*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 322*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 17 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker; EG: INT_TO_FLT 325*9880d681SAndroid Build Coastguard Worker; EG: RECIP_IEEE 326*9880d681SAndroid Build Coastguard Workerdefine void @srem25_i17_i12_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 327*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 328*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 329*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 330*9880d681SAndroid Build Coastguard Worker %num.i17.0 = shl i32 %num, 15 331*9880d681SAndroid Build Coastguard Worker %den.i12.0 = shl i32 %den, 20 332*9880d681SAndroid Build Coastguard Worker %num.i17 = ashr i32 %num.i17.0, 15 333*9880d681SAndroid Build Coastguard Worker %den.i12 = ashr i32 %den.i12.0, 20 334*9880d681SAndroid Build Coastguard Worker %result = sdiv i32 %num.i17, %den.i12 335*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 336*9880d681SAndroid Build Coastguard Worker ret void 337*9880d681SAndroid Build Coastguard Worker} 338