This commit adds RISC-V Zfh 1.0 (half-precision IEEE 754 binary16 floating point) extension to gem5. Include the following commands: * FLH / FSH * FMADD.H / FMSUB.H / FNMSUB.H / FNMADD.H * FADD.H / FSUB.H / FMUL.H / FDIV.H * FSQRT.H * FSGNJ.H / FSGNJN.H / FSGNJX.H * FMIN.H / FMAX.H * FCVT.S.H / FCVT.H.S * FCVT.D.H / FCVT.H.D * FCVT.W.H / FCVT.H.W * FCVT.WU.H / FCVT.H.WU * FMV.X.H / FMV.H.X * FEQ.H / FLT.H / FLE.H * FCLASS.H * FCVT.L.H / FCVT.H.L * FCVT.LU.H / FCVT.H.LU Change-Id: Id7870fdfa1aa8b840706c3ba2cab8eeaf008880f Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/60029 Maintainer: Jason Lowe-Power <power.jg@gmail.com> Reviewed-by: Jason Lowe-Power <power.jg@gmail.com> Tested-by: kokoro <noreply+kokoro@google.com>
37 lines
1.1 KiB
C
37 lines
1.1 KiB
C
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include "platform.h"
|
|
#include "internals.h"
|
|
#include "specialize.h"
|
|
#include "softfloat.h"
|
|
|
|
uint_fast16_t f16_classify( float16_t a )
|
|
{
|
|
union ui16_f16 uA;
|
|
uint_fast16_t uiA;
|
|
|
|
uA.f = a;
|
|
uiA = uA.ui;
|
|
|
|
uint_fast16_t infOrNaN = expF16UI( uiA ) == 0x1F;
|
|
uint_fast16_t subnormalOrZero = expF16UI( uiA ) == 0;
|
|
bool sign = signF16UI( uiA );
|
|
bool fracZero = fracF16UI( uiA ) == 0;
|
|
bool isNaN = isNaNF16UI( uiA );
|
|
bool isSNaN = softfloat_isSigNaNF16UI( uiA );
|
|
|
|
return
|
|
( sign && infOrNaN && fracZero ) << 0 |
|
|
( sign && !infOrNaN && !subnormalOrZero ) << 1 |
|
|
( sign && subnormalOrZero && !fracZero ) << 2 |
|
|
( sign && subnormalOrZero && fracZero ) << 3 |
|
|
( !sign && infOrNaN && fracZero ) << 7 |
|
|
( !sign && !infOrNaN && !subnormalOrZero ) << 6 |
|
|
( !sign && subnormalOrZero && !fracZero ) << 5 |
|
|
( !sign && subnormalOrZero && fracZero ) << 4 |
|
|
( isNaN && isSNaN ) << 8 |
|
|
( isNaN && !isSNaN ) << 9;
|
|
}
|
|
|