1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Make sure 64-bit BFE pattern does a 32-bit BFE on the relevant half. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Extract the high bit of the low half 6*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_31_i64: 7*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 8*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshrrev_b32_e32 v[[SHIFT:[0-9]+]], 31, [[VAL]] 9*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 10*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[SHIFT]]:[[ZERO]]{{\]}} 11*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_31_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 12*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 13*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 14*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 15*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 16*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 31 17*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 1 18*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 19*9880d681SAndroid Build Coastguard Worker ret void 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; Extract the high bit of the high half 23*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_63_i64: 24*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4{{$}} 25*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshrrev_b32_e32 v[[SHIFT:[0-9]+]], 31, [[VAL]] 26*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 27*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[SHIFT]]:[[ZERO]]{{\]}} 28*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_63_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 29*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 30*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 31*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 32*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 33*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 63 34*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 1 35*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_1_i64: 40*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 41*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_u32 v[[BFE:[0-9]+]], [[VAL]], 1, 1 42*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 43*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[BFE]]:[[ZERO]]{{\]}} 44*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_1_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 45*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 46*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 47*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 48*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 49*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 1 50*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 1 51*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 52*9880d681SAndroid Build Coastguard Worker ret void 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_20_i64: 56*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 57*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_u32 v[[BFE:[0-9]+]], [[VAL]], 20, 1 58*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 59*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[BFE]]:[[ZERO]]{{\]}} 60*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_20_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 61*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 62*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 63*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 64*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 65*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 20 66*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 1 67*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_32_i64: 72*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4{{$}} 73*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_and_b32_e32 v[[AND:[0-9]+]], 1, [[VAL]] 74*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 75*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[AND]]:[[ZERO]]{{\]}} 76*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_32_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 77*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 78*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 79*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 80*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 81*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 32 82*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 1 83*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_33_i64: 88*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4{{$}} 89*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_u32 v[[BFE:[0-9]+]], [[VAL]], 1, 1{{$}} 90*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 91*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[SHIFT]]:[[ZERO]]{{\]}} 92*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_33_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 93*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 94*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 95*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 96*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 97*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 33 98*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 1 99*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 100*9880d681SAndroid Build Coastguard Worker ret void 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_20_21_i64: 104*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 105*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_u32 v[[BFE:[0-9]+]], [[VAL]], 20, 2 106*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 107*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[BFE]]:[[ZERO]]{{\]}} 108*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_20_21_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 109*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 110*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 111*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 112*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 113*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 20 114*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 3 115*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 116*9880d681SAndroid Build Coastguard Worker ret void 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_1_30_i64: 120*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 121*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_u32 v[[BFE:[0-9]+]], [[VAL]], 1, 30 122*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 123*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[BFE]]:[[ZERO]]{{\]}} 124*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_1_30_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 125*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 126*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 127*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 128*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 129*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 1 130*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 1073741823 131*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 132*9880d681SAndroid Build Coastguard Worker ret void 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_1_31_i64: 136*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 137*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshrrev_b32_e32 v[[SHIFT:[0-9]+]], 1, [[VAL]] 138*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 139*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[SHIFT]]:[[ZERO]]{{\]}} 140*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_1_31_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 141*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 142*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 143*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 144*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 145*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 1 146*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 2147483647 147*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 148*9880d681SAndroid Build Coastguard Worker ret void 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; Spans the dword boundary, so requires full shift 152*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_31_32_i64: 153*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 [[VAL:v\[[0-9]+:[0-9]+\]]] 154*9880d681SAndroid Build Coastguard Worker; GCN: v_lshr_b64 v{{\[}}[[SHRLO:[0-9]+]]:[[SHRHI:[0-9]+]]{{\]}}, [[VAL]], 31 155*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_and_b32_e32 v[[AND:[0-9]+]], 3, v[[SHRLO]]{{$}} 156*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 157*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[AND]]:[[ZERO]]{{\]}} 158*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_31_32_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 159*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 160*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 161*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 162*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 163*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 31 164*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 3 165*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 166*9880d681SAndroid Build Coastguard Worker ret void 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_32_33_i64: 170*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4{{$}} 171*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_u32 v[[BFE:[0-9]+]], [[VAL]], 1, 2 172*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 173*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[BFE]]:[[ZERO]]{{\]}} 174*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_32_33_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 175*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 176*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 177*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 178*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 179*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 33 180*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 3 181*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 182*9880d681SAndroid Build Coastguard Worker ret void 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_30_60_i64: 186*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 [[VAL:v\[[0-9]+:[0-9]+\]]] 187*9880d681SAndroid Build Coastguard Worker; GCN: v_lshr_b64 v{{\[}}[[SHRLO:[0-9]+]]:[[SHRHI:[0-9]+]]{{\]}}, [[VAL]], 30 188*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_and_b32_e32 v[[AND:[0-9]+]], 0x3fffffff, v[[SHRLO]]{{$}} 189*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 190*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[AND]]:[[ZERO]]{{\]}} 191*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_30_60_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 192*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 193*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 194*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 195*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 196*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 30 197*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 1073741823 198*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 199*9880d681SAndroid Build Coastguard Worker ret void 200*9880d681SAndroid Build Coastguard Worker} 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_33_63_i64: 203*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4{{$}} 204*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_u32 v[[BFE:[0-9]+]], [[VAL]], 1, 30 205*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[BFE:[0-9]+]], 0{{$}} 206*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[SHIFT]]:[[ZERO]]{{\]}} 207*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_33_63_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 208*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 209*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 210*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 211*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 212*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 33 213*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 1073741823 214*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 215*9880d681SAndroid Build Coastguard Worker ret void 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_31_63_i64: 219*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 [[VAL:v\[[0-9]+:[0-9]+\]]] 220*9880d681SAndroid Build Coastguard Worker; GCN: v_lshr_b64 v{{\[}}[[SHRLO:[0-9]+]]:[[SHRHI:[0-9]+]]{{\]}}, [[VAL]], 31 221*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_mov_b32_e32 v[[SHRHI]], 0{{$}} 222*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[SHRLO]]:[[SHRHI]]{{\]}} 223*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_31_63_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 224*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 225*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 226*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 227*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 228*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 31 229*9880d681SAndroid Build Coastguard Worker %and = and i64 %srl, 4294967295 230*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 addrspace(1)* %out 231*9880d681SAndroid Build Coastguard Worker ret void 232*9880d681SAndroid Build Coastguard Worker} 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker; trunc applied before and mask 235*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_31_i64_trunc_i32: 236*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 237*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshrrev_b32_e32 v[[SHIFT:[0-9]+]], 31, [[VAL]] 238*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword v[[SHIFT]] 239*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_31_i64_trunc_i32(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 240*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 241*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 242*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i32, i32 addrspace(1)* %out, i32 %id.x 243*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 244*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 31 245*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %srl to i32 246*9880d681SAndroid Build Coastguard Worker %bit = and i32 %trunc, 1 247*9880d681SAndroid Build Coastguard Worker store i32 %bit, i32 addrspace(1)* %out.gep 248*9880d681SAndroid Build Coastguard Worker ret void 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_3_i64_trunc_i32: 252*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 253*9880d681SAndroid Build Coastguard Worker; GCN: v_bfe_u32 [[BFE:v[0-9]+]], [[VAL]], 3, 1{{$}} 254*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[BFE]] 255*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_3_i64_trunc_i32(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 256*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 257*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 258*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i32, i32 addrspace(1)* %out, i32 %id.x 259*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 260*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 3 261*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %srl to i32 262*9880d681SAndroid Build Coastguard Worker %bit = and i32 %trunc, 1 263*9880d681SAndroid Build Coastguard Worker store i32 %bit, i32 addrspace(1)* %out.gep 264*9880d681SAndroid Build Coastguard Worker ret void 265*9880d681SAndroid Build Coastguard Worker} 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_33_i64_trunc_i32: 268*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4{{$}} 269*9880d681SAndroid Build Coastguard Worker; GCN: v_bfe_u32 [[BFE:v[0-9]+]], [[VAL]], 1, 1{{$}} 270*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[BFE]] 271*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_33_i64_trunc_i32(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 272*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 273*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 274*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i32, i32 addrspace(1)* %out, i32 %id.x 275*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 276*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 33 277*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %srl to i32 278*9880d681SAndroid Build Coastguard Worker %bit = and i32 %trunc, 1 279*9880d681SAndroid Build Coastguard Worker store i32 %bit, i32 addrspace(1)* %out.gep 280*9880d681SAndroid Build Coastguard Worker ret void 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_31_32_i64_trunc_i32: 284*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 [[VAL:v\[[0-9]+:[0-9]+\]]] 285*9880d681SAndroid Build Coastguard Worker; GCN: v_lshr_b64 v{{\[}}[[SHRLO:[0-9]+]]:[[SHRHI:[0-9]+]]{{\]}}, [[VAL]], 31 286*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_and_b32_e32 v[[SHRLO]], 3, v[[SHRLO]] 287*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v[[SHRLO]] 288*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword v[[SHRLO]] 289*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_31_32_i64_trunc_i32(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 290*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 291*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 292*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i32, i32 addrspace(1)* %out, i32 %id.x 293*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 294*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 31 295*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %srl to i32 296*9880d681SAndroid Build Coastguard Worker %bit = and i32 %trunc, 3 297*9880d681SAndroid Build Coastguard Worker store i32 %bit, i32 addrspace(1)* %out.gep 298*9880d681SAndroid Build Coastguard Worker ret void 299*9880d681SAndroid Build Coastguard Worker} 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}and_not_mask_i64: 302*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 v{{\[}}[[VALLO:[0-9]+]]:[[VALHI:[0-9]+]]{{\]}} 303*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 v[[SHRHI]], 0{{$}} 304*9880d681SAndroid Build Coastguard Worker; GCN: v_lshrrev_b32_e32 [[SHR:v[0-9]+]], 20, v[[VALLO]] 305*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_and_b32_e32 v[[SHRLO]], 4, [[SHR]] 306*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v[[SHRLO]] 307*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v[[SHRHI]] 308*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[SHRLO]]:[[SHRHI]]{{\]}} 309*9880d681SAndroid Build Coastguard Workerdefine void @and_not_mask_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 310*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 311*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 312*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 313*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 314*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 20 315*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 4 316*9880d681SAndroid Build Coastguard Worker store i64 %bit, i64 addrspace(1)* %out.gep 317*9880d681SAndroid Build Coastguard Worker ret void 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker; The instruction count is the same with/without hasOneUse, but 321*9880d681SAndroid Build Coastguard Worker; keeping the 32-bit and has a smaller encoding size than the bfe. 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_27_29_multi_use_shift_i64: 324*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 [[VAL:v\[[0-9]+:[0-9]+\]]] 325*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshr_b64 v{{\[}}[[SHRLO:[0-9]+]]:[[SHRHI:[0-9]+]]{{\]}}, [[VAL]], 27 326*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_and_b32_e32 v[[AND:[0-9]+]], 3, v[[SHRLO]] 327*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 328*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[SHRLO]]:[[SHRHI]]{{\]}} 329*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[AND]]:[[ZERO]]{{\]}} 330*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_27_29_multi_use_shift_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 331*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 332*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 333*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 334*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 335*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 27 336*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 3 337*9880d681SAndroid Build Coastguard Worker store volatile i64 %srl, i64 addrspace(1)* %out 338*9880d681SAndroid Build Coastguard Worker store volatile i64 %bit, i64 addrspace(1)* %out 339*9880d681SAndroid Build Coastguard Worker ret void 340*9880d681SAndroid Build Coastguard Worker} 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_34_37_multi_use_shift_i64: 343*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4{{$}} 344*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshrrev_b32_e32 v[[SHR:[0-9]+]], 2, [[VAL]] 345*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_u32 v[[BFE:[0-9]+]], [[VAL]], 2, 3 346*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 347*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dwordx2 v{{\[}}[[SHR]]:[[ZERO]]{{\]}} 348*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[BFE]]:[[ZERO]]{{\]}} 349*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_34_37_multi_use_shift_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) #1 { 350*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 351*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 352*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id.x 353*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 354*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 34 355*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 7 356*9880d681SAndroid Build Coastguard Worker store volatile i64 %srl, i64 addrspace(1)* %out 357*9880d681SAndroid Build Coastguard Worker store volatile i64 %bit, i64 addrspace(1)* %out 358*9880d681SAndroid Build Coastguard Worker ret void 359*9880d681SAndroid Build Coastguard Worker} 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_uextract_bit_33_36_use_upper_half_shift_i64: 362*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL:v[0-9]+]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4{{$}} 363*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_bfe_u32 v[[BFE:[0-9]+]], [[VAL]], 1, 3 364*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[ZERO:[0-9]+]], 0{{$}} 365*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[BFE]]:[[ZERO]]{{\]}} 366*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword v[[ZERO]] 367*9880d681SAndroid Build Coastguard Workerdefine void @v_uextract_bit_33_36_use_upper_half_shift_i64(i64 addrspace(1)* %out0, i32 addrspace(1)* %out1, i64 addrspace(1)* %in) #1 { 368*9880d681SAndroid Build Coastguard Worker %id.x = tail call i32 @llvm.amdgcn.workitem.id.x() 369*9880d681SAndroid Build Coastguard Worker %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %id.x 370*9880d681SAndroid Build Coastguard Worker %out0.gep = getelementptr i64, i64 addrspace(1)* %out0, i32 %id.x 371*9880d681SAndroid Build Coastguard Worker %out1.gep = getelementptr i32, i32 addrspace(1)* %out1, i32 %id.x 372*9880d681SAndroid Build Coastguard Worker %ld.64 = load i64, i64 addrspace(1)* %in.gep 373*9880d681SAndroid Build Coastguard Worker %srl = lshr i64 %ld.64, 33 374*9880d681SAndroid Build Coastguard Worker %bit = and i64 %srl, 7 375*9880d681SAndroid Build Coastguard Worker store volatile i64 %bit, i64 addrspace(1)* %out0.gep 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard Worker %srl.srl32 = lshr i64 %srl, 32 378*9880d681SAndroid Build Coastguard Worker %srl.hi = trunc i64 %srl.srl32 to i32 379*9880d681SAndroid Build Coastguard Worker store volatile i32 %srl.hi, i32 addrspace(1)* %out1.gep 380*9880d681SAndroid Build Coastguard Worker ret void 381*9880d681SAndroid Build Coastguard Worker} 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #0 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 386*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind } 387