diff --git a/libc/include/bits/fenv_riscv64.h b/libc/include/bits/fenv_riscv64.h index 2149f608378957df4635dfecbabb137549162d53..69232bb936733f97f7f15428c755984a3561668d 100644 --- a/libc/include/bits/fenv_riscv64.h +++ b/libc/include/bits/fenv_riscv64.h @@ -43,10 +43,17 @@ typedef unsigned int fenv_t; #define FE_INVALID 0x10 #define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) -/* Rounding modes. */ +/* + * Rounding modes. + * Currently, we have not supported FE_TOMM (Round to Nearest, ties to Max Magnitude). + */ #define FE_TONEAREST 0x0 #define FE_TOWARDZERO 0x1 #define FE_DOWNWARD 0x2 #define FE_UPWARD 0x3 +#define FE_TOMM 0x4 + +#define FE_ROUNDMODE_MIN FE_TONEAREST +#define FE_ROUNDMODE_MAX FE_UPWARD __END_DECLS diff --git a/libm/riscv64/fenv.c b/libm/riscv64/fenv.c index a4dfe15aee260713462068016b912aa5cd80a4ba..0af7a0081bb1a764ed87bcf88eea233e148d4051 100644 --- a/libm/riscv64/fenv.c +++ b/libm/riscv64/fenv.c @@ -95,6 +95,9 @@ int fegetround(void) int fesetround(int round) { + if (round < FE_ROUNDMODE_MIN || round > FE_ROUNDMODE_MAX) { + return -1; + } asm volatile ("fsrm %z0" : : "r" (round)); return 0; }