1  /* { dg-do compile } */
       2  /* { dg-options "-mabi=64 -mfp64 -mhard-float -mmsa -EL -flax-vector-conversions" } */
       3  /* { dg-skip-if "uses global registers" { *-*-* } { "-O0" } { "" } } */
       4  
       5  typedef int v4i32 __attribute__ ((vector_size(16)));
       6  typedef float v4f32 __attribute__ ((vector_size(16)));
       7  typedef double v2f64 __attribute__ ((vector_size(16)));
       8  
       9  /* Test that MSA FMADD-like intrinsics do not use first operand for multiplication.  */
      10  
      11  register v4i32 a __asm__("$f24");
      12  register v4i32 b __asm__("$f25");
      13  register v4f32 c __asm__("$f26");
      14  register v4f32 d __asm__("$f27");
      15  register v2f64 e __asm__("$f28");
      16  register v2f64 f __asm__("$f29");
      17  
      18  void
      19  maddv_b_msa (void)
      20  {
      21    a = __builtin_msa_maddv_b (a, b, b);
      22  }
      23  /* { dg-final { scan-assembler "maddv\\\.b\t\\\$w24,\\\$w25,\\\$w25" } }  */
      24  
      25  void
      26  maddv_h_msa (void)
      27  {
      28    a = __builtin_msa_maddv_h (a, b, b);
      29  }
      30  /* { dg-final { scan-assembler "maddv\\\.h\t\\\$w24,\\\$w25,\\\$w25" } }  */
      31  
      32  void
      33  maddv_w_msa (void)
      34  {
      35    a = __builtin_msa_maddv_w (a, b, b);
      36  }
      37  /* { dg-final { scan-assembler "maddv\\\.w\t\\\$w24,\\\$w25,\\\$w25" } }  */
      38  
      39  void
      40  maddv_d_msa (void)
      41  {
      42    a = __builtin_msa_maddv_d (a, b, b);
      43  }
      44  /* { dg-final { scan-assembler "maddv\\\.d\t\\\$w24,\\\$w25,\\\$w25" } }  */
      45  
      46  void
      47  msubv_b_msa (void)
      48  {
      49    a = __builtin_msa_msubv_b (a, b, b);
      50  }
      51  /* { dg-final { scan-assembler "msubv\\\.b\t\\\$w24,\\\$w25,\\\$w25" } }  */
      52  
      53  void
      54  msubv_h_msa (void)
      55  {
      56    a = __builtin_msa_msubv_h (a, b, b);
      57  }
      58  /* { dg-final { scan-assembler "msubv\\\.h\t\\\$w24,\\\$w25,\\\$w25" } }  */
      59  
      60  void
      61  msubv_w_msa (void)
      62  {
      63    a = __builtin_msa_msubv_w (a, b, b);
      64  }
      65  /* { dg-final { scan-assembler "msubv\\\.w\t\\\$w24,\\\$w25,\\\$w25" } }  */
      66  
      67  void
      68  msubv_d_msa (void)
      69  {
      70    a = __builtin_msa_msubv_d (a, b, b);
      71  }
      72  /* { dg-final { scan-assembler "msubv\\\.d\t\\\$w24,\\\$w25,\\\$w25" } }  */
      73  
      74  void
      75  fmadd_w_msa (void)
      76  {
      77    c = __builtin_msa_fmadd_w (c, d, d);
      78  }
      79  /* { dg-final { scan-assembler "fmadd\\\.w\t\\\$w26,\\\$w27,\\\$w27" } }  */
      80  
      81  void
      82  fmadd_d_msa (void)
      83  {
      84    e = __builtin_msa_fmadd_d (e, f, f);
      85  }
      86  /* { dg-final { scan-assembler "fmadd\\\.d\t\\\$w28,\\\$w29,\\\$w29" } }  */
      87  
      88  void
      89  fmsub_w_msa (void)
      90  {
      91    c = __builtin_msa_fmsub_w (c, d, d);
      92  }
      93  /* { dg-final { scan-assembler "fmsub\\\.w\t\\\$w26,\\\$w27,\\\$w27" } }  */
      94  
      95  void
      96  fmsub_d_msa (void)
      97  {
      98    e = __builtin_msa_fmsub_d (e, f, f);
      99  }
     100  /* { dg-final { scan-assembler "fmsub\\\.d\t\\\$w28,\\\$w29,\\\$w29" } }  */
     101