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 1161 : fd_uint384_t const * a ) { 19 1161 : ulong r5 = fd_ulong_bswap( a->limbs[0] ); 20 1161 : ulong r4 = fd_ulong_bswap( a->limbs[1] ); 21 1161 : ulong r3 = fd_ulong_bswap( a->limbs[2] ); 22 1161 : ulong r2 = fd_ulong_bswap( a->limbs[3] ); 23 1161 : ulong r1 = fd_ulong_bswap( a->limbs[4] ); 24 1161 : ulong r0 = fd_ulong_bswap( a->limbs[5] ); 25 1161 : r->limbs[5] = r5; 26 1161 : r->limbs[4] = r4; 27 1161 : r->limbs[3] = r3; 28 1161 : r->limbs[2] = r2; 29 1161 : r->limbs[1] = r1; 30 1161 : r->limbs[0] = r0; 31 1161 : return r; 32 1161 : } 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 753 : fd_uint384_t const * b ) { 38 753 : return ( a->limbs[0] == b->limbs[0] ) 39 753 : && ( a->limbs[1] == b->limbs[1] ) 40 753 : && ( a->limbs[2] == b->limbs[2] ) 41 753 : && ( a->limbs[3] == b->limbs[3] ) 42 753 : && ( a->limbs[4] == b->limbs[4] ) 43 753 : && ( a->limbs[5] == b->limbs[5] ); 44 753 : } 45 : 46 : /* fd_uint384_is_zero returns 1 if a == 0, 0 otherwise. */ 47 : static inline int 48 732 : fd_uint384_is_zero( fd_uint384_t const * a ) { 49 732 : return !( a->limbs[0] | a->limbs[1] | a->limbs[2] | 50 732 : a->limbs[3] | a->limbs[4] | a->limbs[5] ); 51 732 : } 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 981 : fd_uint384_t const * b ) { 57 1017 : for( int i=5; i>=0; i-- ) { 58 1011 : if( a->limbs[i] != b->limbs[i] ) { 59 975 : return a->limbs[i] > b->limbs[i] ? 1 : -1; 60 975 : } 61 1011 : } 62 6 : return 0; 63 981 : } 64 : 65 : #endif /* HEADER_fd_src_ballet_bigint_fd_uint384_h */