a96cd94ae58fe9a54b6200ae1344dc8bbbd7cb98
[riscv-isa-sim.git] / softfloat / s_mul128To256.c
1
2 #include <stdint.h>
3 #include "platform.h"
4 #include "primitives.h"
5
6 struct uint256
7 softfloat_mul128To256( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
8 {
9 struct uint128 p0, p64, p128;
10 struct uint256 z;
11
12 p0 = softfloat_mul64To128( a0, b0 );
13 z.v0 = p0.v0;
14 p64 = softfloat_mul64To128( a64, b0 );
15 z.v64 = p64.v0 + p0.v64;
16 z.v128 = p64.v64 + ( z.v64 < p64.v0 );
17 p128 = softfloat_mul64To128( a64, b64 );
18 z.v128 += p128.v0;
19 z.v192 = p128.v64 + ( z.v128 < p128.v0 );
20 p64 = softfloat_mul64To128( a0, b64 );
21 z.v64 += p64.v0;
22 p64.v64 += ( z.v64 < p64.v0 );
23 z.v128 += p64.v64;
24 z.v192 += ( z.v128 < p64.v64 );
25 return z;
26
27 }
28