Merge pull request #156 from p12nGH/noncontiguous_harts
[riscv-isa-sim.git] / softfloat / f128_classify.c
1
2 #include <stdbool.h>
3 #include <stdint.h>
4 #include "platform.h"
5 #include "internals.h"
6 #include "specialize.h"
7 #include "softfloat.h"
8
9 uint_fast16_t f128_classify( float128_t a )
10 {
11 union ui128_f128 uA;
12 uint_fast64_t uiA64, uiA0;
13
14 uA.f = a;
15 uiA64 = uA.ui.v64;
16 uiA0 = uA.ui.v0;
17
18 uint_fast16_t infOrNaN = expF128UI64( uiA64 ) == 0x7FFF;
19 uint_fast16_t subnormalOrZero = expF128UI64( uiA64 ) == 0;
20 bool sign = signF128UI64( uiA64 );
21 bool fracZero = fracF128UI64( uiA64 ) == 0 && uiA0 == 0;
22 bool isNaN = isNaNF128UI( uiA64, uiA0 );
23 bool isSNaN = softfloat_isSigNaNF128UI( uiA64, uiA0 );
24
25 return
26 ( sign && infOrNaN && fracZero ) << 0 |
27 ( sign && !infOrNaN && !subnormalOrZero ) << 1 |
28 ( sign && subnormalOrZero && !fracZero ) << 2 |
29 ( sign && subnormalOrZero && fracZero ) << 3 |
30 ( !sign && infOrNaN && fracZero ) << 7 |
31 ( !sign && !infOrNaN && !subnormalOrZero ) << 6 |
32 ( !sign && subnormalOrZero && !fracZero ) << 5 |
33 ( !sign && subnormalOrZero && fracZero ) << 4 |
34 ( isNaN && isSNaN ) << 8 |
35 ( isNaN && !isSNaN ) << 9;
36 }
37