1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=GCN %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=VI -check-prefix=GCN %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}mac_vvv: 5*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[A:v[0-9]+]], off, s[{{[0-9]+:[0-9]+}}], 0{{$}} 6*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[B:v[0-9]+]], off, s[{{[0-9]+:[0-9]+}}], 0 offset:4 7*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[C:v[0-9]+]], off, s[{{[0-9]+:[0-9]+}}], 0 offset:8 8*9880d681SAndroid Build Coastguard Worker; GCN: v_mac_f32_e32 [[C]], [[B]], [[A]] 9*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[C]] 10*9880d681SAndroid Build Coastguard Workerdefine void @mac_vvv(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 13*9880d681SAndroid Build Coastguard Worker %c_ptr = getelementptr float, float addrspace(1)* %in, i32 2 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %in 16*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %b_ptr 17*9880d681SAndroid Build Coastguard Worker %c = load volatile float, float addrspace(1)* %c_ptr 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %a, %b 20*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %c 21*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}mad_inline_sgpr_inline: 26*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mac_f32 27*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32 v{{[0-9]}}, s{{[0-9]+}}, 0.5, 0.5 28*9880d681SAndroid Build Coastguard Workerdefine void @mad_inline_sgpr_inline(float addrspace(1)* %out, float %in) #0 { 29*9880d681SAndroid Build Coastguard Workerentry: 30*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float 0.5, %in 31*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, 0.5 32*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}mad_vvs: 37*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mac_f32 38*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, s{{[0-9]+}} 39*9880d681SAndroid Build Coastguard Workerdefine void @mad_vvs(float addrspace(1)* %out, float addrspace(1)* %in, float %c) #0 { 40*9880d681SAndroid Build Coastguard Workerentry: 41*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in 44*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %b_ptr 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %a, %b 47*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %c 48*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}mac_ssv: 53*9880d681SAndroid Build Coastguard Worker; GCN: v_mac_f32_e64 v{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}} 54*9880d681SAndroid Build Coastguard Workerdefine void @mac_ssv(float addrspace(1)* %out, float addrspace(1)* %in, float %a) #0 { 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker %c = load float, float addrspace(1)* %in 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %a, %a 59*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %c 60*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}mac_mad_same_add: 65*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32 v{{[0-9]}}, v{{[0-9]+}}, v{{[0-9]+}}, [[ADD:v[0-9]+]] 66*9880d681SAndroid Build Coastguard Worker; GCN: v_mac_f32_e32 [[ADD]], v{{[0-9]+}}, v{{[0-9]+}} 67*9880d681SAndroid Build Coastguard Workerdefine void @mac_mad_same_add(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 68*9880d681SAndroid Build Coastguard Workerentry: 69*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 70*9880d681SAndroid Build Coastguard Worker %c_ptr = getelementptr float, float addrspace(1)* %in, i32 2 71*9880d681SAndroid Build Coastguard Worker %d_ptr = getelementptr float, float addrspace(1)* %in, i32 3 72*9880d681SAndroid Build Coastguard Worker %e_ptr = getelementptr float, float addrspace(1)* %in, i32 4 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %in 75*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %b_ptr 76*9880d681SAndroid Build Coastguard Worker %c = load volatile float, float addrspace(1)* %c_ptr 77*9880d681SAndroid Build Coastguard Worker %d = load volatile float, float addrspace(1)* %d_ptr 78*9880d681SAndroid Build Coastguard Worker %e = load volatile float, float addrspace(1)* %e_ptr 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %a, %b 81*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %c 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker %tmp2 = fmul float %d, %e 84*9880d681SAndroid Build Coastguard Worker %tmp3 = fadd float %tmp2, %c 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker %out1 = getelementptr float, float addrspace(1)* %out, i32 1 87*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 88*9880d681SAndroid Build Coastguard Worker store float %tmp3, float addrspace(1)* %out1 89*9880d681SAndroid Build Coastguard Worker ret void 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; There is no advantage to using v_mac when one of the operands is negated 93*9880d681SAndroid Build Coastguard Worker; and v_mad accepts more operand types. 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}mad_neg_src0: 96*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mac_f32 97*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[-0-9]}} 98*9880d681SAndroid Build Coastguard Workerdefine void @mad_neg_src0(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 99*9880d681SAndroid Build Coastguard Workerentry: 100*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 101*9880d681SAndroid Build Coastguard Worker %c_ptr = getelementptr float, float addrspace(1)* %in, i32 2 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in 104*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %b_ptr 105*9880d681SAndroid Build Coastguard Worker %c = load float, float addrspace(1)* %c_ptr 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker %neg_a = fsub float -0.0, %a 108*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %neg_a, %b 109*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %c 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}unsafe_mad_sub0_src0: 116*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mac_f32 117*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[-0-9]}} 118*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_mad_sub0_src0(float addrspace(1)* %out, float addrspace(1)* %in) #1 { 119*9880d681SAndroid Build Coastguard Workerentry: 120*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 121*9880d681SAndroid Build Coastguard Worker %c_ptr = getelementptr float, float addrspace(1)* %in, i32 2 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in 124*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %b_ptr 125*9880d681SAndroid Build Coastguard Worker %c = load float, float addrspace(1)* %c_ptr 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker %neg_a = fsub float 0.0, %a 128*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %neg_a, %b 129*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %c 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 132*9880d681SAndroid Build Coastguard Worker ret void 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}safe_mad_sub0_src0: 136*9880d681SAndroid Build Coastguard Worker; GCN: v_sub_f32_e32 [[SUB0:v[0-9]+]], 0, 137*9880d681SAndroid Build Coastguard Worker; GCN: v_mac_f32_e32 v{{[0-9]+}}, v{{[0-9]+}}, [[SUB0]] 138*9880d681SAndroid Build Coastguard Workerdefine void @safe_mad_sub0_src0(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 139*9880d681SAndroid Build Coastguard Workerentry: 140*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 141*9880d681SAndroid Build Coastguard Worker %c_ptr = getelementptr float, float addrspace(1)* %in, i32 2 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in 144*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %b_ptr 145*9880d681SAndroid Build Coastguard Worker %c = load float, float addrspace(1)* %c_ptr 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker %neg_a = fsub float 0.0, %a 148*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %neg_a, %b 149*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %c 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 152*9880d681SAndroid Build Coastguard Worker ret void 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}mad_neg_src1: 156*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mac_f32 157*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[-0-9]}} 158*9880d681SAndroid Build Coastguard Workerdefine void @mad_neg_src1(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 159*9880d681SAndroid Build Coastguard Workerentry: 160*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 161*9880d681SAndroid Build Coastguard Worker %c_ptr = getelementptr float, float addrspace(1)* %in, i32 2 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in 164*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %b_ptr 165*9880d681SAndroid Build Coastguard Worker %c = load float, float addrspace(1)* %c_ptr 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker %neg_b = fsub float -0.0, %b 168*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %a, %neg_b 169*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %c 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 172*9880d681SAndroid Build Coastguard Worker ret void 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}unsafe_mad_sub0_src1: 176*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mac_f32 177*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32 v{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}}, v{{[-0-9]}} 178*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_mad_sub0_src1(float addrspace(1)* %out, float addrspace(1)* %in) #1 { 179*9880d681SAndroid Build Coastguard Workerentry: 180*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 181*9880d681SAndroid Build Coastguard Worker %c_ptr = getelementptr float, float addrspace(1)* %in, i32 2 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in 184*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %b_ptr 185*9880d681SAndroid Build Coastguard Worker %c = load float, float addrspace(1)* %c_ptr 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker %neg_b = fsub float 0.0, %b 188*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %a, %neg_b 189*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %c 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 192*9880d681SAndroid Build Coastguard Worker ret void 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}mad_neg_src2: 196*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mac 197*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, -v{{[-0-9]}} 198*9880d681SAndroid Build Coastguard Workerdefine void @mad_neg_src2(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 199*9880d681SAndroid Build Coastguard Workerentry: 200*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 201*9880d681SAndroid Build Coastguard Worker %c_ptr = getelementptr float, float addrspace(1)* %in, i32 2 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in 204*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %b_ptr 205*9880d681SAndroid Build Coastguard Worker %c = load float, float addrspace(1)* %c_ptr 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker %neg_c = fsub float -0.0, %c 208*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul float %a, %b 209*9880d681SAndroid Build Coastguard Worker %tmp1 = fadd float %tmp0, %neg_c 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker store float %tmp1, float addrspace(1)* %out 212*9880d681SAndroid Build Coastguard Worker ret void 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "unsafe-fp-math"="false" } 216*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind "unsafe-fp-math"="true" } 217