aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/compiler-rt/lib/builtins/riscv/fp_mode.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/compiler-rt/lib/builtins/riscv/fp_mode.c')
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/riscv/fp_mode.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/riscv/fp_mode.c b/contrib/llvm-project/compiler-rt/lib/builtins/riscv/fp_mode.c
new file mode 100644
index 000000000000..1a5a3de95de9
--- /dev/null
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/riscv/fp_mode.c
@@ -0,0 +1,42 @@
+//=== lib/builtins/riscv/fp_mode.c - Floaing-point mode utilities -*- C -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#include "../fp_mode.h"
+
+#define RISCV_TONEAREST 0x0
+#define RISCV_TOWARDZERO 0x1
+#define RISCV_DOWNWARD 0x2
+#define RISCV_UPWARD 0x3
+
+#define RISCV_INEXACT 0x1
+
+CRT_FE_ROUND_MODE __fe_getround(void) {
+#if defined(__riscv_f) || defined(__riscv_zfinx)
+ int frm;
+ __asm__ __volatile__("frrm %0" : "=r" (frm));
+ switch (frm) {
+ case RISCV_TOWARDZERO:
+ return CRT_FE_TOWARDZERO;
+ case RISCV_DOWNWARD:
+ return CRT_FE_DOWNWARD;
+ case RISCV_UPWARD:
+ return CRT_FE_UPWARD;
+ case RISCV_TONEAREST:
+ default:
+ return CRT_FE_TONEAREST;
+ }
+#else
+ return CRT_FE_TONEAREST;
+#endif
+}
+
+int __fe_raise_inexact(void) {
+#if defined(__riscv_f) || defined(__riscv_zfinx)
+ __asm__ __volatile__("csrsi fflags, %0" :: "i" (RISCV_INEXACT));
+#endif
+ return 0;
+}