You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.3 KiB
72 lines
2.3 KiB
commit bc93ab2946efe008bb0ce2d4d3c212bd01384fca |
|
Author: Ian Bolton <ian.bolton@arm.com> |
|
Date: Wed Apr 16 23:41:04 2014 +0100 |
|
|
|
[AArch64] Define HAVE_RM_CTX and related hooks. |
|
|
|
diff --git a/ports/sysdeps/aarch64/fpu/math_private.h b/ports/sysdeps/aarch64/fpu/math_private.h |
|
index dbf203d..7424952 100644 |
|
--- a/ports/sysdeps/aarch64/fpu/math_private.h |
|
+++ b/ports/sysdeps/aarch64/fpu/math_private.h |
|
@@ -209,6 +209,61 @@ libc_feresetround_aarch64 (fenv_t *envp) |
|
#define libc_feresetroundf libc_feresetround_aarch64 |
|
#define libc_feresetroundl libc_feresetround_aarch64 |
|
|
|
+/* We have support for rounding mode context. */ |
|
+#define HAVE_RM_CTX 1 |
|
+ |
|
+static __always_inline void |
|
+libc_feholdsetround_aarch64_ctx (struct rm_ctx *ctx, int r) |
|
+{ |
|
+ fpu_control_t fpcr, fpsr, round; |
|
+ |
|
+ _FPU_GETCW (fpcr); |
|
+ _FPU_GETFPSR (fpsr); |
|
+ ctx->env.__fpsr = fpsr; |
|
+ |
|
+ /* Check whether rounding modes are different. */ |
|
+ round = (fpcr ^ r) & FE_TOWARDZERO; |
|
+ ctx->updated_status = round != 0; |
|
+ |
|
+ /* Set the rounding mode if changed. */ |
|
+ if (__glibc_unlikely (round != 0)) |
|
+ { |
|
+ ctx->env.__fpcr = fpcr; |
|
+ _FPU_SETCW (fpcr ^ round); |
|
+ } |
|
+} |
|
+ |
|
+#define libc_feholdsetround_ctx libc_feholdsetround_aarch64_ctx |
|
+#define libc_feholdsetroundf_ctx libc_feholdsetround_aarch64_ctx |
|
+#define libc_feholdsetroundl_ctx libc_feholdsetround_aarch64_ctx |
|
+ |
|
+static __always_inline void |
|
+libc_feresetround_aarch64_ctx (struct rm_ctx *ctx) |
|
+{ |
|
+ /* Restore the rounding mode if updated. */ |
|
+ if (__glibc_unlikely (ctx->updated_status)) |
|
+ _FPU_SETCW (ctx->env.__fpcr); |
|
+} |
|
+ |
|
+#define libc_feresetround_ctx libc_feresetround_aarch64_ctx |
|
+#define libc_feresetroundf_ctx libc_feresetround_aarch64_ctx |
|
+#define libc_feresetroundl_ctx libc_feresetround_aarch64_ctx |
|
+ |
|
+static __always_inline void |
|
+libc_feresetround_noex_aarch64_ctx (struct rm_ctx *ctx) |
|
+{ |
|
+ /* Restore the rounding mode if updated. */ |
|
+ if (__glibc_unlikely (ctx->updated_status)) |
|
+ _FPU_SETCW (ctx->env.__fpcr); |
|
+ |
|
+ /* Write new FPSR to restore exception flags. */ |
|
+ _FPU_SETFPSR (ctx->env.__fpsr); |
|
+} |
|
+ |
|
+#define libc_feresetround_noex_ctx libc_feresetround_noex_aarch64_ctx |
|
+#define libc_feresetround_noexf_ctx libc_feresetround_noex_aarch64_ctx |
|
+#define libc_feresetround_noexl_ctx libc_feresetround_noex_aarch64_ctx |
|
+ |
|
#include_next <math_private.h> |
|
|
|
#endif
|
|
|