@@ -169,6 +169,82 @@ void test_builtin_elementwise_sub_sat(float f1, float f2, double d1, double d2,
169169 i1 = __builtin_elementwise_sub_sat (1 , 'a' );
170170}
171171
172+ void test_builtin_elementwise_maximum (float f1 , float f2 , double d1 , double d2 ,
173+ float4 vf1 , float4 vf2 , long long int i1 ,
174+ long long int i2 , si8 vi1 , si8 vi2 ,
175+ unsigned u1 , unsigned u2 , u4 vu1 , u4 vu2 ,
176+ _BitInt (31 ) bi1 , _BitInt (31 ) bi2 ,
177+ unsigned _BitInt (55 ) bu1 , unsigned _BitInt (55 ) bu2 ) {
178+ // CHECK-LABEL: define void @test_builtin_elementwise_maximum(
179+ // CHECK: [[F1:%.+]] = load float, ptr %f1.addr, align 4
180+ // CHECK-NEXT: [[F2:%.+]] = load float, ptr %f2.addr, align 4
181+ // CHECK-NEXT: call float @llvm.maximum.f32(float [[F1]], float [[F2]])
182+ f1 = __builtin_elementwise_maximum (f1 , f2 );
183+
184+ // CHECK: [[D1:%.+]] = load double, ptr %d1.addr, align 8
185+ // CHECK-NEXT: [[D2:%.+]] = load double, ptr %d2.addr, align 8
186+ // CHECK-NEXT: call double @llvm.maximum.f64(double [[D1]], double [[D2]])
187+ d1 = __builtin_elementwise_maximum (d1 , d2 );
188+
189+ // CHECK: [[D2:%.+]] = load double, ptr %d2.addr, align 8
190+ // CHECK-NEXT: call double @llvm.maximum.f64(double 2.000000e+01, double [[D2]])
191+ d1 = __builtin_elementwise_maximum (20.0 , d2 );
192+
193+ // CHECK: [[VF1:%.+]] = load <4 x float>, ptr %vf1.addr, align 16
194+ // CHECK-NEXT: [[VF2:%.+]] = load <4 x float>, ptr %vf2.addr, align 16
195+ // CHECK-NEXT: call <4 x float> @llvm.maximum.v4f32(<4 x float> [[VF1]], <4 x float> [[VF2]])
196+ vf1 = __builtin_elementwise_maximum (vf1 , vf2 );
197+
198+ // CHECK: [[CVF1:%.+]] = load <4 x float>, ptr %cvf1, align 16
199+ // CHECK-NEXT: [[VF2:%.+]] = load <4 x float>, ptr %vf2.addr, align 16
200+ // CHECK-NEXT: call <4 x float> @llvm.maximum.v4f32(<4 x float> [[CVF1]], <4 x float> [[VF2]])
201+ const float4 cvf1 = vf1 ;
202+ vf1 = __builtin_elementwise_maximum (cvf1 , vf2 );
203+
204+ // CHECK: [[VF2:%.+]] = load <4 x float>, ptr %vf2.addr, align 16
205+ // CHECK-NEXT: [[CVF1:%.+]] = load <4 x float>, ptr %cvf1, align 16
206+ // CHECK-NEXT: call <4 x float> @llvm.maximum.v4f32(<4 x float> [[VF2]], <4 x float> [[CVF1]])
207+ vf1 = __builtin_elementwise_maximum (vf2 , cvf1 );
208+ }
209+
210+ void test_builtin_elementwise_minimum (float f1 , float f2 , double d1 , double d2 ,
211+ float4 vf1 , float4 vf2 , long long int i1 ,
212+ long long int i2 , si8 vi1 , si8 vi2 ,
213+ unsigned u1 , unsigned u2 , u4 vu1 , u4 vu2 ,
214+ _BitInt (31 ) bi1 , _BitInt (31 ) bi2 ,
215+ unsigned _BitInt (55 ) bu1 , unsigned _BitInt (55 ) bu2 ) {
216+ // CHECK-LABEL: define void @test_builtin_elementwise_minimum(
217+ // CHECK: [[F1:%.+]] = load float, ptr %f1.addr, align 4
218+ // CHECK-NEXT: [[F2:%.+]] = load float, ptr %f2.addr, align 4
219+ // CHECK-NEXT: call float @llvm.minimum.f32(float [[F1]], float [[F2]])
220+ f1 = __builtin_elementwise_minimum (f1 , f2 );
221+
222+ // CHECK: [[D1:%.+]] = load double, ptr %d1.addr, align 8
223+ // CHECK-NEXT: [[D2:%.+]] = load double, ptr %d2.addr, align 8
224+ // CHECK-NEXT: call double @llvm.minimum.f64(double [[D1]], double [[D2]])
225+ d1 = __builtin_elementwise_minimum (d1 , d2 );
226+
227+ // CHECK: [[D1:%.+]] = load double, ptr %d1.addr, align 8
228+ // CHECK-NEXT: call double @llvm.minimum.f64(double [[D1]], double 2.000000e+00)
229+ d1 = __builtin_elementwise_minimum (d1 , 2.0 );
230+
231+ // CHECK: [[VF1:%.+]] = load <4 x float>, ptr %vf1.addr, align 16
232+ // CHECK-NEXT: [[VF2:%.+]] = load <4 x float>, ptr %vf2.addr, align 16
233+ // CHECK-NEXT: call <4 x float> @llvm.minimum.v4f32(<4 x float> [[VF1]], <4 x float> [[VF2]])
234+ vf1 = __builtin_elementwise_minimum (vf1 , vf2 );
235+
236+ // CHECK: [[CVF1:%.+]] = load <4 x float>, ptr %cvf1, align 16
237+ // CHECK-NEXT: [[VF2:%.+]] = load <4 x float>, ptr %vf2.addr, align 16
238+ // CHECK-NEXT: call <4 x float> @llvm.minimum.v4f32(<4 x float> [[CVF1]], <4 x float> [[VF2]])
239+ const float4 cvf1 = vf1 ;
240+ vf1 = __builtin_elementwise_minimum (cvf1 , vf2 );
241+
242+ // CHECK: [[VF2:%.+]] = load <4 x float>, ptr %vf2.addr, align 16
243+ // CHECK-NEXT: [[CVF1:%.+]] = load <4 x float>, ptr %cvf1, align 16
244+ // CHECK-NEXT: call <4 x float> @llvm.minimum.v4f32(<4 x float> [[VF2]], <4 x float> [[CVF1]])
245+ vf1 = __builtin_elementwise_minimum (vf2 , cvf1 );
246+ }
247+
172248void test_builtin_elementwise_max (float f1 , float f2 , double d1 , double d2 ,
173249 float4 vf1 , float4 vf2 , long long int i1 ,
174250 long long int i2 , si8 vi1 , si8 vi2 ,
0 commit comments