(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
x86_64/
abi/
bf16/
test_passing_structs.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  struct m128bf16_struct
      10  {
      11    __m128bf16 x;
      12  };
      13  
      14  struct m128bf16_2_struct
      15  {
      16    __m128bf16 x1, x2;
      17  };
      18  
      19  /* Check that the struct is passed as the individual members in fregs.  */
      20  void
      21  check_struct_passing1bf16 (struct m128bf16_struct ms1 ATTRIBUTE_UNUSED,
      22  			   struct m128bf16_struct ms2 ATTRIBUTE_UNUSED,
      23  			   struct m128bf16_struct ms3 ATTRIBUTE_UNUSED,
      24  			   struct m128bf16_struct ms4 ATTRIBUTE_UNUSED,
      25  			   struct m128bf16_struct ms5 ATTRIBUTE_UNUSED,
      26  			   struct m128bf16_struct ms6 ATTRIBUTE_UNUSED,
      27  			   struct m128bf16_struct ms7 ATTRIBUTE_UNUSED,
      28  			   struct m128bf16_struct ms8 ATTRIBUTE_UNUSED)
      29  {
      30    check_m128_arguments;
      31  }
      32  
      33  void
      34  check_struct_passing2bf16 (struct m128bf16_2_struct ms ATTRIBUTE_UNUSED)
      35  {
      36    /* Check the passing on the stack by comparing the address of the
      37       stack elements to the expected place on the stack.  */
      38    assert ((unsigned long)&ms.x1 == rsp+8);
      39    assert ((unsigned long)&ms.x2 == rsp+24);
      40  }
      41  
      42  volatile __bf16 bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8,
      43  		bf9, bf10,bf11,bf12,bf13,bf14,bf15,bf16;
      44  
      45  static void
      46  do_test (void)
      47  {
      48    struct m128bf16_struct m128bf16s [8];
      49    struct m128bf16_2_struct m128bf16_2s = { 
      50      { bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8 },
      51      { bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8 },
      52    };
      53    int i;
      54  
      55    for (i = 0; i < 8; i++)
      56      {
      57        m128bf16s[i].x = (__m128bf16) { bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8 };
      58      }
      59  
      60    clear_struct_registers;
      61    for (i = 0; i < 8; i++)
      62      (&fregs.xmm0)[i]._m128bf16[0] = m128bf16s[i].x;
      63    num_fregs = 8;
      64    WRAP_CALL (check_struct_passing1bf16) (m128bf16s[0], m128bf16s[1], m128bf16s[2], m128bf16s[3],
      65  					 m128bf16s[4], m128bf16s[5], m128bf16s[6], m128bf16s[7]);
      66    WRAP_CALL (check_struct_passing2bf16) (m128bf16_2s);
      67  }