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
      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
      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" } }  */