[xcc] minor performance tweaks
[riscv-isa-sim.git] / softfloat / s_mul64To128.c
1
2 #include <stdint.h>
3 #include "platform.h"
4 #include "primitives.h"
5
6 struct uint128 softfloat_mul64To128( uint64_t a, uint64_t b )
7 {
8 uint32_t a32, a0, b32, b0;
9 struct uint128 z;
10 uint64_t mid1, mid2, mid;
11
12 a32 = a>>32;
13 a0 = a;
14 b32 = b>>32;
15 b0 = b;
16 z.v0 = (uint64_t) a0 * b0;
17 mid1 = (uint64_t) a32 * b0;
18 mid2 = (uint64_t) a0 * b32;
19 z.v64 = (uint64_t) a32 * b32;
20 mid = mid1 + mid2;
21 z.v64 += ( (uint64_t) ( mid < mid1 ) )<<32 | mid>>32;
22 mid <<= 32;
23 z.v0 += mid;
24 z.v64 += ( z.v0 < mid );
25 return z;
26
27 }
28