(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
x86_64/
abi/
avx512fp16/
m512h/
test_varargs-m512.c
       1  /* Test variable number of 512-bit vector arguments passed to functions.  */
       2  
       3  #include <stdio.h>
       4  #include "avx512fp16-zmm-check.h"
       5  #include "args.h"
       6  
       7  struct IntegerRegisters iregs;
       8  struct FloatRegisters fregs;
       9  
      10  /* This struct holds values for argument checking.  */
      11  struct 
      12  {
      13    ZMM_T i0, i1, i2, i3, i4, i5, i6, i7, i8, i9;
      14  } values;
      15  
      16  char *pass;
      17  int failed = 0;
      18  
      19  #undef assert
      20  #define assert(c) do { \
      21    if (!(c)) {failed++; printf ("failed %s\n", pass); } \
      22  } while (0)
      23  
      24  #define compare(X1,X2,T) do { \
      25    assert (memcmp (&X1, &X2, sizeof (T)) == 0); \
      26  } while (0)
      27  
      28  void
      29  fun_check_passing_m512_varargs (__m512 i0, __m512 i1, __m512 i2,
      30  				__m512 i3, ...)
      31  {
      32    /* Check argument values.  */
      33    void **fp = __builtin_frame_address (0);
      34    void *ra = __builtin_return_address (0);
      35    __m512 *argp;
      36  
      37    compare (values.i0, i0, __m512);
      38    compare (values.i1, i1, __m512);
      39    compare (values.i2, i2, __m512);
      40    compare (values.i3, i3, __m512);
      41  
      42    /* Get the pointer to the return address on stack.  */
      43    while (*fp != ra)
      44      fp++;
      45  
      46    /* Skip the return address stack slot.  */
      47    argp = (__m512 *)(((char *) fp) + 8);
      48  
      49    /* Check __m512 arguments passed on stack.  */
      50    compare (values.i4, argp[0], __m512);
      51    compare (values.i5, argp[1], __m512);
      52    compare (values.i6, argp[2], __m512);
      53    compare (values.i7, argp[3], __m512);
      54    compare (values.i8, argp[4], __m512);
      55    compare (values.i9, argp[5], __m512);
      56  
      57    /* Check register contents.  */
      58    compare (fregs.zmm0, zmm_regs[0], __m512);
      59    compare (fregs.zmm1, zmm_regs[1], __m512);
      60    compare (fregs.zmm2, zmm_regs[2], __m512);
      61    compare (fregs.zmm3, zmm_regs[3], __m512);
      62  }
      63  
      64  void
      65  fun_check_passing_m512h_varargs (__m512h i0, __m512h i1, __m512h i2,
      66  				 __m512h i3, ...)
      67  {
      68    /* Check argument values.  */
      69    void **fp = __builtin_frame_address (0);
      70    void *ra = __builtin_return_address (0);
      71    __m512h *argp;
      72  
      73    compare (values.i0, i0, __m512h);
      74    compare (values.i1, i1, __m512h);
      75    compare (values.i2, i2, __m512h);
      76    compare (values.i3, i3, __m512h);
      77  
      78    /* Get the pointer to the return address on stack.  */
      79    while (*fp != ra)
      80      fp++;
      81  
      82    /* Skip the return address stack slot.  */
      83    argp = (__m512h *)(((char *) fp) + 8);
      84  
      85    /* Check __m512h arguments passed on stack.  */
      86    compare (values.i4, argp[0], __m512h);
      87    compare (values.i5, argp[1], __m512h);
      88    compare (values.i6, argp[2], __m512h);
      89    compare (values.i7, argp[3], __m512h);
      90    compare (values.i8, argp[4], __m512h);
      91    compare (values.i9, argp[5], __m512h);
      92  
      93    /* Check register contents.  */
      94    compare (fregs.zmm0, zmm_regs[0], __m512h);
      95    compare (fregs.zmm1, zmm_regs[1], __m512h);
      96    compare (fregs.zmm2, zmm_regs[2], __m512h);
      97    compare (fregs.zmm3, zmm_regs[3], __m512h);
      98  }
      99  
     100  #define def_check_int_passing_varargs(_i0, _i1, _i2, _i3, _i4, _i5, \
     101  				      _i6, _i7, _i8, _i9, \
     102  				      _func, TYPE) \
     103    values.i0.TYPE[0] = _i0; \
     104    values.i1.TYPE[0] = _i1; \
     105    values.i2.TYPE[0] = _i2; \
     106    values.i3.TYPE[0] = _i3; \
     107    values.i4.TYPE[0] = _i4; \
     108    values.i5.TYPE[0] = _i5; \
     109    values.i6.TYPE[0] = _i6; \
     110    values.i7.TYPE[0] = _i7; \
     111    values.i8.TYPE[0] = _i8; \
     112    values.i9.TYPE[0] = _i9; \
     113    clear_struct_registers; \
     114    fregs.F0.TYPE[0] = _i0; \
     115    fregs.F1.TYPE[0] = _i1; \
     116    fregs.F2.TYPE[0] = _i2; \
     117    fregs.F3.TYPE[0] = _i3; \
     118    WRAP_CALL(_func) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, _i9);
     119  
     120  void
     121  test_m512_varargs (void)
     122  {
     123    __m512 x[10];
     124    int i;
     125    for (i = 0; i < 10; i++)
     126      x[i] = (__m512){32+i, 0, 0, 0, 0, 0, 0, 0};
     127    pass = "m512-varargs";
     128    def_check_int_passing_varargs (x[0], x[1], x[2], x[3], x[4], x[5],
     129  				 x[6], x[7], x[8], x[9],
     130  				 fun_check_passing_m512_varargs,
     131  				 _m512);
     132  }
     133  
     134  void
     135  test_m512h_varargs (void)
     136  {
     137    __m512h x[10];
     138    int i;
     139    for (i = 0; i < 10; i++)
     140      x[i] = (__m512h) {
     141          1.1f16 + i, 2.2f16 + i, 3.3f16 + i, 4.4f16 + i,
     142  	5.5f16 + i, 6.6f16 + i, 7.7f16 + i, 8.8f16 + i,
     143  	9.9f16 + i, 10.10f16 + i, 11.11f16 + i, 12.12f16 + i,
     144  	13.13f16 + i, 14.14f16 + i, 15.15f16 + i, 16.16f16 + i,
     145  	17.17f16 + i, 18.18f16 + i, 19.19f16 + i, 20.20f16 + i,
     146  	21.21f16 + i, 22.22f16 + i, 23.23f16 + i, 24.24f16 + i,
     147  	25.25f16 + i, 26.26f16 + i, 27.27f16 + i, 28.28f16 + i,
     148  	29.29f16 + i, 30.30f16 + i, 31.31f16 + i, 32.32f16 + i
     149      };
     150    pass = "m512h-varargs";
     151    def_check_int_passing_varargs (x[0], x[1], x[2], x[3], x[4], x[5],
     152  				 x[6], x[7], x[8], x[9],
     153  				 fun_check_passing_m512h_varargs,
     154  				 _m512h);
     155  }
     156  
     157  void
     158  do_test (void)
     159  {
     160    test_m512_varargs ();
     161    test_m512h_varargs ();
     162    if (failed)
     163      abort ();
     164  }