blob: b2853f921fcd4563b4cbd050e542de6fe9a4e3b9 [file] [log] [blame]
Matt Arsenault7c936902014-10-21 23:01:01 +00001; RUN: llc -march=r600 -mcpu=SI < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2
3declare float @llvm.minnum.f32(float, float) #0
4declare <2 x float> @llvm.minnum.v2f32(<2 x float>, <2 x float>) #0
5declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>) #0
6declare <8 x float> @llvm.minnum.v8f32(<8 x float>, <8 x float>) #0
7declare <16 x float> @llvm.minnum.v16f32(<16 x float>, <16 x float>) #0
8
9; FUNC-LABEL: @test_fmin_f32
10; SI: V_MIN_F32_e32
11define void @test_fmin_f32(float addrspace(1)* %out, float %a, float %b) nounwind {
12 %val = call float @llvm.minnum.f32(float %a, float %b) #0
13 store float %val, float addrspace(1)* %out, align 4
14 ret void
15}
16
17; FUNC-LABEL: @test_fmin_v2f32
18; SI: V_MIN_F32_e32
19; SI: V_MIN_F32_e32
20define void @test_fmin_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) nounwind {
21 %val = call <2 x float> @llvm.minnum.v2f32(<2 x float> %a, <2 x float> %b) #0
22 store <2 x float> %val, <2 x float> addrspace(1)* %out, align 8
23 ret void
24}
25
26; FUNC-LABEL: @test_fmin_v4f32
27; SI: V_MIN_F32_e32
28; SI: V_MIN_F32_e32
29; SI: V_MIN_F32_e32
30; SI: V_MIN_F32_e32
31define void @test_fmin_v4f32(<4 x float> addrspace(1)* %out, <4 x float> %a, <4 x float> %b) nounwind {
32 %val = call <4 x float> @llvm.minnum.v4f32(<4 x float> %a, <4 x float> %b) #0
33 store <4 x float> %val, <4 x float> addrspace(1)* %out, align 16
34 ret void
35}
36
37; FUNC-LABEL: @test_fmin_v8f32
38; SI: V_MIN_F32_e32
39; SI: V_MIN_F32_e32
40; SI: V_MIN_F32_e32
41; SI: V_MIN_F32_e32
42; SI: V_MIN_F32_e32
43; SI: V_MIN_F32_e32
44; SI: V_MIN_F32_e32
45; SI: V_MIN_F32_e32
46define void @test_fmin_v8f32(<8 x float> addrspace(1)* %out, <8 x float> %a, <8 x float> %b) nounwind {
47 %val = call <8 x float> @llvm.minnum.v8f32(<8 x float> %a, <8 x float> %b) #0
48 store <8 x float> %val, <8 x float> addrspace(1)* %out, align 32
49 ret void
50}
51
52; FUNC-LABEL: @test_fmin_v16f32
53; SI: V_MIN_F32_e32
54; SI: V_MIN_F32_e32
55; SI: V_MIN_F32_e32
56; SI: V_MIN_F32_e32
57; SI: V_MIN_F32_e32
58; SI: V_MIN_F32_e32
59; SI: V_MIN_F32_e32
60; SI: V_MIN_F32_e32
61; SI: V_MIN_F32_e32
62; SI: V_MIN_F32_e32
63; SI: V_MIN_F32_e32
64; SI: V_MIN_F32_e32
65; SI: V_MIN_F32_e32
66; SI: V_MIN_F32_e32
67; SI: V_MIN_F32_e32
68; SI: V_MIN_F32_e32
69define void @test_fmin_v16f32(<16 x float> addrspace(1)* %out, <16 x float> %a, <16 x float> %b) nounwind {
70 %val = call <16 x float> @llvm.minnum.v16f32(<16 x float> %a, <16 x float> %b) #0
71 store <16 x float> %val, <16 x float> addrspace(1)* %out, align 64
72 ret void
73}
74
75; FUNC-LABEL: @constant_fold_fmin_f32
76; SI-NOT: V_MIN_F32_e32
77; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 1.0
78; SI: BUFFER_STORE_DWORD [[REG]]
79define void @constant_fold_fmin_f32(float addrspace(1)* %out) nounwind {
80 %val = call float @llvm.minnum.f32(float 1.0, float 2.0) #0
81 store float %val, float addrspace(1)* %out, align 4
82 ret void
83}
84
85; FUNC-LABEL: @constant_fold_fmin_f32_nan_nan
86; SI-NOT: V_MIN_F32_e32
87; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 0x7fc00000
88; SI: BUFFER_STORE_DWORD [[REG]]
89define void @constant_fold_fmin_f32_nan_nan(float addrspace(1)* %out) nounwind {
90 %val = call float @llvm.minnum.f32(float 0x7FF8000000000000, float 0x7FF8000000000000) #0
91 store float %val, float addrspace(1)* %out, align 4
92 ret void
93}
94
95; FUNC-LABEL: @constant_fold_fmin_f32_val_nan
96; SI-NOT: V_MIN_F32_e32
97; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 1.0
98; SI: BUFFER_STORE_DWORD [[REG]]
99define void @constant_fold_fmin_f32_val_nan(float addrspace(1)* %out) nounwind {
100 %val = call float @llvm.minnum.f32(float 1.0, float 0x7FF8000000000000) #0
101 store float %val, float addrspace(1)* %out, align 4
102 ret void
103}
104
105; FUNC-LABEL: @constant_fold_fmin_f32_nan_val
106; SI-NOT: V_MIN_F32_e32
107; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 1.0
108; SI: BUFFER_STORE_DWORD [[REG]]
109define void @constant_fold_fmin_f32_nan_val(float addrspace(1)* %out) nounwind {
110 %val = call float @llvm.minnum.f32(float 0x7FF8000000000000, float 1.0) #0
111 store float %val, float addrspace(1)* %out, align 4
112 ret void
113}
114
115; FUNC-LABEL: @constant_fold_fmin_f32_p0_p0
116; SI-NOT: V_MIN_F32_e32
117; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 0
118; SI: BUFFER_STORE_DWORD [[REG]]
119define void @constant_fold_fmin_f32_p0_p0(float addrspace(1)* %out) nounwind {
120 %val = call float @llvm.minnum.f32(float 0.0, float 0.0) #0
121 store float %val, float addrspace(1)* %out, align 4
122 ret void
123}
124
125; FUNC-LABEL: @constant_fold_fmin_f32_p0_n0
126; SI-NOT: V_MIN_F32_e32
127; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 0
128; SI: BUFFER_STORE_DWORD [[REG]]
129define void @constant_fold_fmin_f32_p0_n0(float addrspace(1)* %out) nounwind {
130 %val = call float @llvm.minnum.f32(float 0.0, float -0.0) #0
131 store float %val, float addrspace(1)* %out, align 4
132 ret void
133}
134
135; FUNC-LABEL: @constant_fold_fmin_f32_n0_p0
136; SI-NOT: V_MIN_F32_e32
137; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 0x80000000
138; SI: BUFFER_STORE_DWORD [[REG]]
139define void @constant_fold_fmin_f32_n0_p0(float addrspace(1)* %out) nounwind {
140 %val = call float @llvm.minnum.f32(float -0.0, float 0.0) #0
141 store float %val, float addrspace(1)* %out, align 4
142 ret void
143}
144
145; FUNC-LABEL: @constant_fold_fmin_f32_n0_n0
146; SI-NOT: V_MIN_F32_e32
147; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 0x80000000
148; SI: BUFFER_STORE_DWORD [[REG]]
149define void @constant_fold_fmin_f32_n0_n0(float addrspace(1)* %out) nounwind {
150 %val = call float @llvm.minnum.f32(float -0.0, float -0.0) #0
151 store float %val, float addrspace(1)* %out, align 4
152 ret void
153}
154
155; FUNC-LABEL: @fmin_var_immediate_f32
156; SI: V_MIN_F32_e64 {{v[0-9]+}}, 2.0, {{s[0-9]+}}
157define void @fmin_var_immediate_f32(float addrspace(1)* %out, float %a) nounwind {
158 %val = call float @llvm.minnum.f32(float %a, float 2.0) #0
159 store float %val, float addrspace(1)* %out, align 4
160 ret void
161}
162
163; FUNC-LABEL: @fmin_immediate_var_f32
164; SI: V_MIN_F32_e64 {{v[0-9]+}}, 2.0, {{s[0-9]+}}
165define void @fmin_immediate_var_f32(float addrspace(1)* %out, float %a) nounwind {
166 %val = call float @llvm.minnum.f32(float 2.0, float %a) #0
167 store float %val, float addrspace(1)* %out, align 4
168 ret void
169}
170
171; FUNC-LABEL: @fmin_var_literal_f32
172; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 0x42c60000
173; SI: V_MIN_F32_e32 {{v[0-9]+}}, {{s[0-9]+}}, [[REG]]
174define void @fmin_var_literal_f32(float addrspace(1)* %out, float %a) nounwind {
175 %val = call float @llvm.minnum.f32(float %a, float 99.0) #0
176 store float %val, float addrspace(1)* %out, align 4
177 ret void
178}
179
180; FUNC-LABEL: @fmin_literal_var_f32
181; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 0x42c60000
182; SI: V_MIN_F32_e32 {{v[0-9]+}}, {{s[0-9]+}}, [[REG]]
183define void @fmin_literal_var_f32(float addrspace(1)* %out, float %a) nounwind {
184 %val = call float @llvm.minnum.f32(float 99.0, float %a) #0
185 store float %val, float addrspace(1)* %out, align 4
186 ret void
187}
188
189attributes #0 = { nounwind readnone }