1 ; RUN: llc -march=amdgcn -mcpu=SI < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
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
9 ; FUNC-LABEL: @test_fmin_f32
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
17 ; FUNC-LABEL: @test_fmin_v2f32
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
26 ; FUNC-LABEL: @test_fmin_v4f32
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
37 ; FUNC-LABEL: @test_fmin_v8f32
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
52 ; FUNC-LABEL: @test_fmin_v16f32
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
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
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
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
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
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
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
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
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
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
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
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
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
189 attributes #0 = { nounwind readnone }