LCOV - code coverage report
Current view: top level - ballet/bigint - fd_uint384.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 35 35 100.0 %
Date: 2026-09-17 04:28:31 Functions: 4 4 100.0 %

          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 */

Generated by: LCOV version 1.14