[compiler-rt] ace6e17 - [RISCV] Support fe_getround and fe_raise_inexact in builtins
via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 7 19:00:32 PDT 2022
Author: luxufan
Date: 2022-08-08T09:58:27+08:00
New Revision: ace6e172bd2c86a3b035b90c7e4adedb6ab7a291
URL: https://github.com/llvm/llvm-project/commit/ace6e172bd2c86a3b035b90c7e4adedb6ab7a291
DIFF: https://github.com/llvm/llvm-project/commit/ace6e172bd2c86a3b035b90c7e4adedb6ab7a291.diff
LOG: [RISCV] Support fe_getround and fe_raise_inexact in builtins
Reviewed By: luismarques
Differential Revision: https://reviews.llvm.org/D128240
Added:
compiler-rt/lib/builtins/riscv/fp_mode.c
Modified:
compiler-rt/lib/builtins/CMakeLists.txt
Removed:
################################################################################
diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt
index 795fe2ab316d8..6143457cc9339 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -650,6 +650,7 @@ endif()
set(powerpc64le_SOURCES ${powerpc64_SOURCES})
set(riscv_SOURCES
+ riscv/fp_mode.c
riscv/save.S
riscv/restore.S
${GENERIC_SOURCES}
diff --git a/compiler-rt/lib/builtins/riscv/fp_mode.c b/compiler-rt/lib/builtins/riscv/fp_mode.c
new file mode 100644
index 0000000000000..c542c34c9cc8c
--- /dev/null
+++ b/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)
+ 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)
+ __asm__ __volatile__("csrsi fflags, %0" :: "i" (RISCV_INEXACT));
+#endif
+ return 0;
+}
More information about the llvm-commits
mailing list