LCOV - code coverage report
Current view: top level - util/simd - fd_avx512_wwb.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 51 54 94.4 %
Date: 2025-09-18 04:41:32 Functions: 6 352 1.7 %

          Line data    Source code
       1             : #ifndef HEADER_fd_src_util_simd_fd_avx512_h
       2             : #error "Do not include this directly; use fd_avx512.h"
       3             : #endif
       4             : 
       5             : /* Vector byte API *****************************************************/
       6             : 
       7             : /* A wwb_t is a vector where each 8-bit wide lane holds an unsigned
       8             :    8-bit integer (a "uchar").
       9             : 
      10             :    These mirror the other APIs as much as possible.  Macros are
      11             :    preferred over static inlines when it is possible to do it robustly
      12             :    to reduce the risk of the compiler mucking it up. */
      13             : 
      14   637513552 : #define wwb_t __m512i
      15             : 
      16             : /* Constructors */
      17             : 
      18             : /* Given the uchar values, return ... */
      19             : 
      20             : #define wwb(b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10,b11,b12,b13,b14,b15,                                                \
      21             :             b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,                                                \
      22             :             b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,                                                \
      23             :             b48,b49,b50,b51,b52,b53,b54,b55,b56,b57,b58,b59,b60,b61,b62,b63) /* [ b0 b1 ... b63 ] */                        \
      24      196608 :   _mm512_set_epi8( (char)(b63), (char)(b62), (char)(b61), (char)(b60), (char)(b59), (char)(b58), (char)(b57), (char)(b56), \
      25      196608 :                    (char)(b55), (char)(b54), (char)(b53), (char)(b52), (char)(b51), (char)(b50), (char)(b49), (char)(b48), \
      26      196608 :                    (char)(b47), (char)(b46), (char)(b45), (char)(b44), (char)(b43), (char)(b42), (char)(b41), (char)(b40), \
      27      196608 :                    (char)(b39), (char)(b38), (char)(b37), (char)(b36), (char)(b35), (char)(b34), (char)(b33), (char)(b32), \
      28      196608 :                    (char)(b31), (char)(b30), (char)(b29), (char)(b28), (char)(b27), (char)(b26), (char)(b25), (char)(b24), \
      29      196608 :                    (char)(b23), (char)(b22), (char)(b21), (char)(b20), (char)(b19), (char)(b18), (char)(b17), (char)(b16), \
      30      196608 :                    (char)(b15), (char)(b14), (char)(b13), (char)(b12), (char)(b11), (char)(b10), (char)( b9), (char)( b8), \
      31      196608 :                    (char)( b7), (char)( b6), (char)( b5), (char)( b4), (char)( b3), (char)( b2), (char)( b1), (char)( b0) )
      32             : 
      33             : #define wwb_bcast(b0) _mm512_set1_epi8( (char)(b0) ) /* [ b0 b0 ... b0 ] */
      34             : 
      35             : static inline wwb_t /* [ b0 b1 b0 b1 ... b0 b1 ] */
      36       65536 : wwb_bcast_pair( uchar b0, uchar b1 ) {
      37       65536 :   return _mm512_set_epi8( (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0),
      38       65536 :                           (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0),
      39       65536 :                           (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0),
      40       65536 :                           (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0),
      41       65536 :                           (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0),
      42       65536 :                           (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0),
      43       65536 :                           (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0),
      44       65536 :                           (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0), (char)(b1), (char)(b0) );
      45       65536 : }
      46             : 
      47             : static inline wwb_t /* [ b0 b1 b2 b3 b0 b1 b2 b3 ... b0 b1 b2 b3 ] */
      48       65536 : wwb_bcast_quad( uchar b0, uchar b1, uchar b2, uchar b3 ) {
      49       65536 :   return _mm512_set_epi8( (char)(b3), (char)(b2), (char)(b1), (char)(b0), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      50       65536 :                           (char)(b3), (char)(b2), (char)(b1), (char)(b0), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      51       65536 :                           (char)(b3), (char)(b2), (char)(b1), (char)(b0), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      52       65536 :                           (char)(b3), (char)(b2), (char)(b1), (char)(b0), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      53       65536 :                           (char)(b3), (char)(b2), (char)(b1), (char)(b0), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      54       65536 :                           (char)(b3), (char)(b2), (char)(b1), (char)(b0), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      55       65536 :                           (char)(b3), (char)(b2), (char)(b1), (char)(b0), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      56       65536 :                           (char)(b3), (char)(b2), (char)(b1), (char)(b0), (char)(b3), (char)(b2), (char)(b1), (char)(b0) );
      57       65536 : }
      58             : 
      59             : static inline wwb_t /* [ b0 b1 ... b7 b0 b1 ... b7 b0 b1 ... b7 b0 b1 ... b7 ] */
      60       65536 : wwb_bcast_oct( uchar b0, uchar b1, uchar b2, uchar b3, uchar b4, uchar b5, uchar b6, uchar b7 ) {
      61       65536 :   return _mm512_set_epi8( (char)(b7), (char)(b6), (char)(b5), (char)(b4), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      62       65536 :                           (char)(b7), (char)(b6), (char)(b5), (char)(b4), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      63       65536 :                           (char)(b7), (char)(b6), (char)(b5), (char)(b4), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      64       65536 :                           (char)(b7), (char)(b6), (char)(b5), (char)(b4), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      65       65536 :                           (char)(b7), (char)(b6), (char)(b5), (char)(b4), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      66       65536 :                           (char)(b7), (char)(b6), (char)(b5), (char)(b4), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      67       65536 :                           (char)(b7), (char)(b6), (char)(b5), (char)(b4), (char)(b3), (char)(b2), (char)(b1), (char)(b0),
      68       65536 :                           (char)(b7), (char)(b6), (char)(b5), (char)(b4), (char)(b3), (char)(b2), (char)(b1), (char)(b0) );
      69       65536 : }
      70             : 
      71             : static inline wwb_t /* [ b0 b1 ... b15 b0 b1 ... b15 ] */
      72             : wwb_bcast_hex( uchar b0, uchar b1, uchar b2,  uchar b3,  uchar b4,  uchar b5,  uchar b6,  uchar b7,
      73  1274830496 :                uchar b8, uchar b9, uchar b10, uchar b11, uchar b12, uchar b13, uchar b14, uchar b15 ) {
      74  1274830496 :   return _mm512_set_epi8( (char)(b15), (char)(b14), (char)(b13), (char)(b12), (char)(b11), (char)(b10), (char)(b9), (char)(b8),
      75  1274830496 :                           (char)(b7),  (char)(b6),  (char)(b5),  (char)(b4),  (char)(b3),  (char)(b2),  (char)(b1), (char)(b0),
      76  1274830496 :                           (char)(b15), (char)(b14), (char)(b13), (char)(b12), (char)(b11), (char)(b10), (char)(b9), (char)(b8),
      77  1274830496 :                           (char)(b7),  (char)(b6),  (char)(b5),  (char)(b4),  (char)(b3),  (char)(b2),  (char)(b1), (char)(b0),
      78  1274830496 :                           (char)(b15), (char)(b14), (char)(b13), (char)(b12), (char)(b11), (char)(b10), (char)(b9), (char)(b8),
      79  1274830496 :                           (char)(b7),  (char)(b6),  (char)(b5),  (char)(b4),  (char)(b3),  (char)(b2),  (char)(b1), (char)(b0),
      80  1274830496 :                           (char)(b15), (char)(b14), (char)(b13), (char)(b12), (char)(b11), (char)(b10), (char)(b9), (char)(b8),
      81  1274830496 :                           (char)(b7),  (char)(b6),  (char)(b5),  (char)(b4),  (char)(b3),  (char)(b2),  (char)(b1), (char)(b0) );
      82  1274830496 : }
      83             : 
      84             : 
      85             : #define wwb_exch_adj(x)      /* [ b1 b0 b3 b2 ... b63 b62 ] */ \
      86             :   _mm512_shuffle_epi8( (x), wwb_bcast_hex( 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 ) )
      87             : 
      88             : #define wwb_exch_adj_pair(x) /* [ b2 b3 b0 b1 .. b62 b63 b60 b61 ] */ \
      89   637316944 :   _mm512_shuffle_epi8( (x), wwb_bcast_hex( 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13 ) )
      90             : 
      91             : /* Predefined constants */
      92             : 
      93             : #define wwb_zero() _mm512_setzero_si512() /* Return [ 0 0 ... 0 ] */
      94             : #define wwb_one()  _mm512_set1_epi8( 1 )  /* Return [ 1 1 ... 1 ] */
      95             : 
      96             : /* Bit operations */
      97             : 
      98             : #define wwb_not(a) _mm512_xor_si512( _mm512_set1_epi32( -1 ), (a) ) /* [ ~a0 ~a1 ... ~a63 ] */
      99             : 
     100             : #define wwb_shl(a,imm) wwb_and( _mm512_slli_epi16( (a), (imm) ), wwb_bcast( (uchar)(0xFFUL << (imm)) ) ) /* [ a0<<imm a1<<imm ... a63<<imm ] */
     101             : #define wwb_shr(a,imm) wwb_and( _mm512_srli_epi16( (a), (imm) ), wwb_bcast( (uchar)(0xFFUL >> (imm)) ) ) /* [ a0>>imm a1>>imm ... a63>>imm ] */
     102             : 
     103             : #define wwb_and(a,b)    _mm512_and_si512(    (a), (b) ) /* [   a0 &b0    a1& b1 ...   a63& b63 ] */
     104             : #define wwb_andnot(a,b) _mm512_andnot_si512( (a), (b) ) /* [ (~a0)&b0  (~a1)&b1 ... (~a63)&b63 ] */
     105             : #define wwb_or(a,b)     _mm512_or_si512(     (a), (b) ) /* [   a0 |b0    a1 |b1 ...   a63 |b63 ] */
     106             : #define wwb_xor(a,b)    _mm512_xor_si512(    (a), (b) ) /* [   a0 ^b0    a1 ^b1 ...   a63 ^b63 ] */
     107             : 
     108             : /* Memory operations */
     109             : 
     110             : /* wwb_ld returns the 64 uchars at the 64-byte aligned / 64-byte sized
     111             :    location p as a vector uchar.  wwb_ldu is the same but p does not
     112             :    have to be aligned.  wwb_st writes the vector uchar to the 64-byte
     113             :    aligned / 64-byte sized location p as 64 uchars.  wwb_stu is the same
     114             :    but p does not have to be aligned.  In all these lane l will be at
     115             :    p[l].  FIXME: USE ATTRIBUTES ON P PASSED TO THESE?
     116             : 
     117             :    Note: gcc knows a __m512i may alias. */
     118             : 
     119           0 : static inline wwb_t wwb_ld( uchar const * p ) { return _mm512_load_si512( (__m512i const *)p ); }
     120     2031618 : static inline void  wwb_st( uchar * p, wwb_t i ) { _mm512_store_si512( (__m512i *)p, i ); }
     121             : 
     122           0 : static inline wwb_t wwb_ldu( uchar const * p ) { return _mm512_loadu_si512( (__m512i const *)p ); }
     123           0 : static inline void  wwb_stu( uchar * p, wwb_t i ) { _mm512_storeu_si512( (__m512i *)p, i ); }

Generated by: LCOV version 1.14