xref: /openbsd-src/gnu/llvm/compiler-rt/lib/builtins/riscv/fp_mode.c (revision 810390e339a5425391477d5d41c78d7cab2424ac)
1*810390e3Srobert //=== lib/builtins/riscv/fp_mode.c - Floaing-point mode utilities -*- C -*-===//
2*810390e3Srobert //
3*810390e3Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*810390e3Srobert // See https://llvm.org/LICENSE.txt for license information.
5*810390e3Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*810390e3Srobert //
7*810390e3Srobert //===----------------------------------------------------------------------===//
8*810390e3Srobert #include "../fp_mode.h"
9*810390e3Srobert 
10*810390e3Srobert #define RISCV_TONEAREST  0x0
11*810390e3Srobert #define RISCV_TOWARDZERO 0x1
12*810390e3Srobert #define RISCV_DOWNWARD   0x2
13*810390e3Srobert #define RISCV_UPWARD     0x3
14*810390e3Srobert 
15*810390e3Srobert #define RISCV_INEXACT    0x1
16*810390e3Srobert 
__fe_getround(void)17*810390e3Srobert CRT_FE_ROUND_MODE __fe_getround(void) {
18*810390e3Srobert #if defined(__riscv_f)
19*810390e3Srobert   int frm;
20*810390e3Srobert   __asm__ __volatile__("frrm %0" : "=r" (frm));
21*810390e3Srobert   switch (frm) {
22*810390e3Srobert     case RISCV_TOWARDZERO:
23*810390e3Srobert       return CRT_FE_TOWARDZERO;
24*810390e3Srobert     case RISCV_DOWNWARD:
25*810390e3Srobert       return CRT_FE_DOWNWARD;
26*810390e3Srobert     case RISCV_UPWARD:
27*810390e3Srobert       return CRT_FE_UPWARD;
28*810390e3Srobert     case RISCV_TONEAREST:
29*810390e3Srobert     default:
30*810390e3Srobert       return CRT_FE_TONEAREST;
31*810390e3Srobert   }
32*810390e3Srobert #else
33*810390e3Srobert   return CRT_FE_TONEAREST;
34*810390e3Srobert #endif
35*810390e3Srobert }
36*810390e3Srobert 
__fe_raise_inexact(void)37*810390e3Srobert int __fe_raise_inexact(void) {
38*810390e3Srobert #if defined(__riscv_f)
39*810390e3Srobert   __asm__ __volatile__("csrsi fflags, %0" :: "i" (RISCV_INEXACT));
40*810390e3Srobert #endif
41*810390e3Srobert   return 0;
42*810390e3Srobert }
43