1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=NOSNAN -check-prefix=GCN %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mattr=+fp-exceptions -verify-machineinstrs < %s | FileCheck -check-prefix=SNAN -check-prefix=GCN %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #0 5*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.minnum.f32(float, float) #0 6*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.maxnum.f32(float, float) #0 7*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.minnum.f64(double, double) #0 8*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.maxnum.f64(double, double) #0 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_f32: 11*9880d681SAndroid Build Coastguard Worker; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; SNAN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}} 14*9880d681SAndroid Build Coastguard Worker; SNAN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}} 15*9880d681SAndroid Build Coastguard Workerdefine void @v_test_fmed3_r_i_i_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 { 16*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 17*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 18*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid 19*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep0 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker %max = call float @llvm.maxnum.f32(float %a, float 2.0) 22*9880d681SAndroid Build Coastguard Worker %med = call float @llvm.minnum.f32(float %max, float 4.0) 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker store float %med, float addrspace(1)* %outgep 25*9880d681SAndroid Build Coastguard Worker ret void 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_commute0_f32: 29*9880d681SAndroid Build Coastguard Worker; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; SNAN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}} 32*9880d681SAndroid Build Coastguard Worker; SNAN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}} 33*9880d681SAndroid Build Coastguard Workerdefine void @v_test_fmed3_r_i_i_commute0_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 { 34*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 35*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 36*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid 37*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep0 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker %max = call float @llvm.maxnum.f32(float 2.0, float %a) 40*9880d681SAndroid Build Coastguard Worker %med = call float @llvm.minnum.f32(float 4.0, float %max) 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker store float %med, float addrspace(1)* %outgep 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_commute1_f32: 47*9880d681SAndroid Build Coastguard Worker; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; SNAN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}} 50*9880d681SAndroid Build Coastguard Worker; SNAN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}} 51*9880d681SAndroid Build Coastguard Workerdefine void @v_test_fmed3_r_i_i_commute1_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 { 52*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 53*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 54*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid 55*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep0 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker %max = call float @llvm.maxnum.f32(float %a, float 2.0) 58*9880d681SAndroid Build Coastguard Worker %med = call float @llvm.minnum.f32(float 4.0, float %max) 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker store float %med, float addrspace(1)* %outgep 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_constant_order_f32: 65*9880d681SAndroid Build Coastguard Worker; GCN: v_max_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}} 66*9880d681SAndroid Build Coastguard Worker; GCN: v_min_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}} 67*9880d681SAndroid Build Coastguard Workerdefine void @v_test_fmed3_r_i_i_constant_order_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 { 68*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 69*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 70*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid 71*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep0 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker %max = call float @llvm.maxnum.f32(float %a, float 4.0) 74*9880d681SAndroid Build Coastguard Worker %med = call float @llvm.minnum.f32(float %max, float 2.0) 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker store float %med, float addrspace(1)* %outgep 77*9880d681SAndroid Build Coastguard Worker ret void 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_multi_use_f32: 82*9880d681SAndroid Build Coastguard Worker; GCN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}} 83*9880d681SAndroid Build Coastguard Worker; GCN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}} 84*9880d681SAndroid Build Coastguard Workerdefine void @v_test_fmed3_r_i_i_multi_use_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 { 85*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 86*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 87*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid 88*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep0 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker %max = call float @llvm.maxnum.f32(float %a, float 2.0) 91*9880d681SAndroid Build Coastguard Worker %med = call float @llvm.minnum.f32(float %max, float 4.0) 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker store volatile float %med, float addrspace(1)* %outgep 94*9880d681SAndroid Build Coastguard Worker store volatile float %max, float addrspace(1)* %outgep 95*9880d681SAndroid Build Coastguard Worker ret void 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_f64: 99*9880d681SAndroid Build Coastguard Worker; GCN: v_max_f64 {{v\[[0-9]+:[0-9]+\]}}, {{v\[[0-9]+:[0-9]+\]}}, 2.0 100*9880d681SAndroid Build Coastguard Worker; GCN: v_min_f64 {{v\[[0-9]+:[0-9]+\]}}, {{v\[[0-9]+:[0-9]+\]}}, 4.0 101*9880d681SAndroid Build Coastguard Workerdefine void @v_test_fmed3_r_i_i_f64(double addrspace(1)* %out, double addrspace(1)* %aptr) #1 { 102*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 103*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr double, double addrspace(1)* %aptr, i32 %tid 104*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr double, double addrspace(1)* %out, i32 %tid 105*9880d681SAndroid Build Coastguard Worker %a = load double, double addrspace(1)* %gep0 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker %max = call double @llvm.maxnum.f64(double %a, double 2.0) 108*9880d681SAndroid Build Coastguard Worker %med = call double @llvm.minnum.f64(double %max, double 4.0) 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker store double %med, double addrspace(1)* %outgep 111*9880d681SAndroid Build Coastguard Worker ret void 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_no_nans_f32: 115*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0 116*9880d681SAndroid Build Coastguard Workerdefine void @v_test_fmed3_r_i_i_no_nans_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 { 117*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 118*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 119*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid 120*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep0 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker %max = call float @llvm.maxnum.f32(float %a, float 2.0) 123*9880d681SAndroid Build Coastguard Worker %med = call float @llvm.minnum.f32(float %max, float 4.0) 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker store float %med, float addrspace(1)* %outgep 126*9880d681SAndroid Build Coastguard Worker ret void 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_legacy_fmed3_r_i_i_f32: 130*9880d681SAndroid Build Coastguard Worker; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; SNAN: v_max_f32_e32 v{{[0-9]+}}, 2.0, v{{[0-9]+}} 133*9880d681SAndroid Build Coastguard Worker; SNAN: v_min_f32_e32 v{{[0-9]+}}, 4.0, v{{[0-9]+}} 134*9880d681SAndroid Build Coastguard Workerdefine void @v_test_legacy_fmed3_r_i_i_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 { 135*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 136*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 137*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid 138*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %gep0 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker ; fmax_legacy 141*9880d681SAndroid Build Coastguard Worker %cmp0 = fcmp ule float %a, 2.0 142*9880d681SAndroid Build Coastguard Worker %max = select i1 %cmp0, float 2.0, float %a 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker ; fmin_legacy 145*9880d681SAndroid Build Coastguard Worker %cmp1 = fcmp uge float %max, 4.0 146*9880d681SAndroid Build Coastguard Worker %med = select i1 %cmp1, float 4.0, float %max 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker store float %med, float addrspace(1)* %outgep 149*9880d681SAndroid Build Coastguard Worker ret void 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 153*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind "unsafe-fp-math"="false" "no-nans-fp-math"="false" } 154*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind "unsafe-fp-math"="false" "no-nans-fp-math"="true" } 155