[x32] Fix FrameIndex check in SelectLEA64_32Addr
[oota-llvm.git] / test / CodeGen / R600 / fabs.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
5 ; DAGCombiner will transform:
6 ; (fabs (f32 bitcast (i32 a))) => (f32 bitcast (and (i32 a), 0x7FFFFFFF))
7 ; unless isFabsFree returns true
8
9 ; FUNC-LABEL: @fabs_fn_free
10 ; R600-NOT: AND
11 ; R600: |PV.{{[XYZW]}}|
12
13 ; SI: V_AND_B32
14
15 define void @fabs_fn_free(float addrspace(1)* %out, i32 %in) {
16   %bc= bitcast i32 %in to float
17   %fabs = call float @fabs(float %bc)
18   store float %fabs, float addrspace(1)* %out
19   ret void
20 }
21
22 ; FUNC-LABEL: @fabs_free
23 ; R600-NOT: AND
24 ; R600: |PV.{{[XYZW]}}|
25
26 ; SI: V_AND_B32
27
28 define void @fabs_free(float addrspace(1)* %out, i32 %in) {
29   %bc= bitcast i32 %in to float
30   %fabs = call float @llvm.fabs.f32(float %bc)
31   store float %fabs, float addrspace(1)* %out
32   ret void
33 }
34
35 ; FUNC-LABEL: @fabs_f32
36 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
37
38 ; SI: V_AND_B32
39 define void @fabs_f32(float addrspace(1)* %out, float %in) {
40   %fabs = call float @llvm.fabs.f32(float %in)
41   store float %fabs, float addrspace(1)* %out
42   ret void
43 }
44
45 ; FUNC-LABEL: @fabs_v2f32
46 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
47 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
48
49 ; SI: V_AND_B32
50 ; SI: V_AND_B32
51 define void @fabs_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %in) {
52   %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %in)
53   store <2 x float> %fabs, <2 x float> addrspace(1)* %out
54   ret void
55 }
56
57 ; FUNC-LABEL: @fabs_v4
58 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
59 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
60 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
61 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
62
63 ; SI: V_AND_B32
64 ; SI: V_AND_B32
65 ; SI: V_AND_B32
66 ; SI: V_AND_B32
67 define void @fabs_v4f32(<4 x float> addrspace(1)* %out, <4 x float> %in) {
68   %fabs = call <4 x float> @llvm.fabs.v4f32(<4 x float> %in)
69   store <4 x float> %fabs, <4 x float> addrspace(1)* %out
70   ret void
71 }
72
73 ; SI-LABEL: @fabs_fn_fold
74 ; SI: S_LOAD_DWORD [[ABS_VALUE:s[0-9]+]], s[{{[0-9]+:[0-9]+}}], 0xb
75 ; SI-NOT: AND
76 ; SI: V_MUL_F32_e64 v{{[0-9]+}}, |[[ABS_VALUE]]|, v{{[0-9]+}}
77 define void @fabs_fn_fold(float addrspace(1)* %out, float %in0, float %in1) {
78   %fabs = call float @fabs(float %in0)
79   %fmul = fmul float %fabs, %in1
80   store float %fmul, float addrspace(1)* %out
81   ret void
82 }
83
84 ; SI-LABEL: @fabs_fold
85 ; SI: S_LOAD_DWORD [[ABS_VALUE:s[0-9]+]], s[{{[0-9]+:[0-9]+}}], 0xb
86 ; SI-NOT: AND
87 ; SI: V_MUL_F32_e64 v{{[0-9]+}}, |[[ABS_VALUE]]|, v{{[0-9]+}}
88 define void @fabs_fold(float addrspace(1)* %out, float %in0, float %in1) {
89   %fabs = call float @llvm.fabs.f32(float %in0)
90   %fmul = fmul float %fabs, %in1
91   store float %fmul, float addrspace(1)* %out
92   ret void
93 }
94
95 declare float @fabs(float) readnone
96 declare float @llvm.fabs.f32(float) readnone
97 declare <2 x float> @llvm.fabs.v2f32(<2 x float>) readnone
98 declare <4 x float> @llvm.fabs.v4f32(<4 x float>) readnone