brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · 31877fb Raw
60 lines · c
1//=== lib/builtins/loongarch/fp_mode.c - Floaing-point mode utilities -*- C -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8#include "../fp_mode.h"9 10#define LOONGARCH_TONEAREST  0x000011#define LOONGARCH_TOWARDZERO 0x010012#define LOONGARCH_UPWARD     0x020013#define LOONGARCH_DOWNWARD   0x030014 15#define LOONGARCH_RMODE_MASK (LOONGARCH_TONEAREST | LOONGARCH_TOWARDZERO | \16                              LOONGARCH_UPWARD | LOONGARCH_DOWNWARD)17 18#define LOONGARCH_INEXACT    0x1000019 20CRT_FE_ROUND_MODE __fe_getround(void) {21#if __loongarch_frlen != 022  int fcsr;23#  ifdef __clang__24  __asm__ __volatile__("movfcsr2gr %0, $fcsr0" : "=r" (fcsr));25#  else26  __asm__ __volatile__("movfcsr2gr %0, $r0" : "=r" (fcsr));27#  endif28  fcsr &= LOONGARCH_RMODE_MASK;29  switch (fcsr) {30  case LOONGARCH_TOWARDZERO:31    return CRT_FE_TOWARDZERO;32  case LOONGARCH_DOWNWARD:33    return CRT_FE_DOWNWARD;34  case LOONGARCH_UPWARD:35    return CRT_FE_UPWARD;36  case LOONGARCH_TONEAREST:37  default:38    return CRT_FE_TONEAREST;39  }40#else41  return CRT_FE_TONEAREST;42#endif43}44 45int __fe_raise_inexact(void) {46#if __loongarch_frlen != 047  int fcsr;48#  ifdef __clang__49  __asm__ __volatile__("movfcsr2gr %0, $fcsr0" : "=r" (fcsr));50  __asm__ __volatile__(51      "movgr2fcsr $fcsr0, %0" :: "r" (fcsr | LOONGARCH_INEXACT));52#  else53  __asm__ __volatile__("movfcsr2gr %0, $r0" : "=r" (fcsr));54  __asm__ __volatile__(55      "movgr2fcsr $r0, %0" :: "r" (fcsr | LOONGARCH_INEXACT));56#  endif57#endif58  return 0;59}60