1 /* { dg-do compile } */
2 /* { dg-options "-mno-mips16 -mfp64 -mhard-float -mmsa" } */
3 
4 typedef int v4i32 __attribute__ ((vector_size(16)));
5 typedef float v4f32 __attribute__ ((vector_size(16)));
6 
7 /* Test MSA signed min/max immediate for correct assembly output.  */
8 
9 void
min_s_msa(v4i32 * vx,v4i32 * vy)10 min_s_msa (v4i32 *vx, v4i32 *vy)
11 {
12   *vy = __builtin_msa_mini_s_w (*vx, -15);
13 }
14 /* { dg-final { scan-assembler "-15" } }  */
15 
16 void
max_s_msa(v4i32 * vx,v4i32 * vy)17 max_s_msa (v4i32 *vx, v4i32 *vy)
18 {
19   *vy = __builtin_msa_maxi_s_w (*vx, -15);
20 }
21 /* { dg-final { scan-assembler "-15" } }  */
22 
23 /* Test MSA min_a/max_a instructions for forward propagation optimization.  */
24 
25 #define FUNC(NAME, TYPE, RETTYPE) RETTYPE NAME##_a_msa (TYPE *vx, TYPE *vy) \
26 { \
27   TYPE dest = __builtin_msa_##NAME##_a_w (*vx, *vy); \
28   return dest[0]; \
29 }
30 
31 FUNC(fmin, v4f32, float)
32 /* { dg-final { scan-assembler "fmin_a.w" } }  */
33 FUNC(fmax, v4f32, float)
34 /* { dg-final { scan-assembler "fmax_a.w" } }  */
35 FUNC(min, v4i32, int)
36 /* { dg-final { scan-assembler "min_a.w" } }  */
37 FUNC(max, v4i32, int)
38 /* { dg-final { scan-assembler "max_a.w" } }  */
39