24#ifndef NEORV32_ZFINX_EXTENSION_INTRINSICS_H
25#define NEORV32_ZFINX_EXTENSION_INTRINSICS_H
60 if (fpclassify(tmp) == FP_SUBNORMAL) {
61 if (signbit(tmp) != 0) {
178 return CUSTOM_INSTR_R2_TYPE(0b1100000, 0b00001, opa.
binary_value, 0b000, 0b1010011);
193 return (int32_t)CUSTOM_INSTR_R2_TYPE(0b1100000, 0b00000, opa.
binary_value, 0b000, 0b1010011);
207 res.
binary_value = CUSTOM_INSTR_R2_TYPE(0b1101000, 0b00001, rs1, 0b000, 0b1010011);
222 res.
binary_value = CUSTOM_INSTR_R2_TYPE(0b1101000, 0b00000, rs1, 0b000, 0b1010011);
343 return CUSTOM_INSTR_R2_TYPE(0b1110000, 0b00000, opa.
binary_value, 0b001, 0b1010011);
493 float res = opa + opb;
496 if (fpclassify(res) == FP_NAN) {
516 float res = opa - opb;
519 if (fpclassify(res) == FP_NAN) {
539 float res = opa * opb;
557 uint32_t binary_value;
561 if ((fpclassify(opa) == FP_NAN) && (fpclassify(opb) == FP_NAN)) {
565 if (fpclassify(opa) == FP_NAN) {
569 if (fpclassify(opb) == FP_NAN) {
574 tmp_a.float_value = opa;
575 tmp_b.float_value = opb;
576 if (((tmp_a.binary_value == 0x80000000) && (tmp_b.binary_value == 0x00000000)) ||
577 ((tmp_a.binary_value == 0x00000000) && (tmp_b.binary_value == 0x80000000))) {
581 return fmin(opa, opb);
598 uint32_t binary_value;
603 if ((fpclassify(opa) == FP_NAN) && (fpclassify(opb) == FP_NAN)) {
607 if (fpclassify(opa) == FP_NAN) {
611 if (fpclassify(opb) == FP_NAN) {
616 tmp_a.float_value = opa;
617 tmp_b.float_value = opb;
618 if (((tmp_a.binary_value == 0x80000000) && (tmp_b.binary_value == 0x00000000)) ||
619 ((tmp_a.binary_value == 0x00000000) && (tmp_b.binary_value == 0x80000000))) {
623 return fmax(opa, opb);
637 return (uint32_t)rint(opa);
651 return (int32_t)rint(opa);
691 if ((fpclassify(opa) == FP_NAN) || (fpclassify(opb) == FP_NAN)) {
695 if isless(opa, opb) {
698 else if isgreater(opa, opb) {
719 if ((fpclassify(opa) == FP_NAN) || (fpclassify(opb) == FP_NAN)) {
723 if isless(opa, opb) {
744 if ((fpclassify(opa) == FP_NAN) || (fpclassify(opb) == FP_NAN)) {
748 if islessequal(opa, opb) {
769 int sign_1 = (int)signbit(opa);
770 int sign_2 = (int)signbit(opb);
806 int sign_1 = (int)signbit(opa);
807 int sign_2 = (int)signbit(opb);
843 int sign_1 = (int)signbit(opa);
844 int sign_2 = (int)signbit(opb);
847 if (((sign_1 == 0) && (sign_2 != 0)) || ((sign_1 != 0) && (sign_2 == 0))) {
879 uint32_t binary_value;
884 const uint32_t CLASS_NEG_INF = 1 << 0;
885 const uint32_t CLASS_NEG_NORM = 1 << 1;
886 const uint32_t CLASS_NEG_DENORM = 1 << 2;
887 const uint32_t CLASS_NEG_ZERO = 1 << 3;
888 const uint32_t CLASS_POS_ZERO = 1 << 4;
889 const uint32_t CLASS_POS_DENORM = 1 << 5;
890 const uint32_t CLASS_POS_NORM = 1 << 6;
891 const uint32_t CLASS_POS_INF = 1 << 7;
892 const uint32_t CLASS_SNAN = 1 << 8;
893 const uint32_t CLASS_QNAN = 1 << 9;
895 int tmp = fpclassify(opa);
896 int sgn = (int)signbit(opa);
901 if (tmp == FP_INFINITE) {
902 if (sgn) { res |= CLASS_NEG_INF; }
903 else { res |= CLASS_POS_INF; }
907 if (tmp == FP_ZERO) {
908 if (sgn) { res |= CLASS_NEG_ZERO; }
909 else { res |= CLASS_POS_ZERO; }
913 if (tmp == FP_NORMAL) {
914 if (sgn) { res |= CLASS_NEG_NORM; }
915 else { res |= CLASS_POS_NORM; }
919 if (tmp == FP_SUBNORMAL) {
920 if (sgn) { res |= CLASS_NEG_DENORM; }
921 else { res |= CLASS_POS_DENORM; }
926 aux.float_value = opa;
927 if ((aux.binary_value >> 22) & 0b1) {
951 float res = opa / opb;
966 float res = sqrtf(opa);
987 float res = (opa * opb) + opc;
1006 float res = (opa * opb) - opc;
1025 float res = -(opa * opb) + opc;
1044 float res = -(opa * opb) - opc;
float riscv_intrinsic_fmsubs(float rs1, float rs2, float rs3)
Definition neorv32_zfinx_extension_intrinsics.h:421
float riscv_emulate_fmsubs(float rs1, float rs2, float rs3)
Definition neorv32_zfinx_extension_intrinsics.h:1000
float riscv_emulate_fsgnjns(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:801
float riscv_emulate_fcvt_sw(int32_t rs1)
Definition neorv32_zfinx_extension_intrinsics.h:673
float riscv_emulate_fcvt_swu(uint32_t rs1)
Definition neorv32_zfinx_extension_intrinsics.h:661
float riscv_emulate_fsgnjs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:764
float riscv_intrinsic_fsqrts(float rs1)
Definition neorv32_zfinx_extension_intrinsics.h:379
float riscv_emulate_fsqrts(float rs1)
Definition neorv32_zfinx_extension_intrinsics.h:962
float riscv_intrinsic_fcvt_sw(int32_t rs1)
Definition neorv32_zfinx_extension_intrinsics.h:218
float riscv_intrinsic_fsgnjxs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:321
int32_t riscv_emulate_fcvt_ws(float rs1)
Definition neorv32_zfinx_extension_intrinsics.h:647
uint32_t riscv_emulate_flts(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:714
uint32_t riscv_intrinsic_fclasss(float rs1)
Definition neorv32_zfinx_extension_intrinsics.h:338
float riscv_emulate_fmadds(float rs1, float rs2, float rs3)
Definition neorv32_zfinx_extension_intrinsics.h:981
uint32_t riscv_intrinsic_fcvt_wus(float rs1)
Definition neorv32_zfinx_extension_intrinsics.h:173
float riscv_intrinsic_fadds(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:84
int32_t riscv_intrinsic_fcvt_ws(float rs1)
Definition neorv32_zfinx_extension_intrinsics.h:188
float riscv_intrinsic_fnmsubs(float rs1, float rs2, float rs3)
Definition neorv32_zfinx_extension_intrinsics.h:443
float subnormal_flush(float tmp)
Definition neorv32_zfinx_extension_intrinsics.h:55
uint32_t riscv_emulate_feqs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:686
float riscv_emulate_fnmsubs(float rs1, float rs2, float rs3)
Definition neorv32_zfinx_extension_intrinsics.h:1019
float riscv_intrinsic_fcvt_swu(uint32_t rs1)
Definition neorv32_zfinx_extension_intrinsics.h:203
uint32_t riscv_intrinsic_flts(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:251
float riscv_emulate_fmins(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:551
float riscv_intrinsic_fmuls(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:120
float riscv_intrinsic_fmaxs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:156
float riscv_emulate_fsgnjxs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:838
float riscv_emulate_fadds(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:488
float riscv_intrinsic_fsgnjns(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:303
float riscv_intrinsic_fnmadds(float rs1, float rs2, float rs3)
Definition neorv32_zfinx_extension_intrinsics.h:465
uint32_t riscv_emulate_fcvt_wus(float rs1)
Definition neorv32_zfinx_extension_intrinsics.h:633
float riscv_intrinsic_fdivs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:360
float riscv_intrinsic_fmadds(float rs1, float rs2, float rs3)
Definition neorv32_zfinx_extension_intrinsics.h:399
float riscv_intrinsic_fmins(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:138
uint32_t riscv_emulate_fles(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:739
float riscv_emulate_fnmadds(float rs1, float rs2, float rs3)
Definition neorv32_zfinx_extension_intrinsics.h:1038
float riscv_emulate_fsubs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:511
float riscv_emulate_fmuls(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:534
uint32_t riscv_intrinsic_fles(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:268
uint32_t riscv_emulate_fclasss(float rs1)
Definition neorv32_zfinx_extension_intrinsics.h:874
float riscv_emulate_fdivs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:946
uint32_t riscv_intrinsic_feqs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:234
float riscv_intrinsic_fsubs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:102
float riscv_emulate_fmaxs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:592
float riscv_intrinsic_fsgnjs(float rs1, float rs2)
Definition neorv32_zfinx_extension_intrinsics.h:285
Definition neorv32_zfinx_extension_intrinsics.h:37
uint32_t binary_value
Definition neorv32_zfinx_extension_intrinsics.h:38
float float_value
Definition neorv32_zfinx_extension_intrinsics.h:39