1; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=R600 -check-prefix=FUNC %s 3 4; FUNC-LABEL: {{^}}fneg_f32: 5; R600: -PV 6 7; SI: v_xor_b32 8define void @fneg_f32(float addrspace(1)* %out, float %in) { 9 %fneg = fsub float -0.000000e+00, %in 10 store float %fneg, float addrspace(1)* %out 11 ret void 12} 13 14; FUNC-LABEL: {{^}}fneg_v2f32: 15; R600: -PV 16; R600: -PV 17 18; SI: v_xor_b32 19; SI: v_xor_b32 20define void @fneg_v2f32(<2 x float> addrspace(1)* nocapture %out, <2 x float> %in) { 21 %fneg = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, %in 22 store <2 x float> %fneg, <2 x float> addrspace(1)* %out 23 ret void 24} 25 26; FUNC-LABEL: {{^}}fneg_v4f32: 27; R600: -PV 28; R600: -T 29; R600: -PV 30; R600: -PV 31 32; SI: v_xor_b32 33; SI: v_xor_b32 34; SI: v_xor_b32 35; SI: v_xor_b32 36define void @fneg_v4f32(<4 x float> addrspace(1)* nocapture %out, <4 x float> %in) { 37 %fneg = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %in 38 store <4 x float> %fneg, <4 x float> addrspace(1)* %out 39 ret void 40} 41 42; DAGCombiner will transform: 43; (fneg (f32 bitcast (i32 a))) => (f32 bitcast (xor (i32 a), 0x80000000)) 44; unless the target returns true for isNegFree() 45 46; FUNC-LABEL: {{^}}fneg_free_f32: 47; R600-NOT: XOR 48; R600: -KC0[2].Z 49 50; XXX: We could use v_add_f32_e64 with the negate bit here instead. 51; SI: v_sub_f32_e64 v{{[0-9]}}, 0, s{{[0-9]+$}} 52define void @fneg_free_f32(float addrspace(1)* %out, i32 %in) { 53 %bc = bitcast i32 %in to float 54 %fsub = fsub float 0.0, %bc 55 store float %fsub, float addrspace(1)* %out 56 ret void 57} 58 59; FUNC-LABEL: {{^}}fneg_fold_f32: 60; SI: s_load_dword [[NEG_VALUE:s[0-9]+]], s[{{[0-9]+:[0-9]+}}], 0xb 61; SI-NOT: xor 62; SI: v_mul_f32_e64 v{{[0-9]+}}, -[[NEG_VALUE]], [[NEG_VALUE]] 63define void @fneg_fold_f32(float addrspace(1)* %out, float %in) { 64 %fsub = fsub float -0.0, %in 65 %fmul = fmul float %fsub, %in 66 store float %fmul, float addrspace(1)* %out 67 ret void 68} 69