1  #include <stdio.h>
       2  #include "avx512fp16-xmm-check.h"
       3  #include "defines.h"
       4  #include "macros.h"
       5  #include "args.h"
       6  
       7  struct IntegerRegisters iregs;
       8  struct FloatRegisters fregs;
       9  unsigned int num_iregs, num_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, i10, i11, i12, i13, i14, i15,
      15      i16, i17, i18, i19, i20, i21, i22, i23;
      16  } values;
      17  
      18  char *pass;
      19  int failed = 0;
      20  
      21  #undef assert
      22  #define assert(c) do { \
      23    if (!(c)) {failed++; printf ("failed %s\n", pass); } \
      24  } while (0)
      25  
      26  #define compare(X1,X2,T) do { \
      27    assert (memcmp (&X1, &X2, sizeof (T)) == 0); \
      28  } while (0)
      29  
      30  void
      31  fun_check_passing_m64_8_values (__m64 i0 ATTRIBUTE_UNUSED,
      32  				__m64 i1 ATTRIBUTE_UNUSED,
      33  				__m64 i2 ATTRIBUTE_UNUSED,
      34  				__m64 i3 ATTRIBUTE_UNUSED,
      35  				__m64 i4 ATTRIBUTE_UNUSED,
      36  				__m64 i5 ATTRIBUTE_UNUSED,
      37  				__m64 i6 ATTRIBUTE_UNUSED,
      38  				__m64 i7 ATTRIBUTE_UNUSED)
      39  {
      40    /* Check argument values.  */
      41    compare (values.i0, i0, __m64);
      42    compare (values.i1, i1, __m64);
      43    compare (values.i2, i2, __m64);
      44    compare (values.i3, i3, __m64);
      45    compare (values.i4, i4, __m64);
      46    compare (values.i5, i5, __m64);
      47    compare (values.i6, i6, __m64);
      48    compare (values.i7, i7, __m64);
      49  }
      50  
      51  void
      52  fun_check_passing_m64_8_regs (__m64 i0 ATTRIBUTE_UNUSED,
      53  			      __m64 i1 ATTRIBUTE_UNUSED,
      54  			      __m64 i2 ATTRIBUTE_UNUSED,
      55  			      __m64 i3 ATTRIBUTE_UNUSED,
      56  			      __m64 i4 ATTRIBUTE_UNUSED,
      57  			      __m64 i5 ATTRIBUTE_UNUSED,
      58  			      __m64 i6 ATTRIBUTE_UNUSED,
      59  			      __m64 i7 ATTRIBUTE_UNUSED)
      60  {
      61    /* Check register contents.  */
      62    check_m64_arguments;
      63  }
      64  
      65  void
      66  fun_check_passing_m64_20_values (__m64 i0 ATTRIBUTE_UNUSED,
      67  				 __m64 i1 ATTRIBUTE_UNUSED,
      68  				 __m64 i2 ATTRIBUTE_UNUSED,
      69  				 __m64 i3 ATTRIBUTE_UNUSED,
      70  				 __m64 i4 ATTRIBUTE_UNUSED,
      71  				 __m64 i5 ATTRIBUTE_UNUSED,
      72  				 __m64 i6 ATTRIBUTE_UNUSED,
      73  				 __m64 i7 ATTRIBUTE_UNUSED,
      74  				 __m64 i8 ATTRIBUTE_UNUSED,
      75  				 __m64 i9 ATTRIBUTE_UNUSED,
      76  				 __m64 i10 ATTRIBUTE_UNUSED,
      77  				 __m64 i11 ATTRIBUTE_UNUSED,
      78  				 __m64 i12 ATTRIBUTE_UNUSED,
      79  				 __m64 i13 ATTRIBUTE_UNUSED,
      80  				 __m64 i14 ATTRIBUTE_UNUSED,
      81  				 __m64 i15 ATTRIBUTE_UNUSED,
      82  				 __m64 i16 ATTRIBUTE_UNUSED,
      83  				 __m64 i17 ATTRIBUTE_UNUSED,
      84  				 __m64 i18 ATTRIBUTE_UNUSED,
      85  				 __m64 i19 ATTRIBUTE_UNUSED)
      86  {
      87    /* Check argument values.  */
      88    compare (values.i0, i0, __m64);
      89    compare (values.i1, i1, __m64);
      90    compare (values.i2, i2, __m64);
      91    compare (values.i3, i3, __m64);
      92    compare (values.i4, i4, __m64);
      93    compare (values.i5, i5, __m64);
      94    compare (values.i6, i6, __m64);
      95    compare (values.i7, i7, __m64);
      96    compare (values.i8, i8, __m64);
      97    compare (values.i9, i9, __m64);
      98    compare (values.i10, i10, __m64);
      99    compare (values.i11, i11, __m64);
     100    compare (values.i12, i12, __m64);
     101    compare (values.i13, i13, __m64);
     102    compare (values.i14, i14, __m64);
     103    compare (values.i15, i15, __m64);
     104    compare (values.i16, i16, __m64);
     105    compare (values.i17, i17, __m64);
     106    compare (values.i18, i18, __m64);
     107    compare (values.i19, i19, __m64);
     108  }
     109  
     110  void
     111  fun_check_passing_m64_20_regs (__m64 i0 ATTRIBUTE_UNUSED,
     112  			       __m64 i1 ATTRIBUTE_UNUSED,
     113  			       __m64 i2 ATTRIBUTE_UNUSED,
     114  			       __m64 i3 ATTRIBUTE_UNUSED,
     115  			       __m64 i4 ATTRIBUTE_UNUSED,
     116  			       __m64 i5 ATTRIBUTE_UNUSED,
     117  			       __m64 i6 ATTRIBUTE_UNUSED,
     118  			       __m64 i7 ATTRIBUTE_UNUSED,
     119  			       __m64 i8 ATTRIBUTE_UNUSED,
     120  			       __m64 i9 ATTRIBUTE_UNUSED,
     121  			       __m64 i10 ATTRIBUTE_UNUSED,
     122  			       __m64 i11 ATTRIBUTE_UNUSED,
     123  			       __m64 i12 ATTRIBUTE_UNUSED,
     124  			       __m64 i13 ATTRIBUTE_UNUSED,
     125  			       __m64 i14 ATTRIBUTE_UNUSED,
     126  			       __m64 i15 ATTRIBUTE_UNUSED,
     127  			       __m64 i16 ATTRIBUTE_UNUSED,
     128  			       __m64 i17 ATTRIBUTE_UNUSED,
     129  			       __m64 i18 ATTRIBUTE_UNUSED,
     130  			       __m64 i19 ATTRIBUTE_UNUSED)
     131  {
     132    /* Check register contents.  */
     133    check_m64_arguments;
     134  }
     135  
     136  void
     137  fun_check_passing_m128_8_values (__m128 i0 ATTRIBUTE_UNUSED,
     138  				 __m128 i1 ATTRIBUTE_UNUSED,
     139  				 __m128 i2 ATTRIBUTE_UNUSED,
     140  				 __m128 i3 ATTRIBUTE_UNUSED,
     141  				 __m128 i4 ATTRIBUTE_UNUSED,
     142  				 __m128 i5 ATTRIBUTE_UNUSED,
     143  				 __m128 i6 ATTRIBUTE_UNUSED,
     144  				 __m128 i7 ATTRIBUTE_UNUSED)
     145  {
     146    /* Check argument values.  */
     147    compare (values.i0, i0, __m128);
     148    compare (values.i1, i1, __m128);
     149    compare (values.i2, i2, __m128);
     150    compare (values.i3, i3, __m128);
     151    compare (values.i4, i4, __m128);
     152    compare (values.i5, i5, __m128);
     153    compare (values.i6, i6, __m128);
     154    compare (values.i7, i7, __m128);
     155  }
     156  
     157  void
     158  fun_check_passing_m128h_8_values (__m128h i0 ATTRIBUTE_UNUSED,
     159  				  __m128h i1 ATTRIBUTE_UNUSED,
     160  				  __m128h i2 ATTRIBUTE_UNUSED,
     161  				  __m128h i3 ATTRIBUTE_UNUSED,
     162  				  __m128h i4 ATTRIBUTE_UNUSED,
     163  				  __m128h i5 ATTRIBUTE_UNUSED,
     164  				  __m128h i6 ATTRIBUTE_UNUSED,
     165  				  __m128h i7 ATTRIBUTE_UNUSED)
     166  {
     167    /* Check argument values.  */
     168    compare (values.i0, i0, __m128h);
     169    compare (values.i1, i1, __m128h);
     170    compare (values.i2, i2, __m128h);
     171    compare (values.i3, i3, __m128h);
     172    compare (values.i4, i4, __m128h);
     173    compare (values.i5, i5, __m128h);
     174    compare (values.i6, i6, __m128h);
     175    compare (values.i7, i7, __m128h);
     176  }
     177  
     178  void
     179  fun_check_passing_m128_8_regs (__m128 i0 ATTRIBUTE_UNUSED,
     180  			       __m128 i1 ATTRIBUTE_UNUSED,
     181  			       __m128 i2 ATTRIBUTE_UNUSED,
     182  			       __m128 i3 ATTRIBUTE_UNUSED,
     183  			       __m128 i4 ATTRIBUTE_UNUSED,
     184  			       __m128 i5 ATTRIBUTE_UNUSED,
     185  			       __m128 i6 ATTRIBUTE_UNUSED,
     186  			       __m128 i7 ATTRIBUTE_UNUSED)
     187  {
     188    /* Check register contents.  */
     189    check_m128_arguments;
     190  }
     191  
     192  void
     193  fun_check_passing_m128h_8_regs (__m128h i0 ATTRIBUTE_UNUSED,
     194  			        __m128h i1 ATTRIBUTE_UNUSED,
     195  			        __m128h i2 ATTRIBUTE_UNUSED,
     196  			        __m128h i3 ATTRIBUTE_UNUSED,
     197  			        __m128h i4 ATTRIBUTE_UNUSED,
     198  			        __m128h i5 ATTRIBUTE_UNUSED,
     199  			        __m128h i6 ATTRIBUTE_UNUSED,
     200  			        __m128h i7 ATTRIBUTE_UNUSED)
     201  {
     202    /* Check register contents.  */
     203    check_m128_arguments;
     204  }
     205  
     206  void
     207  fun_check_passing_m128_20_values (__m128 i0 ATTRIBUTE_UNUSED,
     208  				  __m128 i1 ATTRIBUTE_UNUSED,
     209  				  __m128 i2 ATTRIBUTE_UNUSED,
     210  				  __m128 i3 ATTRIBUTE_UNUSED,
     211  				  __m128 i4 ATTRIBUTE_UNUSED,
     212  				  __m128 i5 ATTRIBUTE_UNUSED,
     213  				  __m128 i6 ATTRIBUTE_UNUSED,
     214  				  __m128 i7 ATTRIBUTE_UNUSED,
     215  				  __m128 i8 ATTRIBUTE_UNUSED,
     216  				  __m128 i9 ATTRIBUTE_UNUSED,
     217  				  __m128 i10 ATTRIBUTE_UNUSED,
     218  				  __m128 i11 ATTRIBUTE_UNUSED,
     219  				  __m128 i12 ATTRIBUTE_UNUSED,
     220  				  __m128 i13 ATTRIBUTE_UNUSED,
     221  				  __m128 i14 ATTRIBUTE_UNUSED,
     222  				  __m128 i15 ATTRIBUTE_UNUSED,
     223  				  __m128 i16 ATTRIBUTE_UNUSED,
     224  				  __m128 i17 ATTRIBUTE_UNUSED,
     225  				  __m128 i18 ATTRIBUTE_UNUSED,
     226  				  __m128 i19 ATTRIBUTE_UNUSED)
     227  {
     228    /* Check argument values.  */
     229    compare (values.i0, i0, __m128);
     230    compare (values.i1, i1, __m128);
     231    compare (values.i2, i2, __m128);
     232    compare (values.i3, i3, __m128);
     233    compare (values.i4, i4, __m128);
     234    compare (values.i5, i5, __m128);
     235    compare (values.i6, i6, __m128);
     236    compare (values.i7, i7, __m128);
     237    compare (values.i8, i8, __m128);
     238    compare (values.i9, i9, __m128);
     239    compare (values.i10, i10, __m128);
     240    compare (values.i11, i11, __m128);
     241    compare (values.i12, i12, __m128);
     242    compare (values.i13, i13, __m128);
     243    compare (values.i14, i14, __m128);
     244    compare (values.i15, i15, __m128);
     245    compare (values.i16, i16, __m128);
     246    compare (values.i17, i17, __m128);
     247    compare (values.i18, i18, __m128);
     248    compare (values.i19, i19, __m128);
     249  }
     250  
     251  void
     252  fun_check_passing_m128h_20_values (__m128h i0 ATTRIBUTE_UNUSED,
     253  				   __m128h i1 ATTRIBUTE_UNUSED,
     254  				   __m128h i2 ATTRIBUTE_UNUSED,
     255  				   __m128h i3 ATTRIBUTE_UNUSED,
     256  				   __m128h i4 ATTRIBUTE_UNUSED,
     257  				   __m128h i5 ATTRIBUTE_UNUSED,
     258  				   __m128h i6 ATTRIBUTE_UNUSED,
     259  				   __m128h i7 ATTRIBUTE_UNUSED,
     260  				   __m128h i8 ATTRIBUTE_UNUSED,
     261  				   __m128h i9 ATTRIBUTE_UNUSED,
     262  				   __m128h i10 ATTRIBUTE_UNUSED,
     263  				   __m128h i11 ATTRIBUTE_UNUSED,
     264  				   __m128h i12 ATTRIBUTE_UNUSED,
     265  				   __m128h i13 ATTRIBUTE_UNUSED,
     266  				   __m128h i14 ATTRIBUTE_UNUSED,
     267  				   __m128h i15 ATTRIBUTE_UNUSED,
     268  				   __m128h i16 ATTRIBUTE_UNUSED,
     269  				   __m128h i17 ATTRIBUTE_UNUSED,
     270  				   __m128h i18 ATTRIBUTE_UNUSED,
     271  				   __m128h i19 ATTRIBUTE_UNUSED)
     272  {
     273    /* Check argument values.  */
     274    compare (values.i0, i0, __m128h);
     275    compare (values.i1, i1, __m128h);
     276    compare (values.i2, i2, __m128h);
     277    compare (values.i3, i3, __m128h);
     278    compare (values.i4, i4, __m128h);
     279    compare (values.i5, i5, __m128h);
     280    compare (values.i6, i6, __m128h);
     281    compare (values.i7, i7, __m128h);
     282    compare (values.i8, i8, __m128h);
     283    compare (values.i9, i9, __m128h);
     284    compare (values.i10, i10, __m128h);
     285    compare (values.i11, i11, __m128h);
     286    compare (values.i12, i12, __m128h);
     287    compare (values.i13, i13, __m128h);
     288    compare (values.i14, i14, __m128h);
     289    compare (values.i15, i15, __m128h);
     290    compare (values.i16, i16, __m128h);
     291    compare (values.i17, i17, __m128h);
     292    compare (values.i18, i18, __m128h);
     293    compare (values.i19, i19, __m128h);
     294  }
     295  
     296  void
     297  fun_check_passing_m128_20_regs (__m128 i0 ATTRIBUTE_UNUSED,
     298  				__m128 i1 ATTRIBUTE_UNUSED,
     299  				__m128 i2 ATTRIBUTE_UNUSED,
     300  				__m128 i3 ATTRIBUTE_UNUSED,
     301  				__m128 i4 ATTRIBUTE_UNUSED,
     302  				__m128 i5 ATTRIBUTE_UNUSED,
     303  				__m128 i6 ATTRIBUTE_UNUSED,
     304  				__m128 i7 ATTRIBUTE_UNUSED,
     305  				__m128 i8 ATTRIBUTE_UNUSED,
     306  				__m128 i9 ATTRIBUTE_UNUSED,
     307  				__m128 i10 ATTRIBUTE_UNUSED,
     308  				__m128 i11 ATTRIBUTE_UNUSED,
     309  				__m128 i12 ATTRIBUTE_UNUSED,
     310  				__m128 i13 ATTRIBUTE_UNUSED,
     311  				__m128 i14 ATTRIBUTE_UNUSED,
     312  				__m128 i15 ATTRIBUTE_UNUSED,
     313  				__m128 i16 ATTRIBUTE_UNUSED,
     314  				__m128 i17 ATTRIBUTE_UNUSED,
     315  				__m128 i18 ATTRIBUTE_UNUSED,
     316  				__m128 i19 ATTRIBUTE_UNUSED)
     317  {
     318    /* Check register contents.  */
     319    check_m128_arguments;
     320  }
     321  
     322  void
     323  fun_check_passing_m128h_20_regs (__m128h i0 ATTRIBUTE_UNUSED,
     324  				 __m128h i1 ATTRIBUTE_UNUSED,
     325  				 __m128h i2 ATTRIBUTE_UNUSED,
     326  				 __m128h i3 ATTRIBUTE_UNUSED,
     327  				 __m128h i4 ATTRIBUTE_UNUSED,
     328  				 __m128h i5 ATTRIBUTE_UNUSED,
     329  				 __m128h i6 ATTRIBUTE_UNUSED,
     330  				 __m128h i7 ATTRIBUTE_UNUSED,
     331  				 __m128h i8 ATTRIBUTE_UNUSED,
     332  				 __m128h i9 ATTRIBUTE_UNUSED,
     333  				 __m128h i10 ATTRIBUTE_UNUSED,
     334  				 __m128h i11 ATTRIBUTE_UNUSED,
     335  				 __m128h i12 ATTRIBUTE_UNUSED,
     336  				 __m128h i13 ATTRIBUTE_UNUSED,
     337  				 __m128h i14 ATTRIBUTE_UNUSED,
     338  				 __m128h i15 ATTRIBUTE_UNUSED,
     339  				 __m128h i16 ATTRIBUTE_UNUSED,
     340  				 __m128h i17 ATTRIBUTE_UNUSED,
     341  				 __m128h i18 ATTRIBUTE_UNUSED,
     342  				 __m128h i19 ATTRIBUTE_UNUSED)
     343  {
     344    /* Check register contents.  */
     345    check_m128_arguments;
     346  }
     347  
     348  #define def_check_int_passing8(_i0, _i1, _i2, _i3, \
     349  			       _i4, _i5, _i6, _i7, \
     350  			       _func1, _func2, TYPE) \
     351    values.i0.TYPE[0] = _i0; \
     352    values.i1.TYPE[0] = _i1; \
     353    values.i2.TYPE[0] = _i2; \
     354    values.i3.TYPE[0] = _i3; \
     355    values.i4.TYPE[0] = _i4; \
     356    values.i5.TYPE[0] = _i5; \
     357    values.i6.TYPE[0] = _i6; \
     358    values.i7.TYPE[0] = _i7; \
     359    WRAP_CALL(_func1) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7); \
     360    clear_float_registers; \
     361    fregs.F0.TYPE[0] = _i0; \
     362    fregs.F1.TYPE[0] = _i1; \
     363    fregs.F2.TYPE[0] = _i2; \
     364    fregs.F3.TYPE[0] = _i3; \
     365    fregs.F4.TYPE[0] = _i4; \
     366    fregs.F5.TYPE[0] = _i5; \
     367    fregs.F6.TYPE[0] = _i6; \
     368    fregs.F7.TYPE[0] = _i7; \
     369    num_fregs = 8; \
     370    WRAP_CALL(_func2) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7);
     371  
     372  #define def_check_int_passing20(_i0, _i1, _i2, _i3, _i4, _i5, _i6, \
     373  				_i7, _i8, _i9, _i10, _i11, _i12, _i13, \
     374  				_i14, _i15, _i16, _i17, _i18, _i19, \
     375  				_func1, _func2, TYPE) \
     376    values.i0.TYPE[0] = _i0; \
     377    values.i1.TYPE[0] = _i1; \
     378    values.i2.TYPE[0] = _i2; \
     379    values.i3.TYPE[0] = _i3; \
     380    values.i4.TYPE[0] = _i4; \
     381    values.i5.TYPE[0] = _i5; \
     382    values.i6.TYPE[0] = _i6; \
     383    values.i7.TYPE[0] = _i7; \
     384    values.i8.TYPE[0] = _i8; \
     385    values.i9.TYPE[0] = _i9; \
     386    values.i10.TYPE[0] = _i10; \
     387    values.i11.TYPE[0] = _i11; \
     388    values.i12.TYPE[0] = _i12; \
     389    values.i13.TYPE[0] = _i13; \
     390    values.i14.TYPE[0] = _i14; \
     391    values.i15.TYPE[0] = _i15; \
     392    values.i16.TYPE[0] = _i16; \
     393    values.i17.TYPE[0] = _i17; \
     394    values.i18.TYPE[0] = _i18; \
     395    values.i19.TYPE[0] = _i19; \
     396    WRAP_CALL(_func1) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, \
     397  		     _i9, _i10, _i11, _i12, _i13, _i14, _i15, _i16, \
     398  		     _i17, _i18, _i19); \
     399    clear_float_registers; \
     400    fregs.F0.TYPE[0] = _i0; \
     401    fregs.F1.TYPE[0] = _i1; \
     402    fregs.F2.TYPE[0] = _i2; \
     403    fregs.F3.TYPE[0] = _i3; \
     404    fregs.F4.TYPE[0] = _i4; \
     405    fregs.F5.TYPE[0] = _i5; \
     406    fregs.F6.TYPE[0] = _i6; \
     407    fregs.F7.TYPE[0] = _i7; \
     408    num_fregs = 8; \
     409    WRAP_CALL(_func2) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, \
     410  		     _i9, _i10, _i11, _i12, _i13, _i14, _i15, _i16, \
     411  		     _i17, _i18, _i19);
     412  
     413  void
     414  test_m64_on_stack ()
     415  {
     416    __m64 x[8];
     417    int i;
     418    for (i = 0; i < 8; i++)
     419      x[i] = (__m64){32 + i, 0};
     420    pass = "m64-8";
     421    def_check_int_passing8 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
     422  			  fun_check_passing_m64_8_values,
     423  			  fun_check_passing_m64_8_regs, _m64);
     424  }
     425  
     426  void
     427  test_too_many_m64 ()
     428  {
     429    __m64 x[20];
     430    int i;
     431    for (i = 0; i < 20; i++)
     432      x[i] = (__m64){32 + i, 0};
     433    pass = "m64-20";
     434    def_check_int_passing20 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
     435  			   x[8], x[9], x[10], x[11], x[12], x[13], x[14],
     436  			   x[15], x[16], x[17], x[18], x[19],
     437  			   fun_check_passing_m64_20_values,
     438  			   fun_check_passing_m64_20_regs, _m64);
     439  }
     440  
     441  void
     442  test_m128_on_stack ()
     443  {
     444    __m128 x[8];
     445    int i;
     446    for (i = 0; i < 8; i++)
     447      x[i] = (__m128){32 + i, 0, 0, 0};
     448    pass = "m128-8";
     449    def_check_int_passing8 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
     450  			  fun_check_passing_m128_8_values,
     451  			  fun_check_passing_m128_8_regs, _m128);
     452  }
     453  
     454  void
     455  test_m128h_on_stack ()
     456  {
     457    __m128h x[8];
     458    int i;
     459    for (i = 0; i < 8; i++)
     460      x[i] = (__m128h){1.1f16, 2.2f16, 3.3f16, 4.4f16, 5.5f16,
     461  	             6.6f16, 7.7f16, 8.8f16};
     462    pass = "m128h-8";
     463    def_check_int_passing8 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
     464  			  fun_check_passing_m128h_8_values,
     465  			  fun_check_passing_m128h_8_regs, _m128h);
     466  }
     467  
     468  void
     469  test_too_many_m128 ()
     470  {
     471    __m128 x[20];
     472    int i;
     473    for (i = 0; i < 20; i++)
     474      x[i] = (__m128){32 + i, 0, 0, 0};
     475    pass = "m128-20";
     476    def_check_int_passing20 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
     477  			   x[8], x[9], x[10], x[11], x[12], x[13], x[14],
     478  			   x[15], x[16], x[17], x[18], x[19],
     479  			   fun_check_passing_m128_20_values,
     480  			   fun_check_passing_m128_20_regs, _m128);
     481  }
     482  
     483  void
     484  test_too_many_m128h ()
     485  {
     486    __m128h x[20];
     487    int i;
     488    for (i = 0; i < 20; i++)
     489      x[i] = (__m128h){1.1f16, 2.2f16, 3.3f16, 4.4f16, 5.5f16,
     490  	             6.6f16, 7.7f16, 8.8f16};
     491    pass = "m128h-20";
     492    def_check_int_passing20 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
     493  			   x[8], x[9], x[10], x[11], x[12], x[13], x[14],
     494  			   x[15], x[16], x[17], x[18], x[19],
     495  			   fun_check_passing_m128h_20_values,
     496  			   fun_check_passing_m128h_20_regs, _m128h);
     497  }
     498  
     499  static void
     500  do_test (void)
     501  {
     502    test_m64_on_stack ();
     503    test_too_many_m64 ();
     504    test_m128_on_stack ();
     505    test_too_many_m128 ();
     506    test_m128h_on_stack ();
     507    test_too_many_m128h ();
     508    if (failed)
     509      abort ();
     510  }