Path: blob/main/contrib/llvm-project/compiler-rt/lib/builtins/aarch64/fp_mode.c
35291 views
//===----- lib/aarch64/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 AARCH64_TONEAREST 0x013#define AARCH64_UPWARD 0x114#define AARCH64_DOWNWARD 0x215#define AARCH64_TOWARDZERO 0x316#define AARCH64_RMODE_MASK (AARCH64_TONEAREST | AARCH64_UPWARD | \17AARCH64_DOWNWARD | AARCH64_TOWARDZERO)18#define AARCH64_RMODE_SHIFT 221920#define AARCH64_INEXACT 0x102122#ifndef __ARM_FP23// For soft float targets, allow changing rounding mode by overriding the weak24// __aarch64_fe_default_rmode symbol.25CRT_FE_ROUND_MODE __attribute__((weak)) __aarch64_fe_default_rmode =26CRT_FE_TONEAREST;27#endif2829CRT_FE_ROUND_MODE __fe_getround(void) {30#ifdef __ARM_FP31uint64_t fpcr;32__asm__ __volatile__("mrs %0, fpcr" : "=r" (fpcr));33fpcr = fpcr >> AARCH64_RMODE_SHIFT & AARCH64_RMODE_MASK;34switch (fpcr) {35case AARCH64_UPWARD:36return CRT_FE_UPWARD;37case AARCH64_DOWNWARD:38return CRT_FE_DOWNWARD;39case AARCH64_TOWARDZERO:40return CRT_FE_TOWARDZERO;41case AARCH64_TONEAREST:42default:43return CRT_FE_TONEAREST;44}45#else46return __aarch64_fe_default_rmode;47#endif48}4950int __fe_raise_inexact(void) {51#ifdef __ARM_FP52uint64_t fpsr;53__asm__ __volatile__("mrs %0, fpsr" : "=r" (fpsr));54__asm__ __volatile__("msr fpsr, %0" : : "ri" (fpsr | AARCH64_INEXACT));55return 0;56#else57return 0;58#endif59}606162