Line data Source code
1 : #ifndef HEADER_fd_src_util_simd_test_avx512_h
2 : #define HEADER_fd_src_util_simd_test_avx512_h
3 :
4 : /* This header provides common functionality for the various AVX-512
5 : unit tests */
6 :
7 : #include "../fd_util.h"
8 : #include "fd_avx512.h"
9 :
10 : FD_STATIC_ASSERT( WW_WIDTH ==16, unit_test );
11 : FD_STATIC_ASSERT( WW_FOOTPRINT ==64, unit_test );
12 : FD_STATIC_ASSERT( WW_ALIGN ==64, unit_test );
13 : FD_STATIC_ASSERT( WW_LG_WIDTH == 4, unit_test );
14 : FD_STATIC_ASSERT( WW_LG_FOOTPRINT== 6, unit_test );
15 : FD_STATIC_ASSERT( WW_LG_ALIGN == 6, unit_test );
16 :
17 128000000 : #define WWI_TEST( x, x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf ) do { \
18 128000000 : int _t[16] WW_ATTR; \
19 128000000 : int _u[16] WW_ATTR; \
20 128000000 : wwi_st( _t, (x) ); \
21 128000000 : _u[ 0] = (x0); _u[ 1] = (x1); _u[ 2] = (x2); _u[ 3] = (x3); _u[ 4] = (x4); _u[ 5] = (x5); _u[ 6] = (x6); _u[ 7] = (x7); \
22 128000000 : _u[ 8] = (x8); _u[ 9] = (x9); _u[10] = (xa); _u[11] = (xb); _u[12] = (xc); _u[13] = (xd); _u[14] = (xe); _u[15] = (xf); \
23 2176000000 : for( int _lane=0; _lane<16; _lane++ ) \
24 2048000000 : if( FD_UNLIKELY( _t[_lane]!=_u[_lane] ) ) \
25 2048000000 : FD_LOG_ERR(( "FAIL: %s @ lane %i\n\t" \
26 128000000 : " got 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x " \
27 128000000 : "0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n\t" \
28 128000000 : " exp 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x " \
29 128000000 : "0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x", \
30 128000000 : #x, _lane, \
31 128000000 : (uint)_t[ 0], (uint)_t[ 1], (uint)_t[ 2], (uint)_t[ 3], (uint)_t[ 4], (uint)_t[ 5], (uint)_t[ 6], (uint)_t[ 7], \
32 128000000 : (uint)_t[ 8], (uint)_t[ 9], (uint)_t[10], (uint)_t[11], (uint)_t[12], (uint)_t[13], (uint)_t[14], (uint)_t[15], \
33 128000000 : (uint)_u[ 0], (uint)_u[ 1], (uint)_u[ 2], (uint)_u[ 3], (uint)_u[ 4], (uint)_u[ 5], (uint)_u[ 6], (uint)_u[ 7], \
34 128000000 : (uint)_u[ 8], (uint)_u[ 9], (uint)_u[10], (uint)_u[11], (uint)_u[12], (uint)_u[13], (uint)_u[14], (uint)_u[15] )); \
35 128000000 : } while(0)
36 :
37 127000000 : #define WWU_TEST( x, x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf ) do { \
38 127000000 : uint _t[16] WW_ATTR; \
39 127000000 : uint _u[16] WW_ATTR; \
40 127000000 : wwu_st( _t, (x) ); \
41 127000000 : _u[ 0] = (x0); _u[ 1] = (x1); _u[ 2] = (x2); _u[ 3] = (x3); _u[ 4] = (x4); _u[ 5] = (x5); _u[ 6] = (x6); _u[ 7] = (x7); \
42 127000000 : _u[ 8] = (x8); _u[ 9] = (x9); _u[10] = (xa); _u[11] = (xb); _u[12] = (xc); _u[13] = (xd); _u[14] = (xe); _u[15] = (xf); \
43 2159000000 : for( int _lane=0; _lane<16; _lane++ ) \
44 2032000000 : if( FD_UNLIKELY( _t[_lane]!=_u[_lane] ) ) \
45 2032000000 : FD_LOG_ERR(( "FAIL: %s @ lane %i\n\t" \
46 127000000 : " got 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU " \
47 127000000 : "0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU\n\t" \
48 127000000 : " exp 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU " \
49 127000000 : "0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU 0x%08xU", \
50 127000000 : #x, _lane, \
51 127000000 : _t[ 0], _t[ 1], _t[ 2], _t[ 3], _t[ 4], _t[ 5], _t[ 6], _t[ 7], \
52 127000000 : _t[ 8], _t[ 9], _t[10], _t[11], _t[12], _t[13], _t[14], _t[15], \
53 127000000 : _u[ 0], _u[ 1], _u[ 2], _u[ 3], _u[ 4], _u[ 5], _u[ 6], _u[ 7], \
54 127000000 : _u[ 8], _u[ 9], _u[10], _u[11], _u[12], _u[13], _u[14], _u[15] )); \
55 127000000 : } while(0)
56 :
57 189000000 : #define WWL_TEST( x, x0,x1,x2,x3,x4,x5,x6,x7 ) do { \
58 189000000 : long _t[8] WW_ATTR; \
59 189000000 : long _u[8] WW_ATTR; \
60 189000000 : wwl_st( _t, (x) ); \
61 189000000 : _u[0] = (x0); _u[1] = (x1); _u[2] = (x2); _u[3] = (x3); _u[4] = (x4); _u[5] = (x5); _u[6] = (x6); _u[7] = (x7); \
62 1701000000 : for( int _lane=0; _lane<8; _lane++ ) \
63 1512000000 : if( FD_UNLIKELY( _t[_lane]!=_u[_lane] ) ) \
64 1512000000 : FD_LOG_ERR(( "FAIL: %s @ lane %i\n\t" \
65 189000000 : " got 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL\n\t" \
66 189000000 : " exp 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL 0x%016lxL", \
67 189000000 : #x, _lane, \
68 189000000 : (ulong)_t[0], (ulong)_t[1], (ulong)_t[2], (ulong)_t[3], \
69 189000000 : (ulong)_t[4], (ulong)_t[5], (ulong)_t[6], (ulong)_t[7], \
70 189000000 : (ulong)_u[0], (ulong)_u[1], (ulong)_u[2], (ulong)_u[3], \
71 189000000 : (ulong)_u[4], (ulong)_u[5], (ulong)_u[6], (ulong)_u[7] )); \
72 189000000 : } while(0)
73 :
74 188000000 : #define WWV_TEST( x, x0,x1,x2,x3,x4,x5,x6,x7 ) do { \
75 188000000 : ulong _t[8] WW_ATTR; \
76 188000000 : ulong _u[8] WW_ATTR; \
77 188000000 : wwv_st( _t, (x) ); \
78 188000000 : _u[0] = (x0); _u[1] = (x1); _u[2] = (x2); _u[3] = (x3); _u[4] = (x4); _u[5] = (x5); _u[6] = (x6); _u[7] = (x7); \
79 1692000000 : for( int _lane=0; _lane<8; _lane++ ) \
80 1504000000 : if( FD_UNLIKELY( _t[_lane]!=_u[_lane] ) ) \
81 1504000000 : FD_LOG_ERR(( "FAIL: %s @ lane %i\n\t" \
82 188000000 : " got 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL\n\t" \
83 188000000 : " exp 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL 0x%016lxUL", \
84 188000000 : #x, _lane, \
85 188000000 : _t[0], _t[1], _t[2], _t[3], _t[4], _t[5], _t[6], _t[7], \
86 188000000 : _u[0], _u[1], _u[2], _u[3], _u[4], _u[5], _u[6], _u[7] )); \
87 188000000 : } while(0)
88 :
89 2031618 : #define WWB_TEST( x, u ) do { \
90 2031618 : uchar const * _u = u; \
91 2031618 : uchar _t[64] WW_ATTR; \
92 2031618 : wwb_st( _t, (x) ); \
93 132055170 : for( int _lane=0; _lane<64; _lane++ ) \
94 130023552 : if( FD_UNLIKELY( _t[_lane]!=_u[_lane] ) ) \
95 130023552 : FD_LOG_ERR(( "FAIL: %s @ lane %i\n\t" \
96 2031618 : " got %02x %02x %02x %02x %02x %02x %02x %02x " \
97 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
98 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
99 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
100 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
101 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
102 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
103 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x\n\t" \
104 2031618 : " exp %02x %02x %02x %02x %02x %02x %02x %02x " \
105 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
106 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
107 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
108 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
109 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
110 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x " \
111 2031618 : "%02x %02x %02x %02x %02x %02x %02x %02x", \
112 2031618 : #x, _lane, \
113 2031618 : _t[ 0], _t[ 1], _t[ 2], _t[ 3], _t[ 4], _t[ 5], _t[ 6], _t[ 7], \
114 2031618 : _t[ 8], _t[ 9], _t[10], _t[11], _t[12], _t[13], _t[14], _t[15], \
115 2031618 : _t[16], _t[17], _t[18], _t[19], _t[20], _t[21], _t[22], _t[23], \
116 2031618 : _t[24], _t[25], _t[26], _t[27], _t[28], _t[29], _t[30], _t[31], \
117 2031618 : _t[32], _t[33], _t[34], _t[35], _t[36], _t[37], _t[38], _t[39], \
118 2031618 : _t[40], _t[41], _t[42], _t[43], _t[44], _t[45], _t[46], _t[47], \
119 2031618 : _t[48], _t[49], _t[50], _t[51], _t[52], _t[53], _t[54], _t[55], \
120 2031618 : _t[56], _t[57], _t[58], _t[59], _t[60], _t[61], _t[62], _t[63], \
121 2031618 : _u[ 0], _u[ 1], _u[ 2], _u[ 3], _u[ 4], _u[ 5], _u[ 6], _u[ 7], \
122 2031618 : _u[ 8], _u[ 9], _u[10], _u[11], _u[12], _u[13], _u[14], _u[15], \
123 2031618 : _u[16], _u[17], _u[18], _u[19], _u[20], _u[21], _u[22], _u[23], \
124 2031618 : _u[24], _u[25], _u[26], _u[27], _u[28], _u[29], _u[30], _u[31], \
125 2031618 : _u[32], _u[33], _u[34], _u[35], _u[36], _u[37], _u[38], _u[39], \
126 2031618 : _u[40], _u[41], _u[42], _u[43], _u[44], _u[45], _u[46], _u[47], \
127 2031618 : _u[48], _u[49], _u[50], _u[51], _u[52], _u[53], _u[54], _u[55], \
128 2031618 : _u[56], _u[57], _u[58], _u[59], _u[60], _u[61], _u[62], _u[63] )); \
129 2031618 : } while(0)
130 :
131 : /* Some utility macros for testing functions that need compile time
132 : values.
133 : EXPAND_n( F, j ) expands F n times with j, j+1, ..., j+n-1 as the
134 : argument (not a literal, but a compile time constant).
135 :
136 : COMPARE_n( C, p, fn1, fn2, j ) uses comparator function C to test the
137 : result of fn1(p, j) against fn2(p0, j), fn2(p1, j), ... fn3(p{n-1},
138 : j), where the counters for p, the prefix, are in hex. C must take
139 : n+1 arguments. */
140 :
141 96000000 : #define EXPAND_4( F, j) F(j) F((j)+1) F((j)+2) F((j)+3)
142 24000000 : #define EXPAND_16(F, j) EXPAND_4( F, (j)) EXPAND_4( F, (j)+ 4) EXPAND_4( F, (j)+ 8) EXPAND_4( F, (j)+12)
143 12000000 : #define EXPAND_32(F, j) EXPAND_16(F, (j)) EXPAND_16(F, (j)+16)
144 4000000 : #define EXPAND_64(F, j) EXPAND_32(F, (j)) EXPAND_32(F, (j)+32)
145 :
146 256000000 : #define COMPARE8( C, p, fn1, fn2, j) C( fn1(p, j), fn2( p##0, j ), fn2( p##1, j ), fn2( p##2, j ), fn2( p##3, j ), \
147 256000000 : fn2( p##4, j ), fn2( p##5, j ), fn2( p##6, j ), fn2( p##7, j ) )
148 :
149 128000000 : #define COMPARE16(C, p, fn1, fn2, j) C( fn1(p, j), fn2( p##0, j ), fn2( p##1, j ), fn2( p##2, j ), fn2( p##3, j ), \
150 128000000 : fn2( p##4, j ), fn2( p##5, j ), fn2( p##6, j ), fn2( p##7, j ), \
151 128000000 : fn2( p##8, j ), fn2( p##9, j ), fn2( p##a, j ), fn2( p##b, j ), \
152 128000000 : fn2( p##c, j ), fn2( p##d, j ), fn2( p##e, j ), fn2( p##f, j ) )
153 :
154 :
155 : #endif /* HEADER_fd_src_util_simd_test_avx512_h */
|