diff options
author | Yi Kong <yikong@google.com> | 2019-03-27 04:18:37 +0000 |
---|---|---|
committer | Yi Kong <yikong@google.com> | 2019-03-27 04:18:37 +0000 |
commit | e204d244badb2e9765a1020f41c773f63da208f4 (patch) | |
tree | 3111534fc574456223b949340ec1bd053cdbbb07 | |
parent | 5321dcd608a1d9b1b172b33838f1cfd29e0fed10 (diff) | |
download | bcm5719-llvm-e204d244badb2e9765a1020f41c773f63da208f4.tar.gz bcm5719-llvm-e204d244badb2e9765a1020f41c773f63da208f4.zip |
Revert "[builtins] Rounding mode support for addxf3/subxf3"
This reverts commit 2cabea054e40ae2837da959d0ca89ae25cf1b1f1.
Test failure on buildbots.
llvm-svn: 357048
-rw-r--r-- | compiler-rt/lib/builtins/CMakeLists.txt | 5 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/aarch64/fp_mode.c | 59 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/adddf3.c | 3 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/addsf3.c | 3 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/addtf3.c | 3 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/arm/fp_mode.c | 59 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/fp_add_impl.inc | 19 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/fp_mode.c | 24 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/fp_mode.h | 29 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/subdf3.c | 3 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/subsf3.c | 3 | ||||
-rw-r--r-- | compiler-rt/lib/builtins/subtf3.c | 3 | ||||
-rw-r--r-- | compiler-rt/test/builtins/Unit/addtf3_test.c | 23 | ||||
-rw-r--r-- | compiler-rt/test/builtins/Unit/subtf3_test.c | 21 |
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"); |