Path: blob/main/contrib/llvm-project/compiler-rt/lib/builtins/arm/fp_mode.c
35292 views
//===----- lib/arm/fp_mode.c - Floaing-point mode utilities -------*- C -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include <stdint.h>910#include "../fp_mode.h"1112#define ARM_TONEAREST 0x013#define ARM_UPWARD 0x114#define ARM_DOWNWARD 0x215#define ARM_TOWARDZERO 0x316#define ARM_RMODE_MASK (ARM_TONEAREST | ARM_UPWARD | \17ARM_DOWNWARD | ARM_TOWARDZERO)18#define ARM_RMODE_SHIFT 221920#define ARM_INEXACT 0x102122#ifndef __ARM_FP23// For soft float targets, allow changing rounding mode by overriding the weak24// __arm_fe_default_rmode symbol.25CRT_FE_ROUND_MODE __attribute__((weak)) __arm_fe_default_rmode =26CRT_FE_TONEAREST;27#endif2829CRT_FE_ROUND_MODE __fe_getround(void) {30#ifdef __ARM_FP31uint32_t fpscr;32__asm__ __volatile__("vmrs %0, fpscr" : "=r" (fpscr));33fpscr = fpscr >> ARM_RMODE_SHIFT & ARM_RMODE_MASK;34switch (fpscr) {35case ARM_UPWARD:36return CRT_FE_UPWARD;37case ARM_DOWNWARD:38return CRT_FE_DOWNWARD;39case ARM_TOWARDZERO:40return CRT_FE_TOWARDZERO;41case ARM_TONEAREST:42default:43return CRT_FE_TONEAREST;44}45#else46return __arm_fe_default_rmode;47#endif48}4950int __fe_raise_inexact(void) {51#ifdef __ARM_FP52uint32_t fpscr;53__asm__ __volatile__("vmrs %0, fpscr" : "=r" (fpscr));54__asm__ __volatile__("vmsr fpscr, %0" : : "ri" (fpscr | ARM_INEXACT));55return 0;56#else57return 0;58#endif59}606162