(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
x86_64/
abi/
bf16/
test_passing_m128.c
       1  #include <stdio.h>
       2  #include "bf16-check.h"
       3  #include "defines.h"
       4  #include "macros.h"
       5  #include "args.h"
       6  
       7  struct FloatRegisters fregs;
       8  struct IntegerRegisters iregs;
       9  unsigned int num_fregs, num_iregs;
      10  
      11  /* This struct holds values for argument checking.  */
      12  struct
      13  {
      14    XMM_T i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15,
      15      i16, i17, i18, i19, i20, i21, i22, i23;
      16  } values;
      17  
      18  char *pass;
      19  int failed = 0;
      20  
      21  #undef assert
      22  #define assert(c) do { \
      23    if (!(c)) {failed++; printf ("failed %s\n", pass); } \
      24  } while (0)
      25  
      26  #define compare(X1,X2,T) do { \
      27    assert (memcmp (&X1, &X2, sizeof (T)) == 0); \
      28  } while (0)
      29  
      30  void
      31  fun_check_passing_m128bf16_8_values (__m128bf16 i0 ATTRIBUTE_UNUSED,
      32  				     __m128bf16 i1 ATTRIBUTE_UNUSED,
      33  				     __m128bf16 i2 ATTRIBUTE_UNUSED,
      34  				     __m128bf16 i3 ATTRIBUTE_UNUSED,
      35  				     __m128bf16 i4 ATTRIBUTE_UNUSED,
      36  				     __m128bf16 i5 ATTRIBUTE_UNUSED,
      37  				     __m128bf16 i6 ATTRIBUTE_UNUSED,
      38  				     __m128bf16 i7 ATTRIBUTE_UNUSED)
      39  {
      40    /* Check argument values.  */
      41    compare (values.i0, i0, __m128bf16);
      42    compare (values.i1, i1, __m128bf16);
      43    compare (values.i2, i2, __m128bf16);
      44    compare (values.i3, i3, __m128bf16);
      45    compare (values.i4, i4, __m128bf16);
      46    compare (values.i5, i5, __m128bf16);
      47    compare (values.i6, i6, __m128bf16);
      48    compare (values.i7, i7, __m128bf16);
      49  }
      50  
      51  void
      52  fun_check_passing_m128bf16_8_regs (__m128bf16 i0 ATTRIBUTE_UNUSED,
      53  				   __m128bf16 i1 ATTRIBUTE_UNUSED,
      54  				   __m128bf16 i2 ATTRIBUTE_UNUSED,
      55  				   __m128bf16 i3 ATTRIBUTE_UNUSED,
      56  				   __m128bf16 i4 ATTRIBUTE_UNUSED,
      57  				   __m128bf16 i5 ATTRIBUTE_UNUSED,
      58  				   __m128bf16 i6 ATTRIBUTE_UNUSED,
      59  				   __m128bf16 i7 ATTRIBUTE_UNUSED)
      60  {
      61    /* Check register contents.  */
      62    check_m128_arguments;
      63  }
      64  
      65  void
      66  fun_check_passing_m128bf16_20_values (__m128bf16 i0 ATTRIBUTE_UNUSED,
      67  				      __m128bf16 i1 ATTRIBUTE_UNUSED,
      68  				      __m128bf16 i2 ATTRIBUTE_UNUSED,
      69  				      __m128bf16 i3 ATTRIBUTE_UNUSED,
      70  				      __m128bf16 i4 ATTRIBUTE_UNUSED,
      71  				      __m128bf16 i5 ATTRIBUTE_UNUSED,
      72  				      __m128bf16 i6 ATTRIBUTE_UNUSED,
      73  				      __m128bf16 i7 ATTRIBUTE_UNUSED,
      74  				      __m128bf16 i8 ATTRIBUTE_UNUSED,
      75  				      __m128bf16 i9 ATTRIBUTE_UNUSED,
      76  				      __m128bf16 i10 ATTRIBUTE_UNUSED,
      77  				      __m128bf16 i11 ATTRIBUTE_UNUSED,
      78  				      __m128bf16 i12 ATTRIBUTE_UNUSED,
      79  				      __m128bf16 i13 ATTRIBUTE_UNUSED,
      80  				      __m128bf16 i14 ATTRIBUTE_UNUSED,
      81  				      __m128bf16 i15 ATTRIBUTE_UNUSED,
      82  				      __m128bf16 i16 ATTRIBUTE_UNUSED,
      83  				      __m128bf16 i17 ATTRIBUTE_UNUSED,
      84  				      __m128bf16 i18 ATTRIBUTE_UNUSED,
      85  				      __m128bf16 i19 ATTRIBUTE_UNUSED)
      86  {
      87    /* Check argument values.  */
      88    compare (values.i0, i0, __m128bf16);
      89    compare (values.i1, i1, __m128bf16);
      90    compare (values.i2, i2, __m128bf16);
      91    compare (values.i3, i3, __m128bf16);
      92    compare (values.i4, i4, __m128bf16);
      93    compare (values.i5, i5, __m128bf16);
      94    compare (values.i6, i6, __m128bf16);
      95    compare (values.i7, i7, __m128bf16);
      96    compare (values.i8, i8, __m128bf16);
      97    compare (values.i9, i9, __m128bf16);
      98    compare (values.i10, i10, __m128bf16);
      99    compare (values.i11, i11, __m128bf16);
     100    compare (values.i12, i12, __m128bf16);
     101    compare (values.i13, i13, __m128bf16);
     102    compare (values.i14, i14, __m128bf16);
     103    compare (values.i15, i15, __m128bf16);
     104    compare (values.i16, i16, __m128bf16);
     105    compare (values.i17, i17, __m128bf16);
     106    compare (values.i18, i18, __m128bf16);
     107    compare (values.i19, i19, __m128bf16);
     108  }
     109  
     110  void
     111  fun_check_passing_m128bf16_20_regs (__m128bf16 i0 ATTRIBUTE_UNUSED,
     112  				    __m128bf16 i1 ATTRIBUTE_UNUSED,
     113  				    __m128bf16 i2 ATTRIBUTE_UNUSED,
     114  				    __m128bf16 i3 ATTRIBUTE_UNUSED,
     115  				    __m128bf16 i4 ATTRIBUTE_UNUSED,
     116  				    __m128bf16 i5 ATTRIBUTE_UNUSED,
     117  				    __m128bf16 i6 ATTRIBUTE_UNUSED,
     118  				    __m128bf16 i7 ATTRIBUTE_UNUSED,
     119  				    __m128bf16 i8 ATTRIBUTE_UNUSED,
     120  				    __m128bf16 i9 ATTRIBUTE_UNUSED,
     121  				    __m128bf16 i10 ATTRIBUTE_UNUSED,
     122  				    __m128bf16 i11 ATTRIBUTE_UNUSED,
     123  				    __m128bf16 i12 ATTRIBUTE_UNUSED,
     124  				    __m128bf16 i13 ATTRIBUTE_UNUSED,
     125  				    __m128bf16 i14 ATTRIBUTE_UNUSED,
     126  				    __m128bf16 i15 ATTRIBUTE_UNUSED,
     127  				    __m128bf16 i16 ATTRIBUTE_UNUSED,
     128  				    __m128bf16 i17 ATTRIBUTE_UNUSED,
     129  				    __m128bf16 i18 ATTRIBUTE_UNUSED,
     130  				    __m128bf16 i19 ATTRIBUTE_UNUSED)
     131  {
     132    /* Check register contents.  */
     133    check_m128_arguments;
     134  }
     135  
     136  #define def_check_int_passing8(_i0, _i1, _i2, _i3, \
     137  			       _i4, _i5, _i6, _i7, \
     138  			       _func1, _func2, TYPE) \
     139    values.i0.TYPE[0] = _i0; \
     140    values.i1.TYPE[0] = _i1; \
     141    values.i2.TYPE[0] = _i2; \
     142    values.i3.TYPE[0] = _i3; \
     143    values.i4.TYPE[0] = _i4; \
     144    values.i5.TYPE[0] = _i5; \
     145    values.i6.TYPE[0] = _i6; \
     146    values.i7.TYPE[0] = _i7; \
     147    WRAP_CALL(_func1) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7); \
     148    clear_float_registers; \
     149    fregs.F0.TYPE[0] = _i0; \
     150    fregs.F1.TYPE[0] = _i1; \
     151    fregs.F2.TYPE[0] = _i2; \
     152    fregs.F3.TYPE[0] = _i3; \
     153    fregs.F4.TYPE[0] = _i4; \
     154    fregs.F5.TYPE[0] = _i5; \
     155    fregs.F6.TYPE[0] = _i6; \
     156    fregs.F7.TYPE[0] = _i7; \
     157    num_fregs = 8; \
     158    WRAP_CALL(_func2) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7);
     159  
     160  #define def_check_int_passing20(_i0, _i1, _i2, _i3, _i4, _i5, _i6, \
     161  				_i7, _i8, _i9, _i10, _i11, _i12, _i13, \
     162  				_i14, _i15, _i16, _i17, _i18, _i19, \
     163  				_func1, _func2, TYPE) \
     164    values.i0.TYPE[0] = _i0; \
     165    values.i1.TYPE[0] = _i1; \
     166    values.i2.TYPE[0] = _i2; \
     167    values.i3.TYPE[0] = _i3; \
     168    values.i4.TYPE[0] = _i4; \
     169    values.i5.TYPE[0] = _i5; \
     170    values.i6.TYPE[0] = _i6; \
     171    values.i7.TYPE[0] = _i7; \
     172    values.i8.TYPE[0] = _i8; \
     173    values.i9.TYPE[0] = _i9; \
     174    values.i10.TYPE[0] = _i10; \
     175    values.i11.TYPE[0] = _i11; \
     176    values.i12.TYPE[0] = _i12; \
     177    values.i13.TYPE[0] = _i13; \
     178    values.i14.TYPE[0] = _i14; \
     179    values.i15.TYPE[0] = _i15; \
     180    values.i16.TYPE[0] = _i16; \
     181    values.i17.TYPE[0] = _i17; \
     182    values.i18.TYPE[0] = _i18; \
     183    values.i19.TYPE[0] = _i19; \
     184    WRAP_CALL(_func1) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, \
     185  		     _i9, _i10, _i11, _i12, _i13, _i14, _i15, _i16, \
     186  		     _i17, _i18, _i19); \
     187    clear_float_registers; \
     188    fregs.F0.TYPE[0] = _i0; \
     189    fregs.F1.TYPE[0] = _i1; \
     190    fregs.F2.TYPE[0] = _i2; \
     191    fregs.F3.TYPE[0] = _i3; \
     192    fregs.F4.TYPE[0] = _i4; \
     193    fregs.F5.TYPE[0] = _i5; \
     194    fregs.F6.TYPE[0] = _i6; \
     195    fregs.F7.TYPE[0] = _i7; \
     196    num_fregs = 8; \
     197    WRAP_CALL(_func2) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, \
     198  		     _i9, _i10, _i11, _i12, _i13, _i14, _i15, _i16, \
     199  		     _i17, _i18, _i19);
     200  
     201  volatile __bf16 bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8;
     202  
     203  void
     204  test_m128bf16_on_stack ()
     205  {
     206    __m128bf16 x[8];
     207    int i;
     208    for (i = 0; i < 8; i++)
     209      x[i] = (__m128bf16) { bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8 };
     210    pass = "m128bf16-8";
     211    def_check_int_passing8 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
     212  			  fun_check_passing_m128bf16_8_values,
     213  			  fun_check_passing_m128bf16_8_regs, _m128bf16);
     214  }
     215  
     216  void
     217  test_too_many_m128bf16 ()
     218  {
     219    __m128bf16 x[20];
     220    int i;
     221    for (i = 0; i < 20; i++)
     222      x[i] = (__m128bf16) { bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8 };
     223    pass = "m128bf16-20";
     224    def_check_int_passing20 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
     225  			   x[8], x[9], x[10], x[11], x[12], x[13], x[14],
     226  			   x[15], x[16], x[17], x[18], x[19],
     227  			   fun_check_passing_m128bf16_20_values,
     228  			   fun_check_passing_m128bf16_20_regs, _m128bf16);
     229  }
     230  
     231  static void
     232  do_test (void)
     233  {
     234    test_m128bf16_on_stack ();
     235    test_too_many_m128bf16 ();
     236    if (failed)
     237      abort ();
     238  }