[xcc] minor performance tweaks
[riscv-isa-sim.git] / softfloat / f32_to_i32.c
1
2 #include <stdbool.h>
3 #include <stdint.h>
4 #include "platform.h"
5 #include "primitives.h"
6 #include "internals.h"
7 #include "softfloat.h"
8
9 int_fast32_t f32_to_i32( float32_t a, int_fast8_t roundingMode, bool exact )
10 {
11 union ui32_f32 uA;
12 uint_fast32_t uiA;
13 bool sign;
14 int_fast16_t exp;
15 uint_fast32_t sig;
16 uint_fast64_t sig64;
17 int_fast16_t shiftCount;
18
19 uA.f = a;
20 uiA = uA.ui;
21 sign = signF32UI( uiA );
22 exp = expF32UI( uiA );
23 sig = fracF32UI( uiA );
24 if ( ( exp == 0xFF ) && sig ) sign = 0;
25 if ( exp ) sig |= 0x00800000;
26 sig64 = (uint_fast64_t) sig<<32;
27 shiftCount = 0xAF - exp;
28 if ( 0 < shiftCount ) {
29 sig64 = softfloat_shift64RightJam( sig64, shiftCount );
30 }
31 return softfloat_roundPackToI32( sign, sig64, roundingMode, exact );
32
33 }
34