Skip to content

Commit 390fa46

Browse files
aswatermantroibe
authored andcommitted
Add missing classify functions
1 parent 25e2a60 commit 390fa46

2 files changed

Lines changed: 72 additions & 0 deletions

File tree

softfloat/f32_classify.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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 f32_classify( float32_t a )
10+
{
11+
union ui32_f32 uA;
12+
uint_fast32_t uiA;
13+
14+
uA.f = a;
15+
uiA = uA.ui;
16+
17+
uint_fast16_t infOrNaN = expF32UI( uiA ) == 0xFF;
18+
uint_fast16_t subnormalOrZero = expF32UI( uiA ) == 0;
19+
bool sign = signF32UI( uiA );
20+
bool fracZero = fracF32UI( uiA ) == 0;
21+
bool isNaN = isNaNF32UI( uiA );
22+
bool isSNaN = softfloat_isSigNaNF32UI( uiA );
23+
24+
return
25+
( sign && infOrNaN && fracZero ) << 0 |
26+
( sign && !infOrNaN && !subnormalOrZero ) << 1 |
27+
( sign && subnormalOrZero && !fracZero ) << 2 |
28+
( sign && subnormalOrZero && fracZero ) << 3 |
29+
( !sign && infOrNaN && fracZero ) << 7 |
30+
( !sign && !infOrNaN && !subnormalOrZero ) << 6 |
31+
( !sign && subnormalOrZero && !fracZero ) << 5 |
32+
( !sign && subnormalOrZero && fracZero ) << 4 |
33+
( isNaN && isSNaN ) << 8 |
34+
( isNaN && !isSNaN ) << 9;
35+
}
36+

softfloat/f64_classify.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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 f64_classify( float64_t a )
10+
{
11+
union ui64_f64 uA;
12+
uint_fast64_t uiA;
13+
14+
uA.f = a;
15+
uiA = uA.ui;
16+
17+
uint_fast16_t infOrNaN = expF64UI( uiA ) == 0x7FF;
18+
uint_fast16_t subnormalOrZero = expF64UI( uiA ) == 0;
19+
bool sign = signF64UI( uiA );
20+
bool fracZero = fracF64UI( uiA ) == 0;
21+
bool isNaN = isNaNF64UI( uiA );
22+
bool isSNaN = softfloat_isSigNaNF64UI( uiA );
23+
24+
return
25+
( sign && infOrNaN && fracZero ) << 0 |
26+
( sign && !infOrNaN && !subnormalOrZero ) << 1 |
27+
( sign && subnormalOrZero && !fracZero ) << 2 |
28+
( sign && subnormalOrZero && fracZero ) << 3 |
29+
( !sign && infOrNaN && fracZero ) << 7 |
30+
( !sign && !infOrNaN && !subnormalOrZero ) << 6 |
31+
( !sign && subnormalOrZero && !fracZero ) << 5 |
32+
( !sign && subnormalOrZero && fracZero ) << 4 |
33+
( isNaN && isSNaN ) << 8 |
34+
( isNaN && !isSNaN ) << 9;
35+
}
36+

0 commit comments

Comments
 (0)