(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
x86_64/
abi/
test_varargs-m128.c
       1  /* Test variable number of 128-bit vector arguments passed to functions.  */
       2  
       3  #include <stdio.h>
       4  #include "defines.h"
       5  #include "macros.h"
       6  #include "args.h"
       7  
       8  struct IntegerRegisters iregs;
       9  struct FloatRegisters fregs;
      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;
      15  } values;
      16  
      17  char *pass;
      18  int failed = 0;
      19  
      20  #undef assert
      21  #define assert(c) do { \
      22    if (!(c)) {failed++; printf ("failed %s\n", pass); } \
      23  } while (0)
      24  
      25  #define compare(X1,X2,T) do { \
      26    assert (memcmp (&X1, &X2, sizeof (T)) == 0); \
      27  } while (0)
      28  
      29  void
      30  fun_check_passing_m128_varargs (__m128 i0, __m128 i1, __m128 i2,
      31  				__m128 i3, ...)
      32  {
      33    /* Check argument values.  */
      34    void **fp = __builtin_frame_address (0);
      35    void *ra = __builtin_return_address (0);
      36    __m128 *argp;
      37  
      38    compare (values.i0, i0, __m128);
      39    compare (values.i1, i1, __m128);
      40    compare (values.i2, i2, __m128);
      41    compare (values.i3, i3, __m128);
      42  
      43    /* Get the pointer to the return address on stack.  */
      44    while (*fp != ra)
      45      fp++;
      46  
      47    /* Skip the return address stack slot.  */
      48    argp = (__m128 *) (((char *) fp) + 8);
      49  
      50    /* Check __m128 arguments passed on stack.  */
      51    compare (values.i8, argp[0], __m128);
      52    compare (values.i9, argp[1], __m128);
      53  
      54    /* Check register contents.  */
      55    compare (fregs.xmm0, xmm_regs[0], __m128);
      56    compare (fregs.xmm1, xmm_regs[1], __m128);
      57    compare (fregs.xmm2, xmm_regs[2], __m128);
      58    compare (fregs.xmm3, xmm_regs[3], __m128);
      59    compare (fregs.xmm4, xmm_regs[4], __m128);
      60    compare (fregs.xmm5, xmm_regs[5], __m128);
      61    compare (fregs.xmm6, xmm_regs[6], __m128);
      62    compare (fregs.xmm7, xmm_regs[7], __m128);
      63  }
      64  
      65  #define def_check_int_passing_varargs(_i0, _i1, _i2, _i3, _i4, _i5, \
      66  				      _i6, _i7, _i8, _i9, \
      67  				      _func, TYPE) \
      68    values.i0.TYPE[0] = _i0; \
      69    values.i1.TYPE[0] = _i1; \
      70    values.i2.TYPE[0] = _i2; \
      71    values.i3.TYPE[0] = _i3; \
      72    values.i4.TYPE[0] = _i4; \
      73    values.i5.TYPE[0] = _i5; \
      74    values.i6.TYPE[0] = _i6; \
      75    values.i7.TYPE[0] = _i7; \
      76    values.i8.TYPE[0] = _i8; \
      77    values.i9.TYPE[0] = _i9; \
      78    clear_float_registers; \
      79    fregs.F0.TYPE[0] = _i0; \
      80    fregs.F1.TYPE[0] = _i1; \
      81    fregs.F2.TYPE[0] = _i2; \
      82    fregs.F3.TYPE[0] = _i3; \
      83    fregs.F4.TYPE[0] = _i4; \
      84    fregs.F5.TYPE[0] = _i5; \
      85    fregs.F6.TYPE[0] = _i6; \
      86    fregs.F7.TYPE[0] = _i7; \
      87    WRAP_CALL(_func) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, _i9);
      88  
      89  void
      90  test_m128_varargs (void)
      91  {
      92    __m128 x[10];
      93    int i;
      94    for (i = 0; i < 10; i++)
      95      x[i] = (__m128){32+i, 0, 0, 0};
      96    pass = "m128-varargs";
      97    def_check_int_passing_varargs (x[0], x[1], x[2], x[3], x[4], x[5],
      98  				 x[6], x[7], x[8], x[9],
      99  				 fun_check_passing_m128_varargs,
     100  				 _m128);
     101  }
     102  
     103  int
     104  main (void)
     105  {
     106    test_m128_varargs ();
     107    if (failed)
     108      abort ();
     109    return 0;
     110  }