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
5 ; DAGCombiner will transform:
6 ; (fabs (f32 bitcast (i32 a))) => (f32 bitcast (and (i32 a), 0x7FFFFFFF))
7 ; unless isFabsFree returns true
9 ; FUNC-LABEL: @fabs_fn_free
11 ; R600: |PV.{{[XYZW]}}|
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
22 ; FUNC-LABEL: @fabs_free
24 ; R600: |PV.{{[XYZW]}}|
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
35 ; FUNC-LABEL: @fabs_f32
36 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
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
45 ; FUNC-LABEL: @fabs_v2f32
46 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
47 ; R600: |{{(PV|T[0-9])\.[XYZW]}}|
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
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]}}|
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
73 ; SI-LABEL: @fabs_fn_fold
74 ; SI: S_LOAD_DWORD [[ABS_VALUE:s[0-9]+]], s[{{[0-9]+:[0-9]+}}], 0xb
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
84 ; SI-LABEL: @fabs_fold
85 ; SI: S_LOAD_DWORD [[ABS_VALUE:s[0-9]+]], s[{{[0-9]+:[0-9]+}}], 0xb
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
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