1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %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: {{^}}udiv24_i8: 6*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_ubyte 7*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_ubyte 8*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 9*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT 12*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT 13*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 14*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT 15*9880d681SAndroid Build Coastguard Workerdefine void @udiv24_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 = udiv 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: {{^}}udiv24_i16: 25*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32 26*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32 27*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 28*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT 31*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT 32*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 33*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT 34*9880d681SAndroid Build Coastguard Workerdefine void @udiv24_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 = udiv 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: {{^}}udiv23_i32: 44*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32 45*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cvt_f32_u32 46*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_rcp_f32 47*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT 50*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT 51*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 52*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT 53*9880d681SAndroid Build Coastguard Workerdefine void @udiv23_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.i23.0 = shl i32 %num, 9 58*9880d681SAndroid Build Coastguard Worker %den.i23.0 = shl i32 %den, 9 59*9880d681SAndroid Build Coastguard Worker %num.i23 = lshr i32 %num.i23.0, 9 60*9880d681SAndroid Build Coastguard Worker %den.i23 = lshr i32 %den.i23.0, 9 61*9880d681SAndroid Build Coastguard Worker %result = udiv i32 %num.i23, %den.i23 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: {{^}}udiv24_i32: 67*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag 68*9880d681SAndroid Build Coastguard Worker; SI-NOT v_rcp_f32 69*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 70*9880d681SAndroid Build Coastguard Workerdefine void @udiv24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 71*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 72*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 73*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 74*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 75*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 76*9880d681SAndroid Build Coastguard Worker %num.i24 = lshr i32 %num.i24.0, 8 77*9880d681SAndroid Build Coastguard Worker %den.i24 = lshr i32 %den.i24.0, 8 78*9880d681SAndroid Build Coastguard Worker %result = udiv i32 %num.i24, %den.i24 79*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_udiv24_u23_u24_i32: 84*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag 85*9880d681SAndroid Build Coastguard Worker; SI-NOT v_rcp_f32 86*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 87*9880d681SAndroid Build Coastguard Workerdefine void @no_udiv24_u23_u24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 88*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 89*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 90*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 91*9880d681SAndroid Build Coastguard Worker %num.i23.0 = shl i32 %num, 9 92*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 93*9880d681SAndroid Build Coastguard Worker %num.i23 = lshr i32 %num.i23.0, 9 94*9880d681SAndroid Build Coastguard Worker %den.i24 = lshr i32 %den.i24.0, 8 95*9880d681SAndroid Build Coastguard Worker %result = udiv i32 %num.i23, %den.i24 96*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 97*9880d681SAndroid Build Coastguard Worker ret void 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_udiv24_u24_u23_i32: 101*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag 102*9880d681SAndroid Build Coastguard Worker; SI-NOT v_rcp_f32 103*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 104*9880d681SAndroid Build Coastguard Workerdefine void @no_udiv24_u24_u23_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 105*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 106*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 107*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 108*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 109*9880d681SAndroid Build Coastguard Worker %den.i23.0 = shl i32 %den, 9 110*9880d681SAndroid Build Coastguard Worker %num.i24 = lshr i32 %num.i24.0, 8 111*9880d681SAndroid Build Coastguard Worker %den.i23 = lshr i32 %den.i23.0, 9 112*9880d681SAndroid Build Coastguard Worker %result = udiv i32 %num.i24, %den.i23 113*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 114*9880d681SAndroid Build Coastguard Worker ret void 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}udiv25_i32: 118*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg 119*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag 120*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT 123*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 124*9880d681SAndroid Build Coastguard Workerdefine void @udiv25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 125*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 126*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 127*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 128*9880d681SAndroid Build Coastguard Worker %num.i25.0 = shl i32 %num, 7 129*9880d681SAndroid Build Coastguard Worker %den.i25.0 = shl i32 %den, 7 130*9880d681SAndroid Build Coastguard Worker %num.i25 = lshr i32 %num.i25.0, 7 131*9880d681SAndroid Build Coastguard Worker %den.i25 = lshr i32 %den.i25.0, 7 132*9880d681SAndroid Build Coastguard Worker %result = udiv i32 %num.i25, %den.i25 133*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 134*9880d681SAndroid Build Coastguard Worker ret void 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_udiv24_i32_1: 138*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg 139*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag 140*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT 143*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 144*9880d681SAndroid Build Coastguard Workerdefine void @test_no_udiv24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 145*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 146*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 147*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 148*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 149*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 7 150*9880d681SAndroid Build Coastguard Worker %num.i24 = lshr i32 %num.i24.0, 8 151*9880d681SAndroid Build Coastguard Worker %den.i24 = lshr i32 %den.i24.0, 7 152*9880d681SAndroid Build Coastguard Worker %result = udiv i32 %num.i24, %den.i24 153*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 154*9880d681SAndroid Build Coastguard Worker ret void 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_udiv24_i32_2: 158*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg 159*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag 160*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT 163*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 164*9880d681SAndroid Build Coastguard Workerdefine void @test_no_udiv24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 165*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 166*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 167*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 168*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 7 169*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 170*9880d681SAndroid Build Coastguard Worker %num.i24 = lshr i32 %num.i24.0, 7 171*9880d681SAndroid Build Coastguard Worker %den.i24 = lshr i32 %den.i24.0, 8 172*9880d681SAndroid Build Coastguard Worker %result = udiv i32 %num.i24, %den.i24 173*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 174*9880d681SAndroid Build Coastguard Worker ret void 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}urem24_i8: 178*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_ubyte 179*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_ubyte 180*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 181*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT 184*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT 185*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 186*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT 187*9880d681SAndroid Build Coastguard Workerdefine void @urem24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) { 188*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i8, i8 addrspace(1)* %in, i8 1 189*9880d681SAndroid Build Coastguard Worker %num = load i8, i8 addrspace(1) * %in 190*9880d681SAndroid Build Coastguard Worker %den = load i8, i8 addrspace(1) * %den_ptr 191*9880d681SAndroid Build Coastguard Worker %result = urem i8 %num, %den 192*9880d681SAndroid Build Coastguard Worker store i8 %result, i8 addrspace(1)* %out 193*9880d681SAndroid Build Coastguard Worker ret void 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}urem24_i16: 197*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32 198*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_f32_u32 199*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_f32 200*9880d681SAndroid Build Coastguard Worker; SI: v_cvt_u32_f32 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker; EG: UINT_TO_FLT 203*9880d681SAndroid Build Coastguard Worker; EG-DAG: UINT_TO_FLT 204*9880d681SAndroid Build Coastguard Worker; EG-DAG: RECIP_IEEE 205*9880d681SAndroid Build Coastguard Worker; EG: FLT_TO_UINT 206*9880d681SAndroid Build Coastguard Workerdefine void @urem24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) { 207*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1 208*9880d681SAndroid Build Coastguard Worker %num = load i16, i16 addrspace(1) * %in, align 2 209*9880d681SAndroid Build Coastguard Worker %den = load i16, i16 addrspace(1) * %den_ptr, align 2 210*9880d681SAndroid Build Coastguard Worker %result = urem i16 %num, %den 211*9880d681SAndroid Build Coastguard Worker store i16 %result, i16 addrspace(1)* %out, align 2 212*9880d681SAndroid Build Coastguard Worker ret void 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}urem24_i32: 216*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 217*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 218*9880d681SAndroid Build Coastguard Workerdefine void @urem24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 219*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 220*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 221*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 222*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 223*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 224*9880d681SAndroid Build Coastguard Worker %num.i24 = lshr i32 %num.i24.0, 8 225*9880d681SAndroid Build Coastguard Worker %den.i24 = lshr i32 %den.i24.0, 8 226*9880d681SAndroid Build Coastguard Worker %result = urem i32 %num.i24, %den.i24 227*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 228*9880d681SAndroid Build Coastguard Worker ret void 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}urem25_i32: 232*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg 233*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag 234*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT 237*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 238*9880d681SAndroid Build Coastguard Workerdefine void @urem25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 239*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 240*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 241*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 242*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 7 243*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 7 244*9880d681SAndroid Build Coastguard Worker %num.i24 = lshr i32 %num.i24.0, 7 245*9880d681SAndroid Build Coastguard Worker %den.i24 = lshr i32 %den.i24.0, 7 246*9880d681SAndroid Build Coastguard Worker %result = urem i32 %num.i24, %den.i24 247*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 248*9880d681SAndroid Build Coastguard Worker ret void 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_urem24_i32_1: 252*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg 253*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag 254*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT 257*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 258*9880d681SAndroid Build Coastguard Workerdefine void @test_no_urem24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 259*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 260*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 261*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 262*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 8 263*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 7 264*9880d681SAndroid Build Coastguard Worker %num.i24 = lshr i32 %num.i24.0, 8 265*9880d681SAndroid Build Coastguard Worker %den.i24 = lshr i32 %den.i24.0, 7 266*9880d681SAndroid Build Coastguard Worker %result = urem i32 %num.i24, %den.i24 267*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 268*9880d681SAndroid Build Coastguard Worker ret void 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_no_urem24_i32_2: 272*9880d681SAndroid Build Coastguard Worker; RCP_IFLAG is for URECIP in the full 32b alg 273*9880d681SAndroid Build Coastguard Worker; SI: v_rcp_iflag 274*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_rcp_f32 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Worker; EG-NOT: UINT_TO_FLT 277*9880d681SAndroid Build Coastguard Worker; EG-NOT: RECIP_IEEE 278*9880d681SAndroid Build Coastguard Workerdefine void @test_no_urem24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 279*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 280*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 281*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 282*9880d681SAndroid Build Coastguard Worker %num.i24.0 = shl i32 %num, 7 283*9880d681SAndroid Build Coastguard Worker %den.i24.0 = shl i32 %den, 8 284*9880d681SAndroid Build Coastguard Worker %num.i24 = lshr i32 %num.i24.0, 7 285*9880d681SAndroid Build Coastguard Worker %den.i24 = lshr i32 %den.i24.0, 8 286*9880d681SAndroid Build Coastguard Worker %result = urem i32 %num.i24, %den.i24 287*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 288*9880d681SAndroid Build Coastguard Worker ret void 289*9880d681SAndroid Build Coastguard Worker} 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_udiv24_u16_u23_i32: 292*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_rcp_f32 293*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 [[MASK:s[0-9]+]], 0x7fffff{{$}} 294*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 v{{[0-9]+}}, [[MASK]], 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker; EG: RECIP_IEEE 297*9880d681SAndroid Build Coastguard Workerdefine void @test_udiv24_u16_u23_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 298*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 299*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 300*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 301*9880d681SAndroid Build Coastguard Worker %num.i16.0 = shl i32 %num, 16 302*9880d681SAndroid Build Coastguard Worker %den.i23.0 = shl i32 %den, 9 303*9880d681SAndroid Build Coastguard Worker %num.i16 = lshr i32 %num.i16.0, 16 304*9880d681SAndroid Build Coastguard Worker %den.i23 = lshr i32 %den.i23.0, 9 305*9880d681SAndroid Build Coastguard Worker %result = udiv i32 %num.i16, %den.i23 306*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 307*9880d681SAndroid Build Coastguard Worker ret void 308*9880d681SAndroid Build Coastguard Worker} 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_udiv24_u23_u16_i32: 311*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_rcp_f32 312*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_mov_b32 [[MASK:s[0-9]+]], 0x7fffff{{$}} 313*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 v{{[0-9]+}}, [[MASK]], 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Worker; EG: RECIP_IEEE 316*9880d681SAndroid Build Coastguard Workerdefine void @test_udiv24_u23_u16_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { 317*9880d681SAndroid Build Coastguard Worker %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 318*9880d681SAndroid Build Coastguard Worker %num = load i32, i32 addrspace(1) * %in, align 4 319*9880d681SAndroid Build Coastguard Worker %den = load i32, i32 addrspace(1) * %den_ptr, align 4 320*9880d681SAndroid Build Coastguard Worker %num.i23.0 = shl i32 %num, 9 321*9880d681SAndroid Build Coastguard Worker %den.i16.0 = shl i32 %den, 16 322*9880d681SAndroid Build Coastguard Worker %num.i23 = lshr i32 %num.i23.0, 9 323*9880d681SAndroid Build Coastguard Worker %den.i16 = lshr i32 %den.i16.0, 16 324*9880d681SAndroid Build Coastguard Worker %result = udiv i32 %num.i23, %den.i16 325*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 326*9880d681SAndroid Build Coastguard Worker ret void 327*9880d681SAndroid Build Coastguard Worker} 328