summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/builtins/CMakeLists.txt5
-rw-r--r--compiler-rt/lib/builtins/aarch64/fp_mode.c59
-rw-r--r--compiler-rt/lib/builtins/adddf3.c3
-rw-r--r--compiler-rt/lib/builtins/addsf3.c3
-rw-r--r--compiler-rt/lib/builtins/addtf3.c3
-rw-r--r--compiler-rt/lib/builtins/arm/fp_mode.c59
-rw-r--r--compiler-rt/lib/builtins/fp_add_impl.inc19
-rw-r--r--compiler-rt/lib/builtins/fp_mode.c24
-rw-r--r--compiler-rt/lib/builtins/fp_mode.h29
-rw-r--r--compiler-rt/lib/builtins/subdf3.c3
-rw-r--r--compiler-rt/lib/builtins/subsf3.c3
-rw-r--r--compiler-rt/lib/builtins/subtf3.c3
-rw-r--r--compiler-rt/test/builtins/Unit/addtf3_test.c23
-rw-r--r--compiler-rt/test/builtins/Unit/subtf3_test.c21
14 files changed, 16 insertions, 241 deletions
diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt
index 0662b1ae23e..1669ea8586e 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -94,7 +94,6 @@ set(GENERIC_SOURCES
floatunsisf.c
floatuntidf.c
floatuntisf.c
- fp_mode.c
int_util.c
lshrdi3.c
lshrti3.c
@@ -291,7 +290,6 @@ set(i386_SOURCES ${i386_SOURCES} ${x86_ARCH_SOURCES})
set(i686_SOURCES ${i686_SOURCES} ${x86_ARCH_SOURCES})
set(arm_SOURCES
- arm/fp_mode.c
arm/bswapdi2.S
arm/bswapsi2.S
arm/clzdi2.S
@@ -443,8 +441,7 @@ endif()
set(aarch64_SOURCES
${GENERIC_TF_SOURCES}
- ${GENERIC_SOURCES}
- aarch64/fp_mode.c)
+ ${GENERIC_SOURCES})
if (MINGW)
set(aarch64_SOURCES
diff --git a/compiler-rt/lib/builtins/aarch64/fp_mode.c b/compiler-rt/lib/builtins/aarch64/fp_mode.c
deleted file mode 100644
index 5a413689d2c..00000000000
--- a/compiler-rt/lib/builtins/aarch64/fp_mode.c
+++ /dev/null
@@ -1,59 +0,0 @@
-//===----- lib/aarch64/fp_mode.c - Floaing-point mode utilities ---*- C -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include <stdint.h>
-
-#include "../fp_mode.h"
-
-#define AARCH64_TONEAREST 0x0
-#define AARCH64_UPWARD 0x1
-#define AARCH64_DOWNWARD 0x2
-#define AARCH64_TOWARDZERO 0x3
-#define AARCH64_RMODE_MASK (AARCH64_TONEAREST | AARCH64_UPWARD | \
- AARCH64_DOWNWARD | AARCH64_TOWARDZERO)
-#define AARCH64_RMODE_SHIFT 22
-
-#define AARCH64_INEXACT 0x10
-
-#ifndef __ARM_FP
-// For soft float targets, allow changing rounding mode by overriding the weak
-// __aarch64_fe_default_rmode symbol.
-FE_ROUND_MODE __attribute__((weak)) __aarch64_fe_default_rmode = FE_TONEAREST;
-#endif
-
-FE_ROUND_MODE __fe_getround() {
-#ifdef __ARM_FP
- uint64_t fpcr;
- __asm__ __volatile__("mrs %0, fpcr" : "=r" (fpcr));
- fpcr = fpcr >> AARCH64_RMODE_SHIFT & AARCH64_RMODE_MASK;
- switch (fpcr) {
- case AARCH64_UPWARD:
- return FE_UPWARD;
- case AARCH64_DOWNWARD:
- return FE_DOWNWARD;
- case AARCH64_TOWARDZERO:
- return FE_TOWARDZERO;
- case AARCH64_TONEAREST:
- default:
- return FE_TONEAREST;
- }
-#else
- return __aarch64_fe_default_rmode;
-#endif
-}
-
-int __fe_raise_inexact() {
-#ifdef __ARM_FP
- uint64_t fpsr;
- __asm__ __volatile__("mrs %0, fpsr" : "=r" (fpsr));
- __asm__ __volatile__("msr fpsr, %0" : : "ri" (fpsr | AARCH64_INEXACT));
- return 0;
-#else
- return 0;
-#endif
-}
diff --git a/compiler-rt/lib/builtins/adddf3.c b/compiler-rt/lib/builtins/adddf3.c
index d5c5e980b6d..73ad6150096 100644
--- a/compiler-rt/lib/builtins/adddf3.c
+++ b/compiler-rt/lib/builtins/adddf3.c
@@ -6,7 +6,8 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements double-precision soft-float addition.
+// This file implements double-precision soft-float addition with the IEEE-754
+// default rounding (to nearest, ties to even).
//
//===----------------------------------------------------------------------===//
diff --git a/compiler-rt/lib/builtins/addsf3.c b/compiler-rt/lib/builtins/addsf3.c
index 95985b104eb..a48d537236a 100644
--- a/compiler-rt/lib/builtins/addsf3.c
+++ b/compiler-rt/lib/builtins/addsf3.c
@@ -6,7 +6,8 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements single-precision soft-float addition.
+// This file implements single-precision soft-float addition with the IEEE-754
+// default rounding (to nearest, ties to even).
//
//===----------------------------------------------------------------------===//
diff --git a/compiler-rt/lib/builtins/addtf3.c b/compiler-rt/lib/builtins/addtf3.c
index 156c251a067..1dc303b70d7 100644
--- a/compiler-rt/lib/builtins/addtf3.c
+++ b/compiler-rt/lib/builtins/addtf3.c
@@ -6,7 +6,8 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements quad-precision soft-float addition.
+// This file implements quad-precision soft-float addition with the IEEE-754
+// default rounding (to nearest, ties to even).
//
//===----------------------------------------------------------------------===//
diff --git a/compiler-rt/lib/builtins/arm/fp_mode.c b/compiler-rt/lib/builtins/arm/fp_mode.c
deleted file mode 100644
index 300b71935ad..00000000000
--- a/compiler-rt/lib/builtins/arm/fp_mode.c
+++ /dev/null
@@ -1,59 +0,0 @@
-//===----- lib/arm/fp_mode.c - Floaing-point mode utilities -------*- C -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include <stdint.h>
-
-#include "../fp_mode.h"
-
-#define ARM_TONEAREST 0x0
-#define ARM_UPWARD 0x1
-#define ARM_DOWNWARD 0x2
-#define ARM_TOWARDZERO 0x3
-#define ARM_RMODE_MASK (ARM_TONEAREST | ARM_UPWARD | \
- ARM_DOWNWARD | ARM_TOWARDZERO)
-#define ARM_RMODE_SHIFT 22
-
-#define ARM_INEXACT 0x1000
-
-#ifndef __ARM_FP
-// For soft float targets, allow changing rounding mode by overriding the weak
-// __arm_fe_default_rmode symbol.
-FE_ROUND_MODE __attribute__((weak)) __arm_fe_default_rmode = FE_TONEAREST;
-#endif
-
-FE_ROUND_MODE __fe_getround() {
-#ifdef __ARM_FP
- uint32_t fpscr;
- __asm__ __volatile__("vmrs %0, fpscr" : "=r" (fpscr));
- fpscr = fpscr >> ARM_RMODE_SHIFT & ARM_RMODE_MASK;
- switch (fpscr) {
- case ARM_UPWARD:
- return FE_UPWARD;
- case ARM_DOWNWARD:
- return FE_DOWNWARD;
- case ARM_TOWARDZERO:
- return FE_TOWARDZERO;
- case ARM_TONEAREST:
- default:
- return FE_TONEAREST;
- }
-#else
- return __arm_fe_default_rmode;
-#endif
-}
-
-int __fe_raise_inexact() {
-#ifdef __ARM_FP
- uint32_t fpscr;
- __asm__ __volatile__("vmrs %0, fpscr" : "=r" (fpscr));
- __asm__ __volatile__("vmsr fpscr, %0" : : "ri" (fpscr | ARM_INEXACT));
- return 0;
-#else
- return 0;
-#endif
-}
diff --git a/compiler-rt/lib/builtins/fp_add_impl.inc b/compiler-rt/lib/builtins/fp_add_impl.inc
index 828efea9fa4..f9a32ce6733 100644
--- a/compiler-rt/lib/builtins/fp_add_impl.inc
+++ b/compiler-rt/lib/builtins/fp_add_impl.inc
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "fp_lib.h"
-#include "fp_mode.h"
static __inline fp_t __addXf3__(fp_t a, fp_t b) {
rep_t aRep = toRep(a);
@@ -138,21 +137,7 @@ static __inline fp_t __addXf3__(fp_t a, fp_t b) {
// Final rounding. The result may overflow to infinity, but that is the
// correct result in that case.
- switch (__fe_getround()){
- case FE_TONEAREST:
- if (roundGuardSticky > 0x4) result++;
- if (roundGuardSticky == 0x4) result += result & 1;
- break;
- case FE_DOWNWARD:
- if (resultSign && roundGuardSticky) result++;
- break;
- case FE_UPWARD:
- if (!resultSign && roundGuardSticky) result++;
- break;
- case FE_TOWARDZERO:
- break;
- }
- if (roundGuardSticky)
- __fe_raise_inexact();
+ if (roundGuardSticky > 0x4) result++;
+ if (roundGuardSticky == 0x4) result += result & 1;
return fromRep(result);
}
diff --git a/compiler-rt/lib/builtins/fp_mode.c b/compiler-rt/lib/builtins/fp_mode.c
deleted file mode 100644
index c1b6c1f6b8a..00000000000
--- a/compiler-rt/lib/builtins/fp_mode.c
+++ /dev/null
@@ -1,24 +0,0 @@
-//===----- lib/fp_mode.c - Floaing-point environment mode utilities --C -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file provides a default implementation of fp_mode.h for architectures
-// that does not support or does not have an implementation of floating point
-// environment mode.
-//
-//===----------------------------------------------------------------------===//
-
-#include "fp_mode.h"
-
-// IEEE-754 default rounding (to nearest, ties to even).
-FE_ROUND_MODE __fe_getround() {
- return FE_TONEAREST;
-}
-
-int __fe_raise_inexact() {
- return 0;
-}
diff --git a/compiler-rt/lib/builtins/fp_mode.h b/compiler-rt/lib/builtins/fp_mode.h
deleted file mode 100644
index 51bec0431a4..00000000000
--- a/compiler-rt/lib/builtins/fp_mode.h
+++ /dev/null
@@ -1,29 +0,0 @@
-//===----- lib/fp_mode.h - Floaing-point environment mode utilities --C -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is not part of the interface of this library.
-//
-// This file defines an interface for accessing hardware floating point
-// environment mode.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef FP_MODE
-#define FP_MODE
-
-typedef enum {
- FE_TONEAREST,
- FE_DOWNWARD,
- FE_UPWARD,
- FE_TOWARDZERO
-} FE_ROUND_MODE;
-
-FE_ROUND_MODE __fe_getround();
-int __fe_raise_inexact();
-
-#endif // FP_MODE_H
diff --git a/compiler-rt/lib/builtins/subdf3.c b/compiler-rt/lib/builtins/subdf3.c
index 292aec6d1e8..013c60e9c84 100644
--- a/compiler-rt/lib/builtins/subdf3.c
+++ b/compiler-rt/lib/builtins/subdf3.c
@@ -6,7 +6,8 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements double-precision soft-float subtraction.
+// This file implements double-precision soft-float subtraction with the
+// IEEE-754 default rounding (to nearest, ties to even).
//
//===----------------------------------------------------------------------===//
diff --git a/compiler-rt/lib/builtins/subsf3.c b/compiler-rt/lib/builtins/subsf3.c
index 760db366ee4..90b0e11f3eb 100644
--- a/compiler-rt/lib/builtins/subsf3.c
+++ b/compiler-rt/lib/builtins/subsf3.c
@@ -6,7 +6,8 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements single-precision soft-float subtraction.
+// This file implements single-precision soft-float subtraction with the
+// IEEE-754 default rounding (to nearest, ties to even).
//
//===----------------------------------------------------------------------===//
diff --git a/compiler-rt/lib/builtins/subtf3.c b/compiler-rt/lib/builtins/subtf3.c
index f1b3e293516..871cf86b89f 100644
--- a/compiler-rt/lib/builtins/subtf3.c
+++ b/compiler-rt/lib/builtins/subtf3.c
@@ -6,7 +6,8 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements quad-precision soft-float subtraction.
+// This file implements quad-precision soft-float subtraction with the
+// IEEE-754 default rounding (to nearest, ties to even).
//
//===----------------------------------------------------------------------===//
diff --git a/compiler-rt/test/builtins/Unit/addtf3_test.c b/compiler-rt/test/builtins/Unit/addtf3_test.c
index d24d0ebd70b..8f00f6de7a6 100644
--- a/compiler-rt/test/builtins/Unit/addtf3_test.c
+++ b/compiler-rt/test/builtins/Unit/addtf3_test.c
@@ -11,12 +11,11 @@
//
//===----------------------------------------------------------------------===//
-#include <fenv.h>
+#include "int_lib.h"
#include <stdio.h>
#if __LDBL_MANT_DIG__ == 113
-#include "int_lib.h"
#include "fp_test.h"
// Returns: a + b
@@ -75,26 +74,6 @@ int main()
UINT64_C(0x61e58dd6c51eb77c)))
return 1;
-#if (defined(__arm__) || defined(__aarch64__)) && defined(__ARM_FP)
- // Rounding mode tests on supported architectures
- long double m = 1234.0L, n = 0.01L;
- fesetround(FE_UPWARD);
- if (__addtf3(m, n) != 1235.0L)
- return 1;
-
- fesetround(FE_DOWNWARD);
- if (__addtf3(m, n) != 1234.0L)
- return 1;
-
- fesetround(FE_TOWARDZERO);
- if (__addtf3(m, n) != 1234.0L)
- return 1;
-
- fesetround(FE_TONEAREST);
- if (__addtf3(m, n) != 1234.0L)
- return 1;
-#endif
-
#else
printf("skipped\n");
diff --git a/compiler-rt/test/builtins/Unit/subtf3_test.c b/compiler-rt/test/builtins/Unit/subtf3_test.c
index d1e88ea621e..bcf82e0c6e5 100644
--- a/compiler-rt/test/builtins/Unit/subtf3_test.c
+++ b/compiler-rt/test/builtins/Unit/subtf3_test.c
@@ -11,7 +11,6 @@
//
//===----------------------------------------------------------------------===//
-#include <fenv.h>
#include <stdio.h>
#if __LDBL_MANT_DIG__ == 113
@@ -68,26 +67,6 @@ int main()
UINT64_C(0xa44a7bca780a166c)))
return 1;
-#if (defined(__arm__) || defined(__aarch64__)) && defined(__ARM_FP)
- // Rounding mode tests on supported architectures
- long double m = 1234.0L, n = 0.01L;
- fesetround(FE_UPWARD);
- if (__subtf3(m, n) != 1234.0L)
- return 1;
-
- fesetround(FE_DOWNWARD);
- if (__subtf3(m, n) != 1233.0L)
- return 1;
-
- fesetround(FE_TOWARDZERO);
- if (__subtf3(m, n) != 1233.0L)
- return 1;
-
- fesetround(FE_TONEAREST);
- if (__subtf3(m, n) != 1234.0L)
- return 1;
-#endif
-
#else
printf("skipped\n");
OpenPOWER on IntegriCloud