Line data Source code
1 : #ifndef HEADER_fd_src_ballet_bigint_fd_uint384_h 2 : #define HEADER_fd_src_ballet_bigint_fd_uint384_h 3 : 4 : /* Implementation of uint384. */ 5 : 6 : #include "../fd_ballet_base.h" 7 : 8 : /* Kept at the natural alignment, as our usecases like P-384 require that 9 : the limbs have no padding in between them. */ 10 : union fd_uint384 { 11 : ulong limbs[6]; 12 : uchar buf[48]; 13 : }; 14 : typedef union fd_uint384 fd_uint384_t; 15 : 16 : static inline fd_uint384_t * 17 : fd_uint384_bswap( fd_uint384_t * r, 18 0 : fd_uint384_t const * a ) { 19 0 : ulong r5 = fd_ulong_bswap( a->limbs[0] ); 20 0 : ulong r4 = fd_ulong_bswap( a->limbs[1] ); 21 0 : ulong r3 = fd_ulong_bswap( a->limbs[2] ); 22 0 : ulong r2 = fd_ulong_bswap( a->limbs[3] ); 23 0 : ulong r1 = fd_ulong_bswap( a->limbs[4] ); 24 0 : ulong r0 = fd_ulong_bswap( a->limbs[5] ); 25 0 : r->limbs[5] = r5; 26 0 : r->limbs[4] = r4; 27 0 : r->limbs[3] = r3; 28 0 : r->limbs[2] = r2; 29 0 : r->limbs[1] = r1; 30 0 : r->limbs[0] = r0; 31 0 : return r; 32 0 : } 33 : 34 : /* fd_uint384_eq returns 1 if a == b, 0 otherwise. */ 35 : static inline int 36 : fd_uint384_eq( fd_uint384_t const * a, 37 0 : fd_uint384_t const * b ) { 38 0 : return ( a->limbs[0] == b->limbs[0] ) 39 0 : && ( a->limbs[1] == b->limbs[1] ) 40 0 : && ( a->limbs[2] == b->limbs[2] ) 41 0 : && ( a->limbs[3] == b->limbs[3] ) 42 0 : && ( a->limbs[4] == b->limbs[4] ) 43 0 : && ( a->limbs[5] == b->limbs[5] ); 44 0 : } 45 : 46 : /* fd_uint384_is_zero returns 1 if a == 0, 0 otherwise. */ 47 : static inline int 48 0 : fd_uint384_is_zero( fd_uint384_t const * a ) { 49 0 : return !( a->limbs[0] | a->limbs[1] | a->limbs[2] | 50 0 : a->limbs[3] | a->limbs[4] | a->limbs[5] ); 51 0 : } 52 : 53 : /* fd_uint384_cmp returns 0 if a == b, -1 if a < b, 1 if a > b. */ 54 : static inline int 55 : fd_uint384_cmp( fd_uint384_t const * a, 56 0 : fd_uint384_t const * b ) { 57 0 : for( int i=5; i>=0; i-- ) { 58 0 : if( a->limbs[i] != b->limbs[i] ) { 59 0 : return a->limbs[i] > b->limbs[i] ? 1 : -1; 60 0 : } 61 0 : } 62 0 : return 0; 63 0 : } 64 : 65 : #endif /* HEADER_fd_src_ballet_bigint_fd_uint384_h */