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=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.AMDGPU.imax(i32, i32) nounwind readnone 5*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.r600.read.tidig.x() nounwind readnone 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i1_i32: 9*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[ARG:s[0-9]+]], 10*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_i32 [[SEXTRACT:s[0-9]+]], [[ARG]], 0x10000 11*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[EXTRACT:v[0-9]+]], [[SEXTRACT]] 12*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[EXTRACT]], 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+\.[XYZW]]], [[ADDR:T[0-9]+.[XYZW]]] 15*9880d681SAndroid Build Coastguard Worker; EG: LSHR * [[ADDR]] 16*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT * [[RES]], {{.*}}, 0.0, 1 17*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i1_i32(i32 addrspace(1)* %out, i32 %in) { 18*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %in, 31 19*9880d681SAndroid Build Coastguard Worker %sext = ashr i32 %shl, 31 20*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 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: {{^}}sext_in_reg_i8_to_i32: 25*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 [[VAL:s[0-9]+]], 26*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 [[EXTRACT:s[0-9]+]], [[VAL]] 27*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VEXTRACT:v[0-9]+]], [[EXTRACT]] 28*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VEXTRACT]], 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+\.[XYZW]]], [[ADDR:T[0-9]+.[XYZW]]] 31*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 32*9880d681SAndroid Build Coastguard Worker; EG-NEXT: BFE_INT [[RES]], {{.*}}, 0.0, literal 33*9880d681SAndroid Build Coastguard Worker; EG-NEXT: LSHR * [[ADDR]] 34*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i8_to_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 35*9880d681SAndroid Build Coastguard Worker %c = add i32 %a, %b ; add to prevent folding into extload 36*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %c, 24 37*9880d681SAndroid Build Coastguard Worker %ashr = ashr i32 %shl, 24 38*9880d681SAndroid Build Coastguard Worker store i32 %ashr, i32 addrspace(1)* %out, align 4 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i16_to_i32: 43*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 [[VAL:s[0-9]+]], 44*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i16 [[EXTRACT:s[0-9]+]], [[VAL]] 45*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VEXTRACT:v[0-9]+]], [[EXTRACT]] 46*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VEXTRACT]], 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+\.[XYZW]]], [[ADDR:T[0-9]+.[XYZW]]] 49*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 50*9880d681SAndroid Build Coastguard Worker; EG-NEXT: BFE_INT [[RES]], {{.*}}, 0.0, literal 51*9880d681SAndroid Build Coastguard Worker; EG-NEXT: LSHR * [[ADDR]] 52*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i16_to_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 53*9880d681SAndroid Build Coastguard Worker %c = add i32 %a, %b ; add to prevent folding into extload 54*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %c, 16 55*9880d681SAndroid Build Coastguard Worker %ashr = ashr i32 %shl, 16 56*9880d681SAndroid Build Coastguard Worker store i32 %ashr, i32 addrspace(1)* %out, align 4 57*9880d681SAndroid Build Coastguard Worker ret void 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i8_to_v1i32: 61*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32 [[VAL:s[0-9]+]], 62*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 [[EXTRACT:s[0-9]+]], [[VAL]] 63*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VEXTRACT:v[0-9]+]], [[EXTRACT]] 64*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VEXTRACT]], 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+\.[XYZW]]], [[ADDR:T[0-9]+.[XYZW]]] 67*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 68*9880d681SAndroid Build Coastguard Worker; EG-NEXT: BFE_INT [[RES]], {{.*}}, 0.0, literal 69*9880d681SAndroid Build Coastguard Worker; EG-NEXT: LSHR * [[ADDR]] 70*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i8_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i32> %a, <1 x i32> %b) nounwind { 71*9880d681SAndroid Build Coastguard Worker %c = add <1 x i32> %a, %b ; add to prevent folding into extload 72*9880d681SAndroid Build Coastguard Worker %shl = shl <1 x i32> %c, <i32 24> 73*9880d681SAndroid Build Coastguard Worker %ashr = ashr <1 x i32> %shl, <i32 24> 74*9880d681SAndroid Build Coastguard Worker store <1 x i32> %ashr, <1 x i32> addrspace(1)* %out, align 4 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i1_to_i64: 79*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 [[VAL:s\[[0-9]+:[0-9]+\]]] 80*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_bfe_i64 s{{\[}}[[SLO:[0-9]+]]:[[SHI:[0-9]+]]{{\]}}, [[VAL]], 0x10000 81*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VLO:[0-9]+]], s[[SLO]] 82*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VHI:[0-9]+]], s[[SHI]] 83*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[VLO]]:[[VHI]]{{\]}} 84*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i1_to_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) nounwind { 85*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 86*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 63 87*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 63 88*9880d681SAndroid Build Coastguard Worker store i64 %ashr, i64 addrspace(1)* %out, align 8 89*9880d681SAndroid Build Coastguard Worker ret void 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i8_to_i64: 93*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 [[VAL:s\[[0-9]+:[0-9]+\]]] 94*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_bfe_i64 s{{\[}}[[SLO:[0-9]+]]:[[SHI:[0-9]+]]{{\]}}, [[VAL]], 0x80000 95*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VLO:[0-9]+]], s[[SLO]] 96*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VHI:[0-9]+]], s[[SHI]] 97*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[VLO]]:[[VHI]]{{\]}} 98*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i8_to_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) nounwind { 99*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 100*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 56 101*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 56 102*9880d681SAndroid Build Coastguard Worker store i64 %ashr, i64 addrspace(1)* %out, align 8 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i16_to_i64: 107*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 [[VAL:s\[[0-9]+:[0-9]+\]]] 108*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_bfe_i64 s{{\[}}[[SLO:[0-9]+]]:[[SHI:[0-9]+]]{{\]}}, [[VAL]], 0x100000 109*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VLO:[0-9]+]], s[[SLO]] 110*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VHI:[0-9]+]], s[[SHI]] 111*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[VLO]]:[[VHI]]{{\]}} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i16_to_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) nounwind { 114*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 115*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 48 116*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 48 117*9880d681SAndroid Build Coastguard Worker store i64 %ashr, i64 addrspace(1)* %out, align 8 118*9880d681SAndroid Build Coastguard Worker ret void 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i32_to_i64: 122*9880d681SAndroid Build Coastguard Worker; SI: s_lshl_b64 [[VAL:s\[[0-9]+:[0-9]+\]]] 123*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_bfe_i64 s{{\[}}[[SLO:[0-9]+]]:[[SHI:[0-9]+]]{{\]}}, [[VAL]], 0x200000 124*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VLO:[0-9]+]], s[[SLO]] 125*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VHI:[0-9]+]], s[[SHI]] 126*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[VLO]]:[[VHI]]{{\]}} 127*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i32_to_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) nounwind { 128*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 129*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 32 130*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 32 131*9880d681SAndroid Build Coastguard Worker store i64 %ashr, i64 addrspace(1)* %out, align 8 132*9880d681SAndroid Build Coastguard Worker ret void 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; This is broken on Evergreen for some reason related to the <1 x i64> kernel arguments. 136*9880d681SAndroid Build Coastguard Worker; XFUNC-LABEL: {{^}}sext_in_reg_i8_to_v1i64: 137*9880d681SAndroid Build Coastguard Worker; XSI: s_bfe_i32 [[EXTRACT:s[0-9]+]], {{s[0-9]+}}, 524288 138*9880d681SAndroid Build Coastguard Worker; XSI: s_ashr_i32 {{v[0-9]+}}, [[EXTRACT]], 31 139*9880d681SAndroid Build Coastguard Worker; XSI: buffer_store_dword 140*9880d681SAndroid Build Coastguard Worker; XEG: BFE_INT 141*9880d681SAndroid Build Coastguard Worker; XEG: ASHR 142*9880d681SAndroid Build Coastguard Worker; define void @sext_in_reg_i8_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i64> %a, <1 x i64> %b) nounwind { 143*9880d681SAndroid Build Coastguard Worker; %c = add <1 x i64> %a, %b 144*9880d681SAndroid Build Coastguard Worker; %shl = shl <1 x i64> %c, <i64 56> 145*9880d681SAndroid Build Coastguard Worker; %ashr = ashr <1 x i64> %shl, <i64 56> 146*9880d681SAndroid Build Coastguard Worker; store <1 x i64> %ashr, <1 x i64> addrspace(1)* %out, align 8 147*9880d681SAndroid Build Coastguard Worker; ret void 148*9880d681SAndroid Build Coastguard Worker; } 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_sext_in_reg_i1_to_i64: 151*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx2 152*9880d681SAndroid Build Coastguard Worker; SI: v_lshl_b64 v{{\[}}[[VAL_LO:[0-9]+]]:[[VAL_HI:[0-9]+]]{{\]}} 153*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v[[LO:[0-9]+]], v[[VAL_LO]], 0, 1 154*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]] 155*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}} 156*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_in_reg_i1_to_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr) nounwind { 157*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 158*9880d681SAndroid Build Coastguard Worker %a.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 159*9880d681SAndroid Build Coastguard Worker %b.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 160*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 161*9880d681SAndroid Build Coastguard Worker %a = load i64, i64 addrspace(1)* %a.gep, align 8 162*9880d681SAndroid Build Coastguard Worker %b = load i64, i64 addrspace(1)* %b.gep, align 8 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 165*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 63 166*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 63 167*9880d681SAndroid Build Coastguard Worker store i64 %ashr, i64 addrspace(1)* %out.gep, align 8 168*9880d681SAndroid Build Coastguard Worker ret void 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_sext_in_reg_i8_to_i64: 172*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx2 173*9880d681SAndroid Build Coastguard Worker; SI: v_lshl_b64 v{{\[}}[[VAL_LO:[0-9]+]]:[[VAL_HI:[0-9]+]]{{\]}} 174*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v[[LO:[0-9]+]], v[[VAL_LO]], 0, 8 175*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]] 176*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}} 177*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_in_reg_i8_to_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr) nounwind { 178*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 179*9880d681SAndroid Build Coastguard Worker %a.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 180*9880d681SAndroid Build Coastguard Worker %b.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 181*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 182*9880d681SAndroid Build Coastguard Worker %a = load i64, i64 addrspace(1)* %a.gep, align 8 183*9880d681SAndroid Build Coastguard Worker %b = load i64, i64 addrspace(1)* %b.gep, align 8 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 186*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 56 187*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 56 188*9880d681SAndroid Build Coastguard Worker store i64 %ashr, i64 addrspace(1)* %out.gep, align 8 189*9880d681SAndroid Build Coastguard Worker ret void 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_sext_in_reg_i16_to_i64: 193*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx2 194*9880d681SAndroid Build Coastguard Worker; SI: v_lshl_b64 v{{\[}}[[VAL_LO:[0-9]+]]:[[VAL_HI:[0-9]+]]{{\]}} 195*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v[[LO:[0-9]+]], v[[VAL_LO]], 0, 16 196*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]] 197*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}} 198*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_in_reg_i16_to_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr) nounwind { 199*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 200*9880d681SAndroid Build Coastguard Worker %a.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 201*9880d681SAndroid Build Coastguard Worker %b.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 202*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 203*9880d681SAndroid Build Coastguard Worker %a = load i64, i64 addrspace(1)* %a.gep, align 8 204*9880d681SAndroid Build Coastguard Worker %b = load i64, i64 addrspace(1)* %b.gep, align 8 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 207*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 48 208*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 48 209*9880d681SAndroid Build Coastguard Worker store i64 %ashr, i64 addrspace(1)* %out.gep, align 8 210*9880d681SAndroid Build Coastguard Worker ret void 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_sext_in_reg_i32_to_i64: 214*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx2 215*9880d681SAndroid Build Coastguard Worker; SI: v_lshl_b64 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}, 216*9880d681SAndroid Build Coastguard Worker; SI: v_ashrrev_i32_e32 v[[SHR:[0-9]+]], 31, v[[LO]] 217*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[LO]]:[[SHR]]{{\]}} 218*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_in_reg_i32_to_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr) nounwind { 219*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 220*9880d681SAndroid Build Coastguard Worker %a.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 221*9880d681SAndroid Build Coastguard Worker %b.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 222*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 223*9880d681SAndroid Build Coastguard Worker %a = load i64, i64 addrspace(1)* %a.gep, align 8 224*9880d681SAndroid Build Coastguard Worker %b = load i64, i64 addrspace(1)* %b.gep, align 8 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 227*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 32 228*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 32 229*9880d681SAndroid Build Coastguard Worker store i64 %ashr, i64 addrspace(1)* %out.gep, align 8 230*9880d681SAndroid Build Coastguard Worker ret void 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i1_in_i32_other_amount: 234*9880d681SAndroid Build Coastguard Worker; SI-NOT: s_lshl 235*9880d681SAndroid Build Coastguard Worker; SI-NOT: s_ashr 236*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_i32 {{s[0-9]+}}, {{s[0-9]+}}, 0x190001 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+\.[XYZW]]], [[ADDR:T[0-9]+.[XYZW]]] 239*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 240*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 241*9880d681SAndroid Build Coastguard Worker; EG: LSHL 242*9880d681SAndroid Build Coastguard Worker; EG: ASHR [[RES]] 243*9880d681SAndroid Build Coastguard Worker; EG: LSHR {{\*?}} [[ADDR]] 244*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i1_in_i32_other_amount(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 245*9880d681SAndroid Build Coastguard Worker %c = add i32 %a, %b 246*9880d681SAndroid Build Coastguard Worker %x = shl i32 %c, 6 247*9880d681SAndroid Build Coastguard Worker %y = ashr i32 %x, 7 248*9880d681SAndroid Build Coastguard Worker store i32 %y, i32 addrspace(1)* %out 249*9880d681SAndroid Build Coastguard Worker ret void 250*9880d681SAndroid Build Coastguard Worker} 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_v2i1_in_v2i32_other_amount: 253*9880d681SAndroid Build Coastguard Worker; SI-NOT: s_lshl 254*9880d681SAndroid Build Coastguard Worker; SI-NOT: s_ashr 255*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_bfe_i32 {{s[0-9]+}}, {{s[0-9]+}}, 0x190001 256*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_bfe_i32 {{s[0-9]+}}, {{s[0-9]+}}, 0x190001 257*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+]]{{\.[XYZW][XYZW]}}, [[ADDR:T[0-9]+.[XYZW]]] 260*9880d681SAndroid Build Coastguard Worker; EG-NOT: BFE 261*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT 262*9880d681SAndroid Build Coastguard Worker; EG: LSHL 263*9880d681SAndroid Build Coastguard Worker; EG: ASHR [[RES]] 264*9880d681SAndroid Build Coastguard Worker; EG: LSHL 265*9880d681SAndroid Build Coastguard Worker; EG: ASHR [[RES]] 266*9880d681SAndroid Build Coastguard Worker; EG: LSHR {{\*?}} [[ADDR]] 267*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_v2i1_in_v2i32_other_amount(<2 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b) nounwind { 268*9880d681SAndroid Build Coastguard Worker %c = add <2 x i32> %a, %b 269*9880d681SAndroid Build Coastguard Worker %x = shl <2 x i32> %c, <i32 6, i32 6> 270*9880d681SAndroid Build Coastguard Worker %y = ashr <2 x i32> %x, <i32 7, i32 7> 271*9880d681SAndroid Build Coastguard Worker store <2 x i32> %y, <2 x i32> addrspace(1)* %out 272*9880d681SAndroid Build Coastguard Worker ret void 273*9880d681SAndroid Build Coastguard Worker} 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_v2i1_to_v2i32: 277*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_i32 {{s[0-9]+}}, {{s[0-9]+}}, 0x10000 278*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_i32 {{s[0-9]+}}, {{s[0-9]+}}, 0x10000 279*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+]]{{\.[XYZW][XYZW]}}, [[ADDR:T[0-9]+.[XYZW]]] 282*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 283*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 284*9880d681SAndroid Build Coastguard Worker; EG: LSHR {{\*?}} [[ADDR]] 285*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_v2i1_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b) nounwind { 286*9880d681SAndroid Build Coastguard Worker %c = add <2 x i32> %a, %b ; add to prevent folding into extload 287*9880d681SAndroid Build Coastguard Worker %shl = shl <2 x i32> %c, <i32 31, i32 31> 288*9880d681SAndroid Build Coastguard Worker %ashr = ashr <2 x i32> %shl, <i32 31, i32 31> 289*9880d681SAndroid Build Coastguard Worker store <2 x i32> %ashr, <2 x i32> addrspace(1)* %out, align 8 290*9880d681SAndroid Build Coastguard Worker ret void 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_v4i1_to_v4i32: 294*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_i32 {{s[0-9]+}}, {{s[0-9]+}}, 0x10000 295*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_i32 {{s[0-9]+}}, {{s[0-9]+}}, 0x10000 296*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_i32 {{s[0-9]+}}, {{s[0-9]+}}, 0x10000 297*9880d681SAndroid Build Coastguard Worker; SI: s_bfe_i32 {{s[0-9]+}}, {{s[0-9]+}}, 0x10000 298*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx4 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+]]{{\.[XYZW][XYZW][XYZW][XYZW]}}, [[ADDR:T[0-9]+.[XYZW]]] 301*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 302*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 303*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 304*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 305*9880d681SAndroid Build Coastguard Worker; EG: LSHR {{\*?}} [[ADDR]] 306*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_v4i1_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> %a, <4 x i32> %b) nounwind { 307*9880d681SAndroid Build Coastguard Worker %c = add <4 x i32> %a, %b ; add to prevent folding into extload 308*9880d681SAndroid Build Coastguard Worker %shl = shl <4 x i32> %c, <i32 31, i32 31, i32 31, i32 31> 309*9880d681SAndroid Build Coastguard Worker %ashr = ashr <4 x i32> %shl, <i32 31, i32 31, i32 31, i32 31> 310*9880d681SAndroid Build Coastguard Worker store <4 x i32> %ashr, <4 x i32> addrspace(1)* %out, align 8 311*9880d681SAndroid Build Coastguard Worker ret void 312*9880d681SAndroid Build Coastguard Worker} 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_v2i8_to_v2i32: 315*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 {{s[0-9]+}}, {{s[0-9]+}} 316*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 {{s[0-9]+}}, {{s[0-9]+}} 317*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+]]{{\.[XYZW][XYZW]}}, [[ADDR:T[0-9]+.[XYZW]]] 320*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 321*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 322*9880d681SAndroid Build Coastguard Worker; EG: LSHR {{\*?}} [[ADDR]] 323*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_v2i8_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b) nounwind { 324*9880d681SAndroid Build Coastguard Worker %c = add <2 x i32> %a, %b ; add to prevent folding into extload 325*9880d681SAndroid Build Coastguard Worker %shl = shl <2 x i32> %c, <i32 24, i32 24> 326*9880d681SAndroid Build Coastguard Worker %ashr = ashr <2 x i32> %shl, <i32 24, i32 24> 327*9880d681SAndroid Build Coastguard Worker store <2 x i32> %ashr, <2 x i32> addrspace(1)* %out, align 8 328*9880d681SAndroid Build Coastguard Worker ret void 329*9880d681SAndroid Build Coastguard Worker} 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_v4i8_to_v4i32: 332*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 {{s[0-9]+}}, {{s[0-9]+}} 333*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 {{s[0-9]+}}, {{s[0-9]+}} 334*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 {{s[0-9]+}}, {{s[0-9]+}} 335*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 {{s[0-9]+}}, {{s[0-9]+}} 336*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx4 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+]]{{\.[XYZW][XYZW][XYZW][XYZW]}}, [[ADDR:T[0-9]+.[XYZW]]] 339*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 340*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 341*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 342*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 343*9880d681SAndroid Build Coastguard Worker; EG: LSHR {{\*?}} [[ADDR]] 344*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> %a, <4 x i32> %b) nounwind { 345*9880d681SAndroid Build Coastguard Worker %c = add <4 x i32> %a, %b ; add to prevent folding into extload 346*9880d681SAndroid Build Coastguard Worker %shl = shl <4 x i32> %c, <i32 24, i32 24, i32 24, i32 24> 347*9880d681SAndroid Build Coastguard Worker %ashr = ashr <4 x i32> %shl, <i32 24, i32 24, i32 24, i32 24> 348*9880d681SAndroid Build Coastguard Worker store <4 x i32> %ashr, <4 x i32> addrspace(1)* %out, align 8 349*9880d681SAndroid Build Coastguard Worker ret void 350*9880d681SAndroid Build Coastguard Worker} 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_v2i16_to_v2i32: 353*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i16 {{s[0-9]+}}, {{s[0-9]+}} 354*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i16 {{s[0-9]+}}, {{s[0-9]+}} 355*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+]]{{\.[XYZW][XYZW]}}, [[ADDR:T[0-9]+.[XYZW]]] 358*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 359*9880d681SAndroid Build Coastguard Worker; EG: BFE_INT [[RES]] 360*9880d681SAndroid Build Coastguard Worker; EG: LSHR {{\*?}} [[ADDR]] 361*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_v2i16_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b) nounwind { 362*9880d681SAndroid Build Coastguard Worker %c = add <2 x i32> %a, %b ; add to prevent folding into extload 363*9880d681SAndroid Build Coastguard Worker %shl = shl <2 x i32> %c, <i32 16, i32 16> 364*9880d681SAndroid Build Coastguard Worker %ashr = ashr <2 x i32> %shl, <i32 16, i32 16> 365*9880d681SAndroid Build Coastguard Worker store <2 x i32> %ashr, <2 x i32> addrspace(1)* %out, align 8 366*9880d681SAndroid Build Coastguard Worker ret void 367*9880d681SAndroid Build Coastguard Worker} 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}testcase: 370*9880d681SAndroid Build Coastguard Workerdefine void @testcase(i8 addrspace(1)* %out, i8 %a) nounwind { 371*9880d681SAndroid Build Coastguard Worker %and_a_1 = and i8 %a, 1 372*9880d681SAndroid Build Coastguard Worker %cmp_eq = icmp eq i8 %and_a_1, 0 373*9880d681SAndroid Build Coastguard Worker %cmp_slt = icmp slt i8 %a, 0 374*9880d681SAndroid Build Coastguard Worker %sel0 = select i1 %cmp_slt, i8 0, i8 %a 375*9880d681SAndroid Build Coastguard Worker %sel1 = select i1 %cmp_eq, i8 0, i8 %a 376*9880d681SAndroid Build Coastguard Worker %xor = xor i8 %sel0, %sel1 377*9880d681SAndroid Build Coastguard Worker store i8 %xor, i8 addrspace(1)* %out 378*9880d681SAndroid Build Coastguard Worker ret void 379*9880d681SAndroid Build Coastguard Worker} 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}testcase_3: 382*9880d681SAndroid Build Coastguard Workerdefine void @testcase_3(i8 addrspace(1)* %out, i8 %a) nounwind { 383*9880d681SAndroid Build Coastguard Worker %and_a_1 = and i8 %a, 1 384*9880d681SAndroid Build Coastguard Worker %cmp_eq = icmp eq i8 %and_a_1, 0 385*9880d681SAndroid Build Coastguard Worker %cmp_slt = icmp slt i8 %a, 0 386*9880d681SAndroid Build Coastguard Worker %sel0 = select i1 %cmp_slt, i8 0, i8 %a 387*9880d681SAndroid Build Coastguard Worker %sel1 = select i1 %cmp_eq, i8 0, i8 %a 388*9880d681SAndroid Build Coastguard Worker %xor = xor i8 %sel0, %sel1 389*9880d681SAndroid Build Coastguard Worker store i8 %xor, i8 addrspace(1)* %out 390*9880d681SAndroid Build Coastguard Worker ret void 391*9880d681SAndroid Build Coastguard Worker} 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vgpr_sext_in_reg_v4i8_to_v4i32: 394*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 [[EXTRACT:v[0-9]+]], {{v[0-9]+}}, 0, 8 395*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 [[EXTRACT:v[0-9]+]], {{v[0-9]+}}, 0, 8 396*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 [[EXTRACT:v[0-9]+]], {{v[0-9]+}}, 0, 8 397*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 [[EXTRACT:v[0-9]+]], {{v[0-9]+}}, 0, 8 398*9880d681SAndroid Build Coastguard Workerdefine void @vgpr_sext_in_reg_v4i8_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %a, <4 x i32> addrspace(1)* %b) nounwind { 399*9880d681SAndroid Build Coastguard Worker %loada = load <4 x i32>, <4 x i32> addrspace(1)* %a, align 16 400*9880d681SAndroid Build Coastguard Worker %loadb = load <4 x i32>, <4 x i32> addrspace(1)* %b, align 16 401*9880d681SAndroid Build Coastguard Worker %c = add <4 x i32> %loada, %loadb ; add to prevent folding into extload 402*9880d681SAndroid Build Coastguard Worker %shl = shl <4 x i32> %c, <i32 24, i32 24, i32 24, i32 24> 403*9880d681SAndroid Build Coastguard Worker %ashr = ashr <4 x i32> %shl, <i32 24, i32 24, i32 24, i32 24> 404*9880d681SAndroid Build Coastguard Worker store <4 x i32> %ashr, <4 x i32> addrspace(1)* %out, align 8 405*9880d681SAndroid Build Coastguard Worker ret void 406*9880d681SAndroid Build Coastguard Worker} 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vgpr_sext_in_reg_v4i16_to_v4i32: 409*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 [[EXTRACT:v[0-9]+]], {{v[0-9]+}}, 0, 16 410*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 [[EXTRACT:v[0-9]+]], {{v[0-9]+}}, 0, 16 411*9880d681SAndroid Build Coastguard Workerdefine void @vgpr_sext_in_reg_v4i16_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %a, <4 x i32> addrspace(1)* %b) nounwind { 412*9880d681SAndroid Build Coastguard Worker %loada = load <4 x i32>, <4 x i32> addrspace(1)* %a, align 16 413*9880d681SAndroid Build Coastguard Worker %loadb = load <4 x i32>, <4 x i32> addrspace(1)* %b, align 16 414*9880d681SAndroid Build Coastguard Worker %c = add <4 x i32> %loada, %loadb ; add to prevent folding into extload 415*9880d681SAndroid Build Coastguard Worker %shl = shl <4 x i32> %c, <i32 16, i32 16, i32 16, i32 16> 416*9880d681SAndroid Build Coastguard Worker %ashr = ashr <4 x i32> %shl, <i32 16, i32 16, i32 16, i32 16> 417*9880d681SAndroid Build Coastguard Worker store <4 x i32> %ashr, <4 x i32> addrspace(1)* %out, align 8 418*9880d681SAndroid Build Coastguard Worker ret void 419*9880d681SAndroid Build Coastguard Worker} 420*9880d681SAndroid Build Coastguard Worker 421*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_to_illegal_type: 422*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 423*9880d681SAndroid Build Coastguard Worker; SI: v_max_i32 424*9880d681SAndroid Build Coastguard Worker; SI-NOT: bfe 425*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_short 426*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_to_illegal_type(i16 addrspace(1)* nocapture %out, i8 addrspace(1)* nocapture %src) nounwind { 427*9880d681SAndroid Build Coastguard Worker %tmp5 = load i8, i8 addrspace(1)* %src, align 1 428*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i8 %tmp5 to i32 429*9880d681SAndroid Build Coastguard Worker %tmp2.5 = icmp sgt i32 %tmp2, 0 430*9880d681SAndroid Build Coastguard Worker %tmp3 = select i1 %tmp2.5, i32 %tmp2, i32 0 431*9880d681SAndroid Build Coastguard Worker %tmp4 = trunc i32 %tmp3 to i8 432*9880d681SAndroid Build Coastguard Worker %tmp6 = sext i8 %tmp4 to i16 433*9880d681SAndroid Build Coastguard Worker store i16 %tmp6, i16 addrspace(1)* %out, align 2 434*9880d681SAndroid Build Coastguard Worker ret void 435*9880d681SAndroid Build Coastguard Worker} 436*9880d681SAndroid Build Coastguard Worker 437*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.AMDGPU.bfe.i32(i32, i32, i32) nounwind readnone 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_0_width: 440*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 441*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 442*9880d681SAndroid Build Coastguard Workerdefine void @bfe_0_width(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) nounwind { 443*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %ptr, align 4 444*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %load, i32 8, i32 0) nounwind readnone 445*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 446*9880d681SAndroid Build Coastguard Worker ret void 447*9880d681SAndroid Build Coastguard Worker} 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_8_bfe_8: 450*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 451*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 452*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 453*9880d681SAndroid Build Coastguard Workerdefine void @bfe_8_bfe_8(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) nounwind { 454*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %ptr, align 4 455*9880d681SAndroid Build Coastguard Worker %bfe0 = call i32 @llvm.AMDGPU.bfe.i32(i32 %load, i32 0, i32 8) nounwind readnone 456*9880d681SAndroid Build Coastguard Worker %bfe1 = call i32 @llvm.AMDGPU.bfe.i32(i32 %bfe0, i32 0, i32 8) nounwind readnone 457*9880d681SAndroid Build Coastguard Worker store i32 %bfe1, i32 addrspace(1)* %out, align 4 458*9880d681SAndroid Build Coastguard Worker ret void 459*9880d681SAndroid Build Coastguard Worker} 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_8_bfe_16: 462*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 8 463*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 464*9880d681SAndroid Build Coastguard Workerdefine void @bfe_8_bfe_16(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) nounwind { 465*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %ptr, align 4 466*9880d681SAndroid Build Coastguard Worker %bfe0 = call i32 @llvm.AMDGPU.bfe.i32(i32 %load, i32 0, i32 8) nounwind readnone 467*9880d681SAndroid Build Coastguard Worker %bfe1 = call i32 @llvm.AMDGPU.bfe.i32(i32 %bfe0, i32 0, i32 16) nounwind readnone 468*9880d681SAndroid Build Coastguard Worker store i32 %bfe1, i32 addrspace(1)* %out, align 4 469*9880d681SAndroid Build Coastguard Worker ret void 470*9880d681SAndroid Build Coastguard Worker} 471*9880d681SAndroid Build Coastguard Worker 472*9880d681SAndroid Build Coastguard Worker; This really should be folded into 1 473*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}bfe_16_bfe_8: 474*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 8 475*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 476*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 477*9880d681SAndroid Build Coastguard Workerdefine void @bfe_16_bfe_8(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) nounwind { 478*9880d681SAndroid Build Coastguard Worker %load = load i32, i32 addrspace(1)* %ptr, align 4 479*9880d681SAndroid Build Coastguard Worker %bfe0 = call i32 @llvm.AMDGPU.bfe.i32(i32 %load, i32 0, i32 16) nounwind readnone 480*9880d681SAndroid Build Coastguard Worker %bfe1 = call i32 @llvm.AMDGPU.bfe.i32(i32 %bfe0, i32 0, i32 8) nounwind readnone 481*9880d681SAndroid Build Coastguard Worker store i32 %bfe1, i32 addrspace(1)* %out, align 4 482*9880d681SAndroid Build Coastguard Worker ret void 483*9880d681SAndroid Build Coastguard Worker} 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Worker; Make sure there isn't a redundant BFE 486*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i8_to_i32_bfe: 487*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 s{{[0-9]+}}, s{{[0-9]+}} 488*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 489*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 490*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i8_to_i32_bfe(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 491*9880d681SAndroid Build Coastguard Worker %c = add i32 %a, %b ; add to prevent folding into extload 492*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %c, i32 0, i32 8) nounwind readnone 493*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %bfe, 24 494*9880d681SAndroid Build Coastguard Worker %ashr = ashr i32 %shl, 24 495*9880d681SAndroid Build Coastguard Worker store i32 %ashr, i32 addrspace(1)* %out, align 4 496*9880d681SAndroid Build Coastguard Worker ret void 497*9880d681SAndroid Build Coastguard Worker} 498*9880d681SAndroid Build Coastguard Worker 499*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i8_to_i32_bfe_wrong: 500*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i8_to_i32_bfe_wrong(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 501*9880d681SAndroid Build Coastguard Worker %c = add i32 %a, %b ; add to prevent folding into extload 502*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %c, i32 8, i32 0) nounwind readnone 503*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %bfe, 24 504*9880d681SAndroid Build Coastguard Worker %ashr = ashr i32 %shl, 24 505*9880d681SAndroid Build Coastguard Worker store i32 %ashr, i32 addrspace(1)* %out, align 4 506*9880d681SAndroid Build Coastguard Worker ret void 507*9880d681SAndroid Build Coastguard Worker} 508*9880d681SAndroid Build Coastguard Worker 509*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sextload_i8_to_i32_bfe: 510*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 511*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 512*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 513*9880d681SAndroid Build Coastguard Workerdefine void @sextload_i8_to_i32_bfe(i32 addrspace(1)* %out, i8 addrspace(1)* %ptr) nounwind { 514*9880d681SAndroid Build Coastguard Worker %load = load i8, i8 addrspace(1)* %ptr, align 1 515*9880d681SAndroid Build Coastguard Worker %sext = sext i8 %load to i32 516*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %sext, i32 0, i32 8) nounwind readnone 517*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %bfe, 24 518*9880d681SAndroid Build Coastguard Worker %ashr = ashr i32 %shl, 24 519*9880d681SAndroid Build Coastguard Worker store i32 %ashr, i32 addrspace(1)* %out, align 4 520*9880d681SAndroid Build Coastguard Worker ret void 521*9880d681SAndroid Build Coastguard Worker} 522*9880d681SAndroid Build Coastguard Worker 523*9880d681SAndroid Build Coastguard Worker; SI: .text 524*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sextload_i8_to_i32_bfe_0:{{.*$}} 525*9880d681SAndroid Build Coastguard Worker; SI-NOT: {{[^@]}}bfe 526*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 527*9880d681SAndroid Build Coastguard Workerdefine void @sextload_i8_to_i32_bfe_0(i32 addrspace(1)* %out, i8 addrspace(1)* %ptr) nounwind { 528*9880d681SAndroid Build Coastguard Worker %load = load i8, i8 addrspace(1)* %ptr, align 1 529*9880d681SAndroid Build Coastguard Worker %sext = sext i8 %load to i32 530*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %sext, i32 8, i32 0) nounwind readnone 531*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %bfe, 24 532*9880d681SAndroid Build Coastguard Worker %ashr = ashr i32 %shl, 24 533*9880d681SAndroid Build Coastguard Worker store i32 %ashr, i32 addrspace(1)* %out, align 4 534*9880d681SAndroid Build Coastguard Worker ret void 535*9880d681SAndroid Build Coastguard Worker} 536*9880d681SAndroid Build Coastguard Worker 537*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i1_bfe_offset_0: 538*9880d681SAndroid Build Coastguard Worker; SI-NOT: shr 539*9880d681SAndroid Build Coastguard Worker; SI-NOT: shl 540*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 1 541*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 542*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i1_bfe_offset_0(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 543*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 544*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 31 545*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 %shl, 31 546*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %shr, i32 0, i32 1) 547*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 548*9880d681SAndroid Build Coastguard Worker ret void 549*9880d681SAndroid Build Coastguard Worker} 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i1_bfe_offset_1: 552*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 553*9880d681SAndroid Build Coastguard Worker; SI-NOT: shl 554*9880d681SAndroid Build Coastguard Worker; SI-NOT: shr 555*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 1, 1 556*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 557*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i1_bfe_offset_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 558*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 559*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 30 560*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 %shl, 30 561*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %shr, i32 1, i32 1) 562*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 563*9880d681SAndroid Build Coastguard Worker ret void 564*9880d681SAndroid Build Coastguard Worker} 565*9880d681SAndroid Build Coastguard Worker 566*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_in_reg_i2_bfe_offset_1: 567*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword 568*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_lshl 569*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_ashr 570*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 2 571*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 1, 2 572*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 573*9880d681SAndroid Build Coastguard Workerdefine void @sext_in_reg_i2_bfe_offset_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind { 574*9880d681SAndroid Build Coastguard Worker %x = load i32, i32 addrspace(1)* %in, align 4 575*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 30 576*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 %shl, 30 577*9880d681SAndroid Build Coastguard Worker %bfe = call i32 @llvm.AMDGPU.bfe.i32(i32 %shr, i32 1, i32 2) 578*9880d681SAndroid Build Coastguard Worker store i32 %bfe, i32 addrspace(1)* %out, align 4 579*9880d681SAndroid Build Coastguard Worker ret void 580*9880d681SAndroid Build Coastguard Worker} 581*9880d681SAndroid Build Coastguard Worker 582*9880d681SAndroid Build Coastguard Worker; Make sure we propagate the VALUness to users of a moved scalar BFE. 583*9880d681SAndroid Build Coastguard Worker 584*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_sext_in_reg_i1_to_i64_move_use: 585*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx2 586*9880d681SAndroid Build Coastguard Worker; SI: v_lshl_b64 v{{\[}}[[VAL_LO:[0-9]+]]:[[VAL_HI:[0-9]+]]{{\]}} 587*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_bfe_i32 v[[LO:[0-9]+]], v[[VAL_LO]], 0, 1 588*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]] 589*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_and_b32_e32 v[[RESULT_LO:[0-9]+]], s{{[0-9]+}}, v[[LO]] 590*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_and_b32_e32 v[[RESULT_HI:[0-9]+]], s{{[0-9]+}}, v[[HI]] 591*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[RESULT_LO]]:[[RESULT_HI]]{{\]}} 592*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_in_reg_i1_to_i64_move_use(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 %s.val) nounwind { 593*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 594*9880d681SAndroid Build Coastguard Worker %a.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 595*9880d681SAndroid Build Coastguard Worker %b.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 596*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 597*9880d681SAndroid Build Coastguard Worker %a = load i64, i64 addrspace(1)* %a.gep, align 8 598*9880d681SAndroid Build Coastguard Worker %b = load i64, i64 addrspace(1)* %b.gep, align 8 599*9880d681SAndroid Build Coastguard Worker 600*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 601*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 63 602*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 63 603*9880d681SAndroid Build Coastguard Worker 604*9880d681SAndroid Build Coastguard Worker %and = and i64 %ashr, %s.val 605*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 addrspace(1)* %out.gep, align 8 606*9880d681SAndroid Build Coastguard Worker ret void 607*9880d681SAndroid Build Coastguard Worker} 608*9880d681SAndroid Build Coastguard Worker 609*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_sext_in_reg_i32_to_i64_move_use: 610*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx2 611*9880d681SAndroid Build Coastguard Worker; SI: v_lshl_b64 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}, 612*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_ashrrev_i32_e32 v[[SHR:[0-9]+]], 31, v[[LO]] 613*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_and_b32_e32 v[[RESULT_LO:[0-9]+]], s{{[0-9]+}}, v[[LO]] 614*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_and_b32_e32 v[[RESULT_HI:[0-9]+]], s{{[0-9]+}}, v[[SHR]] 615*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 v{{\[}}[[RESULT_LO]]:[[RESULT_HI]]{{\]}} 616*9880d681SAndroid Build Coastguard Workerdefine void @v_sext_in_reg_i32_to_i64_move_use(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 %s.val) nounwind { 617*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 618*9880d681SAndroid Build Coastguard Worker %a.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 619*9880d681SAndroid Build Coastguard Worker %b.gep = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 620*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 621*9880d681SAndroid Build Coastguard Worker %a = load i64, i64 addrspace(1)* %a.gep, align 8 622*9880d681SAndroid Build Coastguard Worker %b = load i64, i64 addrspace(1)* %b.gep, align 8 623*9880d681SAndroid Build Coastguard Worker 624*9880d681SAndroid Build Coastguard Worker %c = shl i64 %a, %b 625*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %c, 32 626*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %shl, 32 627*9880d681SAndroid Build Coastguard Worker %and = and i64 %ashr, %s.val 628*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 addrspace(1)* %out.gep, align 8 629*9880d681SAndroid Build Coastguard Worker ret void 630*9880d681SAndroid Build Coastguard Worker} 631