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