R600/SI: Change all instruction assembly names to lowercase.
[oota-llvm.git] / test / CodeGen / R600 / fminnum.ll
1 ; RUN: llc -march=r600 -mcpu=SI < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2
3 declare float @llvm.minnum.f32(float, float) #0
4 declare <2 x float> @llvm.minnum.v2f32(<2 x float>, <2 x float>) #0
5 declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>) #0
6 declare <8 x float> @llvm.minnum.v8f32(<8 x float>, <8 x float>) #0
7 declare <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
11 define 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
20 define 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
31 define 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
46 define 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
69 define 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]]
79 define 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]]
89 define 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]]
99 define 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]]
109 define 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]]
119 define 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]]
129 define 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]]
139 define 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]]
149 define 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]+}}
157 define 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]+}}
165 define 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]]
174 define 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]]
183 define 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
189 attributes #0 = { nounwind readnone }