R600/SI: Update concat_vectors.ll to check for scratch usage
[oota-llvm.git] / test / CodeGen / R600 / fneg.ll
1 ; RUN: llc -march=r600 -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
8 define 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
20 define 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
36 define 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.000000e+00, s{{[0-9]}}, 0, 0
52 define 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
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]], v{{[0-9]+}}
63 define 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 }