(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
x86_64/
abi/
avx512f/
test_passing_unions.c
       1  #include "avx512f-check.h"
       2  #include "args.h"
       3  
       4  struct IntegerRegisters iregs;
       5  struct FloatRegisters fregs;
       6  unsigned int num_iregs, num_fregs;
       7  
       8  union un1
       9  {
      10    __m512 x;
      11    float f;
      12  };
      13  
      14  union un2
      15  {
      16    __m512 x;
      17    double d;
      18  };
      19  
      20  union un3
      21  {
      22    __m512 x;
      23    __m128 v;
      24  };
      25  
      26  union un4
      27  {
      28    __m512 x;
      29    long double ld;
      30  };
      31  
      32  union un5
      33  {
      34    __m512 x;
      35    int i;
      36  };
      37  
      38  union un6
      39  {
      40    __m512 x;
      41    __m256 v;
      42  };
      43  
      44  
      45  void
      46  check_union_passing1(union un1 u1 ATTRIBUTE_UNUSED,
      47  		     union un1 u2 ATTRIBUTE_UNUSED,
      48  		     union un1 u3 ATTRIBUTE_UNUSED,
      49  		     union un1 u4 ATTRIBUTE_UNUSED,
      50  		     union un1 u5 ATTRIBUTE_UNUSED,
      51  		     union un1 u6 ATTRIBUTE_UNUSED,
      52  		     union un1 u7 ATTRIBUTE_UNUSED,
      53  		     union un1 u8 ATTRIBUTE_UNUSED)
      54  {
      55    /* Check register contents.  */
      56    check_m512_arguments;
      57  }
      58  
      59  void
      60  check_union_passing2(union un2 u1 ATTRIBUTE_UNUSED,
      61  		     union un2 u2 ATTRIBUTE_UNUSED,
      62  		     union un2 u3 ATTRIBUTE_UNUSED,
      63  		     union un2 u4 ATTRIBUTE_UNUSED,
      64  		     union un2 u5 ATTRIBUTE_UNUSED,
      65  		     union un2 u6 ATTRIBUTE_UNUSED,
      66  		     union un2 u7 ATTRIBUTE_UNUSED,
      67  		     union un2 u8 ATTRIBUTE_UNUSED)
      68  {
      69    /* Check register contents.  */
      70    check_m512_arguments;
      71  }
      72  
      73  void
      74  check_union_passing3(union un3 u1 ATTRIBUTE_UNUSED,
      75  		     union un3 u2 ATTRIBUTE_UNUSED,
      76  		     union un3 u3 ATTRIBUTE_UNUSED,
      77  		     union un3 u4 ATTRIBUTE_UNUSED,
      78  		     union un3 u5 ATTRIBUTE_UNUSED,
      79  		     union un3 u6 ATTRIBUTE_UNUSED,
      80  		     union un3 u7 ATTRIBUTE_UNUSED,
      81  		     union un3 u8 ATTRIBUTE_UNUSED)
      82  {
      83    /* Check register contents.  */
      84    check_m512_arguments;
      85  }
      86  
      87  void
      88  check_union_passing4(union un4 u ATTRIBUTE_UNUSED)
      89  {
      90     /* Check the passing on the stack by comparing the address of the
      91        stack elements to the expected place on the stack.  */
      92    assert ((unsigned long)&u.x == rsp+8);
      93    assert ((unsigned long)&u.ld == rsp+8);
      94  }
      95  
      96  void
      97  check_union_passing5(union un5 u ATTRIBUTE_UNUSED)
      98  {
      99     /* Check the passing on the stack by comparing the address of the
     100        stack elements to the expected place on the stack.  */
     101    assert ((unsigned long)&u.x == rsp+8);
     102    assert ((unsigned long)&u.i == rsp+8);
     103  }
     104  
     105  void
     106  check_union_passing6(union un6 u1 ATTRIBUTE_UNUSED,
     107  		     union un6 u2 ATTRIBUTE_UNUSED,
     108  		     union un6 u3 ATTRIBUTE_UNUSED,
     109  		     union un6 u4 ATTRIBUTE_UNUSED,
     110  		     union un6 u5 ATTRIBUTE_UNUSED,
     111  		     union un6 u6 ATTRIBUTE_UNUSED,
     112  		     union un6 u7 ATTRIBUTE_UNUSED,
     113  		     union un6 u8 ATTRIBUTE_UNUSED)
     114  {
     115    /* Check register contents.  */
     116    check_m512_arguments;
     117  }
     118  
     119  #define check_union_passing1 WRAP_CALL(check_union_passing1)
     120  #define check_union_passing2 WRAP_CALL(check_union_passing2)
     121  #define check_union_passing3 WRAP_CALL(check_union_passing3)
     122  #define check_union_passing4 WRAP_CALL(check_union_passing4)
     123  #define check_union_passing5 WRAP_CALL(check_union_passing5)
     124  #define check_union_passing6 WRAP_CALL(check_union_passing6)
     125  
     126  static void
     127  avx512f_test (void)
     128  {
     129    union un1 u1[8];
     130    union un2 u2[8];
     131    union un3 u3[8];
     132    union un4 u4;
     133    union un5 u5;
     134    union un6 u6[8];
     135    int i;
     136  
     137    for (i = 0; i < 8; i++)
     138      u1[i].x = (__m512){32+i, 0, i, 0, -i, 0, i - 12, i + 8,
     139  		       32+i, 0, i, 0, -i, 0, i - 12, i + 8};
     140  
     141    clear_struct_registers;
     142    for (i = 0; i < 8; i++)
     143      (&fregs.zmm0)[i]._m512[0] = u1[i].x;
     144    num_fregs = 8;
     145    check_union_passing1(u1[0], u1[1], u1[2], u1[3],
     146  		       u1[4], u1[5], u1[6], u1[7]);
     147  
     148    clear_struct_registers;
     149    for (i = 0; i < 8; i++)
     150      {
     151        u2[i].x = u1[i].x;
     152        (&fregs.zmm0)[i]._m512[0] = u2[i].x;
     153      }
     154    num_fregs = 8;
     155    check_union_passing2(u2[0], u2[1], u2[2], u2[3],
     156  		       u2[4], u2[5], u2[6], u2[7]);
     157  
     158    clear_struct_registers;
     159    for (i = 0; i < 8; i++)
     160      {
     161        u3[i].x = u1[i].x;
     162        (&fregs.zmm0)[i]._m512[0] = u3[i].x;
     163      }
     164    num_fregs = 8;
     165    check_union_passing3(u3[0], u3[1], u3[2], u3[3],
     166  		       u3[4], u3[5], u3[6], u3[7]);
     167  
     168    check_union_passing4(u4);
     169    check_union_passing5(u5);
     170  
     171    clear_struct_registers;
     172    for (i = 0; i < 8; i++)
     173      {
     174        u6[i].x = u1[i].x;
     175        (&fregs.zmm0)[i]._m512[0] = u6[i].x;
     176      }
     177    num_fregs = 8;
     178    check_union_passing6(u6[0], u6[1], u6[2], u6[3],
     179  		       u6[4], u6[5], u6[6], u6[7]);
     180  }