Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
s_mul128MTo256M.c File Reference
#include <stdint.h>
#include "platform.h"
#include "primitiveTypes.h"
Include dependency graph for s_mul128MTo256M.c:

Go to the source code of this file.

Functions

void softfloat_mul128MTo256M (const uint32_t *aPtr, const uint32_t *bPtr, uint32_t *zPtr)
 

Function Documentation

◆ softfloat_mul128MTo256M()

void softfloat_mul128MTo256M ( const uint32_t * aPtr,
const uint32_t * bPtr,
uint32_t * zPtr )

Definition at line 44 of file s_mul128MTo256M.c.

46{
47 uint32_t *lastZPtr, wordB;
48 uint64_t dwordProd;
49 uint32_t wordZ;
50 uint_fast8_t carry;
51
52 bPtr += indexWordLo( 4 );
53 lastZPtr = zPtr + indexMultiwordHi( 8, 5 );
54 zPtr += indexMultiwordLo( 8, 5 );
55 wordB = *bPtr;
56 dwordProd = (uint64_t) aPtr[indexWord( 4, 0 )] * wordB;
57 zPtr[indexWord( 5, 0 )] = dwordProd;
58 dwordProd = (uint64_t) aPtr[indexWord( 4, 1 )] * wordB + (dwordProd>>32);
59 zPtr[indexWord( 5, 1 )] = dwordProd;
60 dwordProd = (uint64_t) aPtr[indexWord( 4, 2 )] * wordB + (dwordProd>>32);
61 zPtr[indexWord( 5, 2 )] = dwordProd;
62 dwordProd = (uint64_t) aPtr[indexWord( 4, 3 )] * wordB + (dwordProd>>32);
63 zPtr[indexWord( 5, 3 )] = dwordProd;
64 zPtr[indexWord( 5, 4 )] = dwordProd>>32;
65 do {
66 bPtr += wordIncr;
67 zPtr += wordIncr;
68 wordB = *bPtr;
69 dwordProd = (uint64_t) aPtr[indexWord( 4, 0 )] * wordB;
70 wordZ = zPtr[indexWord( 5, 0 )] + (uint32_t) dwordProd;
71 zPtr[indexWord( 5, 0 )] = wordZ;
72 carry = (wordZ < (uint32_t) dwordProd);
73 dwordProd =
74 (uint64_t) aPtr[indexWord( 4, 1 )] * wordB + (dwordProd>>32);
75 wordZ = zPtr[indexWord( 5, 1 )] + (uint32_t) dwordProd + carry;
76 zPtr[indexWord( 5, 1 )] = wordZ;
77 if ( wordZ != (uint32_t) dwordProd ) {
78 carry = (wordZ < (uint32_t) dwordProd);
79 }
80 dwordProd =
81 (uint64_t) aPtr[indexWord( 4, 2 )] * wordB + (dwordProd>>32);
82 wordZ = zPtr[indexWord( 5, 2 )] + (uint32_t) dwordProd + carry;
83 zPtr[indexWord( 5, 2 )] = wordZ;
84 if ( wordZ != (uint32_t) dwordProd ) {
85 carry = (wordZ < (uint32_t) dwordProd);
86 }
87 dwordProd =
88 (uint64_t) aPtr[indexWord( 4, 3 )] * wordB + (dwordProd>>32);
89 wordZ = zPtr[indexWord( 5, 3 )] + (uint32_t) dwordProd + carry;
90 zPtr[indexWord( 5, 3 )] = wordZ;
91 if ( wordZ != (uint32_t) dwordProd ) {
92 carry = (wordZ < (uint32_t) dwordProd);
93 }
94 zPtr[indexWord( 5, 4 )] = (dwordProd>>32) + carry;
95 } while ( zPtr != lastZPtr );
96
97}
#define indexMultiwordHi(total, n)
#define indexMultiwordLo(total, n)
#define wordIncr
#define indexWordLo(total)
#define indexWord(total, n)
unsigned int uint32_t
Definition stdint.h:126
uint8_t uint_fast8_t
Definition stdint.h:154
unsigned __int64 uint64_t
Definition stdint.h:136