1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 4*9880d681SAndroid Build Coastguard Workerdeclare { float, i1 } @llvm.amdgcn.div.scale.f32(float, float, i1) nounwind readnone 5*9880d681SAndroid Build Coastguard Workerdeclare { double, i1 } @llvm.amdgcn.div.scale.f64(double, double, i1) nounwind readnone 6*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float) nounwind readnone 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_1: 9*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 10*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 11*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]] 12*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 13*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 14*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_1(float addrspace(1)* %out, float addrspace(1)* %in) nounwind { 15*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 16*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 17*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %gep.0, align 4 20*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %gep.1, align 4 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false) nounwind readnone 23*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 24*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 25*9880d681SAndroid Build Coastguard Worker ret void 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_2: 29*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 30*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 31*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]] 32*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 33*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 34*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_2(float addrspace(1)* %out, float addrspace(1)* %in) nounwind { 35*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 36*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 37*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %gep.0, align 4 40*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %gep.1, align 4 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true) nounwind readnone 43*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 44*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 45*9880d681SAndroid Build Coastguard Worker ret void 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_1: 49*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 50*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8 51*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]] 52*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]] 53*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 54*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_1(double addrspace(1)* %out, double addrspace(1)* %aptr, double addrspace(1)* %in) nounwind { 55*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 56*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 57*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0, align 8 60*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1, align 8 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false) nounwind readnone 63*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { double, i1 } %result, 0 64*9880d681SAndroid Build Coastguard Worker store double %result0, double addrspace(1)* %out, align 8 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_2: 69*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 70*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8 71*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]] 72*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]] 73*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 74*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_2(double addrspace(1)* %out, double addrspace(1)* %aptr, double addrspace(1)* %in) nounwind { 75*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 76*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 77*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0, align 8 80*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1, align 8 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true) nounwind readnone 83*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { double, i1 } %result, 0 84*9880d681SAndroid Build Coastguard Worker store double %result0, double addrspace(1)* %out, align 8 85*9880d681SAndroid Build Coastguard Worker ret void 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_scalar_num_1: 89*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]] 90*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]] 91*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]] 92*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 93*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 94*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_scalar_num_1(float addrspace(1)* %out, float addrspace(1)* %in, float %a) nounwind { 95*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 96*9880d681SAndroid Build Coastguard Worker %gep = getelementptr float, float addrspace(1)* %in, i32 %tid 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %gep, align 4 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false) nounwind readnone 101*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 102*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_scalar_num_2: 107*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]] 108*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]] 109*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]] 110*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 111*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 112*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_scalar_num_2(float addrspace(1)* %out, float addrspace(1)* %in, float %a) nounwind { 113*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 114*9880d681SAndroid Build Coastguard Worker %gep = getelementptr float, float addrspace(1)* %in, i32 %tid 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %gep, align 4 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true) nounwind readnone 119*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 120*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 121*9880d681SAndroid Build Coastguard Worker ret void 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_scalar_den_1: 125*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]] 126*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]] 127*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]] 128*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 129*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 130*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_scalar_den_1(float addrspace(1)* %out, float addrspace(1)* %in, float %b) nounwind { 131*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 132*9880d681SAndroid Build Coastguard Worker %gep = getelementptr float, float addrspace(1)* %in, i32 %tid 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep, align 4 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false) nounwind readnone 137*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 138*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 139*9880d681SAndroid Build Coastguard Worker ret void 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_scalar_den_2: 143*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]] 144*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]] 145*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]] 146*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 147*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 148*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_scalar_den_2(float addrspace(1)* %out, float addrspace(1)* %in, float %b) nounwind { 149*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 150*9880d681SAndroid Build Coastguard Worker %gep = getelementptr float, float addrspace(1)* %in, i32 %tid 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep, align 4 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true) nounwind readnone 155*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 156*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 157*9880d681SAndroid Build Coastguard Worker ret void 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_scalar_num_1: 161*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]] 162*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[A:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd 163*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]] 164*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]] 165*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 166*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_scalar_num_1(double addrspace(1)* %out, double addrspace(1)* %in, double %a) nounwind { 167*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 168*9880d681SAndroid Build Coastguard Worker %gep = getelementptr double, double addrspace(1)* %in, i32 %tid 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker %b = load double, double addrspace(1)* %gep, align 8 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false) nounwind readnone 173*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { double, i1 } %result, 0 174*9880d681SAndroid Build Coastguard Worker store double %result0, double addrspace(1)* %out, align 8 175*9880d681SAndroid Build Coastguard Worker ret void 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_scalar_num_2: 179*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[A:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd 180*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]] 181*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]] 182*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]] 183*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 184*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_scalar_num_2(double addrspace(1)* %out, double addrspace(1)* %in, double %a) nounwind { 185*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 186*9880d681SAndroid Build Coastguard Worker %gep = getelementptr double, double addrspace(1)* %in, i32 %tid 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker %b = load double, double addrspace(1)* %gep, align 8 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true) nounwind readnone 191*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { double, i1 } %result, 0 192*9880d681SAndroid Build Coastguard Worker store double %result0, double addrspace(1)* %out, align 8 193*9880d681SAndroid Build Coastguard Worker ret void 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_scalar_den_1: 197*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]] 198*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[B:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd 199*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]] 200*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]] 201*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 202*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_scalar_den_1(double addrspace(1)* %out, double addrspace(1)* %in, double %b) nounwind { 203*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 204*9880d681SAndroid Build Coastguard Worker %gep = getelementptr double, double addrspace(1)* %in, i32 %tid 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker %a = load double, double addrspace(1)* %gep, align 8 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false) nounwind readnone 209*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { double, i1 } %result, 0 210*9880d681SAndroid Build Coastguard Worker store double %result0, double addrspace(1)* %out, align 8 211*9880d681SAndroid Build Coastguard Worker ret void 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_scalar_den_2: 215*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]] 216*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[B:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd 217*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]] 218*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]] 219*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 220*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_scalar_den_2(double addrspace(1)* %out, double addrspace(1)* %in, double %b) nounwind { 221*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 222*9880d681SAndroid Build Coastguard Worker %gep = getelementptr double, double addrspace(1)* %in, i32 %tid 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker %a = load double, double addrspace(1)* %gep, align 8 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true) nounwind readnone 227*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { double, i1 } %result, 0 228*9880d681SAndroid Build Coastguard Worker store double %result0, double addrspace(1)* %out, align 8 229*9880d681SAndroid Build Coastguard Worker ret void 230*9880d681SAndroid Build Coastguard Worker} 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_all_scalar_1: 233*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb 234*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc 235*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VA:v[0-9]+]], [[A]] 236*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[VA]] 237*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 238*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 239*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_all_scalar_1(float addrspace(1)* %out, float %a, float %b) nounwind { 240*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false) nounwind readnone 241*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 242*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 243*9880d681SAndroid Build Coastguard Worker ret void 244*9880d681SAndroid Build Coastguard Worker} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_all_scalar_2: 247*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb 248*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc 249*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[B]] 250*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[VB]], [[A]] 251*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 252*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 253*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_all_scalar_2(float addrspace(1)* %out, float %a, float %b) nounwind { 254*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true) nounwind readnone 255*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 256*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 257*9880d681SAndroid Build Coastguard Worker ret void 258*9880d681SAndroid Build Coastguard Worker} 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_all_scalar_1: 261*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 s{{\[}}[[A_LO:[0-9]+]]:[[A_HI:[0-9]+]]{{\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0xb 262*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[B:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd 263*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VA_LO:[0-9]+]], s[[A_LO]] 264*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VA_HI:[0-9]+]], s[[A_HI]] 265*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], v{{\[}}[[VA_LO]]:[[VA_HI]]{{\]}} 266*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]] 267*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 268*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_all_scalar_1(double addrspace(1)* %out, double %a, double %b) nounwind { 269*9880d681SAndroid Build Coastguard Worker %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false) nounwind readnone 270*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { double, i1 } %result, 0 271*9880d681SAndroid Build Coastguard Worker store double %result0, double addrspace(1)* %out, align 8 272*9880d681SAndroid Build Coastguard Worker ret void 273*9880d681SAndroid Build Coastguard Worker} 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_all_scalar_2: 276*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[A:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb 277*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 s{{\[}}[[B_LO:[0-9]+]]:[[B_HI:[0-9]+]]{{\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0xd 278*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VB_LO:[0-9]+]], s[[B_LO]] 279*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VB_HI:[0-9]+]], s[[B_HI]] 280*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], v{{\[}}[[VB_LO]]:[[VB_HI]]{{\]}}, [[A]] 281*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]] 282*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 283*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_all_scalar_2(double addrspace(1)* %out, double %a, double %b) nounwind { 284*9880d681SAndroid Build Coastguard Worker %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true) nounwind readnone 285*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { double, i1 } %result, 0 286*9880d681SAndroid Build Coastguard Worker store double %result0, double addrspace(1)* %out, align 8 287*9880d681SAndroid Build Coastguard Worker ret void 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_inline_imm_num: 291*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 292*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[A]], 1.0 293*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 294*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 295*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_inline_imm_num(float addrspace(1)* %out, float addrspace(1)* %in) nounwind { 296*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 297*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 298*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep.0, align 4 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float 1.0, float %a, i1 false) nounwind readnone 301*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 302*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 303*9880d681SAndroid Build Coastguard Worker ret void 304*9880d681SAndroid Build Coastguard Worker} 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_inline_imm_den: 307*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 308*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], 2.0, 2.0, [[A]] 309*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 310*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 311*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_inline_imm_den(float addrspace(1)* %out, float addrspace(1)* %in) nounwind { 312*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 313*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 314*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep.0, align 4 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float 2.0, i1 false) nounwind readnone 317*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 318*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 319*9880d681SAndroid Build Coastguard Worker ret void 320*9880d681SAndroid Build Coastguard Worker} 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_fabs_num: 323*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 324*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 325*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], |[[A]]| 326*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 327*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 328*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_fabs_num(float addrspace(1)* %out, float addrspace(1)* %in) nounwind { 329*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 330*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 331*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %gep.0, align 4 334*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %gep.1, align 4 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker %a.fabs = call float @llvm.fabs.f32(float %a) nounwind readnone 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a.fabs, float %b, i1 false) nounwind readnone 339*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 340*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 341*9880d681SAndroid Build Coastguard Worker ret void 342*9880d681SAndroid Build Coastguard Worker} 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_fabs_den: 345*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 346*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 347*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], |[[B]]|, |[[B]]|, [[A]] 348*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]] 349*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 350*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_fabs_den(float addrspace(1)* %out, float addrspace(1)* %in) nounwind { 351*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 352*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 353*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %gep.0, align 4 356*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %gep.1, align 4 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker %b.fabs = call float @llvm.fabs.f32(float %b) nounwind readnone 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b.fabs, i1 false) nounwind readnone 361*9880d681SAndroid Build Coastguard Worker %result0 = extractvalue { float, i1 } %result, 0 362*9880d681SAndroid Build Coastguard Worker store float %result0, float addrspace(1)* %out, align 4 363*9880d681SAndroid Build Coastguard Worker ret void 364*9880d681SAndroid Build Coastguard Worker} 365