(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
x86_64/
abi/
bf16/
test_passing_unions.c
       1  #include "bf16-check.h"
       2  #include "defines.h"
       3  #include "args.h"
       4  
       5  struct FloatRegisters fregs;
       6  struct IntegerRegisters iregs;
       7  unsigned int num_fregs, num_iregs;
       8  
       9  union un1b
      10  {
      11    __m128bf16 x;
      12    float f;
      13  };
      14  
      15  union un1bb
      16  {
      17    __m128bf16 x;
      18    __bf16 f;
      19  };
      20  
      21  union un2b
      22  {
      23    __m128bf16 x;
      24    double d;
      25  };
      26  
      27  union un3b
      28  {
      29    __m128bf16 x;
      30    __m128 v;
      31  };
      32  
      33  union un4b
      34  {
      35    __m128bf16 x;
      36    long double ld;
      37  };
      38  
      39  void
      40  check_union_passing1b (union un1b u1 ATTRIBUTE_UNUSED,
      41  		       union un1b u2 ATTRIBUTE_UNUSED,
      42  		       union un1b u3 ATTRIBUTE_UNUSED,
      43  		       union un1b u4 ATTRIBUTE_UNUSED,
      44  		       union un1b u5 ATTRIBUTE_UNUSED,
      45  		       union un1b u6 ATTRIBUTE_UNUSED,
      46  		       union un1b u7 ATTRIBUTE_UNUSED,
      47  		       union un1b u8 ATTRIBUTE_UNUSED)
      48  {
      49    check_m128_arguments;
      50  }
      51  
      52  void
      53  check_union_passing1bb (union un1bb u1 ATTRIBUTE_UNUSED,
      54  		        union un1bb u2 ATTRIBUTE_UNUSED,
      55  		        union un1bb u3 ATTRIBUTE_UNUSED,
      56  		        union un1bb u4 ATTRIBUTE_UNUSED,
      57  		        union un1bb u5 ATTRIBUTE_UNUSED,
      58  		        union un1bb u6 ATTRIBUTE_UNUSED,
      59  		        union un1bb u7 ATTRIBUTE_UNUSED,
      60  		        union un1bb u8 ATTRIBUTE_UNUSED)
      61  {
      62    check_m128_arguments;
      63  }
      64  
      65  void
      66  check_union_passing2b (union un2b u1 ATTRIBUTE_UNUSED,
      67  		       union un2b u2 ATTRIBUTE_UNUSED,
      68  		       union un2b u3 ATTRIBUTE_UNUSED,
      69  		       union un2b u4 ATTRIBUTE_UNUSED,
      70  		       union un2b u5 ATTRIBUTE_UNUSED,
      71  		       union un2b u6 ATTRIBUTE_UNUSED,
      72  		       union un2b u7 ATTRIBUTE_UNUSED,
      73  		       union un2b u8 ATTRIBUTE_UNUSED)
      74  {
      75    check_m128_arguments;
      76  }
      77  
      78  void
      79  check_union_passing3b (union un3b u1 ATTRIBUTE_UNUSED,
      80  		       union un3b u2 ATTRIBUTE_UNUSED,
      81  		       union un3b u3 ATTRIBUTE_UNUSED,
      82  		       union un3b u4 ATTRIBUTE_UNUSED,
      83  		       union un3b u5 ATTRIBUTE_UNUSED,
      84  		       union un3b u6 ATTRIBUTE_UNUSED,
      85  		       union un3b u7 ATTRIBUTE_UNUSED,
      86  		       union un3b u8 ATTRIBUTE_UNUSED)
      87  {
      88    check_m128_arguments;
      89  }
      90  
      91  void
      92  check_union_passing4b (union un4b u ATTRIBUTE_UNUSED)
      93  {
      94     /* Check the passing on the stack by comparing the address of the
      95        stack elements to the expected place on the stack.  */
      96    assert ((unsigned long)&u.x == rsp+8);
      97    assert ((unsigned long)&u.ld == rsp+8);
      98  }
      99  
     100  #define check_union_passing1b WRAP_CALL(check_union_passing1b)
     101  #define check_union_passing1bb WRAP_CALL(check_union_passing1bb)
     102  #define check_union_passing2b WRAP_CALL(check_union_passing2b)
     103  #define check_union_passing3b WRAP_CALL(check_union_passing3b)
     104  #define check_union_passing4b WRAP_CALL(check_union_passing4b)
     105  
     106  static void
     107  do_test (void)
     108  {
     109    union un1b u1b[8];
     110    union un1bb u1bb[8];
     111    union un2b u2b[8];
     112    union un3b u3b[8];
     113    union un4b u4b;
     114    int i;
     115    __bf16 bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8;
     116  
     117    for (i = 0; i < 8; i++)
     118      {
     119        u1b[i].x = (__m128bf16) { bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8 };
     120      }
     121  
     122    clear_struct_registers;
     123    for (i = 0; i < 8; i++)
     124      (&fregs.xmm0)[i]._m128bf16[0] = u1b[i].x;
     125    num_fregs = 8;
     126    check_union_passing1b (u1b[0], u1b[1], u1b[2], u1b[3],
     127  		         u1b[4], u1b[5], u1b[6], u1b[7]);
     128  
     129    clear_struct_registers;
     130    for (i = 0; i < 8; i++)
     131      {
     132        u1bb[i].x = u1b[i].x;
     133        (&fregs.xmm0)[i]._m128bf16[0] = u1bb[i].x;
     134      }
     135    num_fregs = 8;
     136    check_union_passing1bb (u1bb[0], u1bb[1], u1bb[2], u1bb[3],
     137  		          u1bb[4], u1bb[5], u1bb[6], u1bb[7]);
     138  
     139    clear_struct_registers;
     140    for (i = 0; i < 8; i++)
     141      {
     142        u2b[i].x = u1b[i].x;
     143        (&fregs.xmm0)[i]._m128bf16[0] = u2b[i].x;
     144      }
     145    num_fregs = 8;
     146    check_union_passing2b (u2b[0], u2b[1], u2b[2], u2b[3],
     147  		         u2b[4], u2b[5], u2b[6], u2b[7]);
     148  
     149    clear_struct_registers;
     150    for (i = 0; i < 8; i++)
     151      {
     152        u3b[i].x = u1b[i].x;
     153        (&fregs.xmm0)[i]._m128bf16[0] = u3b[i].x;
     154      }
     155    num_fregs = 8;
     156    check_union_passing3b (u3b[0], u3b[1], u3b[2], u3b[3],
     157  		         u3b[4], u3b[5], u3b[6], u3b[7]);
     158  
     159    check_union_passing4b (u4b);
     160  }