Viewing file: test_varargs-m128.c (2.7 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* Test variable number of 128-bit vector arguments passed to functions. */
#include <stdio.h> #include "defines.h" #include "macros.h" #include "args.h"
struct IntegerRegisters iregs; struct FloatRegisters fregs;
/* This struct holds values for argument checking. */ struct { XMM_T i0, i1, i2, i3, i4, i5, i6, i7, i8, i9; } values;
char *pass; int failed = 0;
#undef assert #define assert(c) do { \ if (!(c)) {failed++; printf ("failed %s\n", pass); } \ } while (0)
#define compare(X1,X2,T) do { \ assert (memcmp (&X1, &X2, sizeof (T)) == 0); \ } while (0)
void fun_check_passing_m128_varargs (__m128 i0, __m128 i1, __m128 i2, __m128 i3, ...) { /* Check argument values. */ void **fp = __builtin_frame_address (0); void *ra = __builtin_return_address (0); __m128 *argp;
compare (values.i0, i0, __m128); compare (values.i1, i1, __m128); compare (values.i2, i2, __m128); compare (values.i3, i3, __m128);
/* Get the pointer to the return address on stack. */ while (*fp != ra) fp++;
/* Skip the return address stack slot. */ argp = (__m128 *) (((char *) fp) + 8);
/* Check __m128 arguments passed on stack. */ compare (values.i8, argp[0], __m128); compare (values.i9, argp[1], __m128);
/* Check register contents. */ compare (fregs.xmm0, xmm_regs[0], __m128); compare (fregs.xmm1, xmm_regs[1], __m128); compare (fregs.xmm2, xmm_regs[2], __m128); compare (fregs.xmm3, xmm_regs[3], __m128); compare (fregs.xmm4, xmm_regs[4], __m128); compare (fregs.xmm5, xmm_regs[5], __m128); compare (fregs.xmm6, xmm_regs[6], __m128); compare (fregs.xmm7, xmm_regs[7], __m128); }
#define def_check_int_passing_varargs(_i0, _i1, _i2, _i3, _i4, _i5, \ _i6, _i7, _i8, _i9, \ _func, TYPE) \ values.i0.TYPE[0] = _i0; \ values.i1.TYPE[0] = _i1; \ values.i2.TYPE[0] = _i2; \ values.i3.TYPE[0] = _i3; \ values.i4.TYPE[0] = _i4; \ values.i5.TYPE[0] = _i5; \ values.i6.TYPE[0] = _i6; \ values.i7.TYPE[0] = _i7; \ values.i8.TYPE[0] = _i8; \ values.i9.TYPE[0] = _i9; \ clear_float_registers; \ fregs.F0.TYPE[0] = _i0; \ fregs.F1.TYPE[0] = _i1; \ fregs.F2.TYPE[0] = _i2; \ fregs.F3.TYPE[0] = _i3; \ fregs.F4.TYPE[0] = _i4; \ fregs.F5.TYPE[0] = _i5; \ fregs.F6.TYPE[0] = _i6; \ fregs.F7.TYPE[0] = _i7; \ WRAP_CALL(_func) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, _i9);
void test_m128_varargs (void) { __m128 x[10]; int i; for (i = 0; i < 10; i++) x[i] = (__m128){32+i, 0, 0, 0}; pass = "m128-varargs"; def_check_int_passing_varargs (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], fun_check_passing_m128_varargs, _m128); }
int main (void) { test_m128_varargs (); if (failed) abort (); return 0; }
|