diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 20:51:06 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 20:51:06 +0000 | 
| commit | 8f3cadc28cb2bb9e8f9d69eeaaea1f57f2f7b2ab (patch) | |
| tree | 05a2b6ec297fe6283d9557c791445d1daf88dcd0 /lib/builtins | |
| parent | 63714eb5809e39666dec2454c354195e76f916ba (diff) | |
Notes
Diffstat (limited to 'lib/builtins')
347 files changed, 8636 insertions, 9774 deletions
diff --git a/lib/builtins/aarch64/chkstk.S b/lib/builtins/aarch64/chkstk.S index 89ec90b08a13..01f90366f030 100644 --- a/lib/builtins/aarch64/chkstk.S +++ b/lib/builtins/aarch64/chkstk.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/absvdi2.c b/lib/builtins/absvdi2.c index 682c2355d2ac..b9566cd874fe 100644 --- a/lib/builtins/absvdi2.c +++ b/lib/builtins/absvdi2.c @@ -1,29 +1,25 @@ -/*===-- absvdi2.c - Implement __absvdi2 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------=== - * - * This file implements __absvdi2 for the compiler_rt library. - * - *===----------------------------------------------------------------------=== - */ +//===-- absvdi2.c - Implement __absvdi2 -----------------------------------===// +// +// 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 implements __absvdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: absolute value */ +// Returns: absolute value -/* Effects: aborts if abs(x) < 0 */ +// Effects: aborts if abs(x) < 0 -COMPILER_RT_ABI di_int -__absvdi2(di_int a) -{ -    const int N = (int)(sizeof(di_int) * CHAR_BIT); -    if (a == ((di_int)1 << (N-1))) -        compilerrt_abort(); -    const di_int t = a >> (N - 1); -    return (a ^ t) - t; +COMPILER_RT_ABI di_int __absvdi2(di_int a) { +  const int N = (int)(sizeof(di_int) * CHAR_BIT); +  if (a == ((di_int)1 << (N - 1))) +    compilerrt_abort(); +  const di_int t = a >> (N - 1); +  return (a ^ t) - t;  } diff --git a/lib/builtins/absvsi2.c b/lib/builtins/absvsi2.c index 4812af815982..44ada169e7e6 100644 --- a/lib/builtins/absvsi2.c +++ b/lib/builtins/absvsi2.c @@ -1,29 +1,25 @@ -/* ===-- absvsi2.c - Implement __absvsi2 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __absvsi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- absvsi2.c - Implement __absvsi2 -----------------------------------===// +// +// 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 implements __absvsi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: absolute value */ +// Returns: absolute value -/* Effects: aborts if abs(x) < 0 */ +// Effects: aborts if abs(x) < 0 -COMPILER_RT_ABI si_int -__absvsi2(si_int a) -{ -    const int N = (int)(sizeof(si_int) * CHAR_BIT); -    if (a == (1 << (N-1))) -        compilerrt_abort(); -    const si_int t = a >> (N - 1); -    return (a ^ t) - t; +COMPILER_RT_ABI si_int __absvsi2(si_int a) { +  const int N = (int)(sizeof(si_int) * CHAR_BIT); +  if (a == (1 << (N - 1))) +    compilerrt_abort(); +  const si_int t = a >> (N - 1); +  return (a ^ t) - t;  } diff --git a/lib/builtins/absvti2.c b/lib/builtins/absvti2.c index 7927770c9ab3..491d99d7ce0f 100644 --- a/lib/builtins/absvti2.c +++ b/lib/builtins/absvti2.c @@ -1,34 +1,29 @@ -/* ===-- absvti2.c - Implement __absvdi2 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __absvti2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- absvti2.c - Implement __absvdi2 -----------------------------------===// +// +// 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 implements __absvti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: absolute value */ +// Returns: absolute value -/* Effects: aborts if abs(x) < 0 */ +// Effects: aborts if abs(x) < 0 -COMPILER_RT_ABI ti_int -__absvti2(ti_int a) -{ -    const int N = (int)(sizeof(ti_int) * CHAR_BIT); -    if (a == ((ti_int)1 << (N-1))) -        compilerrt_abort(); -    const ti_int s = a >> (N - 1); -    return (a ^ s) - s; +COMPILER_RT_ABI ti_int __absvti2(ti_int a) { +  const int N = (int)(sizeof(ti_int) * CHAR_BIT); +  if (a == ((ti_int)1 << (N - 1))) +    compilerrt_abort(); +  const ti_int s = a >> (N - 1); +  return (a ^ s) - s;  } -#endif /* CRT_HAS_128BIT */ - +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/adddf3.c b/lib/builtins/adddf3.c index 9a3901312e51..f2727fafcabe 100644 --- a/lib/builtins/adddf3.c +++ b/lib/builtins/adddf3.c @@ -1,9 +1,8 @@  //===-- lib/adddf3.c - Double-precision addition ------------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -15,16 +14,12 @@  #define DOUBLE_PRECISION  #include "fp_add_impl.inc" -COMPILER_RT_ABI double __adddf3(double a, double b){ -    return __addXf3__(a, b); -} +COMPILER_RT_ABI double __adddf3(double a, double b) { return __addXf3__(a, b); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI double __aeabi_dadd(double a, double b) { -  return __adddf3(a, b); -} +AEABI_RTABI double __aeabi_dadd(double a, double b) { return __adddf3(a, b); }  #else -AEABI_RTABI double __aeabi_dadd(double a, double b) COMPILER_RT_ALIAS(__adddf3); +COMPILER_RT_ALIAS(__adddf3, __aeabi_dadd)  #endif  #endif diff --git a/lib/builtins/addsf3.c b/lib/builtins/addsf3.c index c5c1a41c3611..8fe8622aadd9 100644 --- a/lib/builtins/addsf3.c +++ b/lib/builtins/addsf3.c @@ -1,9 +1,8 @@  //===-- lib/addsf3.c - Single-precision addition ------------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -15,16 +14,12 @@  #define SINGLE_PRECISION  #include "fp_add_impl.inc" -COMPILER_RT_ABI float __addsf3(float a, float b) { -    return __addXf3__(a, b); -} +COMPILER_RT_ABI float __addsf3(float a, float b) { return __addXf3__(a, b); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI float __aeabi_fadd(float a, float b) { -  return __addsf3(a, b); -} +AEABI_RTABI float __aeabi_fadd(float a, float b) { return __addsf3(a, b); }  #else -AEABI_RTABI float __aeabi_fadd(float a, float b) COMPILER_RT_ALIAS(__addsf3); +COMPILER_RT_ALIAS(__addsf3, __aeabi_fadd)  #endif  #endif diff --git a/lib/builtins/addtf3.c b/lib/builtins/addtf3.c index e4bbe0227ae6..570472a14554 100644 --- a/lib/builtins/addtf3.c +++ b/lib/builtins/addtf3.c @@ -1,9 +1,8 @@  //===-- lib/addtf3.c - Quad-precision addition --------------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -18,8 +17,8 @@  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT)  #include "fp_add_impl.inc" -COMPILER_RT_ABI long double __addtf3(long double a, long double b){ -    return __addXf3__(a, b); +COMPILER_RT_ABI long double __addtf3(long double a, long double b) { +  return __addXf3__(a, b);  }  #endif diff --git a/lib/builtins/addvdi3.c b/lib/builtins/addvdi3.c index 0da38945679d..28661fda8498 100644 --- a/lib/builtins/addvdi3.c +++ b/lib/builtins/addvdi3.c @@ -1,36 +1,29 @@ -/* ===-- addvdi3.c - Implement __addvdi3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __addvdi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- addvdi3.c - Implement __addvdi3 -----------------------------------===// +// +// 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 implements __addvdi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a + b */ +// Returns: a + b -/* Effects: aborts if a + b overflows */ +// Effects: aborts if a + b overflows -COMPILER_RT_ABI di_int -__addvdi3(di_int a, di_int b) -{ -    di_int s = (du_int) a + (du_int) b; -    if (b >= 0) -    { -        if (s < a) -            compilerrt_abort(); -    } -    else -    { -        if (s >= a) -            compilerrt_abort(); -    } -    return s; +COMPILER_RT_ABI di_int __addvdi3(di_int a, di_int b) { +  di_int s = (du_int)a + (du_int)b; +  if (b >= 0) { +    if (s < a) +      compilerrt_abort(); +  } else { +    if (s >= a) +      compilerrt_abort(); +  } +  return s;  } diff --git a/lib/builtins/addvsi3.c b/lib/builtins/addvsi3.c index 94ca726f42b9..40400237527b 100644 --- a/lib/builtins/addvsi3.c +++ b/lib/builtins/addvsi3.c @@ -1,36 +1,29 @@ -/* ===-- addvsi3.c - Implement __addvsi3 -----------------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __addvsi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- addvsi3.c - Implement __addvsi3 -----------------------------------===// +// +// 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 implements __addvsi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a + b */ +// Returns: a + b -/* Effects: aborts if a + b overflows */ +// Effects: aborts if a + b overflows -COMPILER_RT_ABI si_int -__addvsi3(si_int a, si_int b) -{ -    si_int s = (su_int) a + (su_int) b; -    if (b >= 0) -    { -        if (s < a) -            compilerrt_abort(); -    } -    else -    { -        if (s >= a) -            compilerrt_abort(); -    } -    return s; +COMPILER_RT_ABI si_int __addvsi3(si_int a, si_int b) { +  si_int s = (su_int)a + (su_int)b; +  if (b >= 0) { +    if (s < a) +      compilerrt_abort(); +  } else { +    if (s >= a) +      compilerrt_abort(); +  } +  return s;  } diff --git a/lib/builtins/addvti3.c b/lib/builtins/addvti3.c index c224de60aab0..aa709875d243 100644 --- a/lib/builtins/addvti3.c +++ b/lib/builtins/addvti3.c @@ -1,40 +1,33 @@ -/* ===-- addvti3.c - Implement __addvti3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __addvti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- addvti3.c - Implement __addvti3 -----------------------------------===// +// +// 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 implements __addvti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: a + b */ +// Returns: a + b -/* Effects: aborts if a + b overflows */ +// Effects: aborts if a + b overflows -COMPILER_RT_ABI ti_int -__addvti3(ti_int a, ti_int b) -{ -    ti_int s = (tu_int) a + (tu_int) b; -    if (b >= 0) -    { -        if (s < a) -            compilerrt_abort(); -    } -    else -    { -        if (s >= a) -            compilerrt_abort(); -    } -    return s; +COMPILER_RT_ABI ti_int __addvti3(ti_int a, ti_int b) { +  ti_int s = (tu_int)a + (tu_int)b; +  if (b >= 0) { +    if (s < a) +      compilerrt_abort(); +  } else { +    if (s >= a) +      compilerrt_abort(); +  } +  return s;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/apple_versioning.c b/lib/builtins/apple_versioning.c index 3797a1ab02da..f87b42820c15 100644 --- a/lib/builtins/apple_versioning.c +++ b/lib/builtins/apple_versioning.c @@ -1,47 +1,42 @@ -/* ===-- apple_versioning.c - Adds versioning symbols for ld ---------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ - +//===-- apple_versioning.c - Adds versioning symbols for ld ---------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #if __APPLE__ -  #include <Availability.h> -   -  #if __IPHONE_OS_VERSION_MIN_REQUIRED -    #define NOT_HERE_BEFORE_10_6(sym)  -    #define NOT_HERE_IN_10_8_AND_EARLIER(sym) \ -        extern const char sym##_tmp61 __asm("$ld$hide$os6.1$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp61 = 0; \ -        extern const char sym##_tmp60 __asm("$ld$hide$os6.0$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp60 = 0; \ -        extern const char sym##_tmp51 __asm("$ld$hide$os5.1$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp51 = 0; \ -        extern const char sym##_tmp50 __asm("$ld$hide$os5.0$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp50 = 0;  -  #else -    #define NOT_HERE_BEFORE_10_6(sym) \ -         extern const char sym##_tmp4 __asm("$ld$hide$os10.4$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp4 = 0; \ -        extern const char sym##_tmp5 __asm("$ld$hide$os10.5$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp5 = 0;  -    #define NOT_HERE_IN_10_8_AND_EARLIER(sym) \ -         extern const char sym##_tmp8 __asm("$ld$hide$os10.8$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp8 = 0; \ -        extern const char sym##_tmp7 __asm("$ld$hide$os10.7$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp7 = 0; \ -        extern const char sym##_tmp6 __asm("$ld$hide$os10.6$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp6 = 0;  -  #endif  +#include <Availability.h> +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#define NOT_HERE_BEFORE_10_6(sym) +#define NOT_HERE_IN_10_8_AND_EARLIER(sym)                                      \ +  extern const char sym##_tmp61 __asm("$ld$hide$os6.1$_" #sym);                \ +  __attribute__((visibility("default"))) const char sym##_tmp61 = 0;           \ +  extern const char sym##_tmp60 __asm("$ld$hide$os6.0$_" #sym);                \ +  __attribute__((visibility("default"))) const char sym##_tmp60 = 0;           \ +  extern const char sym##_tmp51 __asm("$ld$hide$os5.1$_" #sym);                \ +  __attribute__((visibility("default"))) const char sym##_tmp51 = 0;           \ +  extern const char sym##_tmp50 __asm("$ld$hide$os5.0$_" #sym);                \ +  __attribute__((visibility("default"))) const char sym##_tmp50 = 0; +#else +#define NOT_HERE_BEFORE_10_6(sym)                                              \ +  extern const char sym##_tmp4 __asm("$ld$hide$os10.4$_" #sym);                \ +  __attribute__((visibility("default"))) const char sym##_tmp4 = 0;            \ +  extern const char sym##_tmp5 __asm("$ld$hide$os10.5$_" #sym);                \ +  __attribute__((visibility("default"))) const char sym##_tmp5 = 0; +#define NOT_HERE_IN_10_8_AND_EARLIER(sym)                                      \ +  extern const char sym##_tmp8 __asm("$ld$hide$os10.8$_" #sym);                \ +  __attribute__((visibility("default"))) const char sym##_tmp8 = 0;            \ +  extern const char sym##_tmp7 __asm("$ld$hide$os10.7$_" #sym);                \ +  __attribute__((visibility("default"))) const char sym##_tmp7 = 0;            \ +  extern const char sym##_tmp6 __asm("$ld$hide$os10.6$_" #sym);                \ +  __attribute__((visibility("default"))) const char sym##_tmp6 = 0; +#endif -/* Symbols in libSystem.dylib in 10.6 and later,  - *  but are in libgcc_s.dylib in earlier versions - */ +// Symbols in libSystem.dylib in 10.6 and later, +//  but are in libgcc_s.dylib in earlier versions  NOT_HERE_BEFORE_10_6(__absvdi2)  NOT_HERE_BEFORE_10_6(__absvsi2) @@ -143,14 +138,13 @@ NOT_HERE_BEFORE_10_6(__udivti3)  NOT_HERE_BEFORE_10_6(__umoddi3)  NOT_HERE_BEFORE_10_6(__umodti3) -  #if __ppc__  NOT_HERE_BEFORE_10_6(__gcc_qadd)  NOT_HERE_BEFORE_10_6(__gcc_qdiv)  NOT_HERE_BEFORE_10_6(__gcc_qmul)  NOT_HERE_BEFORE_10_6(__gcc_qsub)  NOT_HERE_BEFORE_10_6(__trampoline_setup) -#endif /* __ppc__ */ +#endif // __ppc__  NOT_HERE_IN_10_8_AND_EARLIER(__atomic_compare_exchange)  NOT_HERE_IN_10_8_AND_EARLIER(__atomic_compare_exchange_1) @@ -201,24 +195,23 @@ NOT_HERE_IN_10_8_AND_EARLIER(__atomic_store_2)  NOT_HERE_IN_10_8_AND_EARLIER(__atomic_store_4)  NOT_HERE_IN_10_8_AND_EARLIER(__atomic_store_8) -  #if __arm__ && __DYNAMIC__ -   #define NOT_HERE_UNTIL_AFTER_4_3(sym) \ -        extern const char sym##_tmp1 __asm("$ld$hide$os3.0$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp1 = 0; \ -        extern const char sym##_tmp2 __asm("$ld$hide$os3.1$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp2 = 0; \ -        extern const char sym##_tmp3 __asm("$ld$hide$os3.2$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp3 = 0; \ -        extern const char sym##_tmp4 __asm("$ld$hide$os4.0$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp4 = 0; \ -        extern const char sym##_tmp5 __asm("$ld$hide$os4.1$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp5 = 0; \ -        extern const char sym##_tmp6 __asm("$ld$hide$os4.2$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp6 = 0; \ -        extern const char sym##_tmp7 __asm("$ld$hide$os4.3$_" #sym ); \ -            __attribute__((visibility("default"))) const char sym##_tmp7 = 0;  -             +#define NOT_HERE_UNTIL_AFTER_4_3(sym)                                          \ +  extern const char sym##_tmp1 __asm("$ld$hide$os3.0$_" #sym);                 \ +  __attribute__((visibility("default"))) const char sym##_tmp1 = 0;            \ +  extern const char sym##_tmp2 __asm("$ld$hide$os3.1$_" #sym);                 \ +  __attribute__((visibility("default"))) const char sym##_tmp2 = 0;            \ +  extern const char sym##_tmp3 __asm("$ld$hide$os3.2$_" #sym);                 \ +  __attribute__((visibility("default"))) const char sym##_tmp3 = 0;            \ +  extern const char sym##_tmp4 __asm("$ld$hide$os4.0$_" #sym);                 \ +  __attribute__((visibility("default"))) const char sym##_tmp4 = 0;            \ +  extern const char sym##_tmp5 __asm("$ld$hide$os4.1$_" #sym);                 \ +  __attribute__((visibility("default"))) const char sym##_tmp5 = 0;            \ +  extern const char sym##_tmp6 __asm("$ld$hide$os4.2$_" #sym);                 \ +  __attribute__((visibility("default"))) const char sym##_tmp6 = 0;            \ +  extern const char sym##_tmp7 __asm("$ld$hide$os4.3$_" #sym);                 \ +  __attribute__((visibility("default"))) const char sym##_tmp7 = 0; +  NOT_HERE_UNTIL_AFTER_4_3(__absvdi2)  NOT_HERE_UNTIL_AFTER_4_3(__absvsi2)  NOT_HERE_UNTIL_AFTER_4_3(__adddf3) @@ -339,12 +332,8 @@ NOT_HERE_UNTIL_AFTER_4_3(__divmodsi4)  NOT_HERE_UNTIL_AFTER_4_3(__udivmodsi4)  #endif // __arm__ && __DYNAMIC__ -        -        - - -#else /* !__APPLE__ */ +#else // !__APPLE__  extern int avoid_empty_file; -#endif /* !__APPLE__*/ +#endif // !__APPLE__ diff --git a/lib/builtins/arm/adddf3vfp.S b/lib/builtins/arm/adddf3vfp.S index 8e476cad1624..1a271db0847c 100644 --- a/lib/builtins/arm/adddf3vfp.S +++ b/lib/builtins/arm/adddf3vfp.S @@ -1,20 +1,18 @@  //===-- adddf3vfp.S - Implement adddf3vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" -//  // double __adddf3vfp(double a, double b) { return a + b; }  //  // Adds two double precision floating point numbers using the Darwin  // calling convention where double arguments are passsed in GPR pairs -// +  	.syntax unified  	.p2align 2  DEFINE_COMPILERRT_FUNCTION(__adddf3vfp) @@ -23,7 +21,7 @@ DEFINE_COMPILERRT_FUNCTION(__adddf3vfp)  #else  	vmov	d6, r0, r1		// move first param from r0/r1 pair into d6  	vmov	d7, r2, r3		// move second param from r2/r3 pair into d7 -	vadd.f64 d6, d6, d7		 +	vadd.f64 d6, d6, d7  	vmov	r0, r1, d6		// move result back to r0/r1 pair  #endif  	bx	lr diff --git a/lib/builtins/arm/addsf3.S b/lib/builtins/arm/addsf3.S index 74723cbeff74..aa4d40473edb 100644 --- a/lib/builtins/arm/addsf3.S +++ b/lib/builtins/arm/addsf3.S @@ -1,17 +1,16 @@ -/*===-- addsf3.S - Adds two single precision floating pointer numbers-----===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __addsf3 (single precision floating pointer number - * addition with the IEEE-754 default rounding (to nearest, ties to even) - * function for the ARM Thumb1 ISA. - * - *===----------------------------------------------------------------------===*/ +//===-- addsf3.S - Adds two single precision floating pointer numbers-----===// +// +// 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 implements the __addsf3 (single precision floating pointer number +// addition with the IEEE-754 default rounding (to nearest, ties to even) +// function for the ARM Thumb1 ISA. +// +//===----------------------------------------------------------------------===//  #include "../assembly.h"  #define significandBits 23 @@ -29,9 +28,9 @@ DEFINE_COMPILERRT_THUMB_FUNCTION(__addsf3)    // Get the absolute value of a and b.    lsls r2, r0, #1    lsls r3, r1, #1 -  lsrs r2, r2, #1  /* aAbs */ +  lsrs r2, r2, #1  // aAbs    beq  LOCAL_LABEL(a_zero_nan_inf) -  lsrs r3, r3, #1  /* bAbs */ +  lsrs r3, r3, #1  // bAbs    beq  LOCAL_LABEL(zero_nan_inf)    // Detect if a or b is infinity or Nan. @@ -55,9 +54,9 @@ LOCAL_LABEL(no_swap):    // Get the significands and shift them to give us round, guard and sticky.    lsls r4, r0, #(typeWidth - significandBits) -  lsrs r4, r4, #(typeWidth - significandBits - 3) /* aSignificand << 3 */ +  lsrs r4, r4, #(typeWidth - significandBits - 3) // aSignificand << 3    lsls r5, r1, #(typeWidth - significandBits) -  lsrs r5, r5, #(typeWidth - significandBits - 3) /* bSignificand << 3 */ +  lsrs r5, r5, #(typeWidth - significandBits - 3) // bSignificand << 3    // Get the implicitBit.    movs r6, #1 @@ -199,7 +198,7 @@ LOCAL_LABEL(do_substraction):    beq 1f    movs r7, #1  1: -  lsrs r4, r6 /* aSignificand >> shift */ +  lsrs r4, r6 // aSignificand >> shift    orrs r4, r7    b LOCAL_LABEL(form_result) diff --git a/lib/builtins/arm/addsf3vfp.S b/lib/builtins/arm/addsf3vfp.S index 8871efdcc5d1..c9d1fd1509a8 100644 --- a/lib/builtins/arm/addsf3vfp.S +++ b/lib/builtins/arm/addsf3vfp.S @@ -1,9 +1,8 @@  //===-- addsf3vfp.S - Implement addsf3vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_cdcmp.S b/lib/builtins/arm/aeabi_cdcmp.S index adc2d55d90f5..bd039a0329ea 100644 --- a/lib/builtins/arm/aeabi_cdcmp.S +++ b/lib/builtins/arm/aeabi_cdcmp.S @@ -1,9 +1,8 @@  //===-- aeabi_cdcmp.S - EABI cdcmp* implementation ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_cdcmpeq_check_nan.c b/lib/builtins/arm/aeabi_cdcmpeq_check_nan.c index 7578433a1df7..7bae8743fcf2 100644 --- a/lib/builtins/arm/aeabi_cdcmpeq_check_nan.c +++ b/lib/builtins/arm/aeabi_cdcmpeq_check_nan.c @@ -1,16 +1,15 @@  //===-- lib/arm/aeabi_cdcmpeq_helper.c - Helper for cdcmpeq ---------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../int_lib.h" +#include <stdint.h> -AEABI_RTABI __attribute__((visibility("hidden"))) -int __aeabi_cdcmpeq_check_nan(double a, double b) { -    return __builtin_isnan(a) || __builtin_isnan(b); +AEABI_RTABI __attribute__((visibility("hidden"))) int +__aeabi_cdcmpeq_check_nan(double a, double b) { +  return __builtin_isnan(a) || __builtin_isnan(b);  } diff --git a/lib/builtins/arm/aeabi_cfcmp.S b/lib/builtins/arm/aeabi_cfcmp.S index 4b1de997687f..a26cb2a3ce16 100644 --- a/lib/builtins/arm/aeabi_cfcmp.S +++ b/lib/builtins/arm/aeabi_cfcmp.S @@ -1,9 +1,8 @@  //===-- aeabi_cfcmp.S - EABI cfcmp* implementation ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_cfcmpeq_check_nan.c b/lib/builtins/arm/aeabi_cfcmpeq_check_nan.c index 43dde9a49597..25407337d075 100644 --- a/lib/builtins/arm/aeabi_cfcmpeq_check_nan.c +++ b/lib/builtins/arm/aeabi_cfcmpeq_check_nan.c @@ -1,16 +1,15 @@  //===-- lib/arm/aeabi_cfcmpeq_helper.c - Helper for cdcmpeq ---------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../int_lib.h" +#include <stdint.h> -AEABI_RTABI __attribute__((visibility("hidden"))) -int __aeabi_cfcmpeq_check_nan(float a, float b) { -    return __builtin_isnan(a) || __builtin_isnan(b); +AEABI_RTABI __attribute__((visibility("hidden"))) int +__aeabi_cfcmpeq_check_nan(float a, float b) { +  return __builtin_isnan(a) || __builtin_isnan(b);  } diff --git a/lib/builtins/arm/aeabi_dcmp.S b/lib/builtins/arm/aeabi_dcmp.S index 9fa78b461248..5f720670ddd7 100644 --- a/lib/builtins/arm/aeabi_dcmp.S +++ b/lib/builtins/arm/aeabi_dcmp.S @@ -1,9 +1,8 @@  //===-- aeabi_dcmp.S - EABI dcmp* implementation ---------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_div0.c b/lib/builtins/arm/aeabi_div0.c index dc3031326e37..7e8862321d82 100644 --- a/lib/builtins/arm/aeabi_div0.c +++ b/lib/builtins/arm/aeabi_div0.c @@ -1,34 +1,30 @@ -/* ===-- aeabi_div0.c - ARM Runtime ABI support routines for compiler-rt ---=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements the division by zero helper routines as specified by the - * Run-time ABI for the ARM Architecture. - * - * ===----------------------------------------------------------------------=== - */ +//===-- aeabi_div0.c - ARM Runtime ABI support routines for compiler-rt ---===// +// +// 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 implements the division by zero helper routines as specified by the +// Run-time ABI for the ARM Architecture. +// +//===----------------------------------------------------------------------===// -/* - * RTABI 4.3.2 - Division by zero - * - * The *div0 functions: - * - Return the value passed to them as a parameter - * - Or, return a fixed value defined by the execution environment (such as 0) - * - Or, raise a signal (often SIGFPE) or throw an exception, and do not return - * - * An application may provide its own implementations of the *div0 functions to - * for a particular behaviour from the *div and *divmod functions called out of - * line. - */ +// RTABI 4.3.2 - Division by zero +// +// The *div0 functions: +// - Return the value passed to them as a parameter +// - Or, return a fixed value defined by the execution environment (such as 0) +// - Or, raise a signal (often SIGFPE) or throw an exception, and do not return +// +// An application may provide its own implementations of the *div0 functions to +// for a particular behaviour from the *div and *divmod functions called out of +// line.  #include "../int_lib.h" -/* provide an unused declaration to pacify pendantic compilation */ +// provide an unused declaration to pacify pendantic compilation  extern unsigned char declaration;  #if defined(__ARM_EABI__) @@ -37,9 +33,8 @@ __aeabi_idiv0(int return_value) {    return return_value;  } -AEABI_RTABI long long __attribute__((weak)) __attribute__((visibility("hidden"))) -__aeabi_ldiv0(long long return_value) { +AEABI_RTABI long long __attribute__((weak)) +__attribute__((visibility("hidden"))) __aeabi_ldiv0(long long return_value) {    return return_value;  }  #endif - diff --git a/lib/builtins/arm/aeabi_drsub.c b/lib/builtins/arm/aeabi_drsub.c index 1254886086fb..e4e8dc051468 100644 --- a/lib/builtins/arm/aeabi_drsub.c +++ b/lib/builtins/arm/aeabi_drsub.c @@ -1,19 +1,14 @@  //===-- lib/arm/aeabi_drsub.c - Double-precision subtraction --------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  #define DOUBLE_PRECISION  #include "../fp_lib.h" -AEABI_RTABI fp_t -__aeabi_dsub(fp_t, fp_t); +AEABI_RTABI fp_t __aeabi_dsub(fp_t, fp_t); -AEABI_RTABI fp_t -__aeabi_drsub(fp_t a, fp_t b) { -    return __aeabi_dsub(b, a); -} +AEABI_RTABI fp_t __aeabi_drsub(fp_t a, fp_t b) { return __aeabi_dsub(b, a); } diff --git a/lib/builtins/arm/aeabi_fcmp.S b/lib/builtins/arm/aeabi_fcmp.S index ea5b96c21d57..cd311b417096 100644 --- a/lib/builtins/arm/aeabi_fcmp.S +++ b/lib/builtins/arm/aeabi_fcmp.S @@ -1,9 +1,8 @@  //===-- aeabi_fcmp.S - EABI fcmp* implementation ---------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_frsub.c b/lib/builtins/arm/aeabi_frsub.c index 34f2303745bc..9a363248f14f 100644 --- a/lib/builtins/arm/aeabi_frsub.c +++ b/lib/builtins/arm/aeabi_frsub.c @@ -1,19 +1,14 @@  //===-- lib/arm/aeabi_frsub.c - Single-precision subtraction --------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  #define SINGLE_PRECISION  #include "../fp_lib.h" -AEABI_RTABI fp_t -__aeabi_fsub(fp_t, fp_t); +AEABI_RTABI fp_t __aeabi_fsub(fp_t, fp_t); -AEABI_RTABI fp_t -__aeabi_frsub(fp_t a, fp_t b) { -    return __aeabi_fsub(b, a); -} +AEABI_RTABI fp_t __aeabi_frsub(fp_t a, fp_t b) { return __aeabi_fsub(b, a); } diff --git a/lib/builtins/arm/aeabi_idivmod.S b/lib/builtins/arm/aeabi_idivmod.S index 9c9c80ab5a7b..bb80e4b96fc1 100644 --- a/lib/builtins/arm/aeabi_idivmod.S +++ b/lib/builtins/arm/aeabi_idivmod.S @@ -1,9 +1,8 @@  //===-- aeabi_idivmod.S - EABI idivmod implementation ---------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_ldivmod.S b/lib/builtins/arm/aeabi_ldivmod.S index 038ae5d723a3..d0d06be6f329 100644 --- a/lib/builtins/arm/aeabi_ldivmod.S +++ b/lib/builtins/arm/aeabi_ldivmod.S @@ -1,9 +1,8 @@  //===-- aeabi_ldivmod.S - EABI ldivmod implementation ---------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_memcmp.S b/lib/builtins/arm/aeabi_memcmp.S index e86d6113760e..41637289c1bc 100644 --- a/lib/builtins/arm/aeabi_memcmp.S +++ b/lib/builtins/arm/aeabi_memcmp.S @@ -1,9 +1,8 @@  //===-- aeabi_memcmp.S - EABI memcmp implementation -----------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_memcpy.S b/lib/builtins/arm/aeabi_memcpy.S index e83c5fd4dbb3..93e1b05d54ce 100644 --- a/lib/builtins/arm/aeabi_memcpy.S +++ b/lib/builtins/arm/aeabi_memcpy.S @@ -1,9 +1,8 @@  //===-- aeabi_memcpy.S - EABI memcpy implementation -----------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_memmove.S b/lib/builtins/arm/aeabi_memmove.S index ee28300e46f2..c2f0fa4cd8ff 100644 --- a/lib/builtins/arm/aeabi_memmove.S +++ b/lib/builtins/arm/aeabi_memmove.S @@ -1,9 +1,8 @@  //===-- aeabi_memmove.S - EABI memmove implementation --------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===---------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_memset.S b/lib/builtins/arm/aeabi_memset.S index 0a678d7627e7..2aa8ec0c4679 100644 --- a/lib/builtins/arm/aeabi_memset.S +++ b/lib/builtins/arm/aeabi_memset.S @@ -1,9 +1,8 @@  //===-- aeabi_memset.S - EABI memset implementation -----------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_uidivmod.S b/lib/builtins/arm/aeabi_uidivmod.S index 88a4a6d8bc12..df030769fd40 100644 --- a/lib/builtins/arm/aeabi_uidivmod.S +++ b/lib/builtins/arm/aeabi_uidivmod.S @@ -1,9 +1,8 @@  //===-- aeabi_uidivmod.S - EABI uidivmod implementation -------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/aeabi_uldivmod.S b/lib/builtins/arm/aeabi_uldivmod.S index be343b6bc826..4fc97704d3c5 100644 --- a/lib/builtins/arm/aeabi_uldivmod.S +++ b/lib/builtins/arm/aeabi_uldivmod.S @@ -1,9 +1,8 @@  //===-- aeabi_uldivmod.S - EABI uldivmod implementation -------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/bswapdi2.S b/lib/builtins/arm/bswapdi2.S index e9db8bac7994..271df8bd6ad0 100644 --- a/lib/builtins/arm/bswapdi2.S +++ b/lib/builtins/arm/bswapdi2.S @@ -1,9 +1,8 @@  //===------- bswapdi2 - Implement bswapdi2 --------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/bswapsi2.S b/lib/builtins/arm/bswapsi2.S index 1f6eed5c1bbf..07cc3d89190e 100644 --- a/lib/builtins/arm/bswapsi2.S +++ b/lib/builtins/arm/bswapsi2.S @@ -1,9 +1,8 @@  //===------- bswapsi2 - Implement bswapsi2 --------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/chkstk.S b/lib/builtins/arm/chkstk.S index e3002105897e..c5c9ebe0a531 100644 --- a/lib/builtins/arm/chkstk.S +++ b/lib/builtins/arm/chkstk.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/arm/clzdi2.S b/lib/builtins/arm/clzdi2.S index fc03b385cdfa..685668b11b8e 100644 --- a/lib/builtins/arm/clzdi2.S +++ b/lib/builtins/arm/clzdi2.S @@ -1,16 +1,15 @@ -/* ===-- clzdi2.c - Implement __clzdi2 -------------------------------------=== - * - *               The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements count leading zeros for 64bit arguments. - * - * ===----------------------------------------------------------------------=== - */ +//===-- clzdi2.c - Implement __clzdi2 -------------------------------------===// +// +// 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 implements count leading zeros for 64bit arguments. +// +//===----------------------------------------------------------------------===// +  #include "../assembly.h"  	.syntax unified @@ -35,14 +34,12 @@ DEFINE_COMPILERRT_FUNCTION(__clzdi2)  #endif  	JMP(lr)  #else -	/* Assumption: n != 0 */ +	// Assumption: n != 0 -	/* -	 * r0: n -	 * r1: upper half of n, overwritten after check -	 * r1: count of leading zeros in n + 1 -	 * r2: scratch register for shifted r0 -	 */ +	// r0: n +	// r1: upper half of n, overwritten after check +	// r1: count of leading zeros in n + 1 +	// r2: scratch register for shifted r0  #ifdef __ARMEB__  	cmp	r0, 0  	moveq	r0, r1 @@ -53,14 +50,12 @@ DEFINE_COMPILERRT_FUNCTION(__clzdi2)  	movne	r1, 1  	moveq	r1, 33 -	/* -	 * Basic block: -	 * if ((r0 >> SHIFT) == 0) -	 *   r1 += SHIFT; -	 * else -	 *   r0 >>= SHIFT; -	 * for descending powers of two as SHIFT. -	 */ +	// Basic block: +	// if ((r0 >> SHIFT) == 0) +	//   r1 += SHIFT; +	// else +	//   r0 >>= SHIFT; +	// for descending powers of two as SHIFT.  #define BLOCK(shift) \  	lsrs	r2, r0, shift; \  	movne	r0, r2; \ @@ -71,18 +66,16 @@ DEFINE_COMPILERRT_FUNCTION(__clzdi2)  	BLOCK(4)  	BLOCK(2) -	/* -	 * The basic block invariants at this point are (r0 >> 2) == 0 and -	 * r0 != 0. This means 1 <= r0 <= 3 and 0 <= (r0 >> 1) <= 1. -	 * -	 * r0 | (r0 >> 1) == 0 | (r0 >> 1) == 1 | -(r0 >> 1) | 1 - (r0 >> 1) -	 * ---+----------------+----------------+------------+-------------- -	 * 1  | 1              | 0              | 0          | 1 -	 * 2  | 0              | 1              | -1         | 0 -	 * 3  | 0              | 1              | -1         | 0 -	 * -	 * The r1's initial value of 1 compensates for the 1 here. -	 */ +	// The basic block invariants at this point are (r0 >> 2) == 0 and +	// r0 != 0. This means 1 <= r0 <= 3 and 0 <= (r0 >> 1) <= 1. +	// +	// r0 | (r0 >> 1) == 0 | (r0 >> 1) == 1 | -(r0 >> 1) | 1 - (r0 >> 1) +	// ---+----------------+----------------+------------+-------------- +	// 1  | 1              | 0              | 0          | 1 +	// 2  | 0              | 1              | -1         | 0 +	// 3  | 0              | 1              | -1         | 0 +	// +	// The r1's initial value of 1 compensates for the 1 here.  	sub	r0, r1, r0, lsr #1  	JMP(lr) diff --git a/lib/builtins/arm/clzsi2.S b/lib/builtins/arm/clzsi2.S index f2ce59c90119..5d86fe486edd 100644 --- a/lib/builtins/arm/clzsi2.S +++ b/lib/builtins/arm/clzsi2.S @@ -1,16 +1,15 @@ -/* ===-- clzsi2.c - Implement __clzsi2 -------------------------------------=== - * - *               The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements count leading zeros for 32bit arguments. - * - * ===----------------------------------------------------------------------=== - */ +//===-- clzsi2.c - Implement __clzsi2 -------------------------------------===// +// +// 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 implements count leading zeros for 32bit arguments. +// +//===----------------------------------------------------------------------===// +  #include "../assembly.h"  	.syntax unified @@ -23,23 +22,19 @@ DEFINE_COMPILERRT_FUNCTION(__clzsi2)  	clz	r0, r0  	JMP(lr)  #else -	/* Assumption: n != 0 */ +	// Assumption: n != 0 -	/* -	 * r0: n -	 * r1: count of leading zeros in n + 1 -	 * r2: scratch register for shifted r0 -	 */ +	// r0: n +	// r1: count of leading zeros in n + 1 +	// r2: scratch register for shifted r0  	mov	r1, 1 -	/* -	 * Basic block: -	 * if ((r0 >> SHIFT) == 0) -	 *   r1 += SHIFT; -	 * else -	 *   r0 >>= SHIFT; -	 * for descending powers of two as SHIFT. -	 */ +	// Basic block: +	// if ((r0 >> SHIFT) == 0) +	//   r1 += SHIFT; +	// else +	//   r0 >>= SHIFT; +	// for descending powers of two as SHIFT.  #define BLOCK(shift) \  	lsrs	r2, r0, shift; \ @@ -51,18 +46,16 @@ DEFINE_COMPILERRT_FUNCTION(__clzsi2)  	BLOCK(4)  	BLOCK(2) -	/* -	 * The basic block invariants at this point are (r0 >> 2) == 0 and -	 * r0 != 0. This means 1 <= r0 <= 3 and 0 <= (r0 >> 1) <= 1. -	 * -	 * r0 | (r0 >> 1) == 0 | (r0 >> 1) == 1 | -(r0 >> 1) | 1 - (r0 >> 1) -	 * ---+----------------+----------------+------------+-------------- -	 * 1  | 1              | 0              | 0          | 1 -	 * 2  | 0              | 1              | -1         | 0 -	 * 3  | 0              | 1              | -1         | 0 -	 * -	 * The r1's initial value of 1 compensates for the 1 here. -	 */ +	// The basic block invariants at this point are (r0 >> 2) == 0 and +	// r0 != 0. This means 1 <= r0 <= 3 and 0 <= (r0 >> 1) <= 1. +	// +	// r0 | (r0 >> 1) == 0 | (r0 >> 1) == 1 | -(r0 >> 1) | 1 - (r0 >> 1) +	// ---+----------------+----------------+------------+-------------- +	// 1  | 1              | 0              | 0          | 1 +	// 2  | 0              | 1              | -1         | 0 +	// 3  | 0              | 1              | -1         | 0 +	// +	// The r1's initial value of 1 compensates for the 1 here.  	sub	r0, r1, r0, lsr #1  	JMP(lr) diff --git a/lib/builtins/arm/comparesf2.S b/lib/builtins/arm/comparesf2.S index c6c4cc067f07..24b85d2fee15 100644 --- a/lib/builtins/arm/comparesf2.S +++ b/lib/builtins/arm/comparesf2.S @@ -1,9 +1,8 @@  //===-- comparesf2.S - Implement single-precision soft-float comparisons --===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -38,14 +37,12 @@  //===----------------------------------------------------------------------===//  #include "../assembly.h" +      .syntax unified      .text      DEFINE_CODE_STATE -@ int __eqsf2(float a, float b) - -    .p2align 2 -DEFINE_COMPILERRT_FUNCTION(__eqsf2) +    .macro COMPARESF2_FUNCTION_BODY handle_nan:req  #if defined(COMPILER_RT_ARMHF_TARGET)      vmov r0, s0      vmov r1, s1 @@ -113,9 +110,9 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)      // b < 0 ? 1 : -1. Same if a and b have the opposite sign (ignoring Nan).      movs    r0,         #1      lsrs    r1,         #31 -    bne     LOCAL_LABEL(CHECK_NAN) +    bne     LOCAL_LABEL(CHECK_NAN\@)      negs    r0,         r0 -    b       LOCAL_LABEL(CHECK_NAN) +    b       LOCAL_LABEL(CHECK_NAN\@)  1:  #else      it lo @@ -131,7 +128,7 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)      // Here both have the same sign and absA > absB.      movs    r0,         #1      lsrs    r1,         #31 -    beq     LOCAL_LABEL(CHECK_NAN) +    beq     LOCAL_LABEL(CHECK_NAN\@)      negs    r0, r0  1:  #else @@ -152,7 +149,7 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)      // Finally, we need to deal with NaNs.  If either argument is NaN, replace      // the value in r0 with 1.  #if defined(USE_THUMB_1) -LOCAL_LABEL(CHECK_NAN): +LOCAL_LABEL(CHECK_NAN\@):      movs    r6,         #0xff      lsls    r6,         #24      cmp     r2,         r6 @@ -160,92 +157,60 @@ LOCAL_LABEL(CHECK_NAN):      cmp     r3,         r6  1:      bls     2f -    movs    r0,         #1 +    \handle_nan  2:      pop     {r6, pc}  #else      cmp     r2,         #0xff000000      ite ls      cmpls   r3,         #0xff000000 -    movhi   r0,         #1 +    \handle_nan      JMP(lr)  #endif +    .endm + +@ int __eqsf2(float a, float b) + +    .p2align 2 +DEFINE_COMPILERRT_FUNCTION(__eqsf2) + +    .macro __eqsf2_handle_nan +#if defined(USE_THUMB_1) +    movs    r0,         #1 +#else +    movhi   r0,         #1 +#endif +    .endm + +COMPARESF2_FUNCTION_BODY __eqsf2_handle_nan +  END_COMPILERRT_FUNCTION(__eqsf2)  DEFINE_COMPILERRT_FUNCTION_ALIAS(__lesf2, __eqsf2)  DEFINE_COMPILERRT_FUNCTION_ALIAS(__ltsf2, __eqsf2)  DEFINE_COMPILERRT_FUNCTION_ALIAS(__nesf2, __eqsf2) +#if defined(__ELF__) +// Alias for libgcc compatibility +DEFINE_COMPILERRT_FUNCTION_ALIAS(__cmpsf2, __lesf2) +#endif +  @ int __gtsf2(float a, float b)      .p2align 2  DEFINE_COMPILERRT_FUNCTION(__gtsf2) -    // Identical to the preceding except in that we return -1 for NaN values. -    // Given that the two paths share so much code, one might be tempted to -    // unify them; however, the extra code needed to do so makes the code size -    // to performance tradeoff very hard to justify for such small functions. -#if defined(COMPILER_RT_ARMHF_TARGET) -    vmov r0, s0 -    vmov r1, s1 -#endif + +    .macro __gtsf2_handle_nan  #if defined(USE_THUMB_1) -    push    {r6, lr} -    lsls    r2,        r0, #1 -    lsls    r3,        r1, #1 -    lsrs    r6,        r3, #1 -    orrs    r6,        r2 -    beq     1f -    movs    r6,        r0 -    eors    r6,        r1 -1: -    bmi     2f -    subs    r0,        r2, r3 -2: -    bhs     3f -    movs    r0,        #1 -    lsrs    r1,        #31 -    bne     LOCAL_LABEL(CHECK_NAN_2) -    negs    r0, r0 -    b       LOCAL_LABEL(CHECK_NAN_2) -3: -    bls     4f -    movs    r0,         #1 -    lsrs    r1,         #31 -    beq     LOCAL_LABEL(CHECK_NAN_2) -    negs    r0, r0 -4: -LOCAL_LABEL(CHECK_NAN_2): -    movs    r6,         #0xff -    lsls    r6,         #24 -    cmp     r2,         r6 -    bhi     5f -    cmp     r3,         r6 -5: -    bls     6f      movs    r0,         #1      negs    r0,         r0 -6: -    pop     {r6, pc}  #else -    mov     r2,         r0, lsl #1 -    mov     r3,         r1, lsl #1 -    orrs    r12,    r2, r3, lsr #1 -    it ne -    eorsne  r12,    r0, r1 -    it pl -    subspl  r0,     r2, r3 -    it lo -    mvnlo   r0,         r1, asr #31 -    it hi -    movhi   r0,         r1, asr #31 -    it ne -    orrne   r0,     r0, #1 -    cmp     r2,         #0xff000000 -    ite ls -    cmpls   r3,         #0xff000000      movhi   r0,         #-1 -    JMP(lr)  #endif +    .endm + +COMPARESF2_FUNCTION_BODY __gtsf2_handle_nan +  END_COMPILERRT_FUNCTION(__gtsf2)  DEFINE_COMPILERRT_FUNCTION_ALIAS(__gesf2, __gtsf2) @@ -283,11 +248,11 @@ DEFINE_COMPILERRT_FUNCTION(__unordsf2)  END_COMPILERRT_FUNCTION(__unordsf2)  #if defined(COMPILER_RT_ARMHF_TARGET) -DEFINE_COMPILERRT_FUNCTION(__aeabi_fcmpum) +DEFINE_COMPILERRT_FUNCTION(__aeabi_fcmpun)  	vmov s0, r0  	vmov s1, r1  	b SYMBOL_NAME(__unordsf2) -END_COMPILERRT_FUNCTION(__aeabi_fcmpum) +END_COMPILERRT_FUNCTION(__aeabi_fcmpun)  #else  DEFINE_AEABI_FUNCTION_ALIAS(__aeabi_fcmpun, __unordsf2)  #endif diff --git a/lib/builtins/arm/divdf3vfp.S b/lib/builtins/arm/divdf3vfp.S index 776ba4f24b47..ad50b57a651d 100644 --- a/lib/builtins/arm/divdf3vfp.S +++ b/lib/builtins/arm/divdf3vfp.S @@ -1,9 +1,8 @@  //===-- divdf3vfp.S - Implement divdf3vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/divmodsi4.S b/lib/builtins/arm/divmodsi4.S index 8a027b741efe..f94438dfd593 100644 --- a/lib/builtins/arm/divmodsi4.S +++ b/lib/builtins/arm/divmodsi4.S @@ -1,17 +1,16 @@ -/*===-- divmodsi4.S - 32-bit signed integer divide and modulus ------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __divmodsi4 (32-bit signed integer divide and - * modulus) function for the ARM architecture.  A naive digit-by-digit - * computation is employed for simplicity. - * - *===----------------------------------------------------------------------===*/ +//===-- divmodsi4.S - 32-bit signed integer divide and modulus ------------===// +// +// 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 implements the __divmodsi4 (32-bit signed integer divide and +// modulus) function for the ARM architecture.  A naive digit-by-digit +// computation is employed for simplicity. +// +//===----------------------------------------------------------------------===//  #include "../assembly.h" diff --git a/lib/builtins/arm/divsf3vfp.S b/lib/builtins/arm/divsf3vfp.S index 130318f0c37b..958a6724bbe3 100644 --- a/lib/builtins/arm/divsf3vfp.S +++ b/lib/builtins/arm/divsf3vfp.S @@ -1,9 +1,8 @@  //===-- divsf3vfp.S - Implement divsf3vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/divsi3.S b/lib/builtins/arm/divsi3.S index 19757af177eb..761bf49d3ed0 100644 --- a/lib/builtins/arm/divsi3.S +++ b/lib/builtins/arm/divsi3.S @@ -1,16 +1,15 @@ -/*===-- divsi3.S - 32-bit signed integer divide ---------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __divsi3 (32-bit signed integer divide) function - * for the ARM architecture as a wrapper around the unsigned routine. - * - *===----------------------------------------------------------------------===*/ +//===-- divsi3.S - 32-bit signed integer divide ---------------------------===// +// +// 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 implements the __divsi3 (32-bit signed integer divide) function +// for the ARM architecture as a wrapper around the unsigned routine. +// +//===----------------------------------------------------------------------===//  #include "../assembly.h" diff --git a/lib/builtins/arm/eqdf2vfp.S b/lib/builtins/arm/eqdf2vfp.S index d50706570916..2a0a64b97e7d 100644 --- a/lib/builtins/arm/eqdf2vfp.S +++ b/lib/builtins/arm/eqdf2vfp.S @@ -1,21 +1,19 @@  //===-- eqdf2vfp.S - Implement eqdf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" -//  // extern int __eqdf2vfp(double a, double b);  //  // Returns one iff a == b and neither is NaN. -// Uses Darwin calling convention where double precision arguments are passsed  +// Uses Darwin calling convention where double precision arguments are passsed  // like in GPR pairs. -// +  	.syntax unified  	.p2align 2  DEFINE_COMPILERRT_FUNCTION(__eqdf2vfp) @@ -24,7 +22,7 @@ DEFINE_COMPILERRT_FUNCTION(__eqdf2vfp)  #else  	vmov	d6, r0, r1	// load r0/r1 pair in double register  	vmov	d7, r2, r3	// load r2/r3 pair in double register -	vcmp.f64 d6, d7		 +	vcmp.f64 d6, d7  #endif  	vmrs	apsr_nzcv, fpscr  	ITE(eq) diff --git a/lib/builtins/arm/eqsf2vfp.S b/lib/builtins/arm/eqsf2vfp.S index fd72b2fdbdee..5fefe7b71762 100644 --- a/lib/builtins/arm/eqsf2vfp.S +++ b/lib/builtins/arm/eqsf2vfp.S @@ -1,9 +1,8 @@  //===-- eqsf2vfp.S - Implement eqsf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __eqsf2vfp(float a, float b);  //  // Returns one iff a == b and neither is NaN. -// Uses Darwin calling convention where single precision arguments are passsed  +// Uses Darwin calling convention where single precision arguments are passsed  // like 32-bit ints  //  	.syntax unified diff --git a/lib/builtins/arm/extendsfdf2vfp.S b/lib/builtins/arm/extendsfdf2vfp.S index 1079f977bae6..37c8be8dcd9c 100644 --- a/lib/builtins/arm/extendsfdf2vfp.S +++ b/lib/builtins/arm/extendsfdf2vfp.S @@ -1,9 +1,8 @@  //===-- extendsfdf2vfp.S - Implement extendsfdf2vfp -----------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern double __extendsfdf2vfp(float a);  //  // Converts single precision float to double precision result. -// Uses Darwin calling convention where a single precision parameter is  +// Uses Darwin calling convention where a single precision parameter is  // passed in a GPR and a double precision result is returned in R0/R1 pair.  //  	.syntax unified diff --git a/lib/builtins/arm/fixdfsivfp.S b/lib/builtins/arm/fixdfsivfp.S index 5d7b0f856549..af1d4f4fa5f5 100644 --- a/lib/builtins/arm/fixdfsivfp.S +++ b/lib/builtins/arm/fixdfsivfp.S @@ -1,9 +1,8 @@  //===-- fixdfsivfp.S - Implement fixdfsivfp -----------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __fixdfsivfp(double a);  //  // Converts double precision float to a 32-bit int rounding towards zero. -// Uses Darwin calling convention where a double precision parameter is  +// Uses Darwin calling convention where a double precision parameter is  // passed in GPR register pair.  //  	.syntax unified diff --git a/lib/builtins/arm/fixsfsivfp.S b/lib/builtins/arm/fixsfsivfp.S index 805a277afa34..30b2f3cf9364 100644 --- a/lib/builtins/arm/fixsfsivfp.S +++ b/lib/builtins/arm/fixsfsivfp.S @@ -1,9 +1,8 @@  //===-- fixsfsivfp.S - Implement fixsfsivfp -----------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __fixsfsivfp(float a);  //  // Converts single precision float to a 32-bit int rounding towards zero. -// Uses Darwin calling convention where a single precision parameter is  +// Uses Darwin calling convention where a single precision parameter is  // passed in a GPR..  //  	.syntax unified diff --git a/lib/builtins/arm/fixunsdfsivfp.S b/lib/builtins/arm/fixunsdfsivfp.S index 4f1b2c8cefdc..44e6dbd4989e 100644 --- a/lib/builtins/arm/fixunsdfsivfp.S +++ b/lib/builtins/arm/fixunsdfsivfp.S @@ -1,9 +1,8 @@  //===-- fixunsdfsivfp.S - Implement fixunsdfsivfp -------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -12,9 +11,9 @@  //  // extern unsigned int __fixunsdfsivfp(double a);  // -// Converts double precision float to a 32-bit unsigned int rounding towards  +// Converts double precision float to a 32-bit unsigned int rounding towards  // zero. All negative values become zero. -// Uses Darwin calling convention where a double precision parameter is  +// Uses Darwin calling convention where a double precision parameter is  // passed in GPR register pair.  //  	.syntax unified diff --git a/lib/builtins/arm/fixunssfsivfp.S b/lib/builtins/arm/fixunssfsivfp.S index e5d778236879..5d6ee7cce27f 100644 --- a/lib/builtins/arm/fixunssfsivfp.S +++ b/lib/builtins/arm/fixunssfsivfp.S @@ -1,9 +1,8 @@  //===-- fixunssfsivfp.S - Implement fixunssfsivfp -------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -12,9 +11,9 @@  //  // extern unsigned int __fixunssfsivfp(float a);  // -// Converts single precision float to a 32-bit unsigned int rounding towards  +// Converts single precision float to a 32-bit unsigned int rounding towards  // zero. All negative values become zero. -// Uses Darwin calling convention where a single precision parameter is  +// Uses Darwin calling convention where a single precision parameter is  // passed in a GPR..  //  	.syntax unified diff --git a/lib/builtins/arm/floatsidfvfp.S b/lib/builtins/arm/floatsidfvfp.S index 3297ad44d8cd..ae8d2465889c 100644 --- a/lib/builtins/arm/floatsidfvfp.S +++ b/lib/builtins/arm/floatsidfvfp.S @@ -1,9 +1,8 @@  //===-- floatsidfvfp.S - Implement floatsidfvfp ---------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern double __floatsidfvfp(int a);  //  // Converts a 32-bit int to a double precision float. -// Uses Darwin calling convention where a double precision result is  +// Uses Darwin calling convention where a double precision result is  // return in GPR register pair.  //  	.syntax unified diff --git a/lib/builtins/arm/floatsisfvfp.S b/lib/builtins/arm/floatsisfvfp.S index 65408b54b8d4..a36bc5ee5ee0 100644 --- a/lib/builtins/arm/floatsisfvfp.S +++ b/lib/builtins/arm/floatsisfvfp.S @@ -1,9 +1,8 @@  //===-- floatsisfvfp.S - Implement floatsisfvfp ---------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern float __floatsisfvfp(int a);  //  // Converts single precision float to a 32-bit int rounding towards zero. -// Uses Darwin calling convention where a single precision result is  +// Uses Darwin calling convention where a single precision result is  // return in a GPR..  //  	.syntax unified diff --git a/lib/builtins/arm/floatunssidfvfp.S b/lib/builtins/arm/floatunssidfvfp.S index d7a7024a25b8..0932dab2bdb9 100644 --- a/lib/builtins/arm/floatunssidfvfp.S +++ b/lib/builtins/arm/floatunssidfvfp.S @@ -1,9 +1,8 @@  //===-- floatunssidfvfp.S - Implement floatunssidfvfp ---------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern double __floatunssidfvfp(unsigned int a);  //  // Converts a 32-bit int to a double precision float. -// Uses Darwin calling convention where a double precision result is  +// Uses Darwin calling convention where a double precision result is  // return in GPR register pair.  //  	.syntax unified diff --git a/lib/builtins/arm/floatunssisfvfp.S b/lib/builtins/arm/floatunssisfvfp.S index 1ca856519a92..9578546f40d6 100644 --- a/lib/builtins/arm/floatunssisfvfp.S +++ b/lib/builtins/arm/floatunssisfvfp.S @@ -1,9 +1,8 @@  //===-- floatunssisfvfp.S - Implement floatunssisfvfp ---------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern float __floatunssisfvfp(unsigned int a);  //  // Converts single precision float to a 32-bit int rounding towards zero. -// Uses Darwin calling convention where a single precision result is  +// Uses Darwin calling convention where a single precision result is  // return in a GPR..  //  	.syntax unified diff --git a/lib/builtins/arm/gedf2vfp.S b/lib/builtins/arm/gedf2vfp.S index 364fc5b24cd1..2af9d909967b 100644 --- a/lib/builtins/arm/gedf2vfp.S +++ b/lib/builtins/arm/gedf2vfp.S @@ -1,9 +1,8 @@  //===-- gedf2vfp.S - Implement gedf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __gedf2vfp(double a, double b);  //  // Returns one iff a >= b and neither is NaN. -// Uses Darwin calling convention where double precision arguments are passsed  +// Uses Darwin calling convention where double precision arguments are passsed  // like in GPR pairs.  //  	.syntax unified diff --git a/lib/builtins/arm/gesf2vfp.S b/lib/builtins/arm/gesf2vfp.S index 346c3473ae4c..cedd1e13eb22 100644 --- a/lib/builtins/arm/gesf2vfp.S +++ b/lib/builtins/arm/gesf2vfp.S @@ -1,9 +1,8 @@  //===-- gesf2vfp.S - Implement gesf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __gesf2vfp(float a, float b);  //  // Returns one iff a >= b and neither is NaN. -// Uses Darwin calling convention where single precision arguments are passsed  +// Uses Darwin calling convention where single precision arguments are passsed  // like 32-bit ints  //  	.syntax unified diff --git a/lib/builtins/arm/gtdf2vfp.S b/lib/builtins/arm/gtdf2vfp.S index 3389c3ad9737..782ad8cac013 100644 --- a/lib/builtins/arm/gtdf2vfp.S +++ b/lib/builtins/arm/gtdf2vfp.S @@ -1,9 +1,8 @@  //===-- gtdf2vfp.S - Implement gtdf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern double __gtdf2vfp(double a, double b);  //  // Returns one iff a > b and neither is NaN. -// Uses Darwin calling convention where double precision arguments are passsed  +// Uses Darwin calling convention where double precision arguments are passsed  // like in GPR pairs.  //  	.syntax unified diff --git a/lib/builtins/arm/gtsf2vfp.S b/lib/builtins/arm/gtsf2vfp.S index afdba8b018e2..1cc2bd14f810 100644 --- a/lib/builtins/arm/gtsf2vfp.S +++ b/lib/builtins/arm/gtsf2vfp.S @@ -1,9 +1,8 @@  //===-- gtsf2vfp.S - Implement gtsf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __gtsf2vfp(float a, float b);  //  // Returns one iff a > b and neither is NaN. -// Uses Darwin calling convention where single precision arguments are passsed  +// Uses Darwin calling convention where single precision arguments are passsed  // like 32-bit ints  //  	.syntax unified diff --git a/lib/builtins/arm/ledf2vfp.S b/lib/builtins/arm/ledf2vfp.S index 4bbe4c86837c..0097e4b6c129 100644 --- a/lib/builtins/arm/ledf2vfp.S +++ b/lib/builtins/arm/ledf2vfp.S @@ -1,9 +1,8 @@  //===-- ledf2vfp.S - Implement ledf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern double __ledf2vfp(double a, double b);  //  // Returns one iff a <= b and neither is NaN. -// Uses Darwin calling convention where double precision arguments are passsed  +// Uses Darwin calling convention where double precision arguments are passsed  // like in GPR pairs.  //  	.syntax unified diff --git a/lib/builtins/arm/lesf2vfp.S b/lib/builtins/arm/lesf2vfp.S index 51232bd8cedc..2052d3869145 100644 --- a/lib/builtins/arm/lesf2vfp.S +++ b/lib/builtins/arm/lesf2vfp.S @@ -1,9 +1,8 @@  //===-- lesf2vfp.S - Implement lesf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __lesf2vfp(float a, float b);  //  // Returns one iff a <= b and neither is NaN. -// Uses Darwin calling convention where single precision arguments are passsed  +// Uses Darwin calling convention where single precision arguments are passsed  // like 32-bit ints  //  	.syntax unified diff --git a/lib/builtins/arm/ltdf2vfp.S b/lib/builtins/arm/ltdf2vfp.S index 8e2928c813d2..a126aa9e0536 100644 --- a/lib/builtins/arm/ltdf2vfp.S +++ b/lib/builtins/arm/ltdf2vfp.S @@ -1,9 +1,8 @@  //===-- ltdf2vfp.S - Implement ltdf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern double __ltdf2vfp(double a, double b);  //  // Returns one iff a < b and neither is NaN. -// Uses Darwin calling convention where double precision arguments are passsed  +// Uses Darwin calling convention where double precision arguments are passsed  // like in GPR pairs.  //  	.syntax unified diff --git a/lib/builtins/arm/ltsf2vfp.S b/lib/builtins/arm/ltsf2vfp.S index 59c00c6bab67..ba10d71d2095 100644 --- a/lib/builtins/arm/ltsf2vfp.S +++ b/lib/builtins/arm/ltsf2vfp.S @@ -1,9 +1,8 @@  //===-- ltsf2vfp.S - Implement ltsf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __ltsf2vfp(float a, float b);  //  // Returns one iff a < b and neither is NaN. -// Uses Darwin calling convention where single precision arguments are passsed  +// Uses Darwin calling convention where single precision arguments are passsed  // like 32-bit ints  //  	.syntax unified diff --git a/lib/builtins/arm/modsi3.S b/lib/builtins/arm/modsi3.S index be263834d7f1..5312f5b41c4d 100644 --- a/lib/builtins/arm/modsi3.S +++ b/lib/builtins/arm/modsi3.S @@ -1,16 +1,15 @@ -/*===-- modsi3.S - 32-bit signed integer modulus --------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __modsi3 (32-bit signed integer modulus) function - * for the ARM architecture as a wrapper around the unsigned routine. - * - *===----------------------------------------------------------------------===*/ +//===-- modsi3.S - 32-bit signed integer modulus --------------------------===// +// +// 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 implements the __modsi3 (32-bit signed integer modulus) function +// for the ARM architecture as a wrapper around the unsigned routine. +// +//===----------------------------------------------------------------------===//  #include "../assembly.h" diff --git a/lib/builtins/arm/muldf3vfp.S b/lib/builtins/arm/muldf3vfp.S index aa7b23495034..9adc937bcb3f 100644 --- a/lib/builtins/arm/muldf3vfp.S +++ b/lib/builtins/arm/muldf3vfp.S @@ -1,9 +1,8 @@  //===-- muldf3vfp.S - Implement muldf3vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/mulsf3vfp.S b/lib/builtins/arm/mulsf3vfp.S index a1da789dcade..a94131bebb92 100644 --- a/lib/builtins/arm/mulsf3vfp.S +++ b/lib/builtins/arm/mulsf3vfp.S @@ -1,9 +1,8 @@  //===-- mulsf3vfp.S - Implement mulsf3vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/nedf2vfp.S b/lib/builtins/arm/nedf2vfp.S index aef72eb00974..32d35c41d466 100644 --- a/lib/builtins/arm/nedf2vfp.S +++ b/lib/builtins/arm/nedf2vfp.S @@ -1,21 +1,19 @@  //===-- nedf2vfp.S - Implement nedf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" -//  // extern double __nedf2vfp(double a, double b);  //  // Returns zero if a and b are unequal and neither is NaN. -// Uses Darwin calling convention where double precision arguments are passsed  +// Uses Darwin calling convention where double precision arguments are passsed  // like in GPR pairs. -// +  	.syntax unified  	.p2align 2  DEFINE_COMPILERRT_FUNCTION(__nedf2vfp) @@ -24,7 +22,7 @@ DEFINE_COMPILERRT_FUNCTION(__nedf2vfp)  #else  	vmov 	d6, r0, r1	// load r0/r1 pair in double register  	vmov 	d7, r2, r3	// load r2/r3 pair in double register -	vcmp.f64 d6, d7		 +	vcmp.f64 d6, d7  #endif  	vmrs	apsr_nzcv, fpscr  	ITE(ne) diff --git a/lib/builtins/arm/negdf2vfp.S b/lib/builtins/arm/negdf2vfp.S index 81f0ab8eec1d..b7cf91877e38 100644 --- a/lib/builtins/arm/negdf2vfp.S +++ b/lib/builtins/arm/negdf2vfp.S @@ -1,9 +1,8 @@  //===-- negdf2vfp.S - Implement negdf2vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -12,7 +11,7 @@  //  // extern double __negdf2vfp(double a, double b);  // -// Returns the negation a double precision floating point numbers using the  +// Returns the negation a double precision floating point numbers using the  // Darwin calling convention where double arguments are passsed in GPR pairs.  //  	.syntax unified diff --git a/lib/builtins/arm/negsf2vfp.S b/lib/builtins/arm/negsf2vfp.S index 46ab4a9cf164..b6d3c618927f 100644 --- a/lib/builtins/arm/negsf2vfp.S +++ b/lib/builtins/arm/negsf2vfp.S @@ -1,9 +1,8 @@  //===-- negsf2vfp.S - Implement negsf2vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -12,7 +11,7 @@  //  // extern float __negsf2vfp(float a);  // -// Returns the negation of a single precision floating point numbers using the  +// Returns the negation of a single precision floating point numbers using the  // Darwin calling convention where single arguments are passsed like 32-bit ints  //  	.syntax unified diff --git a/lib/builtins/arm/nesf2vfp.S b/lib/builtins/arm/nesf2vfp.S index 50d60f493005..34c8bb4896c2 100644 --- a/lib/builtins/arm/nesf2vfp.S +++ b/lib/builtins/arm/nesf2vfp.S @@ -1,9 +1,8 @@  //===-- nesf2vfp.S - Implement nesf2vfp -----------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __nesf2vfp(float a, float b);  //  // Returns one iff a != b and neither is NaN. -// Uses Darwin calling convention where single precision arguments are passsed  +// Uses Darwin calling convention where single precision arguments are passsed  // like 32-bit ints  //  	.syntax unified diff --git a/lib/builtins/arm/restore_vfp_d8_d15_regs.S b/lib/builtins/arm/restore_vfp_d8_d15_regs.S index 0692cf3e1b77..fd6d59bb3c38 100644 --- a/lib/builtins/arm/restore_vfp_d8_d15_regs.S +++ b/lib/builtins/arm/restore_vfp_d8_d15_regs.S @@ -1,9 +1,8 @@  //===-- save_restore_regs.S - Implement save/restore* ---------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/save_vfp_d8_d15_regs.S b/lib/builtins/arm/save_vfp_d8_d15_regs.S index 544dd5467a4d..5eb3a2fbaae7 100644 --- a/lib/builtins/arm/save_vfp_d8_d15_regs.S +++ b/lib/builtins/arm/save_vfp_d8_d15_regs.S @@ -1,9 +1,8 @@  //===-- save_restore_regs.S - Implement save/restore* ---------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/softfloat-alias.list b/lib/builtins/arm/softfloat-alias.list index cc6a4b3cdd2e..ab6ed21e54b0 100644 --- a/lib/builtins/arm/softfloat-alias.list +++ b/lib/builtins/arm/softfloat-alias.list @@ -1,5 +1,5 @@  # -# These are soft float functions which can be  +# These are soft float functions which can be  # aliased to the *vfp functions on arm processors  # that support floating point instructions.  # diff --git a/lib/builtins/arm/subdf3vfp.S b/lib/builtins/arm/subdf3vfp.S index 2b6f2bdbfdd5..f4eaf9af1afe 100644 --- a/lib/builtins/arm/subdf3vfp.S +++ b/lib/builtins/arm/subdf3vfp.S @@ -1,9 +1,8 @@  //===-- subdf3vfp.S - Implement subdf3vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -12,7 +11,7 @@  //  // extern double __subdf3vfp(double a, double b);  // -// Returns difference between two double precision floating point numbers using  +// Returns difference between two double precision floating point numbers using  // the Darwin calling convention where double arguments are passsed in GPR pairs  //  	.syntax unified @@ -23,7 +22,7 @@ DEFINE_COMPILERRT_FUNCTION(__subdf3vfp)  #else  	vmov 	d6, r0, r1         // move first param from r0/r1 pair into d6  	vmov 	d7, r2, r3         // move second param from r2/r3 pair into d7 -	vsub.f64 d6, d6, d7		 +	vsub.f64 d6, d6, d7  	vmov 	r0, r1, d6         // move result back to r0/r1 pair  #endif  	bx	lr diff --git a/lib/builtins/arm/subsf3vfp.S b/lib/builtins/arm/subsf3vfp.S index 3e83ea26507d..80e69f2e8e88 100644 --- a/lib/builtins/arm/subsf3vfp.S +++ b/lib/builtins/arm/subsf3vfp.S @@ -1,9 +1,8 @@  //===-- subsf3vfp.S - Implement subsf3vfp ---------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/switch16.S b/lib/builtins/arm/switch16.S index df9e38e176ce..a4b568da59da 100644 --- a/lib/builtins/arm/switch16.S +++ b/lib/builtins/arm/switch16.S @@ -1,9 +1,8 @@  //===-- switch.S - Implement switch* --------------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/switch32.S b/lib/builtins/arm/switch32.S index d97b5361436d..f2a5af5275cf 100644 --- a/lib/builtins/arm/switch32.S +++ b/lib/builtins/arm/switch32.S @@ -1,9 +1,8 @@  //===-- switch.S - Implement switch* --------------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/switch8.S b/lib/builtins/arm/switch8.S index 4d9e0eaff845..0db875c32914 100644 --- a/lib/builtins/arm/switch8.S +++ b/lib/builtins/arm/switch8.S @@ -1,9 +1,8 @@  //===-- switch.S - Implement switch* --------------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/switchu8.S b/lib/builtins/arm/switchu8.S index 4ffe35f0549b..551abebc6083 100644 --- a/lib/builtins/arm/switchu8.S +++ b/lib/builtins/arm/switchu8.S @@ -1,9 +1,8 @@  //===-- switch.S - Implement switch* --------------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/arm/sync-ops.h b/lib/builtins/arm/sync-ops.h index ee02c30c6eaa..c9623249e5d2 100644 --- a/lib/builtins/arm/sync-ops.h +++ b/lib/builtins/arm/sync-ops.h @@ -1,64 +1,61 @@ -/*===-- sync-ops.h - --===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements outline macros for the __sync_fetch_and_* - * operations. Different instantiations will generate appropriate assembly for - * ARM and Thumb-2 versions of the functions. - * - *===----------------------------------------------------------------------===*/ +//===-- sync-ops.h - --===// +// +// 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 implements outline macros for the __sync_fetch_and_* +// operations. Different instantiations will generate appropriate assembly for +// ARM and Thumb-2 versions of the functions. +// +//===----------------------------------------------------------------------===//  #include "../assembly.h" -#define SYNC_OP_4(op) \ -        .p2align 2 ; \ -        .thumb ; \ -        .syntax unified ; \ -        DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_ ## op) \ -        dmb ; \ -        mov r12, r0 ; \ -        LOCAL_LABEL(tryatomic_ ## op): \ -        ldrex r0, [r12] ; \ -        op(r2, r0, r1) ; \ -        strex r3, r2, [r12] ; \ -        cmp r3, #0 ; \ -        bne LOCAL_LABEL(tryatomic_ ## op) ; \ -        dmb ; \ -        bx lr +#define SYNC_OP_4(op)                                                          \ +  .p2align 2;                                                                  \ +  .thumb;                                                                      \ +  .syntax unified;                                                             \ +  DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op)                      \ +  dmb;                                                                         \ +  mov r12, r0;                                                                 \ +  LOCAL_LABEL(tryatomic_##op) : ldrex r0, [r12];                               \ +  op(r2, r0, r1);                                                              \ +  strex r3, r2, [r12];                                                         \ +  cmp r3, #0;                                                                  \ +  bne LOCAL_LABEL(tryatomic_##op);                                             \ +  dmb;                                                                         \ +  bx lr -#define SYNC_OP_8(op) \ -        .p2align 2 ; \ -        .thumb ; \ -        .syntax unified ; \ -        DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_ ## op) \ -        push {r4, r5, r6, lr} ; \ -        dmb ; \ -        mov r12, r0 ; \ -        LOCAL_LABEL(tryatomic_ ## op): \ -        ldrexd r0, r1, [r12] ; \ -        op(r4, r5, r0, r1, r2, r3) ; \ -        strexd r6, r4, r5, [r12] ; \ -        cmp r6, #0 ; \ -        bne LOCAL_LABEL(tryatomic_ ## op) ; \ -        dmb ; \ -        pop {r4, r5, r6, pc} +#define SYNC_OP_8(op)                                                          \ +  .p2align 2;                                                                  \ +  .thumb;                                                                      \ +  .syntax unified;                                                             \ +  DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op)                      \ +  push {r4, r5, r6, lr};                                                       \ +  dmb;                                                                         \ +  mov r12, r0;                                                                 \ +  LOCAL_LABEL(tryatomic_##op) : ldrexd r0, r1, [r12];                          \ +  op(r4, r5, r0, r1, r2, r3);                                                  \ +  strexd r6, r4, r5, [r12];                                                    \ +  cmp r6, #0;                                                                  \ +  bne LOCAL_LABEL(tryatomic_##op);                                             \ +  dmb;                                                                         \ +  pop { r4, r5, r6, pc } -#define MINMAX_4(rD, rN, rM, cmp_kind) \ -        cmp rN, rM ; \ -        mov rD, rM ; \ -        it cmp_kind ; \ -        mov##cmp_kind rD, rN +#define MINMAX_4(rD, rN, rM, cmp_kind)                                         \ +  cmp rN, rM;                                                                  \ +  mov rD, rM;                                                                  \ +  it cmp_kind;                                                                 \ +  mov##cmp_kind rD, rN -#define MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, cmp_kind) \ -        cmp rN_LO, rM_LO ; \ -        sbcs rN_HI, rM_HI ; \ -        mov rD_LO, rM_LO ; \ -        mov rD_HI, rM_HI ; \ -        itt cmp_kind ; \ -        mov##cmp_kind rD_LO, rN_LO ; \ -        mov##cmp_kind rD_HI, rN_HI +#define MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, cmp_kind)           \ +  cmp rN_LO, rM_LO;                                                            \ +  sbcs rN_HI, rM_HI;                                                           \ +  mov rD_LO, rM_LO;                                                            \ +  mov rD_HI, rM_HI;                                                            \ +  itt cmp_kind;                                                                \ +  mov##cmp_kind rD_LO, rN_LO;                                                  \ +  mov##cmp_kind rD_HI, rN_HI diff --git a/lib/builtins/arm/sync_fetch_and_add_4.S b/lib/builtins/arm/sync_fetch_and_add_4.S index 7877d6c46c11..0d55975b7a3a 100644 --- a/lib/builtins/arm/sync_fetch_and_add_4.S +++ b/lib/builtins/arm/sync_fetch_and_add_4.S @@ -1,20 +1,19 @@ -/*===-- sync_fetch_and_add_4.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_add_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_add_4.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_add_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" -/* "adds" is 2 bytes shorter than "add". */ +// "adds" is 2 bytes shorter than "add".  #define add_4(rD, rN, rM)  add rD, rN, rM  SYNC_OP_4(add_4) diff --git a/lib/builtins/arm/sync_fetch_and_add_8.S b/lib/builtins/arm/sync_fetch_and_add_8.S index 1df07a342a1b..18bdd875b8b7 100644 --- a/lib/builtins/arm/sync_fetch_and_add_8.S +++ b/lib/builtins/arm/sync_fetch_and_add_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_add_8.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_add_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_add_8.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_add_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_and_4.S b/lib/builtins/arm/sync_fetch_and_and_4.S index 720ff02279cd..3a76acca671e 100644 --- a/lib/builtins/arm/sync_fetch_and_and_4.S +++ b/lib/builtins/arm/sync_fetch_and_and_4.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_and_4.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_and_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_and_4.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_and_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_and_8.S b/lib/builtins/arm/sync_fetch_and_and_8.S index 4f7b5ca7ab29..3716eff809d5 100644 --- a/lib/builtins/arm/sync_fetch_and_and_8.S +++ b/lib/builtins/arm/sync_fetch_and_and_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_and_8.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_and_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_and_8.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_and_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_max_4.S b/lib/builtins/arm/sync_fetch_and_max_4.S index 43da9c7d4067..b9cee45219de 100644 --- a/lib/builtins/arm/sync_fetch_and_max_4.S +++ b/lib/builtins/arm/sync_fetch_and_max_4.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_max_4.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_max_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_max_4.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_max_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_max_8.S b/lib/builtins/arm/sync_fetch_and_max_8.S index 898fc6202ac8..06115ab55246 100644 --- a/lib/builtins/arm/sync_fetch_and_max_8.S +++ b/lib/builtins/arm/sync_fetch_and_max_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_max_8.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_max_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_max_8.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_max_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_min_4.S b/lib/builtins/arm/sync_fetch_and_min_4.S index bba31a03aace..60d435a0bd3f 100644 --- a/lib/builtins/arm/sync_fetch_and_min_4.S +++ b/lib/builtins/arm/sync_fetch_and_min_4.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_min_4.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_min_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_min_4.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_min_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_min_8.S b/lib/builtins/arm/sync_fetch_and_min_8.S index e7ccf9fb60ef..4f3e299d95cc 100644 --- a/lib/builtins/arm/sync_fetch_and_min_8.S +++ b/lib/builtins/arm/sync_fetch_and_min_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_min_8.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_min_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_min_8.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_min_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_nand_4.S b/lib/builtins/arm/sync_fetch_and_nand_4.S index c13dd394588f..5a04be0f6455 100644 --- a/lib/builtins/arm/sync_fetch_and_nand_4.S +++ b/lib/builtins/arm/sync_fetch_and_nand_4.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_nand_4.S - -----------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_nand_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_nand_4.S - -----------------------------------------===// +// +// 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 implements the __sync_fetch_and_nand_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_nand_8.S b/lib/builtins/arm/sync_fetch_and_nand_8.S index e8107ab3a33c..425c94474af7 100644 --- a/lib/builtins/arm/sync_fetch_and_nand_8.S +++ b/lib/builtins/arm/sync_fetch_and_nand_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_nand_8.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_nand_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_nand_8.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_nand_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_or_4.S b/lib/builtins/arm/sync_fetch_and_or_4.S index 6726571a944f..f44751b9a9f2 100644 --- a/lib/builtins/arm/sync_fetch_and_or_4.S +++ b/lib/builtins/arm/sync_fetch_and_or_4.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_or_4.S - -------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_or_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_or_4.S - -------------------------------------------===// +// +// 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 implements the __sync_fetch_and_or_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_or_8.S b/lib/builtins/arm/sync_fetch_and_or_8.S index f7f162c7c3b3..4f18dcf84df9 100644 --- a/lib/builtins/arm/sync_fetch_and_or_8.S +++ b/lib/builtins/arm/sync_fetch_and_or_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_or_8.S - -------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_or_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_or_8.S - -------------------------------------------===// +// +// 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 implements the __sync_fetch_and_or_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_sub_4.S b/lib/builtins/arm/sync_fetch_and_sub_4.S index b9326b14cdd5..999d48c28aec 100644 --- a/lib/builtins/arm/sync_fetch_and_sub_4.S +++ b/lib/builtins/arm/sync_fetch_and_sub_4.S @@ -1,20 +1,19 @@ -/*===-- sync_fetch_and_sub_4.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_sub_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_sub_4.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_sub_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" -/* "subs" is 2 bytes shorter than "sub". */ +// "subs" is 2 bytes shorter than "sub".  #define sub_4(rD, rN, rM)  sub rD, rN, rM  SYNC_OP_4(sub_4) diff --git a/lib/builtins/arm/sync_fetch_and_sub_8.S b/lib/builtins/arm/sync_fetch_and_sub_8.S index 6ce743e5ee9f..25a4a1076555 100644 --- a/lib/builtins/arm/sync_fetch_and_sub_8.S +++ b/lib/builtins/arm/sync_fetch_and_sub_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_sub_8.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_sub_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_sub_8.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_sub_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_umax_4.S b/lib/builtins/arm/sync_fetch_and_umax_4.S index b8d19ff35057..a7b233b15305 100644 --- a/lib/builtins/arm/sync_fetch_and_umax_4.S +++ b/lib/builtins/arm/sync_fetch_and_umax_4.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_umax_4.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_umax_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_umax_4.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_umax_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_umax_8.S b/lib/builtins/arm/sync_fetch_and_umax_8.S index 34442fd77454..aa5213ff1def 100644 --- a/lib/builtins/arm/sync_fetch_and_umax_8.S +++ b/lib/builtins/arm/sync_fetch_and_umax_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_umax_8.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_umax_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_umax_8.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_umax_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_umin_4.S b/lib/builtins/arm/sync_fetch_and_umin_4.S index 0998e3e10f58..c7a9c89df60a 100644 --- a/lib/builtins/arm/sync_fetch_and_umin_4.S +++ b/lib/builtins/arm/sync_fetch_and_umin_4.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_umin_4.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_umin_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_umin_4.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_umin_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_umin_8.S b/lib/builtins/arm/sync_fetch_and_umin_8.S index 558f91390512..8b40541ab47d 100644 --- a/lib/builtins/arm/sync_fetch_and_umin_8.S +++ b/lib/builtins/arm/sync_fetch_and_umin_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_umin_8.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_umin_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_umin_8.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_umin_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_xor_4.S b/lib/builtins/arm/sync_fetch_and_xor_4.S index 824f49146880..f509191d0175 100644 --- a/lib/builtins/arm/sync_fetch_and_xor_4.S +++ b/lib/builtins/arm/sync_fetch_and_xor_4.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_xor_4.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_xor_4 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_xor_4.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_xor_4 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_fetch_and_xor_8.S b/lib/builtins/arm/sync_fetch_and_xor_8.S index 073fb9c20f25..7436eb1d4cae 100644 --- a/lib/builtins/arm/sync_fetch_and_xor_8.S +++ b/lib/builtins/arm/sync_fetch_and_xor_8.S @@ -1,16 +1,15 @@ -/*===-- sync_fetch_and_xor_8.S - ------------------------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __sync_fetch_and_xor_8 function for the ARM - * architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- sync_fetch_and_xor_8.S - ------------------------------------------===// +// +// 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 implements the __sync_fetch_and_xor_8 function for the ARM +// architecture. +// +//===----------------------------------------------------------------------===//  #include "sync-ops.h" diff --git a/lib/builtins/arm/sync_synchronize.S b/lib/builtins/arm/sync_synchronize.S index 61d1db910f0d..dd06e7191f9b 100644 --- a/lib/builtins/arm/sync_synchronize.S +++ b/lib/builtins/arm/sync_synchronize.S @@ -1,20 +1,17 @@  //===-- sync_synchronize - Implement memory barrier * ----------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" -//  // When compiling a use of the gcc built-in __sync_synchronize() in thumb1 mode -// the compiler may emit a call to __sync_synchronize.   -// On Darwin the implementation jumps to an OS supplied function named  +// the compiler may emit a call to __sync_synchronize. +// On Darwin the implementation jumps to an OS supplied function named  // OSMemoryBarrier -//  	.text  	.syntax unified @@ -31,7 +28,7 @@ END_COMPILERRT_FUNCTION(__sync_synchronize)  	// tell linker it can break up file at label boundaries  	.subsections_via_symbols -		 +  #endif  NO_EXEC_STACK_DIRECTIVE diff --git a/lib/builtins/arm/truncdfsf2vfp.S b/lib/builtins/arm/truncdfsf2vfp.S index 682e54d3d294..a3c0a73466e9 100644 --- a/lib/builtins/arm/truncdfsf2vfp.S +++ b/lib/builtins/arm/truncdfsf2vfp.S @@ -1,9 +1,8 @@  //===-- truncdfsf2vfp.S - Implement truncdfsf2vfp -------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern float __truncdfsf2vfp(double a);  //  // Converts double precision float to signle precision result. -// Uses Darwin calling convention where a double precision parameter is  +// Uses Darwin calling convention where a double precision parameter is  // passed in a R0/R1 pair and a signle precision result is returned in R0.  //  	.syntax unified diff --git a/lib/builtins/arm/udivmodsi4.S b/lib/builtins/arm/udivmodsi4.S index ee3950c9b0eb..0f40575fe99e 100644 --- a/lib/builtins/arm/udivmodsi4.S +++ b/lib/builtins/arm/udivmodsi4.S @@ -1,16 +1,15 @@ -/*===-- udivmodsi4.S - 32-bit unsigned integer divide and modulus ---------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __udivmodsi4 (32-bit unsigned integer divide and - * modulus) function for the ARM 32-bit architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- udivmodsi4.S - 32-bit unsigned integer divide and modulus ---------===// +// +// 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 implements the __udivmodsi4 (32-bit unsigned integer divide and +// modulus) function for the ARM 32-bit architecture. +// +//===----------------------------------------------------------------------===//  #include "../assembly.h" @@ -39,26 +38,25 @@ DEFINE_COMPILERRT_FUNCTION(__udivmodsi4)  	beq	LOCAL_LABEL(divby1)  	cmp	r0, r1  	bcc	LOCAL_LABEL(quotient0) -	/* -	 * Implement division using binary long division algorithm. -	 * -	 * r0 is the numerator, r1 the denominator. -	 * -	 * The code before JMP computes the correct shift I, so that -	 * r0 and (r1 << I) have the highest bit set in the same position. -	 * At the time of JMP, ip := .Ldiv0block - 12 * I. -	 * This depends on the fixed instruction size of block. -	 * For ARM mode, this is 12 Bytes, for THUMB mode 14 Bytes. -	 * -	 * block(shift) implements the test-and-update-quotient core. -	 * It assumes (r0 << shift) can be computed without overflow and -	 * that (r0 << shift) < 2 * r1. The quotient is stored in r3. -	 */ + +	// Implement division using binary long division algorithm. +	// +	// r0 is the numerator, r1 the denominator. +	// +	// The code before JMP computes the correct shift I, so that +	// r0 and (r1 << I) have the highest bit set in the same position. +	// At the time of JMP, ip := .Ldiv0block - 12 * I. +	// This depends on the fixed instruction size of block. +	// For ARM mode, this is 12 Bytes, for THUMB mode 14 Bytes. +	// +	// block(shift) implements the test-and-update-quotient core. +	// It assumes (r0 << shift) can be computed without overflow and +	// that (r0 << shift) < 2 * r1. The quotient is stored in r3.  #  ifdef __ARM_FEATURE_CLZ  	clz	ip, r0  	clz	r3, r1 -	/* r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3. */ +	// r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3.  	sub	r3, r3, ip  #    if defined(USE_THUMB_2)  	adr	ip, LOCAL_LABEL(div0block) + 1 @@ -99,11 +97,11 @@ DEFINE_COMPILERRT_FUNCTION(__udivmodsi4)  	movhs	r4, r3  	subhs	ip, ip, #(2 * 12) -	/* Last block, no need to update r3 or r4. */ +	// Last block, no need to update r3 or r4.  	cmp	r1, r4, lsr #1  	subls	ip, ip, #(1 * 12) -	ldr	r4, [sp], #8	/* restore r4, we are done with it. */ +	ldr	r4, [sp], #8	// restore r4, we are done with it.  	mov	r3, #0  	JMP(ip) @@ -164,7 +162,7 @@ LOCAL_LABEL(divby1):  	mov	r3, #0  	str	r3, [r2]  	JMP(lr) -#endif /* __ARM_ARCH_EXT_IDIV__ */ +#endif // __ARM_ARCH_EXT_IDIV__  LOCAL_LABEL(divby0):  	mov	r0, #0 diff --git a/lib/builtins/arm/udivsi3.S b/lib/builtins/arm/udivsi3.S index 6dea27d404ff..9b1b035b33d6 100644 --- a/lib/builtins/arm/udivsi3.S +++ b/lib/builtins/arm/udivsi3.S @@ -1,16 +1,15 @@ -/*===-- udivsi3.S - 32-bit unsigned integer divide ------------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __udivsi3 (32-bit unsigned integer divide) - * function for the ARM 32-bit architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- udivsi3.S - 32-bit unsigned integer divide ------------------------===// +// +// 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 implements the __udivsi3 (32-bit unsigned integer divide) +// function for the ARM 32-bit architecture. +// +//===----------------------------------------------------------------------===//  #include "../assembly.h" @@ -40,7 +39,7 @@ LOCAL_LABEL(divby0):  	JMP(lr)  #  endif -#else /* ! __ARM_ARCH_EXT_IDIV__ */ +#else // ! __ARM_ARCH_EXT_IDIV__  	cmp	r1, #1  	bcc	LOCAL_LABEL(divby0)  #if defined(USE_THUMB_1) @@ -63,26 +62,24 @@ LOCAL_LABEL(num_ge_denom):  	JMPc(lr, cc)  #endif -	/* -	 * Implement division using binary long division algorithm. -	 * -	 * r0 is the numerator, r1 the denominator. -	 * -	 * The code before JMP computes the correct shift I, so that -	 * r0 and (r1 << I) have the highest bit set in the same position. -	 * At the time of JMP, ip := .Ldiv0block - 12 * I. -	 * This depends on the fixed instruction size of block. -	 * For ARM mode, this is 12 Bytes, for THUMB mode 14 Bytes. -	 * -	 * block(shift) implements the test-and-update-quotient core. -	 * It assumes (r0 << shift) can be computed without overflow and -	 * that (r0 << shift) < 2 * r1. The quotient is stored in r3. -	 */ +	// Implement division using binary long division algorithm. +	// +	// r0 is the numerator, r1 the denominator. +	// +	// The code before JMP computes the correct shift I, so that +	// r0 and (r1 << I) have the highest bit set in the same position. +	// At the time of JMP, ip := .Ldiv0block - 12 * I. +	// This depends on the fixed instruction size of block. +	// For ARM mode, this is 12 Bytes, for THUMB mode 14 Bytes. +	// +	// block(shift) implements the test-and-update-quotient core. +	// It assumes (r0 << shift) can be computed without overflow and +	// that (r0 << shift) < 2 * r1. The quotient is stored in r3.  #  if defined(__ARM_FEATURE_CLZ)  	clz	ip, r0  	clz	r3, r1 -	/* r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3. */ +	// r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3.  	sub	r3, r3, ip  #    if defined(USE_THUMB_2)  	adr	ip, LOCAL_LABEL(div0block) + 1 @@ -94,7 +91,7 @@ LOCAL_LABEL(num_ge_denom):  	sub	ip, ip, r3, lsl #3  	mov	r3, #0  	bx	ip -#  else /* No CLZ Feature */ +#  else // No CLZ Feature  #    if defined(USE_THUMB_2)  #    error THUMB mode requires CLZ or UDIV  #    endif @@ -160,7 +157,7 @@ LOCAL_LABEL(skip_2):  	subhs	ip, ip, #(2 * BLOCK_SIZE)  #    endif -	/* Last block, no need to update r2 or r3. */ +	// Last block, no need to update r2 or r3.  #    if defined(USE_THUMB_1)  	lsrs r3, r2, #1  	cmp r3, r1 @@ -180,12 +177,12 @@ LOCAL_LABEL(skip_1):  	JMP(ip)  #    endif -#  endif /* __ARM_FEATURE_CLZ */ +#  endif // __ARM_FEATURE_CLZ  #define	IMM	# -	/* due to the range limit of branch in Thumb1, we have to place the -		 block closer */ +	// due to the range limit of branch in Thumb1, we have to place the +	// block closer  LOCAL_LABEL(divby0):  	movs	r0, #0  #      if defined(__ARM_EABI__) @@ -204,13 +201,13 @@ LOCAL_LABEL(divby0):  	blo LOCAL_LABEL(block_skip_##shift);                                         \  	subs r0, r0, r2;                                                             \  	LOCAL_LABEL(block_skip_##shift) :;                                           \ -	adcs r3, r3 /* same as ((r3 << 1) | Carry). Carry is set if r0 >= r2. */ +	adcs r3, r3 // same as ((r3 << 1) | Carry). Carry is set if r0 >= r2. -	/* TODO: if current location counter is not not word aligned, we don't -		 need the .p2align and nop */ -	/* Label div0block must be word-aligned. First align block 31 */ +	// TODO: if current location counter is not not word aligned, we don't +	// need the .p2align and nop +	// Label div0block must be word-aligned. First align block 31  	.p2align 2 -	nop /* Padding to align div0block as 31 blocks = 310 bytes */ +	nop // Padding to align div0block as 31 blocks = 310 bytes  #else  #define block(shift)                                                           \ @@ -256,7 +253,7 @@ LOCAL_LABEL(div0block):  	mov	r0, r3  	JMP(lr) -#endif /* __ARM_ARCH_EXT_IDIV__ */ +#endif // __ARM_ARCH_EXT_IDIV__  END_COMPILERRT_FUNCTION(__udivsi3) diff --git a/lib/builtins/arm/umodsi3.S b/lib/builtins/arm/umodsi3.S index 069fad34cb9c..5ab78de17853 100644 --- a/lib/builtins/arm/umodsi3.S +++ b/lib/builtins/arm/umodsi3.S @@ -1,16 +1,15 @@ -/*===-- umodsi3.S - 32-bit unsigned integer modulus -----------------------===// - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===// - * - * This file implements the __umodsi3 (32-bit unsigned integer modulus) - * function for the ARM 32-bit architecture. - * - *===----------------------------------------------------------------------===*/ +//===-- umodsi3.S - 32-bit unsigned integer modulus -----------------------===// +// +// 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 implements the __umodsi3 (32-bit unsigned integer modulus) +// function for the ARM 32-bit architecture. +// +//===----------------------------------------------------------------------===//  #include "../assembly.h" @@ -38,26 +37,25 @@ DEFINE_COMPILERRT_FUNCTION(__umodsi3)  	cmp	r0, r1  	IT(cc)  	JMPc(lr, cc) -	/* -	 * Implement division using binary long division algorithm. -	 * -	 * r0 is the numerator, r1 the denominator. -	 * -	 * The code before JMP computes the correct shift I, so that -	 * r0 and (r1 << I) have the highest bit set in the same position. -	 * At the time of JMP, ip := .Ldiv0block - 8 * I. -	 * This depends on the fixed instruction size of block. -	 * For ARM mode, this is 8 Bytes, for THUMB mode 10 Bytes. -	 * -	 * block(shift) implements the test-and-update-quotient core. -	 * It assumes (r0 << shift) can be computed without overflow and -	 * that (r0 << shift) < 2 * r1. The quotient is stored in r3. -	 */ + +	// Implement division using binary long division algorithm. +	// +	// r0 is the numerator, r1 the denominator. +	// +	// The code before JMP computes the correct shift I, so that +	// r0 and (r1 << I) have the highest bit set in the same position. +	// At the time of JMP, ip := .Ldiv0block - 8 * I. +	// This depends on the fixed instruction size of block. +	// For ARM mode, this is 8 Bytes, for THUMB mode 10 Bytes. +	// +	// block(shift) implements the test-and-update-quotient core. +	// It assumes (r0 << shift) can be computed without overflow and +	// that (r0 << shift) < 2 * r1. The quotient is stored in r3.  #  ifdef __ARM_FEATURE_CLZ  	clz	ip, r0  	clz	r3, r1 -	/* r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3. */ +	// r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3.  	sub	r3, r3, ip  #    if defined(USE_THUMB_2)  	adr	ip, LOCAL_LABEL(div0block) + 1 @@ -94,7 +92,7 @@ DEFINE_COMPILERRT_FUNCTION(__umodsi3)  	movhs	r2, r3  	subhs	ip, ip, #(2 * 8) -	/* Last block, no need to update r2 or r3. */ +	// Last block, no need to update r2 or r3.  	cmp	r1, r2, lsr #1  	subls	ip, ip, #(1 * 8) @@ -142,7 +140,7 @@ DEFINE_COMPILERRT_FUNCTION(__umodsi3)  LOCAL_LABEL(div0block):  	block(0)  	JMP(lr) -#endif /* __ARM_ARCH_EXT_IDIV__ */ +#endif // __ARM_ARCH_EXT_IDIV__  LOCAL_LABEL(divby0):  	mov	r0, #0 diff --git a/lib/builtins/arm/unorddf2vfp.S b/lib/builtins/arm/unorddf2vfp.S index 6625fa8a3119..ea36a1cb5594 100644 --- a/lib/builtins/arm/unorddf2vfp.S +++ b/lib/builtins/arm/unorddf2vfp.S @@ -1,9 +1,8 @@  //===-- unorddf2vfp.S - Implement unorddf2vfp ------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __unorddf2vfp(double a, double b);  //  // Returns one iff a or b is NaN -// Uses Darwin calling convention where double precision arguments are passsed  +// Uses Darwin calling convention where double precision arguments are passsed  // like in GPR pairs.  //  	.syntax unified diff --git a/lib/builtins/arm/unordsf2vfp.S b/lib/builtins/arm/unordsf2vfp.S index 0b5da2ba3e17..7311297329dc 100644 --- a/lib/builtins/arm/unordsf2vfp.S +++ b/lib/builtins/arm/unordsf2vfp.S @@ -1,9 +1,8 @@  //===-- unordsf2vfp.S - Implement unordsf2vfp -----------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -13,7 +12,7 @@  // extern int __unordsf2vfp(float a, float b);  //  // Returns one iff a or b is NaN -// Uses Darwin calling convention where single precision arguments are passsed  +// Uses Darwin calling convention where single precision arguments are passsed  // like 32-bit ints  //  	.syntax unified diff --git a/lib/builtins/ashldi3.c b/lib/builtins/ashldi3.c index a5c1836006b9..7c81057a2284 100644 --- a/lib/builtins/ashldi3.c +++ b/lib/builtins/ashldi3.c @@ -1,45 +1,38 @@ -/* ====-- ashldi3.c - Implement __ashldi3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ashldi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +// ====-- ashldi3.c - Implement __ashldi3 ---------------------------------===// +// +// 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 implements __ashldi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a << b */ +// Returns: a << b -/* Precondition:  0 <= b < bits_in_dword */ +// Precondition:  0 <= b < bits_in_dword -COMPILER_RT_ABI di_int -__ashldi3(di_int a, si_int b) -{ -    const int bits_in_word = (int)(sizeof(si_int) * CHAR_BIT); -    dwords input; -    dwords result; -    input.all = a; -    if (b & bits_in_word)  /* bits_in_word <= b < bits_in_dword */ -    { -        result.s.low = 0; -        result.s.high = input.s.low << (b - bits_in_word); -    } -    else  /* 0 <= b < bits_in_word */ -    { -        if (b == 0) -            return a; -        result.s.low  = input.s.low << b; -        result.s.high = (input.s.high << b) | (input.s.low >> (bits_in_word - b)); -    } -    return result.all; +COMPILER_RT_ABI di_int __ashldi3(di_int a, si_int b) { +  const int bits_in_word = (int)(sizeof(si_int) * CHAR_BIT); +  dwords input; +  dwords result; +  input.all = a; +  if (b & bits_in_word) /* bits_in_word <= b < bits_in_dword */ { +    result.s.low = 0; +    result.s.high = input.s.low << (b - bits_in_word); +  } else /* 0 <= b < bits_in_word */ { +    if (b == 0) +      return a; +    result.s.low = input.s.low << b; +    result.s.high = (input.s.high << b) | (input.s.low >> (bits_in_word - b)); +  } +  return result.all;  }  #if defined(__ARM_EABI__) -AEABI_RTABI di_int __aeabi_llsl(di_int a, si_int b) COMPILER_RT_ALIAS(__ashldi3); +COMPILER_RT_ALIAS(__ashldi3, __aeabi_llsl)  #endif diff --git a/lib/builtins/ashlti3.c b/lib/builtins/ashlti3.c index 638ae845ff04..2d7bd4a89380 100644 --- a/lib/builtins/ashlti3.c +++ b/lib/builtins/ashlti3.c @@ -1,45 +1,38 @@ -/* ===-- ashlti3.c - Implement __ashlti3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ashlti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ashlti3.c - Implement __ashlti3 -----------------------------------===// +// +// 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 implements __ashlti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: a << b */ +// Returns: a << b -/* Precondition:  0 <= b < bits_in_tword */ +// Precondition:  0 <= b < bits_in_tword -COMPILER_RT_ABI ti_int -__ashlti3(ti_int a, si_int b) -{ -    const int bits_in_dword = (int)(sizeof(di_int) * CHAR_BIT); -    twords input; -    twords result; -    input.all = a; -    if (b & bits_in_dword)  /* bits_in_dword <= b < bits_in_tword */ -    { -        result.s.low = 0; -        result.s.high = input.s.low << (b - bits_in_dword); -    } -    else  /* 0 <= b < bits_in_dword */ -    { -        if (b == 0) -            return a; -        result.s.low  = input.s.low << b; -        result.s.high = (input.s.high << b) | (input.s.low >> (bits_in_dword - b)); -    } -    return result.all; +COMPILER_RT_ABI ti_int __ashlti3(ti_int a, si_int b) { +  const int bits_in_dword = (int)(sizeof(di_int) * CHAR_BIT); +  twords input; +  twords result; +  input.all = a; +  if (b & bits_in_dword) /* bits_in_dword <= b < bits_in_tword */ { +    result.s.low = 0; +    result.s.high = input.s.low << (b - bits_in_dword); +  } else /* 0 <= b < bits_in_dword */ { +    if (b == 0) +      return a; +    result.s.low = input.s.low << b; +    result.s.high = (input.s.high << b) | (input.s.low >> (bits_in_dword - b)); +  } +  return result.all;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/ashrdi3.c b/lib/builtins/ashrdi3.c index 84619965eca0..b9939132205c 100644 --- a/lib/builtins/ashrdi3.c +++ b/lib/builtins/ashrdi3.c @@ -1,46 +1,39 @@ -/*===-- ashrdi3.c - Implement __ashrdi3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ashrdi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ashrdi3.c - Implement __ashrdi3 -----------------------------------===// +// +// 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 implements __ashrdi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: arithmetic a >> b */ +// Returns: arithmetic a >> b -/* Precondition:  0 <= b < bits_in_dword */ +// Precondition:  0 <= b < bits_in_dword -COMPILER_RT_ABI di_int -__ashrdi3(di_int a, si_int b) -{ -    const int bits_in_word = (int)(sizeof(si_int) * CHAR_BIT); -    dwords input; -    dwords result; -    input.all = a; -    if (b & bits_in_word)  /* bits_in_word <= b < bits_in_dword */ -    { -        /* result.s.high = input.s.high < 0 ? -1 : 0 */ -        result.s.high = input.s.high >> (bits_in_word - 1); -        result.s.low = input.s.high >> (b - bits_in_word); -    } -    else  /* 0 <= b < bits_in_word */ -    { -        if (b == 0) -            return a; -        result.s.high  = input.s.high >> b; -        result.s.low = (input.s.high << (bits_in_word - b)) | (input.s.low >> b); -    } -    return result.all; +COMPILER_RT_ABI di_int __ashrdi3(di_int a, si_int b) { +  const int bits_in_word = (int)(sizeof(si_int) * CHAR_BIT); +  dwords input; +  dwords result; +  input.all = a; +  if (b & bits_in_word) /* bits_in_word <= b < bits_in_dword */ { +    // result.s.high = input.s.high < 0 ? -1 : 0 +    result.s.high = input.s.high >> (bits_in_word - 1); +    result.s.low = input.s.high >> (b - bits_in_word); +  } else /* 0 <= b < bits_in_word */ { +    if (b == 0) +      return a; +    result.s.high = input.s.high >> b; +    result.s.low = (input.s.high << (bits_in_word - b)) | (input.s.low >> b); +  } +  return result.all;  }  #if defined(__ARM_EABI__) -AEABI_RTABI di_int __aeabi_lasr(di_int a, si_int b) COMPILER_RT_ALIAS(__ashrdi3); +COMPILER_RT_ALIAS(__ashrdi3, __aeabi_lasr)  #endif diff --git a/lib/builtins/ashrti3.c b/lib/builtins/ashrti3.c index f78205d961e4..f573b6d6ccba 100644 --- a/lib/builtins/ashrti3.c +++ b/lib/builtins/ashrti3.c @@ -1,46 +1,39 @@ -/* ===-- ashrti3.c - Implement __ashrti3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ashrti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ashrti3.c - Implement __ashrti3 -----------------------------------===// +// +// 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 implements __ashrti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: arithmetic a >> b */ +// Returns: arithmetic a >> b -/* Precondition:  0 <= b < bits_in_tword */ +// Precondition:  0 <= b < bits_in_tword -COMPILER_RT_ABI ti_int -__ashrti3(ti_int a, si_int b) -{ -    const int bits_in_dword = (int)(sizeof(di_int) * CHAR_BIT); -    twords input; -    twords result; -    input.all = a; -    if (b & bits_in_dword)  /* bits_in_dword <= b < bits_in_tword */ -    { -        /* result.s.high = input.s.high < 0 ? -1 : 0 */ -        result.s.high = input.s.high >> (bits_in_dword - 1); -        result.s.low = input.s.high >> (b - bits_in_dword); -    } -    else  /* 0 <= b < bits_in_dword */ -    { -        if (b == 0) -            return a; -        result.s.high  = input.s.high >> b; -        result.s.low = (input.s.high << (bits_in_dword - b)) | (input.s.low >> b); -    } -    return result.all; +COMPILER_RT_ABI ti_int __ashrti3(ti_int a, si_int b) { +  const int bits_in_dword = (int)(sizeof(di_int) * CHAR_BIT); +  twords input; +  twords result; +  input.all = a; +  if (b & bits_in_dword) /* bits_in_dword <= b < bits_in_tword */ { +    // result.s.high = input.s.high < 0 ? -1 : 0 +    result.s.high = input.s.high >> (bits_in_dword - 1); +    result.s.low = input.s.high >> (b - bits_in_dword); +  } else /* 0 <= b < bits_in_dword */ { +    if (b == 0) +      return a; +    result.s.high = input.s.high >> b; +    result.s.low = (input.s.high << (bits_in_dword - b)) | (input.s.low >> b); +  } +  return result.all;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/assembly.h b/lib/builtins/assembly.h index 3f5e59b25442..f437cb87f60a 100644 --- a/lib/builtins/assembly.h +++ b/lib/builtins/assembly.h @@ -1,17 +1,15 @@ -/* ===-- assembly.h - compiler-rt assembler support macros -----------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file defines macros for use in compiler-rt assembler source. - * This file is not part of the interface of this library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- assembly.h - compiler-rt assembler support macros -----------------===// +// +// 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 defines macros for use in compiler-rt assembler source. +// This file is not part of the interface of this library. +// +//===----------------------------------------------------------------------===//  #ifndef COMPILERRT_ASSEMBLY_H  #define COMPILERRT_ASSEMBLY_H @@ -69,11 +67,9 @@  #if defined(__arm__) -/* - * Determine actual [ARM][THUMB[1][2]] ISA using compiler predefined macros: - * - for '-mthumb -march=armv6' compiler defines '__thumb__' - * - for '-mthumb -march=armv7' compiler defines '__thumb__' and '__thumb2__' - */ +// Determine actual [ARM][THUMB[1][2]] ISA using compiler predefined macros: +// - for '-mthumb -march=armv6' compiler defines '__thumb__' +// - for '-mthumb -march=armv7' compiler defines '__thumb__' and '__thumb2__'  #if defined(__thumb2__) || defined(__thumb__)  #define DEFINE_CODE_STATE .thumb SEPARATOR  #define DECLARE_FUNC_ENCODING    .thumb_func SEPARATOR @@ -201,4 +197,4 @@  #define END_COMPILERRT_FUNCTION(name)  #endif -#endif /* COMPILERRT_ASSEMBLY_H */ +#endif // COMPILERRT_ASSEMBLY_H diff --git a/lib/builtins/atomic.c b/lib/builtins/atomic.c index ee35e342eda5..0f82803a6416 100644 --- a/lib/builtins/atomic.c +++ b/lib/builtins/atomic.c @@ -1,29 +1,27 @@ -/*===-- atomic.c - Implement support functions for atomic operations.------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------=== - * - *  atomic.c defines a set of functions for performing atomic accesses on - *  arbitrary-sized memory locations.  This design uses locks that should - *  be fast in the uncontended case, for two reasons: - *  - *  1) This code must work with C programs that do not link to anything - *     (including pthreads) and so it should not depend on any pthread - *     functions. - *  2) Atomic operations, rather than explicit mutexes, are most commonly used - *     on code where contended operations are rate. - *  - *  To avoid needing a per-object lock, this code allocates an array of - *  locks and hashes the object pointers to find the one that it should use. - *  For operations that must be atomic on two locations, the lower lock is - *  always acquired first, to avoid deadlock. - * - *===----------------------------------------------------------------------=== - */ +//===-- atomic.c - Implement support functions for atomic operations.------===// +// +// 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 +// +//===----------------------------------------------------------------------===// +// +//  atomic.c defines a set of functions for performing atomic accesses on +//  arbitrary-sized memory locations.  This design uses locks that should +//  be fast in the uncontended case, for two reasons: +// +//  1) This code must work with C programs that do not link to anything +//     (including pthreads) and so it should not depend on any pthread +//     functions. +//  2) Atomic operations, rather than explicit mutexes, are most commonly used +//     on code where contended operations are rate. +// +//  To avoid needing a per-object lock, this code allocates an array of +//  locks and hashes the object pointers to find the one that it should use. +//  For operations that must be atomic on two locations, the lower lock is +//  always acquired first, to avoid deadlock. +// +//===----------------------------------------------------------------------===//  #include <stdint.h>  #include <string.h> @@ -35,13 +33,14 @@  #pragma redefine_extname __atomic_load_c SYMBOL_NAME(__atomic_load)  #pragma redefine_extname __atomic_store_c SYMBOL_NAME(__atomic_store)  #pragma redefine_extname __atomic_exchange_c SYMBOL_NAME(__atomic_exchange) -#pragma redefine_extname __atomic_compare_exchange_c SYMBOL_NAME(__atomic_compare_exchange) +#pragma redefine_extname __atomic_compare_exchange_c SYMBOL_NAME(              \ +    __atomic_compare_exchange)  /// Number of locks.  This allocates one page on 32-bit platforms, two on  /// 64-bit.  This can be specified externally if a different trade between  /// memory usage and contention probability is required for a given platform.  #ifndef SPINLOCK_COUNT -#define SPINLOCK_COUNT (1<<10) +#define SPINLOCK_COUNT (1 << 10)  #endif  static const long SPINLOCK_MASK = SPINLOCK_COUNT - 1; @@ -52,38 +51,35 @@ static const long SPINLOCK_MASK = SPINLOCK_COUNT - 1;  ////////////////////////////////////////////////////////////////////////////////  #ifdef __FreeBSD__  #include <errno.h> -#include <sys/types.h>  #include <machine/atomic.h> +#include <sys/types.h>  #include <sys/umtx.h>  typedef struct _usem Lock;  __inline static void unlock(Lock *l) { -  __c11_atomic_store((_Atomic(uint32_t)*)&l->_count, 1, __ATOMIC_RELEASE); +  __c11_atomic_store((_Atomic(uint32_t) *)&l->_count, 1, __ATOMIC_RELEASE);    __c11_atomic_thread_fence(__ATOMIC_SEQ_CST);    if (l->_has_waiters) -      _umtx_op(l, UMTX_OP_SEM_WAKE, 1, 0, 0); +    _umtx_op(l, UMTX_OP_SEM_WAKE, 1, 0, 0);  }  __inline static void lock(Lock *l) {    uint32_t old = 1; -  while (!__c11_atomic_compare_exchange_weak((_Atomic(uint32_t)*)&l->_count, &old, -        0, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) { +  while (!__c11_atomic_compare_exchange_weak((_Atomic(uint32_t) *)&l->_count, +                                             &old, 0, __ATOMIC_ACQUIRE, +                                             __ATOMIC_RELAXED)) {      _umtx_op(l, UMTX_OP_SEM_WAIT, 0, 0, 0);      old = 1;    }  }  /// locks for atomic operations -static Lock locks[SPINLOCK_COUNT] = { [0 ...  SPINLOCK_COUNT-1] = {0,1,0} }; +static Lock locks[SPINLOCK_COUNT] = {[0 ... SPINLOCK_COUNT - 1] = {0, 1, 0}};  #elif defined(__APPLE__)  #include <libkern/OSAtomic.h>  typedef OSSpinLock Lock; -__inline static void unlock(Lock *l) { -  OSSpinLockUnlock(l); -} +__inline static void unlock(Lock *l) { OSSpinLockUnlock(l); }  /// Locks a lock.  In the current implementation, this is potentially  /// unbounded in the contended case. -__inline static void lock(Lock *l) { -  OSSpinLockLock(l); -} +__inline static void lock(Lock *l) { OSSpinLockLock(l); }  static Lock locks[SPINLOCK_COUNT]; // initialized to OS_SPINLOCK_INIT which is 0  #else @@ -97,20 +93,19 @@ __inline static void unlock(Lock *l) {  __inline static void lock(Lock *l) {    uintptr_t old = 0;    while (!__c11_atomic_compare_exchange_weak(l, &old, 1, __ATOMIC_ACQUIRE, -        __ATOMIC_RELAXED)) +                                             __ATOMIC_RELAXED))      old = 0;  }  /// locks for atomic operations  static Lock locks[SPINLOCK_COUNT];  #endif - -/// Returns a lock to use for a given pointer.   +/// Returns a lock to use for a given pointer.  static __inline Lock *lock_for_pointer(void *ptr) {    intptr_t hash = (intptr_t)ptr;    // Disregard the lowest 4 bits.  We want all values that may be part of the    // same memory operation to hash to the same value and therefore use the same -  // lock.   +  // lock.    hash >>= 4;    // Use the next bits as the basis for the hash    intptr_t low = hash & SPINLOCK_MASK; @@ -133,36 +128,44 @@ static __inline Lock *lock_for_pointer(void *ptr) {  /// Macro that calls the compiler-generated lock-free versions of functions  /// when they exist. -#define LOCK_FREE_CASES() \ -  do {\ -  switch (size) {\ -    case 2:\ -      if (IS_LOCK_FREE_2) {\ -        LOCK_FREE_ACTION(uint16_t);\ -      }\ -    case 4:\ -      if (IS_LOCK_FREE_4) {\ -        LOCK_FREE_ACTION(uint32_t);\ -      }\ -    case 8:\ -      if (IS_LOCK_FREE_8) {\ -        LOCK_FREE_ACTION(uint64_t);\ -      }\ -    case 16:\ -      if (IS_LOCK_FREE_16) {\ -        /* FIXME: __uint128_t isn't available on 32 bit platforms. -        LOCK_FREE_ACTION(__uint128_t);*/\ -      }\ -  }\ +#define LOCK_FREE_CASES()                                                      \ +  do {                                                                         \ +    switch (size) {                                                            \ +    case 1:                                                                    \ +      if (IS_LOCK_FREE_1) {                                                    \ +        LOCK_FREE_ACTION(uint8_t);                                             \ +      }                                                                        \ +      break;                                                                   \ +    case 2:                                                                    \ +      if (IS_LOCK_FREE_2) {                                                    \ +        LOCK_FREE_ACTION(uint16_t);                                            \ +      }                                                                        \ +      break;                                                                   \ +    case 4:                                                                    \ +      if (IS_LOCK_FREE_4) {                                                    \ +        LOCK_FREE_ACTION(uint32_t);                                            \ +      }                                                                        \ +      break;                                                                   \ +    case 8:                                                                    \ +      if (IS_LOCK_FREE_8) {                                                    \ +        LOCK_FREE_ACTION(uint64_t);                                            \ +      }                                                                        \ +      break;                                                                   \ +    case 16:                                                                   \ +      if (IS_LOCK_FREE_16) {                                                   \ +        /* FIXME: __uint128_t isn't available on 32 bit platforms.             \ +        LOCK_FREE_ACTION(__uint128_t);*/                                       \ +      }                                                                        \ +      break;                                                                   \ +    }                                                                          \    } while (0) -  /// An atomic load operation.  This is atomic with respect to the source  /// pointer only.  void __atomic_load_c(int size, void *src, void *dest, int model) { -#define LOCK_FREE_ACTION(type) \ -    *((type*)dest) = __c11_atomic_load((_Atomic(type)*)src, model);\ -    return; +#define LOCK_FREE_ACTION(type)                                                 \ +  *((type *)dest) = __c11_atomic_load((_Atomic(type) *)src, model);            \ +  return;    LOCK_FREE_CASES();  #undef LOCK_FREE_ACTION    Lock *l = lock_for_pointer(src); @@ -174,9 +177,9 @@ void __atomic_load_c(int size, void *src, void *dest, int model) {  /// An atomic store operation.  This is atomic with respect to the destination  /// pointer only.  void __atomic_store_c(int size, void *dest, void *src, int model) { -#define LOCK_FREE_ACTION(type) \ -    __c11_atomic_store((_Atomic(type)*)dest, *(type*)dest, model);\ -    return; +#define LOCK_FREE_ACTION(type)                                                 \ +  __c11_atomic_store((_Atomic(type) *)dest, *(type *)src, model);              \ +  return;    LOCK_FREE_CASES();  #undef LOCK_FREE_ACTION    Lock *l = lock_for_pointer(dest); @@ -189,12 +192,13 @@ void __atomic_store_c(int size, void *dest, void *src, int model) {  /// to the value at *expected, then this copies value at *desired to *ptr.  If  /// they  are not, then this stores the current value from *ptr in *expected.  /// -/// This function returns 1 if the exchange takes place or 0 if it fails.  +/// This function returns 1 if the exchange takes place or 0 if it fails.  int __atomic_compare_exchange_c(int size, void *ptr, void *expected, -    void *desired, int success, int failure) { -#define LOCK_FREE_ACTION(type) \ -  return __c11_atomic_compare_exchange_strong((_Atomic(type)*)ptr, (type*)expected,\ -      *(type*)desired, success, failure) +                                void *desired, int success, int failure) { +#define LOCK_FREE_ACTION(type)                                                 \ +  return __c11_atomic_compare_exchange_strong(                                 \ +      (_Atomic(type) *)ptr, (type *)expected, *(type *)desired, success,       \ +      failure)    LOCK_FREE_CASES();  #undef LOCK_FREE_ACTION    Lock *l = lock_for_pointer(ptr); @@ -212,10 +216,10 @@ int __atomic_compare_exchange_c(int size, void *ptr, void *expected,  /// Performs an atomic exchange operation between two pointers.  This is atomic  /// with respect to the target address.  void __atomic_exchange_c(int size, void *ptr, void *val, void *old, int model) { -#define LOCK_FREE_ACTION(type) \ -    *(type*)old = __c11_atomic_exchange((_Atomic(type)*)ptr, *(type*)val,\ -        model);\ -    return; +#define LOCK_FREE_ACTION(type)                                                 \ +  *(type *)old =                                                               \ +      __c11_atomic_exchange((_Atomic(type) *)ptr, *(type *)val, model);        \ +  return;    LOCK_FREE_CASES();  #undef LOCK_FREE_ACTION    Lock *l = lock_for_pointer(ptr); @@ -230,96 +234,96 @@ void __atomic_exchange_c(int size, void *ptr, void *val, void *old, int model) {  // specialised versions of the above functions.  ////////////////////////////////////////////////////////////////////////////////  #ifdef __SIZEOF_INT128__ -#define OPTIMISED_CASES\ -  OPTIMISED_CASE(1, IS_LOCK_FREE_1, uint8_t)\ -  OPTIMISED_CASE(2, IS_LOCK_FREE_2, uint16_t)\ -  OPTIMISED_CASE(4, IS_LOCK_FREE_4, uint32_t)\ -  OPTIMISED_CASE(8, IS_LOCK_FREE_8, uint64_t)\ +#define OPTIMISED_CASES                                                        \ +  OPTIMISED_CASE(1, IS_LOCK_FREE_1, uint8_t)                                   \ +  OPTIMISED_CASE(2, IS_LOCK_FREE_2, uint16_t)                                  \ +  OPTIMISED_CASE(4, IS_LOCK_FREE_4, uint32_t)                                  \ +  OPTIMISED_CASE(8, IS_LOCK_FREE_8, uint64_t)                                  \    OPTIMISED_CASE(16, IS_LOCK_FREE_16, __uint128_t)  #else -#define OPTIMISED_CASES\ -  OPTIMISED_CASE(1, IS_LOCK_FREE_1, uint8_t)\ -  OPTIMISED_CASE(2, IS_LOCK_FREE_2, uint16_t)\ -  OPTIMISED_CASE(4, IS_LOCK_FREE_4, uint32_t)\ +#define OPTIMISED_CASES                                                        \ +  OPTIMISED_CASE(1, IS_LOCK_FREE_1, uint8_t)                                   \ +  OPTIMISED_CASE(2, IS_LOCK_FREE_2, uint16_t)                                  \ +  OPTIMISED_CASE(4, IS_LOCK_FREE_4, uint32_t)                                  \    OPTIMISED_CASE(8, IS_LOCK_FREE_8, uint64_t)  #endif -#define OPTIMISED_CASE(n, lockfree, type)\ -type __atomic_load_##n(type *src, int model) {\ -  if (lockfree)\ -    return __c11_atomic_load((_Atomic(type)*)src, model);\ -  Lock *l = lock_for_pointer(src);\ -  lock(l);\ -  type val = *src;\ -  unlock(l);\ -  return val;\ -} +#define OPTIMISED_CASE(n, lockfree, type)                                      \ +  type __atomic_load_##n(type *src, int model) {                               \ +    if (lockfree)                                                              \ +      return __c11_atomic_load((_Atomic(type) *)src, model);                   \ +    Lock *l = lock_for_pointer(src);                                           \ +    lock(l);                                                                   \ +    type val = *src;                                                           \ +    unlock(l);                                                                 \ +    return val;                                                                \ +  }  OPTIMISED_CASES  #undef OPTIMISED_CASE -#define OPTIMISED_CASE(n, lockfree, type)\ -void  __atomic_store_##n(type *dest, type val, int model) {\ -  if (lockfree) {\ -    __c11_atomic_store((_Atomic(type)*)dest, val, model);\ -    return;\ -  }\ -  Lock *l = lock_for_pointer(dest);\ -  lock(l);\ -  *dest = val;\ -  unlock(l);\ -  return;\ -} +#define OPTIMISED_CASE(n, lockfree, type)                                      \ +  void __atomic_store_##n(type *dest, type val, int model) {                   \ +    if (lockfree) {                                                            \ +      __c11_atomic_store((_Atomic(type) *)dest, val, model);                   \ +      return;                                                                  \ +    }                                                                          \ +    Lock *l = lock_for_pointer(dest);                                          \ +    lock(l);                                                                   \ +    *dest = val;                                                               \ +    unlock(l);                                                                 \ +    return;                                                                    \ +  }  OPTIMISED_CASES  #undef OPTIMISED_CASE -#define OPTIMISED_CASE(n, lockfree, type)\ -type __atomic_exchange_##n(type *dest, type val, int model) {\ -  if (lockfree)\ -    return __c11_atomic_exchange((_Atomic(type)*)dest, val, model);\ -  Lock *l = lock_for_pointer(dest);\ -  lock(l);\ -  type tmp = *dest;\ -  *dest = val;\ -  unlock(l);\ -  return tmp;\ -} +#define OPTIMISED_CASE(n, lockfree, type)                                      \ +  type __atomic_exchange_##n(type *dest, type val, int model) {                \ +    if (lockfree)                                                              \ +      return __c11_atomic_exchange((_Atomic(type) *)dest, val, model);         \ +    Lock *l = lock_for_pointer(dest);                                          \ +    lock(l);                                                                   \ +    type tmp = *dest;                                                          \ +    *dest = val;                                                               \ +    unlock(l);                                                                 \ +    return tmp;                                                                \ +  }  OPTIMISED_CASES  #undef OPTIMISED_CASE -#define OPTIMISED_CASE(n, lockfree, type)\ -int __atomic_compare_exchange_##n(type *ptr, type *expected, type desired,\ -    int success, int failure) {\ -  if (lockfree)\ -    return __c11_atomic_compare_exchange_strong((_Atomic(type)*)ptr, expected, desired,\ -        success, failure);\ -  Lock *l = lock_for_pointer(ptr);\ -  lock(l);\ -  if (*ptr == *expected) {\ -    *ptr = desired;\ -    unlock(l);\ -    return 1;\ -  }\ -  *expected = *ptr;\ -  unlock(l);\ -  return 0;\ -} +#define OPTIMISED_CASE(n, lockfree, type)                                      \ +  int __atomic_compare_exchange_##n(type *ptr, type *expected, type desired,   \ +                                    int success, int failure) {                \ +    if (lockfree)                                                              \ +      return __c11_atomic_compare_exchange_strong(                             \ +          (_Atomic(type) *)ptr, expected, desired, success, failure);          \ +    Lock *l = lock_for_pointer(ptr);                                           \ +    lock(l);                                                                   \ +    if (*ptr == *expected) {                                                   \ +      *ptr = desired;                                                          \ +      unlock(l);                                                               \ +      return 1;                                                                \ +    }                                                                          \ +    *expected = *ptr;                                                          \ +    unlock(l);                                                                 \ +    return 0;                                                                  \ +  }  OPTIMISED_CASES  #undef OPTIMISED_CASE  ////////////////////////////////////////////////////////////////////////////////  // Atomic read-modify-write operations for integers of various sizes.  //////////////////////////////////////////////////////////////////////////////// -#define ATOMIC_RMW(n, lockfree, type, opname, op) \ -type __atomic_fetch_##opname##_##n(type *ptr, type val, int model) {\ -  if (lockfree) \ -    return __c11_atomic_fetch_##opname((_Atomic(type)*)ptr, val, model);\ -  Lock *l = lock_for_pointer(ptr);\ -  lock(l);\ -  type tmp = *ptr;\ -  *ptr = tmp op val;\ -  unlock(l);\ -  return tmp;\ -} +#define ATOMIC_RMW(n, lockfree, type, opname, op)                              \ +  type __atomic_fetch_##opname##_##n(type *ptr, type val, int model) {         \ +    if (lockfree)                                                              \ +      return __c11_atomic_fetch_##opname((_Atomic(type) *)ptr, val, model);    \ +    Lock *l = lock_for_pointer(ptr);                                           \ +    lock(l);                                                                   \ +    type tmp = *ptr;                                                           \ +    *ptr = tmp op val;                                                         \ +    unlock(l);                                                                 \ +    return tmp;                                                                \ +  }  #define OPTIMISED_CASE(n, lockfree, type) ATOMIC_RMW(n, lockfree, type, add, +)  OPTIMISED_CASES diff --git a/lib/builtins/atomic_flag_clear.c b/lib/builtins/atomic_flag_clear.c index da912af64312..983e5d7f076b 100644 --- a/lib/builtins/atomic_flag_clear.c +++ b/lib/builtins/atomic_flag_clear.c @@ -1,16 +1,14 @@ -/*===-- atomic_flag_clear.c -------------------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===------------------------------------------------------------------------=== - * - * This file implements atomic_flag_clear from C11's stdatomic.h. - * - *===------------------------------------------------------------------------=== - */ +//===-- atomic_flag_clear.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 implements atomic_flag_clear from C11's stdatomic.h. +// +//===----------------------------------------------------------------------===//  #ifndef __has_include  #define __has_include(inc) 0 diff --git a/lib/builtins/atomic_flag_clear_explicit.c b/lib/builtins/atomic_flag_clear_explicit.c index 1059b787f169..e61c0647684e 100644 --- a/lib/builtins/atomic_flag_clear_explicit.c +++ b/lib/builtins/atomic_flag_clear_explicit.c @@ -1,16 +1,14 @@ -/*===-- atomic_flag_clear_explicit.c ----------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===------------------------------------------------------------------------=== - * - * This file implements atomic_flag_clear_explicit from C11's stdatomic.h. - * - *===------------------------------------------------------------------------=== - */ +//===-- atomic_flag_clear_explicit.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 implements atomic_flag_clear_explicit from C11's stdatomic.h. +// +//===----------------------------------------------------------------------===//  #ifndef __has_include  #define __has_include(inc) 0 diff --git a/lib/builtins/atomic_flag_test_and_set.c b/lib/builtins/atomic_flag_test_and_set.c index e8811d39ef25..ee22b08b5669 100644 --- a/lib/builtins/atomic_flag_test_and_set.c +++ b/lib/builtins/atomic_flag_test_and_set.c @@ -1,16 +1,14 @@ -/*===-- atomic_flag_test_and_set.c ------------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===------------------------------------------------------------------------=== - * - * This file implements atomic_flag_test_and_set from C11's stdatomic.h. - * - *===------------------------------------------------------------------------=== - */ +//===-- atomic_flag_test_and_set.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 implements atomic_flag_test_and_set from C11's stdatomic.h. +// +//===----------------------------------------------------------------------===//  #ifndef __has_include  #define __has_include(inc) 0 diff --git a/lib/builtins/atomic_flag_test_and_set_explicit.c b/lib/builtins/atomic_flag_test_and_set_explicit.c index 5c8c2df90543..8c9d03994267 100644 --- a/lib/builtins/atomic_flag_test_and_set_explicit.c +++ b/lib/builtins/atomic_flag_test_and_set_explicit.c @@ -1,16 +1,14 @@ -/*===-- atomic_flag_test_and_set_explicit.c ---------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===------------------------------------------------------------------------=== - * - * This file implements atomic_flag_test_and_set_explicit from C11's stdatomic.h - * - *===------------------------------------------------------------------------=== - */ +//===-- atomic_flag_test_and_set_explicit.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 implements atomic_flag_test_and_set_explicit from C11's stdatomic.h +// +//===----------------------------------------------------------------------===//  #ifndef __has_include  #define __has_include(inc) 0 diff --git a/lib/builtins/atomic_signal_fence.c b/lib/builtins/atomic_signal_fence.c index 9ccc2ae60ad8..f4f5169d3008 100644 --- a/lib/builtins/atomic_signal_fence.c +++ b/lib/builtins/atomic_signal_fence.c @@ -1,16 +1,14 @@ -/*===-- atomic_signal_fence.c -----------------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===------------------------------------------------------------------------=== - * - * This file implements atomic_signal_fence from C11's stdatomic.h. - * - *===------------------------------------------------------------------------=== - */ +//===-- atomic_signal_fence.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 implements atomic_signal_fence from C11's stdatomic.h. +// +//===----------------------------------------------------------------------===//  #ifndef __has_include  #define __has_include(inc) 0 diff --git a/lib/builtins/atomic_thread_fence.c b/lib/builtins/atomic_thread_fence.c index d22560151bc8..5659ecb0b1f9 100644 --- a/lib/builtins/atomic_thread_fence.c +++ b/lib/builtins/atomic_thread_fence.c @@ -1,16 +1,14 @@ -/*===-- atomic_thread_fence.c -----------------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===------------------------------------------------------------------------=== - * - * This file implements atomic_thread_fence from C11's stdatomic.h. - * - *===------------------------------------------------------------------------=== - */ +//===-- atomic_thread_fence.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 implements atomic_thread_fence from C11's stdatomic.h. +// +//===----------------------------------------------------------------------===//  #ifndef __has_include  #define __has_include(inc) 0 diff --git a/lib/builtins/bswapdi2.c b/lib/builtins/bswapdi2.c index eb220007bb10..cd049f58e328 100644 --- a/lib/builtins/bswapdi2.c +++ b/lib/builtins/bswapdi2.c @@ -1,16 +1,14 @@ -/* ===-- bswapdi2.c - Implement __bswapdi2 ---------------------------------=== - * - *               The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __bswapdi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- bswapdi2.c - Implement __bswapdi2 ---------------------------------===// +// +// 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 implements __bswapdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" diff --git a/lib/builtins/bswapsi2.c b/lib/builtins/bswapsi2.c index 5d941e69f7c4..ec566d61a2b0 100644 --- a/lib/builtins/bswapsi2.c +++ b/lib/builtins/bswapsi2.c @@ -1,23 +1,20 @@ -/* ===-- bswapsi2.c - Implement __bswapsi2 ---------------------------------=== - * - *               The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __bswapsi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- bswapsi2.c - Implement __bswapsi2 ---------------------------------===// +// +// 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 implements __bswapsi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  COMPILER_RT_ABI uint32_t __bswapsi2(uint32_t u) { -  return ( -      (((u)&0xff000000) >> 24) | -      (((u)&0x00ff0000) >> 8)  | -      (((u)&0x0000ff00) << 8)  | -      (((u)&0x000000ff) << 24)); +  return ((((u)&0xff000000) >> 24) | +          (((u)&0x00ff0000) >> 8)  | +          (((u)&0x0000ff00) << 8)  | +          (((u)&0x000000ff) << 24));  } diff --git a/lib/builtins/clear_cache.c b/lib/builtins/clear_cache.c index 9dcab344ad1b..76dc1968cc7e 100644 --- a/lib/builtins/clear_cache.c +++ b/lib/builtins/clear_cache.c @@ -1,179 +1,164 @@ -/* ===-- clear_cache.c - Implement __clear_cache ---------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- clear_cache.c - Implement __clear_cache ---------------------------===// +// +// 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 "int_lib.h"  #include <assert.h>  #include <stddef.h>  #if __APPLE__ -  #include <libkern/OSCacheControl.h> +#include <libkern/OSCacheControl.h>  #endif  #if defined(_WIN32) -/* Forward declare Win32 APIs since the GCC mode driver does not handle the -   newer SDKs as well as needed.  */ +// Forward declare Win32 APIs since the GCC mode driver does not handle the +// newer SDKs as well as needed.  uint32_t FlushInstructionCache(uintptr_t hProcess, void *lpBaseAddress,                                 uintptr_t dwSize);  uintptr_t GetCurrentProcess(void);  #endif  #if defined(__FreeBSD__) && defined(__arm__) -  #include <sys/types.h> -  #include <machine/sysarch.h> +#include <machine/sysarch.h> +#include <sys/types.h>  #endif  #if defined(__NetBSD__) && defined(__arm__) -  #include <machine/sysarch.h> +#include <machine/sysarch.h>  #endif  #if defined(__OpenBSD__) && defined(__mips__) -  #include <sys/types.h> -  #include <machine/sysarch.h> +#include <machine/sysarch.h> +#include <sys/types.h>  #endif  #if defined(__linux__) && defined(__mips__) -  #include <sys/cachectl.h> -  #include <sys/syscall.h> -  #include <unistd.h> -  #if defined(__ANDROID__) && defined(__LP64__) -    /* -     * clear_mips_cache - Invalidates instruction cache for Mips. -     */ -    static void clear_mips_cache(const void* Addr, size_t Size) { -      __asm__ volatile ( -        ".set push\n" -        ".set noreorder\n" -        ".set noat\n" -        "beq %[Size], $zero, 20f\n"          /* If size == 0, branch around. */ -        "nop\n" -        "daddu %[Size], %[Addr], %[Size]\n"  /* Calculate end address + 1 */ -        "rdhwr $v0, $1\n"                    /* Get step size for SYNCI. -                                                $1 is $HW_SYNCI_Step */ -        "beq $v0, $zero, 20f\n"              /* If no caches require -                                                synchronization, branch -                                                around. */ -        "nop\n" -        "10:\n" -        "synci 0(%[Addr])\n"                 /* Synchronize all caches around -                                                address. */ -        "daddu %[Addr], %[Addr], $v0\n"      /* Add step size. */ -        "sltu $at, %[Addr], %[Size]\n"       /* Compare current with end -                                                address. */ -        "bne $at, $zero, 10b\n"              /* Branch if more to do. */ -        "nop\n" -        "sync\n"                             /* Clear memory hazards. */ -        "20:\n" -        "bal 30f\n" -        "nop\n" -        "30:\n" -        "daddiu $ra, $ra, 12\n"              /* $ra has a value of $pc here. -                                                Add offset of 12 to point to the -                                                instruction after the last nop. -                                              */ -        "jr.hb $ra\n"                        /* Return, clearing instruction -                                                hazards. */ -        "nop\n" -        ".set pop\n" -        : [Addr] "+r"(Addr), [Size] "+r"(Size) -        :: "at", "ra", "v0", "memory" -      ); -    } -  #endif +#include <sys/cachectl.h> +#include <sys/syscall.h> +#include <unistd.h> +#if defined(__ANDROID__) && defined(__LP64__) +// clear_mips_cache - Invalidates instruction cache for Mips. +static void clear_mips_cache(const void *Addr, size_t Size) { +  __asm__ volatile( +      ".set push\n" +      ".set noreorder\n" +      ".set noat\n" +      "beq %[Size], $zero, 20f\n" // If size == 0, branch around. +      "nop\n" +      "daddu %[Size], %[Addr], %[Size]\n" // Calculate end address + 1 +      "rdhwr $v0, $1\n"                   // Get step size for SYNCI. +                                          // $1 is $HW_SYNCI_Step +      "beq $v0, $zero, 20f\n"             // If no caches require +                                          // synchronization, branch +                                          // around. +      "nop\n" +      "10:\n" +      "synci 0(%[Addr])\n"            // Synchronize all caches around +                                      // address. +      "daddu %[Addr], %[Addr], $v0\n" // Add step size. +      "sltu $at, %[Addr], %[Size]\n"  // Compare current with end +                                      // address. +      "bne $at, $zero, 10b\n"         // Branch if more to do. +      "nop\n" +      "sync\n" // Clear memory hazards. +      "20:\n" +      "bal 30f\n" +      "nop\n" +      "30:\n" +      "daddiu $ra, $ra, 12\n" // $ra has a value of $pc here. +                              // Add offset of 12 to point to the +                              // instruction after the last nop. +                              // +      "jr.hb $ra\n"           // Return, clearing instruction +                              // hazards. +      "nop\n" +      ".set pop\n" +      : [ Addr ] "+r"(Addr), [ Size ] "+r"(Size)::"at", "ra", "v0", "memory"); +} +#endif  #endif -/* - * The compiler generates calls to __clear_cache() when creating  - * trampoline functions on the stack for use with nested functions. - * It is expected to invalidate the instruction cache for the  - * specified range. - */ +// The compiler generates calls to __clear_cache() when creating +// trampoline functions on the stack for use with nested functions. +// It is expected to invalidate the instruction cache for the +// specified range.  void __clear_cache(void *start, void *end) {  #if __i386__ || __x86_64__ || defined(_M_IX86) || defined(_M_X64) -/* - * Intel processors have a unified instruction and data cache - * so there is nothing to do - */ +// Intel processors have a unified instruction and data cache +// so there is nothing to do  #elif defined(_WIN32) && (defined(__arm__) || defined(__aarch64__)) -    FlushInstructionCache(GetCurrentProcess(), start, end - start); +  FlushInstructionCache(GetCurrentProcess(), start, end - start);  #elif defined(__arm__) && !defined(__APPLE__) -    #if defined(__FreeBSD__) || defined(__NetBSD__) -        struct arm_sync_icache_args arg; - -        arg.addr = (uintptr_t)start; -        arg.len = (uintptr_t)end - (uintptr_t)start; - -        sysarch(ARM_SYNC_ICACHE, &arg); -    #elif defined(__linux__) -    /* -     * We used to include asm/unistd.h for the __ARM_NR_cacheflush define, but -     * it also brought many other unused defines, as well as a dependency on -     * kernel headers to be installed. -     * -     * This value is stable at least since Linux 3.13 and should remain so for -     * compatibility reasons, warranting it's re-definition here. -     */ -    #define __ARM_NR_cacheflush 0x0f0002 -         register int start_reg __asm("r0") = (int) (intptr_t) start; -         const register int end_reg __asm("r1") = (int) (intptr_t) end; -         const register int flags __asm("r2") = 0; -         const register int syscall_nr __asm("r7") = __ARM_NR_cacheflush; -         __asm __volatile("svc 0x0" -                          : "=r"(start_reg) -                          : "r"(syscall_nr), "r"(start_reg), "r"(end_reg), -                            "r"(flags)); -         assert(start_reg == 0 && "Cache flush syscall failed."); -    #else -        compilerrt_abort(); -    #endif +#if defined(__FreeBSD__) || defined(__NetBSD__) +  struct arm_sync_icache_args arg; + +  arg.addr = (uintptr_t)start; +  arg.len = (uintptr_t)end - (uintptr_t)start; + +  sysarch(ARM_SYNC_ICACHE, &arg); +#elif defined(__linux__) +// We used to include asm/unistd.h for the __ARM_NR_cacheflush define, but +// it also brought many other unused defines, as well as a dependency on +// kernel headers to be installed. +// +// This value is stable at least since Linux 3.13 and should remain so for +// compatibility reasons, warranting it's re-definition here. +#define __ARM_NR_cacheflush 0x0f0002 +  register int start_reg __asm("r0") = (int)(intptr_t)start; +  const register int end_reg __asm("r1") = (int)(intptr_t)end; +  const register int flags __asm("r2") = 0; +  const register int syscall_nr __asm("r7") = __ARM_NR_cacheflush; +  __asm __volatile("svc 0x0" +                   : "=r"(start_reg) +                   : "r"(syscall_nr), "r"(start_reg), "r"(end_reg), "r"(flags)); +  assert(start_reg == 0 && "Cache flush syscall failed."); +#else +  compilerrt_abort(); +#endif  #elif defined(__linux__) && defined(__mips__) -  const uintptr_t start_int = (uintptr_t) start; -  const uintptr_t end_int = (uintptr_t) end; -    #if defined(__ANDROID__) && defined(__LP64__) -        // Call synci implementation for short address range. -        const uintptr_t address_range_limit = 256; -        if ((end_int - start_int) <= address_range_limit) { -            clear_mips_cache(start, (end_int - start_int)); -        } else { -            syscall(__NR_cacheflush, start, (end_int - start_int), BCACHE); -        } -    #else -        syscall(__NR_cacheflush, start, (end_int - start_int), BCACHE); -    #endif +  const uintptr_t start_int = (uintptr_t)start; +  const uintptr_t end_int = (uintptr_t)end; +#if defined(__ANDROID__) && defined(__LP64__) +  // Call synci implementation for short address range. +  const uintptr_t address_range_limit = 256; +  if ((end_int - start_int) <= address_range_limit) { +    clear_mips_cache(start, (end_int - start_int)); +  } else { +    syscall(__NR_cacheflush, start, (end_int - start_int), BCACHE); +  } +#else +  syscall(__NR_cacheflush, start, (end_int - start_int), BCACHE); +#endif  #elif defined(__mips__) && defined(__OpenBSD__)    cacheflush(start, (uintptr_t)end - (uintptr_t)start, BCACHE);  #elif defined(__aarch64__) && !defined(__APPLE__) -  uint64_t xstart = (uint64_t)(uintptr_t) start; -  uint64_t xend = (uint64_t)(uintptr_t) end; +  uint64_t xstart = (uint64_t)(uintptr_t)start; +  uint64_t xend = (uint64_t)(uintptr_t)end;    uint64_t addr;    // Get Cache Type Info    uint64_t ctr_el0;    __asm __volatile("mrs %0, ctr_el0" : "=r"(ctr_el0)); -  /* -   * dc & ic instructions must use 64bit registers so we don't use -   * uintptr_t in case this runs in an IPL32 environment. -   */ +  // dc & ic instructions must use 64bit registers so we don't use +  // uintptr_t in case this runs in an IPL32 environment.    const size_t dcache_line_size = 4 << ((ctr_el0 >> 16) & 15);    for (addr = xstart & ~(dcache_line_size - 1); addr < xend;         addr += dcache_line_size) -    __asm __volatile("dc cvau, %0" :: "r"(addr)); +    __asm __volatile("dc cvau, %0" ::"r"(addr));    __asm __volatile("dsb ish");    const size_t icache_line_size = 4 << ((ctr_el0 >> 0) & 15);    for (addr = xstart & ~(icache_line_size - 1); addr < xend;         addr += icache_line_size) -    __asm __volatile("ic ivau, %0" :: "r"(addr)); +    __asm __volatile("ic ivau, %0" ::"r"(addr));    __asm __volatile("isb sy"); -#elif defined (__powerpc64__) +#elif defined(__powerpc64__)    const size_t line_size = 32;    const size_t len = (uintptr_t)end - (uintptr_t)start; @@ -189,11 +174,11 @@ void __clear_cache(void *start, void *end) {      __asm__ volatile("icbi 0, %0" : : "r"(line));    __asm__ volatile("isync");  #else -    #if __APPLE__ -        /* On Darwin, sys_icache_invalidate() provides this functionality */ -        sys_icache_invalidate(start, end-start); -    #else -        compilerrt_abort(); -    #endif +#if __APPLE__ +  // On Darwin, sys_icache_invalidate() provides this functionality +  sys_icache_invalidate(start, end - start); +#else +  compilerrt_abort(); +#endif  #endif  } diff --git a/lib/builtins/clzdi2.c b/lib/builtins/clzdi2.c index 1819e6be436b..a0bacb2ae39e 100644 --- a/lib/builtins/clzdi2.c +++ b/lib/builtins/clzdi2.c @@ -1,40 +1,35 @@ -/* ===-- clzdi2.c - Implement __clzdi2 -------------------------------------=== - * - *               The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __clzdi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- clzdi2.c - Implement __clzdi2 -------------------------------------===// +// +// 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 implements __clzdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: the number of leading 0-bits */ +// Returns: the number of leading 0-bits  #if !defined(__clang__) &&                                                     \ -    ((defined(__sparc__) && defined(__arch64__)) ||                            \ -     defined(__mips64) ||                                                      \ +    ((defined(__sparc__) && defined(__arch64__)) || defined(__mips64) ||       \       (defined(__riscv) && __SIZEOF_POINTER__ >= 8)) -/* On 64-bit architectures with neither a native clz instruction nor a native - * ctz instruction, gcc resolves __builtin_clz to __clzdi2 rather than - * __clzsi2, leading to infinite recursion. */ +// On 64-bit architectures with neither a native clz instruction nor a native +// ctz instruction, gcc resolves __builtin_clz to __clzdi2 rather than +// __clzsi2, leading to infinite recursion.  #define __builtin_clz(a) __clzsi2(a)  extern si_int __clzsi2(si_int);  #endif -/* Precondition: a != 0 */ +// Precondition: a != 0 -COMPILER_RT_ABI si_int -__clzdi2(di_int a) -{ -    dwords x; -    x.all = a; -    const si_int f = -(x.s.high == 0); -    return __builtin_clz((x.s.high & ~f) | (x.s.low & f)) + -           (f & ((si_int)(sizeof(si_int) * CHAR_BIT))); +COMPILER_RT_ABI si_int __clzdi2(di_int a) { +  dwords x; +  x.all = a; +  const si_int f = -(x.s.high == 0); +  return __builtin_clz((x.s.high & ~f) | (x.s.low & f)) + +         (f & ((si_int)(sizeof(si_int) * CHAR_BIT)));  } diff --git a/lib/builtins/clzsi2.c b/lib/builtins/clzsi2.c index 25b8ed2c4c24..3f9f27f41331 100644 --- a/lib/builtins/clzsi2.c +++ b/lib/builtins/clzsi2.c @@ -1,53 +1,48 @@ -/* ===-- clzsi2.c - Implement __clzsi2 -------------------------------------=== - * - *               The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __clzsi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- clzsi2.c - Implement __clzsi2 -------------------------------------===// +// +// 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 implements __clzsi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: the number of leading 0-bits */ +// Returns: the number of leading 0-bits -/* Precondition: a != 0 */ +// Precondition: a != 0 -COMPILER_RT_ABI si_int -__clzsi2(si_int a) -{ -    su_int x = (su_int)a; -    si_int t = ((x & 0xFFFF0000) == 0) << 4;  /* if (x is small) t = 16 else 0 */ -    x >>= 16 - t;      /* x = [0 - 0xFFFF] */ -    su_int r = t;       /* r = [0, 16] */ -    /* return r + clz(x) */ -    t = ((x & 0xFF00) == 0) << 3; -    x >>= 8 - t;       /* x = [0 - 0xFF] */ -    r += t;            /* r = [0, 8, 16, 24] */ -    /* return r + clz(x) */ -    t = ((x & 0xF0) == 0) << 2; -    x >>= 4 - t;       /* x = [0 - 0xF] */ -    r += t;            /* r = [0, 4, 8, 12, 16, 20, 24, 28] */ -    /* return r + clz(x) */ -    t = ((x & 0xC) == 0) << 1; -    x >>= 2 - t;       /* x = [0 - 3] */ -    r += t;            /* r = [0 - 30] and is even */ -    /* return r + clz(x) */ -/*     switch (x) - *     { - *     case 0: - *         return r + 2; - *     case 1: - *         return r + 1; - *     case 2: - *     case 3: - *         return r; - *     } - */ -    return r + ((2 - x) & -((x & 2) == 0)); +COMPILER_RT_ABI si_int __clzsi2(si_int a) { +  su_int x = (su_int)a; +  si_int t = ((x & 0xFFFF0000) == 0) << 4; // if (x is small) t = 16 else 0 +  x >>= 16 - t;                            // x = [0 - 0xFFFF] +  su_int r = t;                            // r = [0, 16] +  // return r + clz(x) +  t = ((x & 0xFF00) == 0) << 3; +  x >>= 8 - t; // x = [0 - 0xFF] +  r += t;      // r = [0, 8, 16, 24] +  // return r + clz(x) +  t = ((x & 0xF0) == 0) << 2; +  x >>= 4 - t; // x = [0 - 0xF] +  r += t;      // r = [0, 4, 8, 12, 16, 20, 24, 28] +  // return r + clz(x) +  t = ((x & 0xC) == 0) << 1; +  x >>= 2 - t; // x = [0 - 3] +  r += t;      // r = [0 - 30] and is even +  // return r + clz(x) +  //     switch (x) +  //     { +  //     case 0: +  //         return r + 2; +  //     case 1: +  //         return r + 1; +  //     case 2: +  //     case 3: +  //         return r; +  //     } +  return r + ((2 - x) & -((x & 2) == 0));  } diff --git a/lib/builtins/clzti2.c b/lib/builtins/clzti2.c index 15a7b3c90004..0c787104caa2 100644 --- a/lib/builtins/clzti2.c +++ b/lib/builtins/clzti2.c @@ -1,33 +1,29 @@ -/* ===-- clzti2.c - Implement __clzti2 -------------------------------------=== - * - *      	       The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __clzti2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- clzti2.c - Implement __clzti2 -------------------------------------===// +// +// 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 implements __clzti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: the number of leading 0-bits */ +// Returns: the number of leading 0-bits -/* Precondition: a != 0 */ +// Precondition: a != 0 -COMPILER_RT_ABI si_int -__clzti2(ti_int a) -{ -    twords x; -    x.all = a; -    const di_int f = -(x.s.high == 0); -    return __builtin_clzll((x.s.high & ~f) | (x.s.low & f)) + -           ((si_int)f & ((si_int)(sizeof(di_int) * CHAR_BIT))); +COMPILER_RT_ABI si_int __clzti2(ti_int a) { +  twords x; +  x.all = a; +  const di_int f = -(x.s.high == 0); +  return __builtin_clzll((x.s.high & ~f) | (x.s.low & f)) + +         ((si_int)f & ((si_int)(sizeof(di_int) * CHAR_BIT)));  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/cmpdi2.c b/lib/builtins/cmpdi2.c index 52634d9c3362..951db85b5062 100644 --- a/lib/builtins/cmpdi2.c +++ b/lib/builtins/cmpdi2.c @@ -1,51 +1,42 @@ -/* ===-- cmpdi2.c - Implement __cmpdi2 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __cmpdi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- cmpdi2.c - Implement __cmpdi2 -------------------------------------===// +// +// 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 implements __cmpdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: if (a <  b) returns 0 -*           if (a == b) returns 1 -*           if (a >  b) returns 2 -*/ +// Returns: if (a <  b) returns 0 +//           if (a == b) returns 1 +//           if (a >  b) returns 2 -COMPILER_RT_ABI si_int -__cmpdi2(di_int a, di_int b) -{ -    dwords x; -    x.all = a; -    dwords y; -    y.all = b; -    if (x.s.high < y.s.high) -        return 0; -    if (x.s.high > y.s.high) -        return 2; -    if (x.s.low < y.s.low) -        return 0; -    if (x.s.low > y.s.low) -        return 2; -    return 1; +COMPILER_RT_ABI si_int __cmpdi2(di_int a, di_int b) { +  dwords x; +  x.all = a; +  dwords y; +  y.all = b; +  if (x.s.high < y.s.high) +    return 0; +  if (x.s.high > y.s.high) +    return 2; +  if (x.s.low < y.s.low) +    return 0; +  if (x.s.low > y.s.low) +    return 2; +  return 1;  }  #ifdef __ARM_EABI__ -/* Returns: if (a <  b) returns -1 -*           if (a == b) returns  0 -*           if (a >  b) returns  1 -*/ -COMPILER_RT_ABI si_int -__aeabi_lcmp(di_int a, di_int b) -{ -	return __cmpdi2(a, b) - 1; +// Returns: if (a <  b) returns -1 +//           if (a == b) returns  0 +//           if (a >  b) returns  1 +COMPILER_RT_ABI si_int __aeabi_lcmp(di_int a, di_int b) { +  return __cmpdi2(a, b) - 1;  }  #endif - diff --git a/lib/builtins/cmpti2.c b/lib/builtins/cmpti2.c index 2c8b56e29a06..7f0ee1b5159d 100644 --- a/lib/builtins/cmpti2.c +++ b/lib/builtins/cmpti2.c @@ -1,42 +1,37 @@ -/* ===-- cmpti2.c - Implement __cmpti2 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __cmpti2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- cmpti2.c - Implement __cmpti2 -------------------------------------===// +// +// 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 implements __cmpti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns:  if (a <  b) returns 0 - *           if (a == b) returns 1 - *           if (a >  b) returns 2 - */ +// Returns:  if (a <  b) returns 0 +//           if (a == b) returns 1 +//           if (a >  b) returns 2 -COMPILER_RT_ABI si_int -__cmpti2(ti_int a, ti_int b) -{ -    twords x; -    x.all = a; -    twords y; -    y.all = b; -    if (x.s.high < y.s.high) -        return 0; -    if (x.s.high > y.s.high) -        return 2; -    if (x.s.low < y.s.low) -        return 0; -    if (x.s.low > y.s.low) -        return 2; -    return 1; +COMPILER_RT_ABI si_int __cmpti2(ti_int a, ti_int b) { +  twords x; +  x.all = a; +  twords y; +  y.all = b; +  if (x.s.high < y.s.high) +    return 0; +  if (x.s.high > y.s.high) +    return 2; +  if (x.s.low < y.s.low) +    return 0; +  if (x.s.low > y.s.low) +    return 2; +  return 1;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/comparedf2.c b/lib/builtins/comparedf2.c index 44e5d2b288a6..58290d87de65 100644 --- a/lib/builtins/comparedf2.c +++ b/lib/builtins/comparedf2.c @@ -1,9 +1,8 @@  //===-- lib/comparedf2.c - Double-precision comparisons -----------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -40,79 +39,93 @@  #define DOUBLE_PRECISION  #include "fp_lib.h" -enum LE_RESULT { -    LE_LESS      = -1, -    LE_EQUAL     =  0, -    LE_GREATER   =  1, -    LE_UNORDERED =  1 -}; +enum LE_RESULT { LE_LESS = -1, LE_EQUAL = 0, LE_GREATER = 1, LE_UNORDERED = 1 }; + +COMPILER_RT_ABI enum LE_RESULT __ledf2(fp_t a, fp_t b) { + +  const srep_t aInt = toRep(a); +  const srep_t bInt = toRep(b); +  const rep_t aAbs = aInt & absMask; +  const rep_t bAbs = bInt & absMask; + +  // If either a or b is NaN, they are unordered. +  if (aAbs > infRep || bAbs > infRep) +    return LE_UNORDERED; + +  // If a and b are both zeros, they are equal. +  if ((aAbs | bAbs) == 0) +    return LE_EQUAL; -COMPILER_RT_ABI enum LE_RESULT -__ledf2(fp_t a, fp_t b) { -     -    const srep_t aInt = toRep(a); -    const srep_t bInt = toRep(b); -    const rep_t aAbs = aInt & absMask; -    const rep_t bAbs = bInt & absMask; -     -    // If either a or b is NaN, they are unordered. -    if (aAbs > infRep || bAbs > infRep) return LE_UNORDERED; -     -    // If a and b are both zeros, they are equal. -    if ((aAbs | bAbs) == 0) return LE_EQUAL; -     -    // If at least one of a and b is positive, we get the same result comparing -    // a and b as signed integers as we would with a floating-point compare. -    if ((aInt & bInt) >= 0) { -        if (aInt < bInt) return LE_LESS; -        else if (aInt == bInt) return LE_EQUAL; -        else return LE_GREATER; -    } -     -    // Otherwise, both are negative, so we need to flip the sense of the -    // comparison to get the correct result.  (This assumes a twos- or ones- -    // complement integer representation; if integers are represented in a -    // sign-magnitude representation, then this flip is incorrect). -    else { -        if (aInt > bInt) return LE_LESS; -        else if (aInt == bInt) return LE_EQUAL; -        else return LE_GREATER; -    } +  // If at least one of a and b is positive, we get the same result comparing +  // a and b as signed integers as we would with a floating-point compare. +  if ((aInt & bInt) >= 0) { +    if (aInt < bInt) +      return LE_LESS; +    else if (aInt == bInt) +      return LE_EQUAL; +    else +      return LE_GREATER; +  } + +  // Otherwise, both are negative, so we need to flip the sense of the +  // comparison to get the correct result.  (This assumes a twos- or ones- +  // complement integer representation; if integers are represented in a +  // sign-magnitude representation, then this flip is incorrect). +  else { +    if (aInt > bInt) +      return LE_LESS; +    else if (aInt == bInt) +      return LE_EQUAL; +    else +      return LE_GREATER; +  }  }  #if defined(__ELF__)  // Alias for libgcc compatibility -FNALIAS(__cmpdf2, __ledf2); +COMPILER_RT_ALIAS(__ledf2, __cmpdf2)  #endif +COMPILER_RT_ALIAS(__ledf2, __eqdf2) +COMPILER_RT_ALIAS(__ledf2, __ltdf2) +COMPILER_RT_ALIAS(__ledf2, __nedf2)  enum GE_RESULT { -    GE_LESS      = -1, -    GE_EQUAL     =  0, -    GE_GREATER   =  1, -    GE_UNORDERED = -1   // Note: different from LE_UNORDERED +  GE_LESS = -1, +  GE_EQUAL = 0, +  GE_GREATER = 1, +  GE_UNORDERED = -1 // Note: different from LE_UNORDERED  }; -COMPILER_RT_ABI enum GE_RESULT -__gedf2(fp_t a, fp_t b) { -     -    const srep_t aInt = toRep(a); -    const srep_t bInt = toRep(b); -    const rep_t aAbs = aInt & absMask; -    const rep_t bAbs = bInt & absMask; -     -    if (aAbs > infRep || bAbs > infRep) return GE_UNORDERED; -    if ((aAbs | bAbs) == 0) return GE_EQUAL; -    if ((aInt & bInt) >= 0) { -        if (aInt < bInt) return GE_LESS; -        else if (aInt == bInt) return GE_EQUAL; -        else return GE_GREATER; -    } else { -        if (aInt > bInt) return GE_LESS; -        else if (aInt == bInt) return GE_EQUAL; -        else return GE_GREATER; -    } +COMPILER_RT_ABI enum GE_RESULT __gedf2(fp_t a, fp_t b) { + +  const srep_t aInt = toRep(a); +  const srep_t bInt = toRep(b); +  const rep_t aAbs = aInt & absMask; +  const rep_t bAbs = bInt & absMask; + +  if (aAbs > infRep || bAbs > infRep) +    return GE_UNORDERED; +  if ((aAbs | bAbs) == 0) +    return GE_EQUAL; +  if ((aInt & bInt) >= 0) { +    if (aInt < bInt) +      return GE_LESS; +    else if (aInt == bInt) +      return GE_EQUAL; +    else +      return GE_GREATER; +  } else { +    if (aInt > bInt) +      return GE_LESS; +    else if (aInt == bInt) +      return GE_EQUAL; +    else +      return GE_GREATER; +  }  } +COMPILER_RT_ALIAS(__gedf2, __gtdf2) +  COMPILER_RT_ABI int  __unorddf2(fp_t a, fp_t b) {      const rep_t aAbs = toRep(a) & absMask; @@ -120,34 +133,19 @@ __unorddf2(fp_t a, fp_t b) {      return aAbs > infRep || bAbs > infRep;  } -// The following are alternative names for the preceding routines. - -COMPILER_RT_ABI enum LE_RESULT -__eqdf2(fp_t a, fp_t b) { -    return __ledf2(a, b); -} - -COMPILER_RT_ABI enum LE_RESULT -__ltdf2(fp_t a, fp_t b) { -    return __ledf2(a, b); -} - -COMPILER_RT_ABI enum LE_RESULT -__nedf2(fp_t a, fp_t b) { -    return __ledf2(a, b); -} - -COMPILER_RT_ABI enum GE_RESULT -__gtdf2(fp_t a, fp_t b) { -    return __gedf2(a, b); -} -  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI int __aeabi_dcmpun(fp_t a, fp_t b) { -  return __unorddf2(a, b); -} +AEABI_RTABI int __aeabi_dcmpun(fp_t a, fp_t b) { return __unorddf2(a, b); }  #else -AEABI_RTABI int __aeabi_dcmpun(fp_t a, fp_t b) COMPILER_RT_ALIAS(__unorddf2); +COMPILER_RT_ALIAS(__unorddf2, __aeabi_dcmpun)  #endif  #endif + +#if defined(_WIN32) && !defined(__MINGW32__) +// The alias mechanism doesn't work on Windows except for MinGW, so emit +// wrapper functions. +int __eqdf2(fp_t a, fp_t b) { return __ledf2(a, b); } +int __ltdf2(fp_t a, fp_t b) { return __ledf2(a, b); } +int __nedf2(fp_t a, fp_t b) { return __ledf2(a, b); } +int __gtdf2(fp_t a, fp_t b) { return __gedf2(a, b); } +#endif diff --git a/lib/builtins/comparesf2.c b/lib/builtins/comparesf2.c index 43cd6a6a7003..1cb99e468c18 100644 --- a/lib/builtins/comparesf2.c +++ b/lib/builtins/comparesf2.c @@ -1,9 +1,8 @@  //===-- lib/comparesf2.c - Single-precision comparisons -----------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -40,79 +39,93 @@  #define SINGLE_PRECISION  #include "fp_lib.h" -enum LE_RESULT { -    LE_LESS      = -1, -    LE_EQUAL     =  0, -    LE_GREATER   =  1, -    LE_UNORDERED =  1 -}; +enum LE_RESULT { LE_LESS = -1, LE_EQUAL = 0, LE_GREATER = 1, LE_UNORDERED = 1 }; + +COMPILER_RT_ABI enum LE_RESULT __lesf2(fp_t a, fp_t b) { + +  const srep_t aInt = toRep(a); +  const srep_t bInt = toRep(b); +  const rep_t aAbs = aInt & absMask; +  const rep_t bAbs = bInt & absMask; + +  // If either a or b is NaN, they are unordered. +  if (aAbs > infRep || bAbs > infRep) +    return LE_UNORDERED; + +  // If a and b are both zeros, they are equal. +  if ((aAbs | bAbs) == 0) +    return LE_EQUAL; -COMPILER_RT_ABI enum LE_RESULT -__lesf2(fp_t a, fp_t b) { -     -    const srep_t aInt = toRep(a); -    const srep_t bInt = toRep(b); -    const rep_t aAbs = aInt & absMask; -    const rep_t bAbs = bInt & absMask; -     -    // If either a or b is NaN, they are unordered. -    if (aAbs > infRep || bAbs > infRep) return LE_UNORDERED; -     -    // If a and b are both zeros, they are equal. -    if ((aAbs | bAbs) == 0) return LE_EQUAL; -     -    // If at least one of a and b is positive, we get the same result comparing -    // a and b as signed integers as we would with a fp_ting-point compare. -    if ((aInt & bInt) >= 0) { -        if (aInt < bInt) return LE_LESS; -        else if (aInt == bInt) return LE_EQUAL; -        else return LE_GREATER; -    } -     -    // Otherwise, both are negative, so we need to flip the sense of the -    // comparison to get the correct result.  (This assumes a twos- or ones- -    // complement integer representation; if integers are represented in a -    // sign-magnitude representation, then this flip is incorrect). -    else { -        if (aInt > bInt) return LE_LESS; -        else if (aInt == bInt) return LE_EQUAL; -        else return LE_GREATER; -    } +  // If at least one of a and b is positive, we get the same result comparing +  // a and b as signed integers as we would with a fp_ting-point compare. +  if ((aInt & bInt) >= 0) { +    if (aInt < bInt) +      return LE_LESS; +    else if (aInt == bInt) +      return LE_EQUAL; +    else +      return LE_GREATER; +  } + +  // Otherwise, both are negative, so we need to flip the sense of the +  // comparison to get the correct result.  (This assumes a twos- or ones- +  // complement integer representation; if integers are represented in a +  // sign-magnitude representation, then this flip is incorrect). +  else { +    if (aInt > bInt) +      return LE_LESS; +    else if (aInt == bInt) +      return LE_EQUAL; +    else +      return LE_GREATER; +  }  }  #if defined(__ELF__)  // Alias for libgcc compatibility -FNALIAS(__cmpsf2, __lesf2); +COMPILER_RT_ALIAS(__lesf2, __cmpsf2)  #endif +COMPILER_RT_ALIAS(__lesf2, __eqsf2) +COMPILER_RT_ALIAS(__lesf2, __ltsf2) +COMPILER_RT_ALIAS(__lesf2, __nesf2)  enum GE_RESULT { -    GE_LESS      = -1, -    GE_EQUAL     =  0, -    GE_GREATER   =  1, -    GE_UNORDERED = -1   // Note: different from LE_UNORDERED +  GE_LESS = -1, +  GE_EQUAL = 0, +  GE_GREATER = 1, +  GE_UNORDERED = -1 // Note: different from LE_UNORDERED  }; -COMPILER_RT_ABI enum GE_RESULT -__gesf2(fp_t a, fp_t b) { -     -    const srep_t aInt = toRep(a); -    const srep_t bInt = toRep(b); -    const rep_t aAbs = aInt & absMask; -    const rep_t bAbs = bInt & absMask; -     -    if (aAbs > infRep || bAbs > infRep) return GE_UNORDERED; -    if ((aAbs | bAbs) == 0) return GE_EQUAL; -    if ((aInt & bInt) >= 0) { -        if (aInt < bInt) return GE_LESS; -        else if (aInt == bInt) return GE_EQUAL; -        else return GE_GREATER; -    } else { -        if (aInt > bInt) return GE_LESS; -        else if (aInt == bInt) return GE_EQUAL; -        else return GE_GREATER; -    } +COMPILER_RT_ABI enum GE_RESULT __gesf2(fp_t a, fp_t b) { + +  const srep_t aInt = toRep(a); +  const srep_t bInt = toRep(b); +  const rep_t aAbs = aInt & absMask; +  const rep_t bAbs = bInt & absMask; + +  if (aAbs > infRep || bAbs > infRep) +    return GE_UNORDERED; +  if ((aAbs | bAbs) == 0) +    return GE_EQUAL; +  if ((aInt & bInt) >= 0) { +    if (aInt < bInt) +      return GE_LESS; +    else if (aInt == bInt) +      return GE_EQUAL; +    else +      return GE_GREATER; +  } else { +    if (aInt > bInt) +      return GE_LESS; +    else if (aInt == bInt) +      return GE_EQUAL; +    else +      return GE_GREATER; +  }  } +COMPILER_RT_ALIAS(__gesf2, __gtsf2) +  COMPILER_RT_ABI int  __unordsf2(fp_t a, fp_t b) {      const rep_t aAbs = toRep(a) & absMask; @@ -120,34 +133,19 @@ __unordsf2(fp_t a, fp_t b) {      return aAbs > infRep || bAbs > infRep;  } -// The following are alternative names for the preceding routines. - -COMPILER_RT_ABI enum LE_RESULT -__eqsf2(fp_t a, fp_t b) { -    return __lesf2(a, b); -} - -COMPILER_RT_ABI enum LE_RESULT -__ltsf2(fp_t a, fp_t b) { -    return __lesf2(a, b); -} - -COMPILER_RT_ABI enum LE_RESULT -__nesf2(fp_t a, fp_t b) { -    return __lesf2(a, b); -} - -COMPILER_RT_ABI enum GE_RESULT -__gtsf2(fp_t a, fp_t b) { -    return __gesf2(a, b); -} -  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI int __aeabi_fcmpun(fp_t a, fp_t b) { -  return __unordsf2(a, b); -} +AEABI_RTABI int __aeabi_fcmpun(fp_t a, fp_t b) { return __unordsf2(a, b); }  #else -AEABI_RTABI int __aeabi_fcmpun(fp_t a, fp_t b) COMPILER_RT_ALIAS(__unordsf2); +COMPILER_RT_ALIAS(__unordsf2, __aeabi_fcmpun)  #endif  #endif + +#if defined(_WIN32) && !defined(__MINGW32__) +// The alias mechanism doesn't work on Windows except for MinGW, so emit +// wrapper functions. +int __eqsf2(fp_t a, fp_t b) { return __lesf2(a, b); } +int __ltsf2(fp_t a, fp_t b) { return __lesf2(a, b); } +int __nesf2(fp_t a, fp_t b) { return __lesf2(a, b); } +int __gtsf2(fp_t a, fp_t b) { return __gesf2(a, b); } +#endif diff --git a/lib/builtins/comparetf2.c b/lib/builtins/comparetf2.c index c0ad8ed0aecd..2eb34cf37fbc 100644 --- a/lib/builtins/comparetf2.c +++ b/lib/builtins/comparetf2.c @@ -1,9 +1,8 @@  //===-- lib/comparetf2.c - Quad-precision comparisons -------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -41,98 +40,95 @@  #include "fp_lib.h"  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT) -enum LE_RESULT { -    LE_LESS      = -1, -    LE_EQUAL     =  0, -    LE_GREATER   =  1, -    LE_UNORDERED =  1 -}; +enum LE_RESULT { LE_LESS = -1, LE_EQUAL = 0, LE_GREATER = 1, LE_UNORDERED = 1 };  COMPILER_RT_ABI enum LE_RESULT __letf2(fp_t a, fp_t b) { -    const srep_t aInt = toRep(a); -    const srep_t bInt = toRep(b); -    const rep_t aAbs = aInt & absMask; -    const rep_t bAbs = bInt & absMask; - -    // If either a or b is NaN, they are unordered. -    if (aAbs > infRep || bAbs > infRep) return LE_UNORDERED; - -    // If a and b are both zeros, they are equal. -    if ((aAbs | bAbs) == 0) return LE_EQUAL; - -    // If at least one of a and b is positive, we get the same result comparing -    // a and b as signed integers as we would with a floating-point compare. -    if ((aInt & bInt) >= 0) { -        if (aInt < bInt) return LE_LESS; -        else if (aInt == bInt) return LE_EQUAL; -        else return LE_GREATER; -    } -    else { -        // Otherwise, both are negative, so we need to flip the sense of the -        // comparison to get the correct result.  (This assumes a twos- or ones- -        // complement integer representation; if integers are represented in a -        // sign-magnitude representation, then this flip is incorrect). -        if (aInt > bInt) return LE_LESS; -        else if (aInt == bInt) return LE_EQUAL; -        else return LE_GREATER; -    } +  const srep_t aInt = toRep(a); +  const srep_t bInt = toRep(b); +  const rep_t aAbs = aInt & absMask; +  const rep_t bAbs = bInt & absMask; + +  // If either a or b is NaN, they are unordered. +  if (aAbs > infRep || bAbs > infRep) +    return LE_UNORDERED; + +  // If a and b are both zeros, they are equal. +  if ((aAbs | bAbs) == 0) +    return LE_EQUAL; + +  // If at least one of a and b is positive, we get the same result comparing +  // a and b as signed integers as we would with a floating-point compare. +  if ((aInt & bInt) >= 0) { +    if (aInt < bInt) +      return LE_LESS; +    else if (aInt == bInt) +      return LE_EQUAL; +    else +      return LE_GREATER; +  } else { +    // Otherwise, both are negative, so we need to flip the sense of the +    // comparison to get the correct result.  (This assumes a twos- or ones- +    // complement integer representation; if integers are represented in a +    // sign-magnitude representation, then this flip is incorrect). +    if (aInt > bInt) +      return LE_LESS; +    else if (aInt == bInt) +      return LE_EQUAL; +    else +      return LE_GREATER; +  }  }  #if defined(__ELF__)  // Alias for libgcc compatibility -FNALIAS(__cmptf2, __letf2); +COMPILER_RT_ALIAS(__letf2, __cmptf2)  #endif +COMPILER_RT_ALIAS(__letf2, __eqtf2) +COMPILER_RT_ALIAS(__letf2, __lttf2) +COMPILER_RT_ALIAS(__letf2, __netf2)  enum GE_RESULT { -    GE_LESS      = -1, -    GE_EQUAL     =  0, -    GE_GREATER   =  1, -    GE_UNORDERED = -1   // Note: different from LE_UNORDERED +  GE_LESS = -1, +  GE_EQUAL = 0, +  GE_GREATER = 1, +  GE_UNORDERED = -1 // Note: different from LE_UNORDERED  };  COMPILER_RT_ABI enum GE_RESULT __getf2(fp_t a, fp_t b) { -    const srep_t aInt = toRep(a); -    const srep_t bInt = toRep(b); -    const rep_t aAbs = aInt & absMask; -    const rep_t bAbs = bInt & absMask; - -    if (aAbs > infRep || bAbs > infRep) return GE_UNORDERED; -    if ((aAbs | bAbs) == 0) return GE_EQUAL; -    if ((aInt & bInt) >= 0) { -        if (aInt < bInt) return GE_LESS; -        else if (aInt == bInt) return GE_EQUAL; -        else return GE_GREATER; -    } else { -        if (aInt > bInt) return GE_LESS; -        else if (aInt == bInt) return GE_EQUAL; -        else return GE_GREATER; -    } -} - -COMPILER_RT_ABI int __unordtf2(fp_t a, fp_t b) { -    const rep_t aAbs = toRep(a) & absMask; -    const rep_t bAbs = toRep(b) & absMask; -    return aAbs > infRep || bAbs > infRep; -} - -// The following are alternative names for the preceding routines. - -COMPILER_RT_ABI enum LE_RESULT __eqtf2(fp_t a, fp_t b) { -    return __letf2(a, b); +  const srep_t aInt = toRep(a); +  const srep_t bInt = toRep(b); +  const rep_t aAbs = aInt & absMask; +  const rep_t bAbs = bInt & absMask; + +  if (aAbs > infRep || bAbs > infRep) +    return GE_UNORDERED; +  if ((aAbs | bAbs) == 0) +    return GE_EQUAL; +  if ((aInt & bInt) >= 0) { +    if (aInt < bInt) +      return GE_LESS; +    else if (aInt == bInt) +      return GE_EQUAL; +    else +      return GE_GREATER; +  } else { +    if (aInt > bInt) +      return GE_LESS; +    else if (aInt == bInt) +      return GE_EQUAL; +    else +      return GE_GREATER; +  }  } -COMPILER_RT_ABI enum LE_RESULT __lttf2(fp_t a, fp_t b) { -    return __letf2(a, b); -} - -COMPILER_RT_ABI enum LE_RESULT __netf2(fp_t a, fp_t b) { -    return __letf2(a, b); -} +COMPILER_RT_ALIAS(__getf2, __gttf2) -COMPILER_RT_ABI enum GE_RESULT __gttf2(fp_t a, fp_t b) { -    return __getf2(a, b); +COMPILER_RT_ABI int __unordtf2(fp_t a, fp_t b) { +  const rep_t aAbs = toRep(a) & absMask; +  const rep_t bAbs = toRep(b) & absMask; +  return aAbs > infRep || bAbs > infRep;  }  #endif diff --git a/lib/builtins/cpu_model.c b/lib/builtins/cpu_model.c index fb2b899fc70a..f953aed959e5 100644 --- a/lib/builtins/cpu_model.c +++ b/lib/builtins/cpu_model.c @@ -1,9 +1,8 @@  //===-- cpu_model.c - Support for __cpu_model builtin  ------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -13,8 +12,8 @@  //  //===----------------------------------------------------------------------===// -#if (defined(__i386__) || defined(_M_IX86) || \ -     defined(__x86_64__) || defined(_M_X64)) && \ +#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) ||           \ +     defined(_M_X64)) &&                                                       \      (defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER))  #include <assert.h> @@ -32,8 +31,8 @@  #endif  enum VendorSignatures { -  SIG_INTEL = 0x756e6547 /* Genu */, -  SIG_AMD = 0x68747541 /* Auth */ +  SIG_INTEL = 0x756e6547, // Genu +  SIG_AMD = 0x68747541,   // Auth  };  enum ProcessorVendors { @@ -81,6 +80,8 @@ enum ProcessorSubtypes {    INTEL_COREI7_CANNONLAKE,    INTEL_COREI7_ICELAKE_CLIENT,    INTEL_COREI7_ICELAKE_SERVER, +  AMDFAM17H_ZNVER2, +  INTEL_COREI7_CASCADELAKE,    CPU_SUBTYPE_MAX  }; @@ -266,10 +267,11 @@ static void detectX86FamilyModel(unsigned EAX, unsigned *Family,    }  } -static void -getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model, -                                unsigned Brand_id, unsigned Features, -                                unsigned *Type, unsigned *Subtype) { +static void getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model, +                                            unsigned Brand_id, +                                            unsigned Features, +                                            unsigned Features2, unsigned *Type, +                                            unsigned *Subtype) {    if (Brand_id != 0)      return;    switch (Family) { @@ -295,7 +297,7 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,      case 0x1e: // Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz.                 // As found in a Summer 2010 model iMac.      case 0x1f: -    case 0x2e:             // Nehalem EX +    case 0x2e:              // Nehalem EX        *Type = INTEL_COREI7; // "nehalem"        *Subtype = INTEL_COREI7_NEHALEM;        break; @@ -313,7 +315,7 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,        *Subtype = INTEL_COREI7_SANDYBRIDGE;        break;      case 0x3a: -    case 0x3e:             // Ivy Bridge EP +    case 0x3e:              // Ivy Bridge EP        *Type = INTEL_COREI7; // "ivybridge"        *Subtype = INTEL_COREI7_IVYBRIDGE;        break; @@ -337,10 +339,10 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,        break;      // Skylake: -    case 0x4e: // Skylake mobile -    case 0x5e: // Skylake desktop -    case 0x8e: // Kaby Lake mobile -    case 0x9e: // Kaby Lake desktop +    case 0x4e:              // Skylake mobile +    case 0x5e:              // Skylake desktop +    case 0x8e:              // Kaby Lake mobile +    case 0x9e:              // Kaby Lake desktop        *Type = INTEL_COREI7; // "skylake"        *Subtype = INTEL_COREI7_SKYLAKE;        break; @@ -348,7 +350,10 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,      // Skylake Xeon:      case 0x55:        *Type = INTEL_COREI7; -      *Subtype = INTEL_COREI7_SKYLAKE_AVX512; // "skylake-avx512" +      if (Features2 & (1 << (FEATURE_AVX512VNNI - 32))) +        *Subtype = INTEL_COREI7_CASCADELAKE; // "cascadelake" +      else +        *Subtype = INTEL_COREI7_SKYLAKE_AVX512; // "skylake-avx512"        break;      // Cannonlake: @@ -357,6 +362,20 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,        *Subtype = INTEL_COREI7_CANNONLAKE; // "cannonlake"        break; +    // Icelake: +    case 0x7d: +    case 0x7e: +      *Type = INTEL_COREI7; +      *Subtype = INTEL_COREI7_ICELAKE_CLIENT; // "icelake-client" +      break; + +    // Icelake Xeon: +    case 0x6a: +    case 0x6c: +      *Type = INTEL_COREI7; +      *Subtype = INTEL_COREI7_ICELAKE_SERVER; // "icelake-server" +      break; +      case 0x1c: // Most 45 nm Intel Atom processors      case 0x26: // 45 nm Atom Lincroft      case 0x27: // 32 nm Atom Medfield @@ -382,6 +401,9 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,      case 0x7a:        *Type = INTEL_GOLDMONT_PLUS;        break; +    case 0x86: +      *Type = INTEL_TREMONT; +      break;      case 0x57:        *Type = INTEL_KNL; // knl @@ -393,7 +415,7 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,      default: // Unknown family 6 CPU.        break; -    break; +      break;      }    default:      break; // Unknown. @@ -401,8 +423,8 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,  }  static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model, -                                          unsigned Features, unsigned *Type, -                                          unsigned *Subtype) { +                                          unsigned Features, unsigned Features2, +                                          unsigned *Type, unsigned *Subtype) {    // FIXME: this poorly matches the generated SubtargetFeatureKV table.  There    // appears to be no way to generate the wide variety of AMD-specific targets    // from the information returned from CPUID. @@ -448,7 +470,14 @@ static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model,      break; // "btver2"    case 23:      *Type = AMDFAM17H; -    *Subtype = AMDFAM17H_ZNVER1; +    if (Model >= 0x30 && Model <= 0x3f) { +      *Subtype = AMDFAM17H_ZNVER2; +      break; // "znver2"; 30h-3fh: Zen2 +    } +    if (Model <= 0x0f) { +      *Subtype = AMDFAM17H_ZNVER1; +      break; // "znver1"; 00h-0Fh: Zen1 +    }      break;    default:      break; // "generic" @@ -462,12 +491,12 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,    unsigned Features2 = 0;    unsigned EAX, EBX; -#define setFeature(F)                       \ -  do {                                      \ -    if (F < 32)                             \ -      Features |= 1U << (F & 0x1f);         \ -    else if (F < 64)                        \ -      Features2 |= 1U << ((F - 32) & 0x1f); \ +#define setFeature(F)                                                          \ +  do {                                                                         \ +    if (F < 32)                                                                \ +      Features |= 1U << (F & 0x1f);                                            \ +    else if (F < 64)                                                           \ +      Features2 |= 1U << ((F - 32) & 0x1f);                                    \    } while (0)    if ((EDX >> 15) & 1) @@ -580,24 +609,33 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,  #define CONSTRUCTOR_ATTRIBUTE  #endif +#ifndef _WIN32 +__attribute__((visibility("hidden"))) +#endif  int __cpu_indicator_init(void) CONSTRUCTOR_ATTRIBUTE; +#ifndef _WIN32 +__attribute__((visibility("hidden"))) +#endif  struct __processor_model {    unsigned int __cpu_vendor;    unsigned int __cpu_type;    unsigned int __cpu_subtype;    unsigned int __cpu_features[1];  } __cpu_model = {0, 0, 0, {0}}; + +#ifndef _WIN32 +__attribute__((visibility("hidden"))) +#endif  unsigned int __cpu_features2; -/* A constructor function that is sets __cpu_model and __cpu_features2 with -   the right values.  This needs to run only once.  This constructor is -   given the highest priority and it should run before constructors without -   the priority set.  However, it still runs after ifunc initializers and -   needs to be called explicitly there.  */ +// A constructor function that is sets __cpu_model and __cpu_features2 with +// the right values.  This needs to run only once.  This constructor is +// given the highest priority and it should run before constructors without +// the priority set.  However, it still runs after ifunc initializers and +// needs to be called explicitly there. -int CONSTRUCTOR_ATTRIBUTE -__cpu_indicator_init(void) { +int CONSTRUCTOR_ATTRIBUTE __cpu_indicator_init(void) {    unsigned EAX, EBX, ECX, EDX;    unsigned MaxLeaf = 5;    unsigned Vendor; @@ -605,14 +643,14 @@ __cpu_indicator_init(void) {    unsigned Features = 0;    unsigned Features2 = 0; -  /* This function needs to run just once.  */ +  // This function needs to run just once.    if (__cpu_model.__cpu_vendor)      return 0;    if (!isCpuIdSupported())      return -1; -  /* Assume cpuid insn present. Run in level 0 to get vendor id. */ +  // Assume cpuid insn present. Run in level 0 to get vendor id.    if (getX86CpuIDAndInfo(0, &MaxLeaf, &Vendor, &ECX, &EDX) || MaxLeaf < 1) {      __cpu_model.__cpu_vendor = VENDOR_OTHER;      return -1; @@ -621,20 +659,20 @@ __cpu_indicator_init(void) {    detectX86FamilyModel(EAX, &Family, &Model);    Brand_id = EBX & 0xff; -  /* Find available features. */ +  // Find available features.    getAvailableFeatures(ECX, EDX, MaxLeaf, &Features, &Features2);    __cpu_model.__cpu_features[0] = Features;    __cpu_features2 = Features2;    if (Vendor == SIG_INTEL) { -    /* Get CPU type.  */ +    // Get CPU type.      getIntelProcessorTypeAndSubtype(Family, Model, Brand_id, Features, -                                    &(__cpu_model.__cpu_type), +                                    Features2, &(__cpu_model.__cpu_type),                                      &(__cpu_model.__cpu_subtype));      __cpu_model.__cpu_vendor = VENDOR_INTEL;    } else if (Vendor == SIG_AMD) { -    /* Get CPU type.  */ -    getAMDProcessorTypeAndSubtype(Family, Model, Features, +    // Get CPU type. +    getAMDProcessorTypeAndSubtype(Family, Model, Features, Features2,                                    &(__cpu_model.__cpu_type),                                    &(__cpu_model.__cpu_subtype));      __cpu_model.__cpu_vendor = VENDOR_AMD; diff --git a/lib/builtins/ctzdi2.c b/lib/builtins/ctzdi2.c index ef6d7fea1365..9384aa6055a1 100644 --- a/lib/builtins/ctzdi2.c +++ b/lib/builtins/ctzdi2.c @@ -1,40 +1,35 @@ -/* ===-- ctzdi2.c - Implement __ctzdi2 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ctzdi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ctzdi2.c - Implement __ctzdi2 -------------------------------------===// +// +// 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 implements __ctzdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: the number of trailing 0-bits  */ +// Returns: the number of trailing 0-bits  #if !defined(__clang__) &&                                                     \ -    ((defined(__sparc__) && defined(__arch64__)) ||                            \ -     defined(__mips64) ||                                                      \ +    ((defined(__sparc__) && defined(__arch64__)) || defined(__mips64) ||       \       (defined(__riscv) && __SIZEOF_POINTER__ >= 8)) -/* On 64-bit architectures with neither a native clz instruction nor a native - * ctz instruction, gcc resolves __builtin_ctz to __ctzdi2 rather than - * __ctzsi2, leading to infinite recursion. */ +// On 64-bit architectures with neither a native clz instruction nor a native +// ctz instruction, gcc resolves __builtin_ctz to __ctzdi2 rather than +// __ctzsi2, leading to infinite recursion.  #define __builtin_ctz(a) __ctzsi2(a)  extern si_int __ctzsi2(si_int);  #endif -/* Precondition: a != 0 */ +// Precondition: a != 0 -COMPILER_RT_ABI si_int -__ctzdi2(di_int a) -{ -    dwords x; -    x.all = a; -    const si_int f = -(x.s.low == 0); -    return __builtin_ctz((x.s.high & f) | (x.s.low & ~f)) + -              (f & ((si_int)(sizeof(si_int) * CHAR_BIT))); +COMPILER_RT_ABI si_int __ctzdi2(di_int a) { +  dwords x; +  x.all = a; +  const si_int f = -(x.s.low == 0); +  return __builtin_ctz((x.s.high & f) | (x.s.low & ~f)) + +         (f & ((si_int)(sizeof(si_int) * CHAR_BIT)));  } diff --git a/lib/builtins/ctzsi2.c b/lib/builtins/ctzsi2.c index c69486ea445f..09c6863b74e3 100644 --- a/lib/builtins/ctzsi2.c +++ b/lib/builtins/ctzsi2.c @@ -1,57 +1,53 @@ -/* ===-- ctzsi2.c - Implement __ctzsi2 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ctzsi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ctzsi2.c - Implement __ctzsi2 -------------------------------------===// +// +// 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 implements __ctzsi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: the number of trailing 0-bits */ +// Returns: the number of trailing 0-bits -/* Precondition: a != 0 */ +// Precondition: a != 0 -COMPILER_RT_ABI si_int -__ctzsi2(si_int a) -{ -    su_int x = (su_int)a; -    si_int t = ((x & 0x0000FFFF) == 0) << 4;  /* if (x has no small bits) t = 16 else 0 */ -    x >>= t;           /* x = [0 - 0xFFFF] + higher garbage bits */ -    su_int r = t;       /* r = [0, 16]  */ -    /* return r + ctz(x) */ -    t = ((x & 0x00FF) == 0) << 3; -    x >>= t;           /* x = [0 - 0xFF] + higher garbage bits */ -    r += t;            /* r = [0, 8, 16, 24] */ -    /* return r + ctz(x) */ -    t = ((x & 0x0F) == 0) << 2; -    x >>= t;           /* x = [0 - 0xF] + higher garbage bits */ -    r += t;            /* r = [0, 4, 8, 12, 16, 20, 24, 28] */ -    /* return r + ctz(x) */ -    t = ((x & 0x3) == 0) << 1; -    x >>= t; -    x &= 3;            /* x = [0 - 3] */ -    r += t;            /* r = [0 - 30] and is even */ -    /* return r + ctz(x) */ +COMPILER_RT_ABI si_int __ctzsi2(si_int a) { +  su_int x = (su_int)a; +  si_int t = ((x & 0x0000FFFF) == 0) +             << 4; // if (x has no small bits) t = 16 else 0 +  x >>= t;         // x = [0 - 0xFFFF] + higher garbage bits +  su_int r = t;    // r = [0, 16] +  // return r + ctz(x) +  t = ((x & 0x00FF) == 0) << 3; +  x >>= t; // x = [0 - 0xFF] + higher garbage bits +  r += t;  // r = [0, 8, 16, 24] +  // return r + ctz(x) +  t = ((x & 0x0F) == 0) << 2; +  x >>= t; // x = [0 - 0xF] + higher garbage bits +  r += t;  // r = [0, 4, 8, 12, 16, 20, 24, 28] +  // return r + ctz(x) +  t = ((x & 0x3) == 0) << 1; +  x >>= t; +  x &= 3; // x = [0 - 3] +  r += t; // r = [0 - 30] and is even +  // return r + ctz(x) -/*  The branch-less return statement below is equivalent - *  to the following switch statement: - *     switch (x) - *    { - *     case 0: - *         return r + 2; - *     case 2: - *         return r + 1; - *     case 1: - *     case 3: - *         return r; - *     } - */ -    return r + ((2 - (x >> 1)) & -((x & 1) == 0)); +  //  The branch-less return statement below is equivalent +  //  to the following switch statement: +  //     switch (x) +  //    { +  //     case 0: +  //         return r + 2; +  //     case 2: +  //         return r + 1; +  //     case 1: +  //     case 3: +  //         return r; +  //     } +  return r + ((2 - (x >> 1)) & -((x & 1) == 0));  } diff --git a/lib/builtins/ctzti2.c b/lib/builtins/ctzti2.c index 45de682700cc..2a1312c8437d 100644 --- a/lib/builtins/ctzti2.c +++ b/lib/builtins/ctzti2.c @@ -1,33 +1,29 @@ -/* ===-- ctzti2.c - Implement __ctzti2 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ctzti2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ctzti2.c - Implement __ctzti2 -------------------------------------===// +// +// 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 implements __ctzti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: the number of trailing 0-bits */ +// Returns: the number of trailing 0-bits -/* Precondition: a != 0 */ +// Precondition: a != 0 -COMPILER_RT_ABI si_int -__ctzti2(ti_int a) -{ -    twords x; -    x.all = a; -    const di_int f = -(x.s.low == 0); -    return __builtin_ctzll((x.s.high & f) | (x.s.low & ~f)) + -              ((si_int)f & ((si_int)(sizeof(di_int) * CHAR_BIT))); +COMPILER_RT_ABI si_int __ctzti2(ti_int a) { +  twords x; +  x.all = a; +  const di_int f = -(x.s.low == 0); +  return __builtin_ctzll((x.s.high & f) | (x.s.low & ~f)) + +         ((si_int)f & ((si_int)(sizeof(di_int) * CHAR_BIT)));  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/divdc3.c b/lib/builtins/divdc3.c index 392d6ecacde1..c2cf62874603 100644 --- a/lib/builtins/divdc3.c +++ b/lib/builtins/divdc3.c @@ -1,62 +1,53 @@ -/* ===-- divdc3.c - Implement __divdc3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __divdc3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- divdc3.c - Implement __divdc3 -------------------------------------===// +// +// 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 implements __divdc3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #define DOUBLE_PRECISION  #include "fp_lib.h"  #include "int_lib.h"  #include "int_math.h" -/* Returns: the quotient of (a + ib) / (c + id) */ +// Returns: the quotient of (a + ib) / (c + id) -COMPILER_RT_ABI Dcomplex -__divdc3(double __a, double __b, double __c, double __d) -{ -    int __ilogbw = 0; -    double __logbw = __compiler_rt_logb(crt_fmax(crt_fabs(__c), crt_fabs(__d))); -    if (crt_isfinite(__logbw)) -    { -        __ilogbw = (int)__logbw; -        __c = crt_scalbn(__c, -__ilogbw); -        __d = crt_scalbn(__d, -__ilogbw); +COMPILER_RT_ABI Dcomplex __divdc3(double __a, double __b, double __c, +                                  double __d) { +  int __ilogbw = 0; +  double __logbw = __compiler_rt_logb(crt_fmax(crt_fabs(__c), crt_fabs(__d))); +  if (crt_isfinite(__logbw)) { +    __ilogbw = (int)__logbw; +    __c = crt_scalbn(__c, -__ilogbw); +    __d = crt_scalbn(__d, -__ilogbw); +  } +  double __denom = __c * __c + __d * __d; +  Dcomplex z; +  COMPLEX_REAL(z) = crt_scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); +  COMPLEX_IMAGINARY(z) = +      crt_scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); +  if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { +    if ((__denom == 0.0) && (!crt_isnan(__a) || !crt_isnan(__b))) { +      COMPLEX_REAL(z) = crt_copysign(CRT_INFINITY, __c) * __a; +      COMPLEX_IMAGINARY(z) = crt_copysign(CRT_INFINITY, __c) * __b; +    } else if ((crt_isinf(__a) || crt_isinf(__b)) && crt_isfinite(__c) && +               crt_isfinite(__d)) { +      __a = crt_copysign(crt_isinf(__a) ? 1.0 : 0.0, __a); +      __b = crt_copysign(crt_isinf(__b) ? 1.0 : 0.0, __b); +      COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c + __b * __d); +      COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__b * __c - __a * __d); +    } else if (crt_isinf(__logbw) && __logbw > 0.0 && crt_isfinite(__a) && +               crt_isfinite(__b)) { +      __c = crt_copysign(crt_isinf(__c) ? 1.0 : 0.0, __c); +      __d = crt_copysign(crt_isinf(__d) ? 1.0 : 0.0, __d); +      COMPLEX_REAL(z) = 0.0 * (__a * __c + __b * __d); +      COMPLEX_IMAGINARY(z) = 0.0 * (__b * __c - __a * __d);      } -    double __denom = __c * __c + __d * __d; -    Dcomplex z; -    COMPLEX_REAL(z) = crt_scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); -    COMPLEX_IMAGINARY(z) = crt_scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); -    if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) -    { -        if ((__denom == 0.0) && (!crt_isnan(__a) || !crt_isnan(__b))) -        { -            COMPLEX_REAL(z) = crt_copysign(CRT_INFINITY, __c) * __a; -            COMPLEX_IMAGINARY(z) = crt_copysign(CRT_INFINITY, __c) * __b; -        } -        else if ((crt_isinf(__a) || crt_isinf(__b)) && -                 crt_isfinite(__c) && crt_isfinite(__d)) -        { -            __a = crt_copysign(crt_isinf(__a) ? 1.0 : 0.0, __a); -            __b = crt_copysign(crt_isinf(__b) ? 1.0 : 0.0, __b); -            COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c + __b * __d); -            COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__b * __c - __a * __d); -        } -        else if (crt_isinf(__logbw) && __logbw > 0.0 && -                 crt_isfinite(__a) && crt_isfinite(__b)) -        { -            __c = crt_copysign(crt_isinf(__c) ? 1.0 : 0.0, __c); -            __d = crt_copysign(crt_isinf(__d) ? 1.0 : 0.0, __d); -            COMPLEX_REAL(z) = 0.0 * (__a * __c + __b * __d); -            COMPLEX_IMAGINARY(z) = 0.0 * (__b * __c - __a * __d); -        } -    } -    return z; +  } +  return z;  } diff --git a/lib/builtins/divdf3.c b/lib/builtins/divdf3.c index 411c82ebb87a..1dea3b534f5a 100644 --- a/lib/builtins/divdf3.c +++ b/lib/builtins/divdf3.c @@ -1,9 +1,8 @@  //===-- lib/divdf3.c - Double-precision division ------------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -19,175 +18,193 @@  #define DOUBLE_PRECISION  #include "fp_lib.h" -COMPILER_RT_ABI fp_t -__divdf3(fp_t a, fp_t b) { - -    const unsigned int aExponent = toRep(a) >> significandBits & maxExponent; -    const unsigned int bExponent = toRep(b) >> significandBits & maxExponent; -    const rep_t quotientSign = (toRep(a) ^ toRep(b)) & signBit; - -    rep_t aSignificand = toRep(a) & significandMask; -    rep_t bSignificand = toRep(b) & significandMask; -    int scale = 0; - -    // Detect if a or b is zero, denormal, infinity, or NaN. -    if (aExponent-1U >= maxExponent-1U || bExponent-1U >= maxExponent-1U) { - -        const rep_t aAbs = toRep(a) & absMask; -        const rep_t bAbs = toRep(b) & absMask; - -        // NaN / anything = qNaN -        if (aAbs > infRep) return fromRep(toRep(a) | quietBit); -        // anything / NaN = qNaN -        if (bAbs > infRep) return fromRep(toRep(b) | quietBit); - -        if (aAbs == infRep) { -            // infinity / infinity = NaN -            if (bAbs == infRep) return fromRep(qnanRep); -            // infinity / anything else = +/- infinity -            else return fromRep(aAbs | quotientSign); -        } - -        // anything else / infinity = +/- 0 -        if (bAbs == infRep) return fromRep(quotientSign); - -        if (!aAbs) { -            // zero / zero = NaN -            if (!bAbs) return fromRep(qnanRep); -            // zero / anything else = +/- zero -            else return fromRep(quotientSign); -        } -        // anything else / zero = +/- infinity -        if (!bAbs) return fromRep(infRep | quotientSign); - -        // one or both of a or b is denormal, the other (if applicable) is a -        // normal number.  Renormalize one or both of a and b, and set scale to -        // include the necessary exponent adjustment. -        if (aAbs < implicitBit) scale += normalize(&aSignificand); -        if (bAbs < implicitBit) scale -= normalize(&bSignificand); -    } - -    // Or in the implicit significand bit.  (If we fell through from the -    // denormal path it was already set by normalize( ), but setting it twice -    // won't hurt anything.) -    aSignificand |= implicitBit; -    bSignificand |= implicitBit; -    int quotientExponent = aExponent - bExponent + scale; - -    // Align the significand of b as a Q31 fixed-point number in the range -    // [1, 2.0) and get a Q32 approximate reciprocal using a small minimax -    // polynomial approximation: reciprocal = 3/4 + 1/sqrt(2) - b/2.  This -    // is accurate to about 3.5 binary digits. -    const uint32_t q31b = bSignificand >> 21; -    uint32_t recip32 = UINT32_C(0x7504f333) - q31b; - -    // Now refine the reciprocal estimate using a Newton-Raphson iteration: -    // -    //     x1 = x0 * (2 - x0 * b) -    // -    // This doubles the number of correct binary digits in the approximation -    // with each iteration, so after three iterations, we have about 28 binary -    // digits of accuracy. -    uint32_t correction32; -    correction32 = -((uint64_t)recip32 * q31b >> 32); -    recip32 = (uint64_t)recip32 * correction32 >> 31; -    correction32 = -((uint64_t)recip32 * q31b >> 32); -    recip32 = (uint64_t)recip32 * correction32 >> 31; -    correction32 = -((uint64_t)recip32 * q31b >> 32); -    recip32 = (uint64_t)recip32 * correction32 >> 31; - -    // recip32 might have overflowed to exactly zero in the preceding -    // computation if the high word of b is exactly 1.0.  This would sabotage -    // the full-width final stage of the computation that follows, so we adjust -    // recip32 downward by one bit. -    recip32--; - -    // We need to perform one more iteration to get us to 56 binary digits; -    // The last iteration needs to happen with extra precision. -    const uint32_t q63blo = bSignificand << 11; -    uint64_t correction, reciprocal; -    correction = -((uint64_t)recip32*q31b + ((uint64_t)recip32*q63blo >> 32)); -    uint32_t cHi = correction >> 32; -    uint32_t cLo = correction; -    reciprocal = (uint64_t)recip32*cHi + ((uint64_t)recip32*cLo >> 32); - -    // We already adjusted the 32-bit estimate, now we need to adjust the final -    // 64-bit reciprocal estimate downward to ensure that it is strictly smaller -    // than the infinitely precise exact reciprocal.  Because the computation -    // of the Newton-Raphson step is truncating at every step, this adjustment -    // is small; most of the work is already done. -    reciprocal -= 2; - -    // The numerical reciprocal is accurate to within 2^-56, lies in the -    // interval [0.5, 1.0), and is strictly smaller than the true reciprocal -    // of b.  Multiplying a by this reciprocal thus gives a numerical q = a/b -    // in Q53 with the following properties: -    // -    //    1. q < a/b -    //    2. q is in the interval [0.5, 2.0) -    //    3. the error in q is bounded away from 2^-53 (actually, we have a -    //       couple of bits to spare, but this is all we need). - -    // We need a 64 x 64 multiply high to compute q, which isn't a basic -    // operation in C, so we need to be a little bit fussy. -    rep_t quotient, quotientLo; -    wideMultiply(aSignificand << 2, reciprocal, "ient, "ientLo); - -    // Two cases: quotient is in [0.5, 1.0) or quotient is in [1.0, 2.0). -    // In either case, we are going to compute a residual of the form -    // -    //     r = a - q*b -    // -    // We know from the construction of q that r satisfies: -    // -    //     0 <= r < ulp(q)*b -    // -    // if r is greater than 1/2 ulp(q)*b, then q rounds up.  Otherwise, we -    // already have the correct result.  The exact halfway case cannot occur. -    // We also take this time to right shift quotient if it falls in the [1,2) -    // range and adjust the exponent accordingly. -    rep_t residual; -    if (quotient < (implicitBit << 1)) { -        residual = (aSignificand << 53) - quotient * bSignificand; -        quotientExponent--; -    } else { -        quotient >>= 1; -        residual = (aSignificand << 52) - quotient * bSignificand; +COMPILER_RT_ABI fp_t __divdf3(fp_t a, fp_t b) { + +  const unsigned int aExponent = toRep(a) >> significandBits & maxExponent; +  const unsigned int bExponent = toRep(b) >> significandBits & maxExponent; +  const rep_t quotientSign = (toRep(a) ^ toRep(b)) & signBit; + +  rep_t aSignificand = toRep(a) & significandMask; +  rep_t bSignificand = toRep(b) & significandMask; +  int scale = 0; + +  // Detect if a or b is zero, denormal, infinity, or NaN. +  if (aExponent - 1U >= maxExponent - 1U || +      bExponent - 1U >= maxExponent - 1U) { + +    const rep_t aAbs = toRep(a) & absMask; +    const rep_t bAbs = toRep(b) & absMask; + +    // NaN / anything = qNaN +    if (aAbs > infRep) +      return fromRep(toRep(a) | quietBit); +    // anything / NaN = qNaN +    if (bAbs > infRep) +      return fromRep(toRep(b) | quietBit); + +    if (aAbs == infRep) { +      // infinity / infinity = NaN +      if (bAbs == infRep) +        return fromRep(qnanRep); +      // infinity / anything else = +/- infinity +      else +        return fromRep(aAbs | quotientSign);      } -    const int writtenExponent = quotientExponent + exponentBias; +    // anything else / infinity = +/- 0 +    if (bAbs == infRep) +      return fromRep(quotientSign); -    if (writtenExponent >= maxExponent) { -        // If we have overflowed the exponent, return infinity. -        return fromRep(infRep | quotientSign); -    } - -    else if (writtenExponent < 1) { -        // Flush denormals to zero.  In the future, it would be nice to add -        // code to round them correctly. +    if (!aAbs) { +      // zero / zero = NaN +      if (!bAbs) +        return fromRep(qnanRep); +      // zero / anything else = +/- zero +      else          return fromRep(quotientSign);      } - -    else { -        const bool round = (residual << 1) > bSignificand; -        // Clear the implicit bit -        rep_t absResult = quotient & significandMask; -        // Insert the exponent -        absResult |= (rep_t)writtenExponent << significandBits; -        // Round -        absResult += round; -        // Insert the sign and return -        const double result = fromRep(absResult | quotientSign); -        return result; +    // anything else / zero = +/- infinity +    if (!bAbs) +      return fromRep(infRep | quotientSign); + +    // One or both of a or b is denormal.  The other (if applicable) is a +    // normal number.  Renormalize one or both of a and b, and set scale to +    // include the necessary exponent adjustment. +    if (aAbs < implicitBit) +      scale += normalize(&aSignificand); +    if (bAbs < implicitBit) +      scale -= normalize(&bSignificand); +  } + +  // Set the implicit significand bit.  If we fell through from the +  // denormal path it was already set by normalize( ), but setting it twice +  // won't hurt anything. +  aSignificand |= implicitBit; +  bSignificand |= implicitBit; +  int quotientExponent = aExponent - bExponent + scale; + +  // Align the significand of b as a Q31 fixed-point number in the range +  // [1, 2.0) and get a Q32 approximate reciprocal using a small minimax +  // polynomial approximation: reciprocal = 3/4 + 1/sqrt(2) - b/2.  This +  // is accurate to about 3.5 binary digits. +  const uint32_t q31b = bSignificand >> 21; +  uint32_t recip32 = UINT32_C(0x7504f333) - q31b; +  // 0x7504F333 / 2^32 + 1 = 3/4 + 1/sqrt(2) + +  // Now refine the reciprocal estimate using a Newton-Raphson iteration: +  // +  //     x1 = x0 * (2 - x0 * b) +  // +  // This doubles the number of correct binary digits in the approximation +  // with each iteration. +  uint32_t correction32; +  correction32 = -((uint64_t)recip32 * q31b >> 32); +  recip32 = (uint64_t)recip32 * correction32 >> 31; +  correction32 = -((uint64_t)recip32 * q31b >> 32); +  recip32 = (uint64_t)recip32 * correction32 >> 31; +  correction32 = -((uint64_t)recip32 * q31b >> 32); +  recip32 = (uint64_t)recip32 * correction32 >> 31; + +  // The reciprocal may have overflowed to zero if the upper half of b is +  // exactly 1.0.  This would sabatoge the full-width final stage of the +  // computation that follows, so we adjust the reciprocal down by one bit. +  recip32--; + +  // We need to perform one more iteration to get us to 56 binary digits. +  // The last iteration needs to happen with extra precision. +  const uint32_t q63blo = bSignificand << 11; +  uint64_t correction, reciprocal; +  correction = -((uint64_t)recip32 * q31b + ((uint64_t)recip32 * q63blo >> 32)); +  uint32_t cHi = correction >> 32; +  uint32_t cLo = correction; +  reciprocal = (uint64_t)recip32 * cHi + ((uint64_t)recip32 * cLo >> 32); + +  // Adjust the final 64-bit reciprocal estimate downward to ensure that it is +  // strictly smaller than the infinitely precise exact reciprocal.  Because +  // the computation of the Newton-Raphson step is truncating at every step, +  // this adjustment is small; most of the work is already done. +  reciprocal -= 2; + +  // The numerical reciprocal is accurate to within 2^-56, lies in the +  // interval [0.5, 1.0), and is strictly smaller than the true reciprocal +  // of b.  Multiplying a by this reciprocal thus gives a numerical q = a/b +  // in Q53 with the following properties: +  // +  //    1. q < a/b +  //    2. q is in the interval [0.5, 2.0) +  //    3. The error in q is bounded away from 2^-53 (actually, we have a +  //       couple of bits to spare, but this is all we need). + +  // We need a 64 x 64 multiply high to compute q, which isn't a basic +  // operation in C, so we need to be a little bit fussy. +  rep_t quotient, quotientLo; +  wideMultiply(aSignificand << 2, reciprocal, "ient, "ientLo); + +  // Two cases: quotient is in [0.5, 1.0) or quotient is in [1.0, 2.0). +  // In either case, we are going to compute a residual of the form +  // +  //     r = a - q*b +  // +  // We know from the construction of q that r satisfies: +  // +  //     0 <= r < ulp(q)*b +  // +  // If r is greater than 1/2 ulp(q)*b, then q rounds up.  Otherwise, we +  // already have the correct result.  The exact halfway case cannot occur. +  // We also take this time to right shift quotient if it falls in the [1,2) +  // range and adjust the exponent accordingly. +  rep_t residual; +  if (quotient < (implicitBit << 1)) { +    residual = (aSignificand << 53) - quotient * bSignificand; +    quotientExponent--; +  } else { +    quotient >>= 1; +    residual = (aSignificand << 52) - quotient * bSignificand; +  } + +  const int writtenExponent = quotientExponent + exponentBias; + +  if (writtenExponent >= maxExponent) { +    // If we have overflowed the exponent, return infinity. +    return fromRep(infRep | quotientSign); +  } + +  else if (writtenExponent < 1) { +    if (writtenExponent == 0) { +      // Check whether the rounded result is normal. +      const bool round = (residual << 1) > bSignificand; +      // Clear the implicit bit. +      rep_t absResult = quotient & significandMask; +      // Round. +      absResult += round; +      if (absResult & ~significandMask) { +        // The rounded result is normal; return it. +        return fromRep(absResult | quotientSign); +      }      } +    // Flush denormals to zero.  In the future, it would be nice to add +    // code to round them correctly. +    return fromRep(quotientSign); +  } + +  else { +    const bool round = (residual << 1) > bSignificand; +    // Clear the implicit bit. +    rep_t absResult = quotient & significandMask; +    // Insert the exponent. +    absResult |= (rep_t)writtenExponent << significandBits; +    // Round. +    absResult += round; +    // Insert the sign and return. +    const double result = fromRep(absResult | quotientSign); +    return result; +  }  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_ddiv(fp_t a, fp_t b) { -  return __divdf3(a, b); -} +AEABI_RTABI fp_t __aeabi_ddiv(fp_t a, fp_t b) { return __divdf3(a, b); }  #else -AEABI_RTABI fp_t __aeabi_ddiv(fp_t a, fp_t b) COMPILER_RT_ALIAS(__divdf3); +COMPILER_RT_ALIAS(__divdf3, __aeabi_ddiv)  #endif  #endif diff --git a/lib/builtins/divdi3.c b/lib/builtins/divdi3.c index b8eebcb20465..ee08d6557783 100644 --- a/lib/builtins/divdi3.c +++ b/lib/builtins/divdi3.c @@ -1,29 +1,25 @@ -/* ===-- divdi3.c - Implement __divdi3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __divdi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- divdi3.c - Implement __divdi3 -------------------------------------===// +// +// 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 implements __divdi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a / b */ +// Returns: a / b -COMPILER_RT_ABI di_int -__divdi3(di_int a, di_int b) -{ -    const int bits_in_dword_m1 = (int)(sizeof(di_int) * CHAR_BIT) - 1; -    di_int s_a = a >> bits_in_dword_m1;           /* s_a = a < 0 ? -1 : 0 */ -    di_int s_b = b >> bits_in_dword_m1;           /* s_b = b < 0 ? -1 : 0 */ -    a = (a ^ s_a) - s_a;                         /* negate if s_a == -1 */ -    b = (b ^ s_b) - s_b;                         /* negate if s_b == -1 */ -    s_a ^= s_b;                                  /*sign of quotient */ -    return (__udivmoddi4(a, b, (du_int*)0) ^ s_a) - s_a;  /* negate if s_a == -1 */ +COMPILER_RT_ABI di_int __divdi3(di_int a, di_int b) { +  const int bits_in_dword_m1 = (int)(sizeof(di_int) * CHAR_BIT) - 1; +  di_int s_a = a >> bits_in_dword_m1;                   // s_a = a < 0 ? -1 : 0 +  di_int s_b = b >> bits_in_dword_m1;                   // s_b = b < 0 ? -1 : 0 +  a = (a ^ s_a) - s_a;                                  // negate if s_a == -1 +  b = (b ^ s_b) - s_b;                                  // negate if s_b == -1 +  s_a ^= s_b;                                           // sign of quotient +  return (__udivmoddi4(a, b, (du_int *)0) ^ s_a) - s_a; // negate if s_a == -1  } diff --git a/lib/builtins/divmoddi4.c b/lib/builtins/divmoddi4.c index 0d4df67a63e0..7f333510c003 100644 --- a/lib/builtins/divmoddi4.c +++ b/lib/builtins/divmoddi4.c @@ -1,25 +1,21 @@ -/*===-- divmoddi4.c - Implement __divmoddi4 --------------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __divmoddi4 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- divmoddi4.c - Implement __divmoddi4 -------------------------------===// +// +// 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 implements __divmoddi4 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a / b, *rem = a % b  */ +// Returns: a / b, *rem = a % b -COMPILER_RT_ABI di_int -__divmoddi4(di_int a, di_int b, di_int* rem) -{ -  di_int d = __divdi3(a,b); -  *rem = a - (d*b); +COMPILER_RT_ABI di_int __divmoddi4(di_int a, di_int b, di_int *rem) { +  di_int d = __divdi3(a, b); +  *rem = a - (d * b);    return d;  } diff --git a/lib/builtins/divmodsi4.c b/lib/builtins/divmodsi4.c index dabe2874397c..402eed22fe7a 100644 --- a/lib/builtins/divmodsi4.c +++ b/lib/builtins/divmodsi4.c @@ -1,27 +1,22 @@ -/*===-- divmodsi4.c - Implement __divmodsi4 --------------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __divmodsi4 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- divmodsi4.c - Implement __divmodsi4 +//--------------------------------===// +// +// 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 implements __divmodsi4 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a / b, *rem = a % b  */ +// Returns: a / b, *rem = a % b -COMPILER_RT_ABI si_int -__divmodsi4(si_int a, si_int b, si_int* rem) -{ -  si_int d = __divsi3(a,b); -  *rem = a - (d*b); -  return d;  +COMPILER_RT_ABI si_int __divmodsi4(si_int a, si_int b, si_int *rem) { +  si_int d = __divsi3(a, b); +  *rem = a - (d * b); +  return d;  } - - diff --git a/lib/builtins/divsc3.c b/lib/builtins/divsc3.c index 0d18a256c3de..1a63634dde21 100644 --- a/lib/builtins/divsc3.c +++ b/lib/builtins/divsc3.c @@ -1,63 +1,53 @@ -/*===-- divsc3.c - Implement __divsc3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __divsc3 for the compiler_rt library. - * - *===----------------------------------------------------------------------=== - */ +//===-- divsc3.c - Implement __divsc3 -------------------------------------===// +// +// 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 implements __divsc3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #define SINGLE_PRECISION  #include "fp_lib.h"  #include "int_lib.h"  #include "int_math.h" -/* Returns: the quotient of (a + ib) / (c + id) */ +// Returns: the quotient of (a + ib) / (c + id) -COMPILER_RT_ABI Fcomplex -__divsc3(float __a, float __b, float __c, float __d) -{ -    int __ilogbw = 0; -    float __logbw = -        __compiler_rt_logbf(crt_fmaxf(crt_fabsf(__c), crt_fabsf(__d))); -    if (crt_isfinite(__logbw)) -    { -        __ilogbw = (int)__logbw; -        __c = crt_scalbnf(__c, -__ilogbw); -        __d = crt_scalbnf(__d, -__ilogbw); +COMPILER_RT_ABI Fcomplex __divsc3(float __a, float __b, float __c, float __d) { +  int __ilogbw = 0; +  float __logbw = +      __compiler_rt_logbf(crt_fmaxf(crt_fabsf(__c), crt_fabsf(__d))); +  if (crt_isfinite(__logbw)) { +    __ilogbw = (int)__logbw; +    __c = crt_scalbnf(__c, -__ilogbw); +    __d = crt_scalbnf(__d, -__ilogbw); +  } +  float __denom = __c * __c + __d * __d; +  Fcomplex z; +  COMPLEX_REAL(z) = crt_scalbnf((__a * __c + __b * __d) / __denom, -__ilogbw); +  COMPLEX_IMAGINARY(z) = +      crt_scalbnf((__b * __c - __a * __d) / __denom, -__ilogbw); +  if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { +    if ((__denom == 0) && (!crt_isnan(__a) || !crt_isnan(__b))) { +      COMPLEX_REAL(z) = crt_copysignf(CRT_INFINITY, __c) * __a; +      COMPLEX_IMAGINARY(z) = crt_copysignf(CRT_INFINITY, __c) * __b; +    } else if ((crt_isinf(__a) || crt_isinf(__b)) && crt_isfinite(__c) && +               crt_isfinite(__d)) { +      __a = crt_copysignf(crt_isinf(__a) ? 1 : 0, __a); +      __b = crt_copysignf(crt_isinf(__b) ? 1 : 0, __b); +      COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c + __b * __d); +      COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__b * __c - __a * __d); +    } else if (crt_isinf(__logbw) && __logbw > 0 && crt_isfinite(__a) && +               crt_isfinite(__b)) { +      __c = crt_copysignf(crt_isinf(__c) ? 1 : 0, __c); +      __d = crt_copysignf(crt_isinf(__d) ? 1 : 0, __d); +      COMPLEX_REAL(z) = 0 * (__a * __c + __b * __d); +      COMPLEX_IMAGINARY(z) = 0 * (__b * __c - __a * __d);      } -    float __denom = __c * __c + __d * __d; -    Fcomplex z; -    COMPLEX_REAL(z) = crt_scalbnf((__a * __c + __b * __d) / __denom, -__ilogbw); -    COMPLEX_IMAGINARY(z) = crt_scalbnf((__b * __c - __a * __d) / __denom, -__ilogbw); -    if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) -    { -        if ((__denom == 0) && (!crt_isnan(__a) || !crt_isnan(__b))) -        { -            COMPLEX_REAL(z) = crt_copysignf(CRT_INFINITY, __c) * __a; -            COMPLEX_IMAGINARY(z) = crt_copysignf(CRT_INFINITY, __c) * __b; -        } -        else if ((crt_isinf(__a) || crt_isinf(__b)) && -                 crt_isfinite(__c) && crt_isfinite(__d)) -        { -            __a = crt_copysignf(crt_isinf(__a) ? 1 : 0, __a); -            __b = crt_copysignf(crt_isinf(__b) ? 1 : 0, __b); -            COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c + __b * __d); -            COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__b * __c - __a * __d); -        } -        else if (crt_isinf(__logbw) && __logbw > 0 && -                 crt_isfinite(__a) && crt_isfinite(__b)) -        { -            __c = crt_copysignf(crt_isinf(__c) ? 1 : 0, __c); -            __d = crt_copysignf(crt_isinf(__d) ? 1 : 0, __d); -            COMPLEX_REAL(z) = 0 * (__a * __c + __b * __d); -            COMPLEX_IMAGINARY(z) = 0 * (__b * __c - __a * __d); -        } -    } -    return z; +  } +  return z;  } diff --git a/lib/builtins/divsf3.c b/lib/builtins/divsf3.c index a74917fd1de5..593f93b45ac2 100644 --- a/lib/builtins/divsf3.c +++ b/lib/builtins/divsf3.c @@ -1,9 +1,8 @@  //===-- lib/divsf3.c - Single-precision division ------------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -19,159 +18,177 @@  #define SINGLE_PRECISION  #include "fp_lib.h" -COMPILER_RT_ABI fp_t -__divsf3(fp_t a, fp_t b) { - -    const unsigned int aExponent = toRep(a) >> significandBits & maxExponent; -    const unsigned int bExponent = toRep(b) >> significandBits & maxExponent; -    const rep_t quotientSign = (toRep(a) ^ toRep(b)) & signBit; - -    rep_t aSignificand = toRep(a) & significandMask; -    rep_t bSignificand = toRep(b) & significandMask; -    int scale = 0; - -    // Detect if a or b is zero, denormal, infinity, or NaN. -    if (aExponent-1U >= maxExponent-1U || bExponent-1U >= maxExponent-1U) { - -        const rep_t aAbs = toRep(a) & absMask; -        const rep_t bAbs = toRep(b) & absMask; - -        // NaN / anything = qNaN -        if (aAbs > infRep) return fromRep(toRep(a) | quietBit); -        // anything / NaN = qNaN -        if (bAbs > infRep) return fromRep(toRep(b) | quietBit); - -        if (aAbs == infRep) { -            // infinity / infinity = NaN -            if (bAbs == infRep) return fromRep(qnanRep); -            // infinity / anything else = +/- infinity -            else return fromRep(aAbs | quotientSign); -        } - -        // anything else / infinity = +/- 0 -        if (bAbs == infRep) return fromRep(quotientSign); - -        if (!aAbs) { -            // zero / zero = NaN -            if (!bAbs) return fromRep(qnanRep); -            // zero / anything else = +/- zero -            else return fromRep(quotientSign); -        } -        // anything else / zero = +/- infinity -        if (!bAbs) return fromRep(infRep | quotientSign); - -        // one or both of a or b is denormal, the other (if applicable) is a -        // normal number.  Renormalize one or both of a and b, and set scale to -        // include the necessary exponent adjustment. -        if (aAbs < implicitBit) scale += normalize(&aSignificand); -        if (bAbs < implicitBit) scale -= normalize(&bSignificand); -    } - -    // Or in the implicit significand bit.  (If we fell through from the -    // denormal path it was already set by normalize( ), but setting it twice -    // won't hurt anything.) -    aSignificand |= implicitBit; -    bSignificand |= implicitBit; -    int quotientExponent = aExponent - bExponent + scale; - -    // Align the significand of b as a Q31 fixed-point number in the range -    // [1, 2.0) and get a Q32 approximate reciprocal using a small minimax -    // polynomial approximation: reciprocal = 3/4 + 1/sqrt(2) - b/2.  This -    // is accurate to about 3.5 binary digits. -    uint32_t q31b = bSignificand << 8; -    uint32_t reciprocal = UINT32_C(0x7504f333) - q31b; - -    // Now refine the reciprocal estimate using a Newton-Raphson iteration: -    // -    //     x1 = x0 * (2 - x0 * b) -    // -    // This doubles the number of correct binary digits in the approximation -    // with each iteration, so after three iterations, we have about 28 binary -    // digits of accuracy. -    uint32_t correction; -    correction = -((uint64_t)reciprocal * q31b >> 32); -    reciprocal = (uint64_t)reciprocal * correction >> 31; -    correction = -((uint64_t)reciprocal * q31b >> 32); -    reciprocal = (uint64_t)reciprocal * correction >> 31; -    correction = -((uint64_t)reciprocal * q31b >> 32); -    reciprocal = (uint64_t)reciprocal * correction >> 31; - -    // Exhaustive testing shows that the error in reciprocal after three steps -    // is in the interval [-0x1.f58108p-31, 0x1.d0e48cp-29], in line with our -    // expectations.  We bump the reciprocal by a tiny value to force the error -    // to be strictly positive (in the range [0x1.4fdfp-37,0x1.287246p-29], to -    // be specific).  This also causes 1/1 to give a sensible approximation -    // instead of zero (due to overflow). -    reciprocal -= 2; - -    // The numerical reciprocal is accurate to within 2^-28, lies in the -    // interval [0x1.000000eep-1, 0x1.fffffffcp-1], and is strictly smaller -    // than the true reciprocal of b.  Multiplying a by this reciprocal thus -    // gives a numerical q = a/b in Q24 with the following properties: -    // -    //    1. q < a/b -    //    2. q is in the interval [0x1.000000eep-1, 0x1.fffffffcp0) -    //    3. the error in q is at most 2^-24 + 2^-27 -- the 2^24 term comes -    //       from the fact that we truncate the product, and the 2^27 term -    //       is the error in the reciprocal of b scaled by the maximum -    //       possible value of a.  As a consequence of this error bound, -    //       either q or nextafter(q) is the correctly rounded -    rep_t quotient = (uint64_t)reciprocal*(aSignificand << 1) >> 32; - -    // Two cases: quotient is in [0.5, 1.0) or quotient is in [1.0, 2.0). -    // In either case, we are going to compute a residual of the form -    // -    //     r = a - q*b -    // -    // We know from the construction of q that r satisfies: -    // -    //     0 <= r < ulp(q)*b -    // -    // if r is greater than 1/2 ulp(q)*b, then q rounds up.  Otherwise, we -    // already have the correct result.  The exact halfway case cannot occur. -    // We also take this time to right shift quotient if it falls in the [1,2) -    // range and adjust the exponent accordingly. -    rep_t residual; -    if (quotient < (implicitBit << 1)) { -        residual = (aSignificand << 24) - quotient * bSignificand; -        quotientExponent--; -    } else { -        quotient >>= 1; -        residual = (aSignificand << 23) - quotient * bSignificand; +COMPILER_RT_ABI fp_t __divsf3(fp_t a, fp_t b) { + +  const unsigned int aExponent = toRep(a) >> significandBits & maxExponent; +  const unsigned int bExponent = toRep(b) >> significandBits & maxExponent; +  const rep_t quotientSign = (toRep(a) ^ toRep(b)) & signBit; + +  rep_t aSignificand = toRep(a) & significandMask; +  rep_t bSignificand = toRep(b) & significandMask; +  int scale = 0; + +  // Detect if a or b is zero, denormal, infinity, or NaN. +  if (aExponent - 1U >= maxExponent - 1U || +      bExponent - 1U >= maxExponent - 1U) { + +    const rep_t aAbs = toRep(a) & absMask; +    const rep_t bAbs = toRep(b) & absMask; + +    // NaN / anything = qNaN +    if (aAbs > infRep) +      return fromRep(toRep(a) | quietBit); +    // anything / NaN = qNaN +    if (bAbs > infRep) +      return fromRep(toRep(b) | quietBit); + +    if (aAbs == infRep) { +      // infinity / infinity = NaN +      if (bAbs == infRep) +        return fromRep(qnanRep); +      // infinity / anything else = +/- infinity +      else +        return fromRep(aAbs | quotientSign);      } -    const int writtenExponent = quotientExponent + exponentBias; +    // anything else / infinity = +/- 0 +    if (bAbs == infRep) +      return fromRep(quotientSign); -    if (writtenExponent >= maxExponent) { -        // If we have overflowed the exponent, return infinity. -        return fromRep(infRep | quotientSign); -    } - -    else if (writtenExponent < 1) { -        // Flush denormals to zero.  In the future, it would be nice to add -        // code to round them correctly. +    if (!aAbs) { +      // zero / zero = NaN +      if (!bAbs) +        return fromRep(qnanRep); +      // zero / anything else = +/- zero +      else          return fromRep(quotientSign);      } - -    else { -        const bool round = (residual << 1) > bSignificand; -        // Clear the implicit bit -        rep_t absResult = quotient & significandMask; -        // Insert the exponent -        absResult |= (rep_t)writtenExponent << significandBits; -        // Round -        absResult += round; -        // Insert the sign and return +    // anything else / zero = +/- infinity +    if (!bAbs) +      return fromRep(infRep | quotientSign); + +    // One or both of a or b is denormal.  The other (if applicable) is a +    // normal number.  Renormalize one or both of a and b, and set scale to +    // include the necessary exponent adjustment. +    if (aAbs < implicitBit) +      scale += normalize(&aSignificand); +    if (bAbs < implicitBit) +      scale -= normalize(&bSignificand); +  } + +  // Set the implicit significand bit.  If we fell through from the +  // denormal path it was already set by normalize( ), but setting it twice +  // won't hurt anything. +  aSignificand |= implicitBit; +  bSignificand |= implicitBit; +  int quotientExponent = aExponent - bExponent + scale; +  // 0x7504F333 / 2^32 + 1 = 3/4 + 1/sqrt(2) + +  // Align the significand of b as a Q31 fixed-point number in the range +  // [1, 2.0) and get a Q32 approximate reciprocal using a small minimax +  // polynomial approximation: reciprocal = 3/4 + 1/sqrt(2) - b/2.  This +  // is accurate to about 3.5 binary digits. +  uint32_t q31b = bSignificand << 8; +  uint32_t reciprocal = UINT32_C(0x7504f333) - q31b; + +  // Now refine the reciprocal estimate using a Newton-Raphson iteration: +  // +  //     x1 = x0 * (2 - x0 * b) +  // +  // This doubles the number of correct binary digits in the approximation +  // with each iteration. +  uint32_t correction; +  correction = -((uint64_t)reciprocal * q31b >> 32); +  reciprocal = (uint64_t)reciprocal * correction >> 31; +  correction = -((uint64_t)reciprocal * q31b >> 32); +  reciprocal = (uint64_t)reciprocal * correction >> 31; +  correction = -((uint64_t)reciprocal * q31b >> 32); +  reciprocal = (uint64_t)reciprocal * correction >> 31; + +  // Adust the final 32-bit reciprocal estimate downward to ensure that it is +  // strictly smaller than the infinitely precise exact reciprocal.  Because +  // the computation of the Newton-Raphson step is truncating at every step, +  // this adjustment is small; most of the work is already done. +  reciprocal -= 2; + +  // The numerical reciprocal is accurate to within 2^-28, lies in the +  // interval [0x1.000000eep-1, 0x1.fffffffcp-1], and is strictly smaller +  // than the true reciprocal of b.  Multiplying a by this reciprocal thus +  // gives a numerical q = a/b in Q24 with the following properties: +  // +  //    1. q < a/b +  //    2. q is in the interval [0x1.000000eep-1, 0x1.fffffffcp0) +  //    3. The error in q is at most 2^-24 + 2^-27 -- the 2^24 term comes +  //       from the fact that we truncate the product, and the 2^27 term +  //       is the error in the reciprocal of b scaled by the maximum +  //       possible value of a.  As a consequence of this error bound, +  //       either q or nextafter(q) is the correctly rounded. +  rep_t quotient = (uint64_t)reciprocal * (aSignificand << 1) >> 32; + +  // Two cases: quotient is in [0.5, 1.0) or quotient is in [1.0, 2.0). +  // In either case, we are going to compute a residual of the form +  // +  //     r = a - q*b +  // +  // We know from the construction of q that r satisfies: +  // +  //     0 <= r < ulp(q)*b +  // +  // If r is greater than 1/2 ulp(q)*b, then q rounds up.  Otherwise, we +  // already have the correct result.  The exact halfway case cannot occur. +  // We also take this time to right shift quotient if it falls in the [1,2) +  // range and adjust the exponent accordingly. +  rep_t residual; +  if (quotient < (implicitBit << 1)) { +    residual = (aSignificand << 24) - quotient * bSignificand; +    quotientExponent--; +  } else { +    quotient >>= 1; +    residual = (aSignificand << 23) - quotient * bSignificand; +  } + +  const int writtenExponent = quotientExponent + exponentBias; + +  if (writtenExponent >= maxExponent) { +    // If we have overflowed the exponent, return infinity. +    return fromRep(infRep | quotientSign); +  } + +  else if (writtenExponent < 1) { +    if (writtenExponent == 0) { +      // Check whether the rounded result is normal. +      const bool round = (residual << 1) > bSignificand; +      // Clear the implicit bit. +      rep_t absResult = quotient & significandMask; +      // Round. +      absResult += round; +      if (absResult & ~significandMask) { +        // The rounded result is normal; return it.          return fromRep(absResult | quotientSign); +      }      } +    // Flush denormals to zero.  In the future, it would be nice to add +    // code to round them correctly. +    return fromRep(quotientSign); +  } + +  else { +    const bool round = (residual << 1) > bSignificand; +    // Clear the implicit bit. +    rep_t absResult = quotient & significandMask; +    // Insert the exponent. +    absResult |= (rep_t)writtenExponent << significandBits; +    // Round. +    absResult += round; +    // Insert the sign and return. +    return fromRep(absResult | quotientSign); +  }  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_fdiv(fp_t a, fp_t b) { -  return __divsf3(a, b); -} +AEABI_RTABI fp_t __aeabi_fdiv(fp_t a, fp_t b) { return __divsf3(a, b); }  #else -AEABI_RTABI fp_t __aeabi_fdiv(fp_t a, fp_t b) COMPILER_RT_ALIAS(__divsf3); +COMPILER_RT_ALIAS(__divsf3, __aeabi_fdiv)  #endif  #endif diff --git a/lib/builtins/divsi3.c b/lib/builtins/divsi3.c index 75aea008ddc1..b97e11119f0e 100644 --- a/lib/builtins/divsi3.c +++ b/lib/builtins/divsi3.c @@ -1,39 +1,35 @@ -/* ===-- divsi3.c - Implement __divsi3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __divsi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- divsi3.c - Implement __divsi3 -------------------------------------===// +// +// 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 implements __divsi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a / b */ +// Returns: a / b -COMPILER_RT_ABI si_int -__divsi3(si_int a, si_int b) -{ -    const int bits_in_word_m1 = (int)(sizeof(si_int) * CHAR_BIT) - 1; -    si_int s_a = a >> bits_in_word_m1;           /* s_a = a < 0 ? -1 : 0 */ -    si_int s_b = b >> bits_in_word_m1;           /* s_b = b < 0 ? -1 : 0 */ -    a = (a ^ s_a) - s_a;                         /* negate if s_a == -1 */ -    b = (b ^ s_b) - s_b;                         /* negate if s_b == -1 */ -    s_a ^= s_b;                                  /* sign of quotient */ -    /* -     * On CPUs without unsigned hardware division support, -     *  this calls __udivsi3 (notice the cast to su_int). -     * On CPUs with unsigned hardware division support, -     *  this uses the unsigned division instruction. -     */ -    return ((su_int)a/(su_int)b ^ s_a) - s_a;    /* negate if s_a == -1 */ +COMPILER_RT_ABI si_int __divsi3(si_int a, si_int b) { +  const int bits_in_word_m1 = (int)(sizeof(si_int) * CHAR_BIT) - 1; +  si_int s_a = a >> bits_in_word_m1; // s_a = a < 0 ? -1 : 0 +  si_int s_b = b >> bits_in_word_m1; // s_b = b < 0 ? -1 : 0 +  a = (a ^ s_a) - s_a;               // negate if s_a == -1 +  b = (b ^ s_b) - s_b;               // negate if s_b == -1 +  s_a ^= s_b;                        // sign of quotient +  // +  // On CPUs without unsigned hardware division support, +  //  this calls __udivsi3 (notice the cast to su_int). +  // On CPUs with unsigned hardware division support, +  //  this uses the unsigned division instruction. +  // +  return ((su_int)a / (su_int)b ^ s_a) - s_a; // negate if s_a == -1  }  #if defined(__ARM_EABI__) -AEABI_RTABI si_int __aeabi_idiv(si_int a, si_int b) COMPILER_RT_ALIAS(__divsi3); +COMPILER_RT_ALIAS(__divsi3, __aeabi_idiv)  #endif diff --git a/lib/builtins/divtc3.c b/lib/builtins/divtc3.c index e5ea00d841e3..37c71400e370 100644 --- a/lib/builtins/divtc3.c +++ b/lib/builtins/divtc3.c @@ -1,63 +1,54 @@ -/*===-- divtc3.c - Implement __divtc3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __divtc3 for the compiler_rt library. - * - *===----------------------------------------------------------------------=== - */ +//===-- divtc3.c - Implement __divtc3 -------------------------------------===// +// +// 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 implements __divtc3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #define QUAD_PRECISION  #include "fp_lib.h"  #include "int_lib.h"  #include "int_math.h" -/* Returns: the quotient of (a + ib) / (c + id) */ +// Returns: the quotient of (a + ib) / (c + id) -COMPILER_RT_ABI Lcomplex -__divtc3(long double __a, long double __b, long double __c, long double __d) -{ -    int __ilogbw = 0; -    long double __logbw = -        __compiler_rt_logbl(crt_fmaxl(crt_fabsl(__c), crt_fabsl(__d))); -    if (crt_isfinite(__logbw)) -    { -        __ilogbw = (int)__logbw; -        __c = crt_scalbnl(__c, -__ilogbw); -        __d = crt_scalbnl(__d, -__ilogbw); +COMPILER_RT_ABI Lcomplex __divtc3(long double __a, long double __b, +                                  long double __c, long double __d) { +  int __ilogbw = 0; +  long double __logbw = +      __compiler_rt_logbl(crt_fmaxl(crt_fabsl(__c), crt_fabsl(__d))); +  if (crt_isfinite(__logbw)) { +    __ilogbw = (int)__logbw; +    __c = crt_scalbnl(__c, -__ilogbw); +    __d = crt_scalbnl(__d, -__ilogbw); +  } +  long double __denom = __c * __c + __d * __d; +  Lcomplex z; +  COMPLEX_REAL(z) = crt_scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw); +  COMPLEX_IMAGINARY(z) = +      crt_scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw); +  if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { +    if ((__denom == 0.0) && (!crt_isnan(__a) || !crt_isnan(__b))) { +      COMPLEX_REAL(z) = crt_copysignl(CRT_INFINITY, __c) * __a; +      COMPLEX_IMAGINARY(z) = crt_copysignl(CRT_INFINITY, __c) * __b; +    } else if ((crt_isinf(__a) || crt_isinf(__b)) && crt_isfinite(__c) && +               crt_isfinite(__d)) { +      __a = crt_copysignl(crt_isinf(__a) ? 1.0 : 0.0, __a); +      __b = crt_copysignl(crt_isinf(__b) ? 1.0 : 0.0, __b); +      COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c + __b * __d); +      COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__b * __c - __a * __d); +    } else if (crt_isinf(__logbw) && __logbw > 0.0 && crt_isfinite(__a) && +               crt_isfinite(__b)) { +      __c = crt_copysignl(crt_isinf(__c) ? 1.0 : 0.0, __c); +      __d = crt_copysignl(crt_isinf(__d) ? 1.0 : 0.0, __d); +      COMPLEX_REAL(z) = 0.0 * (__a * __c + __b * __d); +      COMPLEX_IMAGINARY(z) = 0.0 * (__b * __c - __a * __d);      } -    long double __denom = __c * __c + __d * __d; -    Lcomplex z; -    COMPLEX_REAL(z) = crt_scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw); -    COMPLEX_IMAGINARY(z) = crt_scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw); -    if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) -    { -        if ((__denom == 0.0) && (!crt_isnan(__a) || !crt_isnan(__b))) -        { -            COMPLEX_REAL(z) = crt_copysignl(CRT_INFINITY, __c) * __a; -            COMPLEX_IMAGINARY(z) = crt_copysignl(CRT_INFINITY, __c) * __b; -        } -        else if ((crt_isinf(__a) || crt_isinf(__b)) && -                 crt_isfinite(__c) && crt_isfinite(__d)) -        { -            __a = crt_copysignl(crt_isinf(__a) ? 1.0 : 0.0, __a); -            __b = crt_copysignl(crt_isinf(__b) ? 1.0 : 0.0, __b); -            COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c + __b * __d); -            COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__b * __c - __a * __d); -        } -        else if (crt_isinf(__logbw) && __logbw > 0.0 && -                 crt_isfinite(__a) && crt_isfinite(__b)) -        { -            __c = crt_copysignl(crt_isinf(__c) ? 1.0 : 0.0, __c); -            __d = crt_copysignl(crt_isinf(__d) ? 1.0 : 0.0, __d); -            COMPLEX_REAL(z) = 0.0 * (__a * __c + __b * __d); -            COMPLEX_IMAGINARY(z) = 0.0 * (__b * __c - __a * __d); -        } -    } -    return z; +  } +  return z;  } diff --git a/lib/builtins/divtf3.c b/lib/builtins/divtf3.c index e81dab826bdd..6e61d2e31b75 100644 --- a/lib/builtins/divtf3.c +++ b/lib/builtins/divtf3.c @@ -1,9 +1,8 @@  //===-- lib/divtf3.c - Quad-precision division --------------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -22,182 +21,201 @@  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT)  COMPILER_RT_ABI fp_t __divtf3(fp_t a, fp_t b) { -    const unsigned int aExponent = toRep(a) >> significandBits & maxExponent; -    const unsigned int bExponent = toRep(b) >> significandBits & maxExponent; -    const rep_t quotientSign = (toRep(a) ^ toRep(b)) & signBit; - -    rep_t aSignificand = toRep(a) & significandMask; -    rep_t bSignificand = toRep(b) & significandMask; -    int scale = 0; - -    // Detect if a or b is zero, denormal, infinity, or NaN. -    if (aExponent-1U >= maxExponent-1U || bExponent-1U >= maxExponent-1U) { - -        const rep_t aAbs = toRep(a) & absMask; -        const rep_t bAbs = toRep(b) & absMask; - -        // NaN / anything = qNaN -        if (aAbs > infRep) return fromRep(toRep(a) | quietBit); -        // anything / NaN = qNaN -        if (bAbs > infRep) return fromRep(toRep(b) | quietBit); - -        if (aAbs == infRep) { -            // infinity / infinity = NaN -            if (bAbs == infRep) return fromRep(qnanRep); -            // infinity / anything else = +/- infinity -            else return fromRep(aAbs | quotientSign); -        } - -        // anything else / infinity = +/- 0 -        if (bAbs == infRep) return fromRep(quotientSign); - -        if (!aAbs) { -            // zero / zero = NaN -            if (!bAbs) return fromRep(qnanRep); -            // zero / anything else = +/- zero -            else return fromRep(quotientSign); -        } -        // anything else / zero = +/- infinity -        if (!bAbs) return fromRep(infRep | quotientSign); - -        // one or both of a or b is denormal, the other (if applicable) is a -        // normal number.  Renormalize one or both of a and b, and set scale to -        // include the necessary exponent adjustment. -        if (aAbs < implicitBit) scale += normalize(&aSignificand); -        if (bAbs < implicitBit) scale -= normalize(&bSignificand); -    } - -    // Or in the implicit significand bit.  (If we fell through from the -    // denormal path it was already set by normalize( ), but setting it twice -    // won't hurt anything.) -    aSignificand |= implicitBit; -    bSignificand |= implicitBit; -    int quotientExponent = aExponent - bExponent + scale; - -    // Align the significand of b as a Q63 fixed-point number in the range -    // [1, 2.0) and get a Q64 approximate reciprocal using a small minimax -    // polynomial approximation: reciprocal = 3/4 + 1/sqrt(2) - b/2.  This -    // is accurate to about 3.5 binary digits. -    const uint64_t q63b = bSignificand >> 49; -    uint64_t recip64 = UINT64_C(0x7504f333F9DE6484) - q63b; -    // 0x7504f333F9DE6484 / 2^64 + 1 = 3/4 + 1/sqrt(2) - -    // Now refine the reciprocal estimate using a Newton-Raphson iteration: -    // -    //     x1 = x0 * (2 - x0 * b) -    // -    // This doubles the number of correct binary digits in the approximation -    // with each iteration. -    uint64_t correction64; -    correction64 = -((rep_t)recip64 * q63b >> 64); -    recip64 = (rep_t)recip64 * correction64 >> 63; -    correction64 = -((rep_t)recip64 * q63b >> 64); -    recip64 = (rep_t)recip64 * correction64 >> 63; -    correction64 = -((rep_t)recip64 * q63b >> 64); -    recip64 = (rep_t)recip64 * correction64 >> 63; -    correction64 = -((rep_t)recip64 * q63b >> 64); -    recip64 = (rep_t)recip64 * correction64 >> 63; -    correction64 = -((rep_t)recip64 * q63b >> 64); -    recip64 = (rep_t)recip64 * correction64 >> 63; - -    // recip64 might have overflowed to exactly zero in the preceeding -    // computation if the high word of b is exactly 1.0.  This would sabotage -    // the full-width final stage of the computation that follows, so we adjust -    // recip64 downward by one bit. -    recip64--; - -    // We need to perform one more iteration to get us to 112 binary digits; -    // The last iteration needs to happen with extra precision. -    const uint64_t q127blo = bSignificand << 15; -    rep_t correction, reciprocal; - -    // NOTE: This operation is equivalent to __multi3, which is not implemented -    //       in some architechure -    rep_t r64q63, r64q127, r64cH, r64cL, dummy; -    wideMultiply((rep_t)recip64, (rep_t)q63b, &dummy, &r64q63); -    wideMultiply((rep_t)recip64, (rep_t)q127blo, &dummy, &r64q127); - -    correction = -(r64q63 + (r64q127 >> 64)); - -    uint64_t cHi = correction >> 64; -    uint64_t cLo = correction; - -    wideMultiply((rep_t)recip64, (rep_t)cHi, &dummy, &r64cH); -    wideMultiply((rep_t)recip64, (rep_t)cLo, &dummy, &r64cL); - -    reciprocal = r64cH + (r64cL >> 64); - -    // We already adjusted the 64-bit estimate, now we need to adjust the final -    // 128-bit reciprocal estimate downward to ensure that it is strictly smaller -    // than the infinitely precise exact reciprocal.  Because the computation -    // of the Newton-Raphson step is truncating at every step, this adjustment -    // is small; most of the work is already done. -    reciprocal -= 2; - -    // The numerical reciprocal is accurate to within 2^-112, lies in the -    // interval [0.5, 1.0), and is strictly smaller than the true reciprocal -    // of b.  Multiplying a by this reciprocal thus gives a numerical q = a/b -    // in Q127 with the following properties: -    // -    //    1. q < a/b -    //    2. q is in the interval [0.5, 2.0) -    //    3. the error in q is bounded away from 2^-113 (actually, we have a -    //       couple of bits to spare, but this is all we need). - -    // We need a 128 x 128 multiply high to compute q, which isn't a basic -    // operation in C, so we need to be a little bit fussy. -    rep_t quotient, quotientLo; -    wideMultiply(aSignificand << 2, reciprocal, "ient, "ientLo); - -    // Two cases: quotient is in [0.5, 1.0) or quotient is in [1.0, 2.0). -    // In either case, we are going to compute a residual of the form -    // -    //     r = a - q*b -    // -    // We know from the construction of q that r satisfies: -    // -    //     0 <= r < ulp(q)*b -    // -    // if r is greater than 1/2 ulp(q)*b, then q rounds up.  Otherwise, we -    // already have the correct result.  The exact halfway case cannot occur. -    // We also take this time to right shift quotient if it falls in the [1,2) -    // range and adjust the exponent accordingly. -    rep_t residual; -    rep_t qb; - -    if (quotient < (implicitBit << 1)) { -        wideMultiply(quotient, bSignificand, &dummy, &qb); -        residual = (aSignificand << 113) - qb; -        quotientExponent--; -    } else { -        quotient >>= 1; -        wideMultiply(quotient, bSignificand, &dummy, &qb); -        residual = (aSignificand << 112) - qb; +  const unsigned int aExponent = toRep(a) >> significandBits & maxExponent; +  const unsigned int bExponent = toRep(b) >> significandBits & maxExponent; +  const rep_t quotientSign = (toRep(a) ^ toRep(b)) & signBit; + +  rep_t aSignificand = toRep(a) & significandMask; +  rep_t bSignificand = toRep(b) & significandMask; +  int scale = 0; + +  // Detect if a or b is zero, denormal, infinity, or NaN. +  if (aExponent - 1U >= maxExponent - 1U || +      bExponent - 1U >= maxExponent - 1U) { + +    const rep_t aAbs = toRep(a) & absMask; +    const rep_t bAbs = toRep(b) & absMask; + +    // NaN / anything = qNaN +    if (aAbs > infRep) +      return fromRep(toRep(a) | quietBit); +    // anything / NaN = qNaN +    if (bAbs > infRep) +      return fromRep(toRep(b) | quietBit); + +    if (aAbs == infRep) { +      // infinity / infinity = NaN +      if (bAbs == infRep) +        return fromRep(qnanRep); +      // infinity / anything else = +/- infinity +      else +        return fromRep(aAbs | quotientSign);      } -    const int writtenExponent = quotientExponent + exponentBias; +    // anything else / infinity = +/- 0 +    if (bAbs == infRep) +      return fromRep(quotientSign); -    if (writtenExponent >= maxExponent) { -        // If we have overflowed the exponent, return infinity. -        return fromRep(infRep | quotientSign); -    } -    else if (writtenExponent < 1) { -        // Flush denormals to zero.  In the future, it would be nice to add -        // code to round them correctly. +    if (!aAbs) { +      // zero / zero = NaN +      if (!bAbs) +        return fromRep(qnanRep); +      // zero / anything else = +/- zero +      else          return fromRep(quotientSign);      } -    else { -        const bool round = (residual << 1) >= bSignificand; -        // Clear the implicit bit -        rep_t absResult = quotient & significandMask; -        // Insert the exponent -        absResult |= (rep_t)writtenExponent << significandBits; -        // Round -        absResult += round; -        // Insert the sign and return -        const long double result = fromRep(absResult | quotientSign); -        return result; +    // anything else / zero = +/- infinity +    if (!bAbs) +      return fromRep(infRep | quotientSign); + +    // One or both of a or b is denormal.  The other (if applicable) is a +    // normal number.  Renormalize one or both of a and b, and set scale to +    // include the necessary exponent adjustment. +    if (aAbs < implicitBit) +      scale += normalize(&aSignificand); +    if (bAbs < implicitBit) +      scale -= normalize(&bSignificand); +  } + +  // Set the implicit significand bit.  If we fell through from the +  // denormal path it was already set by normalize( ), but setting it twice +  // won't hurt anything. +  aSignificand |= implicitBit; +  bSignificand |= implicitBit; +  int quotientExponent = aExponent - bExponent + scale; + +  // Align the significand of b as a Q63 fixed-point number in the range +  // [1, 2.0) and get a Q64 approximate reciprocal using a small minimax +  // polynomial approximation: reciprocal = 3/4 + 1/sqrt(2) - b/2.  This +  // is accurate to about 3.5 binary digits. +  const uint64_t q63b = bSignificand >> 49; +  uint64_t recip64 = UINT64_C(0x7504f333F9DE6484) - q63b; +  // 0x7504f333F9DE6484 / 2^64 + 1 = 3/4 + 1/sqrt(2) + +  // Now refine the reciprocal estimate using a Newton-Raphson iteration: +  // +  //     x1 = x0 * (2 - x0 * b) +  // +  // This doubles the number of correct binary digits in the approximation +  // with each iteration. +  uint64_t correction64; +  correction64 = -((rep_t)recip64 * q63b >> 64); +  recip64 = (rep_t)recip64 * correction64 >> 63; +  correction64 = -((rep_t)recip64 * q63b >> 64); +  recip64 = (rep_t)recip64 * correction64 >> 63; +  correction64 = -((rep_t)recip64 * q63b >> 64); +  recip64 = (rep_t)recip64 * correction64 >> 63; +  correction64 = -((rep_t)recip64 * q63b >> 64); +  recip64 = (rep_t)recip64 * correction64 >> 63; +  correction64 = -((rep_t)recip64 * q63b >> 64); +  recip64 = (rep_t)recip64 * correction64 >> 63; + +  // The reciprocal may have overflowed to zero if the upper half of b is +  // exactly 1.0.  This would sabatoge the full-width final stage of the +  // computation that follows, so we adjust the reciprocal down by one bit. +  recip64--; + +  // We need to perform one more iteration to get us to 112 binary digits; +  // The last iteration needs to happen with extra precision. +  const uint64_t q127blo = bSignificand << 15; +  rep_t correction, reciprocal; + +  // NOTE: This operation is equivalent to __multi3, which is not implemented +  //       in some architechure +  rep_t r64q63, r64q127, r64cH, r64cL, dummy; +  wideMultiply((rep_t)recip64, (rep_t)q63b, &dummy, &r64q63); +  wideMultiply((rep_t)recip64, (rep_t)q127blo, &dummy, &r64q127); + +  correction = -(r64q63 + (r64q127 >> 64)); + +  uint64_t cHi = correction >> 64; +  uint64_t cLo = correction; + +  wideMultiply((rep_t)recip64, (rep_t)cHi, &dummy, &r64cH); +  wideMultiply((rep_t)recip64, (rep_t)cLo, &dummy, &r64cL); + +  reciprocal = r64cH + (r64cL >> 64); + +  // Adjust the final 128-bit reciprocal estimate downward to ensure that it +  // is strictly smaller than the infinitely precise exact reciprocal. Because +  // the computation of the Newton-Raphson step is truncating at every step, +  // this adjustment is small; most of the work is already done. +  reciprocal -= 2; + +  // The numerical reciprocal is accurate to within 2^-112, lies in the +  // interval [0.5, 1.0), and is strictly smaller than the true reciprocal +  // of b.  Multiplying a by this reciprocal thus gives a numerical q = a/b +  // in Q127 with the following properties: +  // +  //    1. q < a/b +  //    2. q is in the interval [0.5, 2.0) +  //    3. The error in q is bounded away from 2^-113 (actually, we have a +  //       couple of bits to spare, but this is all we need). + +  // We need a 128 x 128 multiply high to compute q, which isn't a basic +  // operation in C, so we need to be a little bit fussy. +  rep_t quotient, quotientLo; +  wideMultiply(aSignificand << 2, reciprocal, "ient, "ientLo); + +  // Two cases: quotient is in [0.5, 1.0) or quotient is in [1.0, 2.0). +  // In either case, we are going to compute a residual of the form +  // +  //     r = a - q*b +  // +  // We know from the construction of q that r satisfies: +  // +  //     0 <= r < ulp(q)*b +  // +  // If r is greater than 1/2 ulp(q)*b, then q rounds up.  Otherwise, we +  // already have the correct result.  The exact halfway case cannot occur. +  // We also take this time to right shift quotient if it falls in the [1,2) +  // range and adjust the exponent accordingly. +  rep_t residual; +  rep_t qb; + +  if (quotient < (implicitBit << 1)) { +    wideMultiply(quotient, bSignificand, &dummy, &qb); +    residual = (aSignificand << 113) - qb; +    quotientExponent--; +  } else { +    quotient >>= 1; +    wideMultiply(quotient, bSignificand, &dummy, &qb); +    residual = (aSignificand << 112) - qb; +  } + +  const int writtenExponent = quotientExponent + exponentBias; + +  if (writtenExponent >= maxExponent) { +    // If we have overflowed the exponent, return infinity. +    return fromRep(infRep | quotientSign); +  } else if (writtenExponent < 1) { +    if (writtenExponent == 0) { +      // Check whether the rounded result is normal. +      const bool round = (residual << 1) > bSignificand; +      // Clear the implicit bit. +      rep_t absResult = quotient & significandMask; +      // Round. +      absResult += round; +      if (absResult & ~significandMask) { +        // The rounded result is normal; return it. +        return fromRep(absResult | quotientSign); +      }      } +    // Flush denormals to zero.  In the future, it would be nice to add +    // code to round them correctly. +    return fromRep(quotientSign); +  } else { +    const bool round = (residual << 1) >= bSignificand; +    // Clear the implicit bit. +    rep_t absResult = quotient & significandMask; +    // Insert the exponent. +    absResult |= (rep_t)writtenExponent << significandBits; +    // Round. +    absResult += round; +    // Insert the sign and return. +    const long double result = fromRep(absResult | quotientSign); +    return result; +  }  }  #endif diff --git a/lib/builtins/divti3.c b/lib/builtins/divti3.c index c73eae28fe08..6d007fe34654 100644 --- a/lib/builtins/divti3.c +++ b/lib/builtins/divti3.c @@ -1,33 +1,29 @@ -/* ===-- divti3.c - Implement __divti3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __divti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- divti3.c - Implement __divti3 -------------------------------------===// +// +// 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 implements __divti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: a / b */ +// Returns: a / b -COMPILER_RT_ABI ti_int -__divti3(ti_int a, ti_int b) -{ -    const int bits_in_tword_m1 = (int)(sizeof(ti_int) * CHAR_BIT) - 1; -    ti_int s_a = a >> bits_in_tword_m1;           /* s_a = a < 0 ? -1 : 0 */ -    ti_int s_b = b >> bits_in_tword_m1;           /* s_b = b < 0 ? -1 : 0 */ -    a = (a ^ s_a) - s_a;                         /* negate if s_a == -1 */ -    b = (b ^ s_b) - s_b;                         /* negate if s_b == -1 */ -    s_a ^= s_b;                                  /* sign of quotient */ -    return (__udivmodti4(a, b, (tu_int*)0) ^ s_a) - s_a;  /* negate if s_a == -1 */ +COMPILER_RT_ABI ti_int __divti3(ti_int a, ti_int b) { +  const int bits_in_tword_m1 = (int)(sizeof(ti_int) * CHAR_BIT) - 1; +  ti_int s_a = a >> bits_in_tword_m1;                   // s_a = a < 0 ? -1 : 0 +  ti_int s_b = b >> bits_in_tword_m1;                   // s_b = b < 0 ? -1 : 0 +  a = (a ^ s_a) - s_a;                                  // negate if s_a == -1 +  b = (b ^ s_b) - s_b;                                  // negate if s_b == -1 +  s_a ^= s_b;                                           // sign of quotient +  return (__udivmodti4(a, b, (tu_int *)0) ^ s_a) - s_a; // negate if s_a == -1  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/divxc3.c b/lib/builtins/divxc3.c index 6f49280e5f61..97ffd2eac211 100644 --- a/lib/builtins/divxc3.c +++ b/lib/builtins/divxc3.c @@ -1,63 +1,55 @@ -/* ===-- divxc3.c - Implement __divxc3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __divxc3 for the compiler_rt library. - * - */ +//===-- divxc3.c - Implement __divxc3 -------------------------------------===// +// +// 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 implements __divxc3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #if !_ARCH_PPC  #include "int_lib.h"  #include "int_math.h" -/* Returns: the quotient of (a + ib) / (c + id) */ +// Returns: the quotient of (a + ib) / (c + id) -COMPILER_RT_ABI Lcomplex -__divxc3(long double __a, long double __b, long double __c, long double __d) -{ -    int __ilogbw = 0; -    long double __logbw = crt_logbl(crt_fmaxl(crt_fabsl(__c), crt_fabsl(__d))); -    if (crt_isfinite(__logbw)) -    { -        __ilogbw = (int)__logbw; -        __c = crt_scalbnl(__c, -__ilogbw); -        __d = crt_scalbnl(__d, -__ilogbw); +COMPILER_RT_ABI Lcomplex __divxc3(long double __a, long double __b, +                                  long double __c, long double __d) { +  int __ilogbw = 0; +  long double __logbw = crt_logbl(crt_fmaxl(crt_fabsl(__c), crt_fabsl(__d))); +  if (crt_isfinite(__logbw)) { +    __ilogbw = (int)__logbw; +    __c = crt_scalbnl(__c, -__ilogbw); +    __d = crt_scalbnl(__d, -__ilogbw); +  } +  long double __denom = __c * __c + __d * __d; +  Lcomplex z; +  COMPLEX_REAL(z) = crt_scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw); +  COMPLEX_IMAGINARY(z) = +      crt_scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw); +  if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { +    if ((__denom == 0) && (!crt_isnan(__a) || !crt_isnan(__b))) { +      COMPLEX_REAL(z) = crt_copysignl(CRT_INFINITY, __c) * __a; +      COMPLEX_IMAGINARY(z) = crt_copysignl(CRT_INFINITY, __c) * __b; +    } else if ((crt_isinf(__a) || crt_isinf(__b)) && crt_isfinite(__c) && +               crt_isfinite(__d)) { +      __a = crt_copysignl(crt_isinf(__a) ? 1 : 0, __a); +      __b = crt_copysignl(crt_isinf(__b) ? 1 : 0, __b); +      COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c + __b * __d); +      COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__b * __c - __a * __d); +    } else if (crt_isinf(__logbw) && __logbw > 0 && crt_isfinite(__a) && +               crt_isfinite(__b)) { +      __c = crt_copysignl(crt_isinf(__c) ? 1 : 0, __c); +      __d = crt_copysignl(crt_isinf(__d) ? 1 : 0, __d); +      COMPLEX_REAL(z) = 0 * (__a * __c + __b * __d); +      COMPLEX_IMAGINARY(z) = 0 * (__b * __c - __a * __d);      } -    long double __denom = __c * __c + __d * __d; -    Lcomplex z; -    COMPLEX_REAL(z) = crt_scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw); -    COMPLEX_IMAGINARY(z) = crt_scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw); -    if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) -    { -        if ((__denom == 0) && (!crt_isnan(__a) || !crt_isnan(__b))) -        { -            COMPLEX_REAL(z) = crt_copysignl(CRT_INFINITY, __c) * __a; -            COMPLEX_IMAGINARY(z) = crt_copysignl(CRT_INFINITY, __c) * __b; -        } -        else if ((crt_isinf(__a) || crt_isinf(__b)) && -                 crt_isfinite(__c) && crt_isfinite(__d)) -        { -            __a = crt_copysignl(crt_isinf(__a) ? 1 : 0, __a); -            __b = crt_copysignl(crt_isinf(__b) ? 1 : 0, __b); -            COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c + __b * __d); -            COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__b * __c - __a * __d); -        } -        else if (crt_isinf(__logbw) && __logbw > 0 && -                 crt_isfinite(__a) && crt_isfinite(__b)) -        { -            __c = crt_copysignl(crt_isinf(__c) ? 1 : 0, __c); -            __d = crt_copysignl(crt_isinf(__d) ? 1 : 0, __d); -            COMPLEX_REAL(z) = 0 * (__a * __c + __b * __d); -            COMPLEX_IMAGINARY(z) = 0 * (__b * __c - __a * __d); -        } -    } -    return z; +  } +  return z;  }  #endif diff --git a/lib/builtins/emutls.c b/lib/builtins/emutls.c index ef95a1c260c1..da58feb7b906 100644 --- a/lib/builtins/emutls.c +++ b/lib/builtins/emutls.c @@ -1,37 +1,35 @@ -/* ===---------- emutls.c - Implements __emutls_get_address ---------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===---------- emutls.c - Implements __emutls_get_address ---------------===// +// +// 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 <stdlib.h>  #include <string.h>  #include "int_lib.h" -#include "int_util.h"  #ifdef __BIONIC__ -/* There are 4 pthread key cleanup rounds on Bionic. Delay emutls deallocation -   to round 2. We need to delay deallocation because: -    - Android versions older than M lack __cxa_thread_atexit_impl, so apps -      use a pthread key destructor to call C++ destructors. -    - Apps might use __thread/thread_local variables in pthread destructors. -   We can't wait until the final two rounds, because jemalloc needs two rounds -   after the final malloc/free call to free its thread-specific data (see -   https://reviews.llvm.org/D46978#1107507). */ +// There are 4 pthread key cleanup rounds on Bionic. Delay emutls deallocation +// to round 2. We need to delay deallocation because: +//  - Android versions older than M lack __cxa_thread_atexit_impl, so apps +//    use a pthread key destructor to call C++ destructors. +//  - Apps might use __thread/thread_local variables in pthread destructors. +// We can't wait until the final two rounds, because jemalloc needs two rounds +// after the final malloc/free call to free its thread-specific data (see +// https://reviews.llvm.org/D46978#1107507).  #define EMUTLS_SKIP_DESTRUCTOR_ROUNDS 1  #else  #define EMUTLS_SKIP_DESTRUCTOR_ROUNDS 0  #endif  typedef struct emutls_address_array { -    uintptr_t skip_destructor_rounds; -    uintptr_t size;  /* number of elements in the 'data' array */ -    void* data[]; +  uintptr_t skip_destructor_rounds; +  uintptr_t size; // number of elements in the 'data' array +  void *data[];  } emutls_address_array;  static void emutls_shutdown(emutls_address_array *array); @@ -47,359 +45,339 @@ static bool emutls_key_created = false;  typedef unsigned int gcc_word __attribute__((mode(word)));  typedef unsigned int gcc_pointer __attribute__((mode(pointer))); -/* Default is not to use posix_memalign, so systems like Android - * can use thread local data without heavier POSIX memory allocators. - */ +// Default is not to use posix_memalign, so systems like Android +// can use thread local data without heavier POSIX memory allocators.  #ifndef EMUTLS_USE_POSIX_MEMALIGN  #define EMUTLS_USE_POSIX_MEMALIGN 0  #endif  static __inline void *emutls_memalign_alloc(size_t align, size_t size) { -    void *base; +  void *base;  #if EMUTLS_USE_POSIX_MEMALIGN -    if (posix_memalign(&base, align, size) != 0) -        abort(); +  if (posix_memalign(&base, align, size) != 0) +    abort();  #else -    #define EXTRA_ALIGN_PTR_BYTES (align - 1 + sizeof(void*)) -    char* object; -    if ((object = (char*)malloc(EXTRA_ALIGN_PTR_BYTES + size)) == NULL) -        abort(); -    base = (void*)(((uintptr_t)(object + EXTRA_ALIGN_PTR_BYTES)) -                    & ~(uintptr_t)(align - 1)); - -    ((void**)base)[-1] = object; +#define EXTRA_ALIGN_PTR_BYTES (align - 1 + sizeof(void *)) +  char *object; +  if ((object = (char *)malloc(EXTRA_ALIGN_PTR_BYTES + size)) == NULL) +    abort(); +  base = (void *)(((uintptr_t)(object + EXTRA_ALIGN_PTR_BYTES)) & +                  ~(uintptr_t)(align - 1)); + +  ((void **)base)[-1] = object;  #endif -    return base; +  return base;  }  static __inline void emutls_memalign_free(void *base) {  #if EMUTLS_USE_POSIX_MEMALIGN -    free(base); +  free(base);  #else -    /* The mallocated address is in ((void**)base)[-1] */ -    free(((void**)base)[-1]); +  // The mallocated address is in ((void**)base)[-1] +  free(((void **)base)[-1]);  #endif  }  static __inline void emutls_setspecific(emutls_address_array *value) { -    pthread_setspecific(emutls_pthread_key, (void*) value); +  pthread_setspecific(emutls_pthread_key, (void *)value);  } -static __inline emutls_address_array* emutls_getspecific() { -    return (emutls_address_array*) pthread_getspecific(emutls_pthread_key); +static __inline emutls_address_array *emutls_getspecific() { +  return (emutls_address_array *)pthread_getspecific(emutls_pthread_key);  } -static void emutls_key_destructor(void* ptr) { -    emutls_address_array *array = (emutls_address_array*)ptr; -    if (array->skip_destructor_rounds > 0) { -        /* emutls is deallocated using a pthread key destructor. These -         * destructors are called in several rounds to accommodate destructor -         * functions that (re)initialize key values with pthread_setspecific. -         * Delay the emutls deallocation to accommodate other end-of-thread -         * cleanup tasks like calling thread_local destructors (e.g. the -         * __cxa_thread_atexit fallback in libc++abi). -         */ -        array->skip_destructor_rounds--; -        emutls_setspecific(array); -    } else { -        emutls_shutdown(array); -        free(ptr); -    } +static void emutls_key_destructor(void *ptr) { +  emutls_address_array *array = (emutls_address_array *)ptr; +  if (array->skip_destructor_rounds > 0) { +    // emutls is deallocated using a pthread key destructor. These +    // destructors are called in several rounds to accommodate destructor +    // functions that (re)initialize key values with pthread_setspecific. +    // Delay the emutls deallocation to accommodate other end-of-thread +    // cleanup tasks like calling thread_local destructors (e.g. the +    // __cxa_thread_atexit fallback in libc++abi). +    array->skip_destructor_rounds--; +    emutls_setspecific(array); +  } else { +    emutls_shutdown(array); +    free(ptr); +  }  }  static __inline void emutls_init(void) { -    if (pthread_key_create(&emutls_pthread_key, emutls_key_destructor) != 0) -        abort(); -    emutls_key_created = true; +  if (pthread_key_create(&emutls_pthread_key, emutls_key_destructor) != 0) +    abort(); +  emutls_key_created = true;  }  static __inline void emutls_init_once(void) { -    static pthread_once_t once = PTHREAD_ONCE_INIT; -    pthread_once(&once, emutls_init); +  static pthread_once_t once = PTHREAD_ONCE_INIT; +  pthread_once(&once, emutls_init);  } -static __inline void emutls_lock() { -    pthread_mutex_lock(&emutls_mutex); -} +static __inline void emutls_lock() { pthread_mutex_lock(&emutls_mutex); } -static __inline void emutls_unlock() { -    pthread_mutex_unlock(&emutls_mutex); -} +static __inline void emutls_unlock() { pthread_mutex_unlock(&emutls_mutex); } -#else /* _WIN32 */ +#else // _WIN32 -#include <windows.h> +#include <assert.h>  #include <malloc.h>  #include <stdio.h> -#include <assert.h> +#include <windows.h>  static LPCRITICAL_SECTION emutls_mutex;  static DWORD emutls_tls_index = TLS_OUT_OF_INDEXES;  typedef uintptr_t gcc_word; -typedef void * gcc_pointer; +typedef void *gcc_pointer;  static void win_error(DWORD last_err, const char *hint) { -    char *buffer = NULL; -    if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | -                       FORMAT_MESSAGE_FROM_SYSTEM | -                       FORMAT_MESSAGE_MAX_WIDTH_MASK, -                       NULL, last_err, 0, (LPSTR)&buffer, 1, NULL)) { -        fprintf(stderr, "Windows error: %s\n", buffer); -    } else { -        fprintf(stderr, "Unkown Windows error: %s\n", hint); -    } -    LocalFree(buffer); +  char *buffer = NULL; +  if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | +                         FORMAT_MESSAGE_FROM_SYSTEM | +                         FORMAT_MESSAGE_MAX_WIDTH_MASK, +                     NULL, last_err, 0, (LPSTR)&buffer, 1, NULL)) { +    fprintf(stderr, "Windows error: %s\n", buffer); +  } else { +    fprintf(stderr, "Unkown Windows error: %s\n", hint); +  } +  LocalFree(buffer);  }  static __inline void win_abort(DWORD last_err, const char *hint) { -    win_error(last_err, hint); -    abort(); +  win_error(last_err, hint); +  abort();  }  static __inline void *emutls_memalign_alloc(size_t align, size_t size) { -    void *base = _aligned_malloc(size, align); -    if (!base) -        win_abort(GetLastError(), "_aligned_malloc"); -    return base; +  void *base = _aligned_malloc(size, align); +  if (!base) +    win_abort(GetLastError(), "_aligned_malloc"); +  return base;  } -static __inline void emutls_memalign_free(void *base) { -    _aligned_free(base); -} +static __inline void emutls_memalign_free(void *base) { _aligned_free(base); }  static void emutls_exit(void) { -    if (emutls_mutex) { -        DeleteCriticalSection(emutls_mutex); -        _aligned_free(emutls_mutex); -        emutls_mutex = NULL; -    } -    if (emutls_tls_index != TLS_OUT_OF_INDEXES) { -        emutls_shutdown((emutls_address_array*)TlsGetValue(emutls_tls_index)); -        TlsFree(emutls_tls_index); -        emutls_tls_index = TLS_OUT_OF_INDEXES; -    } +  if (emutls_mutex) { +    DeleteCriticalSection(emutls_mutex); +    _aligned_free(emutls_mutex); +    emutls_mutex = NULL; +  } +  if (emutls_tls_index != TLS_OUT_OF_INDEXES) { +    emutls_shutdown((emutls_address_array *)TlsGetValue(emutls_tls_index)); +    TlsFree(emutls_tls_index); +    emutls_tls_index = TLS_OUT_OF_INDEXES; +  }  } -#pragma warning (push) -#pragma warning (disable : 4100) +#pragma warning(push) +#pragma warning(disable : 4100)  static BOOL CALLBACK emutls_init(PINIT_ONCE p0, PVOID p1, PVOID *p2) { -    emutls_mutex = (LPCRITICAL_SECTION)_aligned_malloc(sizeof(CRITICAL_SECTION), 16); -    if (!emutls_mutex) { -        win_error(GetLastError(), "_aligned_malloc"); -        return FALSE; -    } -    InitializeCriticalSection(emutls_mutex); - -    emutls_tls_index = TlsAlloc(); -    if (emutls_tls_index == TLS_OUT_OF_INDEXES) { -        emutls_exit(); -        win_error(GetLastError(), "TlsAlloc"); -        return FALSE; -    } -    atexit(&emutls_exit); -    return TRUE; +  emutls_mutex = +      (LPCRITICAL_SECTION)_aligned_malloc(sizeof(CRITICAL_SECTION), 16); +  if (!emutls_mutex) { +    win_error(GetLastError(), "_aligned_malloc"); +    return FALSE; +  } +  InitializeCriticalSection(emutls_mutex); + +  emutls_tls_index = TlsAlloc(); +  if (emutls_tls_index == TLS_OUT_OF_INDEXES) { +    emutls_exit(); +    win_error(GetLastError(), "TlsAlloc"); +    return FALSE; +  } +  atexit(&emutls_exit); +  return TRUE;  }  static __inline void emutls_init_once(void) { -    static INIT_ONCE once; -    InitOnceExecuteOnce(&once, emutls_init, NULL, NULL); +  static INIT_ONCE once; +  InitOnceExecuteOnce(&once, emutls_init, NULL, NULL);  } -static __inline void emutls_lock() { -    EnterCriticalSection(emutls_mutex); -} +static __inline void emutls_lock() { EnterCriticalSection(emutls_mutex); } -static __inline void emutls_unlock() { -    LeaveCriticalSection(emutls_mutex); -} +static __inline void emutls_unlock() { LeaveCriticalSection(emutls_mutex); }  static __inline void emutls_setspecific(emutls_address_array *value) { -    if (TlsSetValue(emutls_tls_index, (LPVOID) value) == 0) -        win_abort(GetLastError(), "TlsSetValue"); +  if (TlsSetValue(emutls_tls_index, (LPVOID)value) == 0) +    win_abort(GetLastError(), "TlsSetValue");  } -static __inline emutls_address_array* emutls_getspecific() { -    LPVOID value = TlsGetValue(emutls_tls_index); -    if (value == NULL) { -        const DWORD err = GetLastError(); -        if (err != ERROR_SUCCESS) -            win_abort(err, "TlsGetValue"); -    } -    return (emutls_address_array*) value; +static __inline emutls_address_array *emutls_getspecific() { +  LPVOID value = TlsGetValue(emutls_tls_index); +  if (value == NULL) { +    const DWORD err = GetLastError(); +    if (err != ERROR_SUCCESS) +      win_abort(err, "TlsGetValue"); +  } +  return (emutls_address_array *)value;  } -/* Provide atomic load/store functions for emutls_get_index if built with MSVC. - */ +// Provide atomic load/store functions for emutls_get_index if built with MSVC.  #if !defined(__ATOMIC_RELEASE)  #include <intrin.h>  enum { __ATOMIC_ACQUIRE = 2, __ATOMIC_RELEASE = 3 };  static __inline uintptr_t __atomic_load_n(void *ptr, unsigned type) { -    assert(type == __ATOMIC_ACQUIRE); -    // These return the previous value - but since we do an OR with 0, -    // it's equivalent to a plain load. +  assert(type == __ATOMIC_ACQUIRE); +  // These return the previous value - but since we do an OR with 0, +  // it's equivalent to a plain load.  #ifdef _WIN64 -    return InterlockedOr64(ptr, 0); +  return InterlockedOr64(ptr, 0);  #else -    return InterlockedOr(ptr, 0); +  return InterlockedOr(ptr, 0);  #endif  }  static __inline void __atomic_store_n(void *ptr, uintptr_t val, unsigned type) { -    assert(type == __ATOMIC_RELEASE); -    InterlockedExchangePointer((void *volatile *)ptr, (void *)val); +  assert(type == __ATOMIC_RELEASE); +  InterlockedExchangePointer((void *volatile *)ptr, (void *)val);  } -#endif /* __ATOMIC_RELEASE */ +#endif // __ATOMIC_RELEASE -#pragma warning (pop) +#pragma warning(pop) -#endif /* _WIN32 */ +#endif // _WIN32 -static size_t emutls_num_object = 0;  /* number of allocated TLS objects */ +static size_t emutls_num_object = 0; // number of allocated TLS objects -/* Free the allocated TLS data - */ +// Free the allocated TLS data  static void emutls_shutdown(emutls_address_array *array) { -    if (array) { -        uintptr_t i; -        for (i = 0; i < array->size; ++i) { -            if (array->data[i]) -                emutls_memalign_free(array->data[i]); -        } +  if (array) { +    uintptr_t i; +    for (i = 0; i < array->size; ++i) { +      if (array->data[i]) +        emutls_memalign_free(array->data[i]);      } +  }  } -/* For every TLS variable xyz, - * there is one __emutls_control variable named __emutls_v.xyz. - * If xyz has non-zero initial value, __emutls_v.xyz's "value" - * will point to __emutls_t.xyz, which has the initial value. - */ +// For every TLS variable xyz, +// there is one __emutls_control variable named __emutls_v.xyz. +// If xyz has non-zero initial value, __emutls_v.xyz's "value" +// will point to __emutls_t.xyz, which has the initial value.  typedef struct __emutls_control { -    /* Must use gcc_word here, instead of size_t, to match GCC.  When -       gcc_word is larger than size_t, the upper extra bits are all -       zeros.  We can use variables of size_t to operate on size and -       align.  */ -    gcc_word size;  /* size of the object in bytes */ -    gcc_word align;  /* alignment of the object in bytes */ -    union { -        uintptr_t index;  /* data[index-1] is the object address */ -        void* address;  /* object address, when in single thread env */ -    } object; -    void* value;  /* null or non-zero initial value for the object */ +  // Must use gcc_word here, instead of size_t, to match GCC.  When +  // gcc_word is larger than size_t, the upper extra bits are all +  // zeros.  We can use variables of size_t to operate on size and +  // align. +  gcc_word size;  // size of the object in bytes +  gcc_word align; // alignment of the object in bytes +  union { +    uintptr_t index; // data[index-1] is the object address +    void *address;   // object address, when in single thread env +  } object; +  void *value; // null or non-zero initial value for the object  } __emutls_control; -/* Emulated TLS objects are always allocated at run-time. */ +// Emulated TLS objects are always allocated at run-time.  static __inline void *emutls_allocate_object(__emutls_control *control) { -    /* Use standard C types, check with gcc's emutls.o. */ -    COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(gcc_pointer)); -    COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(void*)); - -    size_t size = control->size; -    size_t align = control->align; -    void* base; -    if (align < sizeof(void*)) -        align = sizeof(void*); -    /* Make sure that align is power of 2. */ -    if ((align & (align - 1)) != 0) -        abort(); - -    base = emutls_memalign_alloc(align, size); -    if (control->value) -        memcpy(base, control->value, size); -    else -        memset(base, 0, size); -    return base; -} +  // Use standard C types, check with gcc's emutls.o. +  COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(gcc_pointer)); +  COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(void *)); + +  size_t size = control->size; +  size_t align = control->align; +  void *base; +  if (align < sizeof(void *)) +    align = sizeof(void *); +  // Make sure that align is power of 2. +  if ((align & (align - 1)) != 0) +    abort(); +  base = emutls_memalign_alloc(align, size); +  if (control->value) +    memcpy(base, control->value, size); +  else +    memset(base, 0, size); +  return base; +} -/* Returns control->object.index; set index if not allocated yet. */ +// Returns control->object.index; set index if not allocated yet.  static __inline uintptr_t emutls_get_index(__emutls_control *control) { -    uintptr_t index = __atomic_load_n(&control->object.index, __ATOMIC_ACQUIRE); +  uintptr_t index = __atomic_load_n(&control->object.index, __ATOMIC_ACQUIRE); +  if (!index) { +    emutls_init_once(); +    emutls_lock(); +    index = control->object.index;      if (!index) { -        emutls_init_once(); -        emutls_lock(); -        index = control->object.index; -        if (!index) { -            index = ++emutls_num_object; -            __atomic_store_n(&control->object.index, index, __ATOMIC_RELEASE); -        } -        emutls_unlock(); +      index = ++emutls_num_object; +      __atomic_store_n(&control->object.index, index, __ATOMIC_RELEASE);      } -    return index; +    emutls_unlock(); +  } +  return index;  } -/* Updates newly allocated thread local emutls_address_array. */ +// Updates newly allocated thread local emutls_address_array.  static __inline void emutls_check_array_set_size(emutls_address_array *array,                                                   uintptr_t size) { -    if (array == NULL) -        abort(); -    array->size = size; -    emutls_setspecific(array); +  if (array == NULL) +    abort(); +  array->size = size; +  emutls_setspecific(array);  } -/* Returns the new 'data' array size, number of elements, - * which must be no smaller than the given index. - */ +// Returns the new 'data' array size, number of elements, +// which must be no smaller than the given index.  static __inline uintptr_t emutls_new_data_array_size(uintptr_t index) { -   /* Need to allocate emutls_address_array with extra slots -    * to store the header. -    * Round up the emutls_address_array size to multiple of 16. -    */ -    uintptr_t header_words = sizeof(emutls_address_array) / sizeof(void *); -    return ((index + header_words + 15) & ~((uintptr_t)15)) - header_words; +  // Need to allocate emutls_address_array with extra slots +  // to store the header. +  // Round up the emutls_address_array size to multiple of 16. +  uintptr_t header_words = sizeof(emutls_address_array) / sizeof(void *); +  return ((index + header_words + 15) & ~((uintptr_t)15)) - header_words;  } -/* Returns the size in bytes required for an emutls_address_array with - * N number of elements for data field. - */ +// Returns the size in bytes required for an emutls_address_array with +// N number of elements for data field.  static __inline uintptr_t emutls_asize(uintptr_t N) { -    return N * sizeof(void *) + sizeof(emutls_address_array); +  return N * sizeof(void *) + sizeof(emutls_address_array);  } -/* Returns the thread local emutls_address_array. - * Extends its size if necessary to hold address at index. - */ +// Returns the thread local emutls_address_array. +// Extends its size if necessary to hold address at index.  static __inline emutls_address_array *  emutls_get_address_array(uintptr_t index) { -    emutls_address_array* array = emutls_getspecific(); -    if (array == NULL) { -        uintptr_t new_size = emutls_new_data_array_size(index); -        array = (emutls_address_array*) malloc(emutls_asize(new_size)); -        if (array) { -            memset(array->data, 0, new_size * sizeof(void*)); -            array->skip_destructor_rounds = EMUTLS_SKIP_DESTRUCTOR_ROUNDS; -        } -        emutls_check_array_set_size(array, new_size); -    } else if (index > array->size) { -        uintptr_t orig_size = array->size; -        uintptr_t new_size = emutls_new_data_array_size(index); -        array = (emutls_address_array*) realloc(array, emutls_asize(new_size)); -        if (array) -            memset(array->data + orig_size, 0, -                   (new_size - orig_size) * sizeof(void*)); -        emutls_check_array_set_size(array, new_size); +  emutls_address_array *array = emutls_getspecific(); +  if (array == NULL) { +    uintptr_t new_size = emutls_new_data_array_size(index); +    array = (emutls_address_array *)malloc(emutls_asize(new_size)); +    if (array) { +      memset(array->data, 0, new_size * sizeof(void *)); +      array->skip_destructor_rounds = EMUTLS_SKIP_DESTRUCTOR_ROUNDS;      } -    return array; +    emutls_check_array_set_size(array, new_size); +  } else if (index > array->size) { +    uintptr_t orig_size = array->size; +    uintptr_t new_size = emutls_new_data_array_size(index); +    array = (emutls_address_array *)realloc(array, emutls_asize(new_size)); +    if (array) +      memset(array->data + orig_size, 0, +             (new_size - orig_size) * sizeof(void *)); +    emutls_check_array_set_size(array, new_size); +  } +  return array;  } -void* __emutls_get_address(__emutls_control* control) { -    uintptr_t index = emutls_get_index(control); -    emutls_address_array* array = emutls_get_address_array(index--); -    if (array->data[index] == NULL) -        array->data[index] = emutls_allocate_object(control); -    return array->data[index]; +void *__emutls_get_address(__emutls_control *control) { +  uintptr_t index = emutls_get_index(control); +  emutls_address_array *array = emutls_get_address_array(index--); +  if (array->data[index] == NULL) +    array->data[index] = emutls_allocate_object(control); +  return array->data[index];  }  #ifdef __BIONIC__ -/* Called by Bionic on dlclose to delete the emutls pthread key. */ -__attribute__((visibility("hidden"))) -void __emutls_unregister_key(void) { -    if (emutls_key_created) { -        pthread_key_delete(emutls_pthread_key); -        emutls_key_created = false; -    } +// Called by Bionic on dlclose to delete the emutls pthread key. +__attribute__((visibility("hidden"))) void __emutls_unregister_key(void) { +  if (emutls_key_created) { +    pthread_key_delete(emutls_pthread_key); +    emutls_key_created = false; +  }  }  #endif diff --git a/lib/builtins/enable_execute_stack.c b/lib/builtins/enable_execute_stack.c index 327d460b4253..e18de4eaebf2 100644 --- a/lib/builtins/enable_execute_stack.c +++ b/lib/builtins/enable_execute_stack.c @@ -1,12 +1,10 @@ -/* ===-- enable_execute_stack.c - Implement __enable_execute_stack ---------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- enable_execute_stack.c - Implement __enable_execute_stack ---------===// +// +// 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 "int_lib.h" @@ -14,10 +12,9 @@  #include <sys/mman.h>  #endif -/* #include "config.h" - * FIXME: CMake - include when cmake system is ready. - * Remove #define HAVE_SYSCONF 1 line. - */ +// #include "config.h" +// FIXME: CMake - include when cmake system is ready. +// Remove #define HAVE_SYSCONF 1 line.  #define HAVE_SYSCONF 1  #ifdef _WIN32 @@ -26,47 +23,45 @@  #else  #ifndef __APPLE__  #include <unistd.h> -#endif /* __APPLE__ */ -#endif /* _WIN32 */ +#endif // __APPLE__ +#endif // _WIN32  #if __LP64__ -	#define TRAMPOLINE_SIZE 48 +#define TRAMPOLINE_SIZE 48  #else -	#define TRAMPOLINE_SIZE 40 +#define TRAMPOLINE_SIZE 40  #endif -/* - * The compiler generates calls to __enable_execute_stack() when creating  - * trampoline functions on the stack for use with nested functions. - * It is expected to mark the page(s) containing the address  - * and the next 48 bytes as executable.  Since the stack is normally rw- - * that means changing the protection on those page(s) to rwx.  - */ +// The compiler generates calls to __enable_execute_stack() when creating +// trampoline functions on the stack for use with nested functions. +// It is expected to mark the page(s) containing the address +// and the next 48 bytes as executable.  Since the stack is normally rw- +// that means changing the protection on those page(s) to rwx. -COMPILER_RT_ABI void -__enable_execute_stack(void* addr) -{ +COMPILER_RT_ABI void __enable_execute_stack(void *addr) {  #if _WIN32 -	MEMORY_BASIC_INFORMATION mbi; -	if (!VirtualQuery (addr, &mbi, sizeof(mbi))) -		return; /* We should probably assert here because there is no return value */ -	VirtualProtect (mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect); +  MEMORY_BASIC_INFORMATION mbi; +  if (!VirtualQuery(addr, &mbi, sizeof(mbi))) +    return; // We should probably assert here because there is no return value +  VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, +                 &mbi.Protect);  #else  #if __APPLE__ -	/* On Darwin, pagesize is always 4096 bytes */ -	const uintptr_t pageSize = 4096; +  // On Darwin, pagesize is always 4096 bytes +  const uintptr_t pageSize = 4096;  #elif !defined(HAVE_SYSCONF)  #error "HAVE_SYSCONF not defined! See enable_execute_stack.c"  #else -        const uintptr_t pageSize = sysconf(_SC_PAGESIZE); -#endif /* __APPLE__ */ +  const uintptr_t pageSize = sysconf(_SC_PAGESIZE); +#endif // __APPLE__ -	const uintptr_t pageAlignMask = ~(pageSize-1); -	uintptr_t p = (uintptr_t)addr; -	unsigned char* startPage = (unsigned char*)(p & pageAlignMask); -	unsigned char* endPage = (unsigned char*)((p+TRAMPOLINE_SIZE+pageSize) & pageAlignMask); -	size_t length = endPage - startPage; -	(void) mprotect((void *)startPage, length, PROT_READ | PROT_WRITE | PROT_EXEC); +  const uintptr_t pageAlignMask = ~(pageSize - 1); +  uintptr_t p = (uintptr_t)addr; +  unsigned char *startPage = (unsigned char *)(p & pageAlignMask); +  unsigned char *endPage = +      (unsigned char *)((p + TRAMPOLINE_SIZE + pageSize) & pageAlignMask); +  size_t length = endPage - startPage; +  (void)mprotect((void *)startPage, length, PROT_READ | PROT_WRITE | PROT_EXEC);  #endif  } diff --git a/lib/builtins/eprintf.c b/lib/builtins/eprintf.c index 89f34b154577..89fb0e315b2e 100644 --- a/lib/builtins/eprintf.c +++ b/lib/builtins/eprintf.c @@ -1,35 +1,27 @@ -/* ===---------- eprintf.c - Implements __eprintf --------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ - - +//===---------- eprintf.c - Implements __eprintf --------------------------===// +// +// 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 "int_lib.h"  #include <stdio.h> - -/* - * __eprintf() was used in an old version of <assert.h>. - * It can eventually go away, but it is needed when linking - * .o files built with the old <assert.h>. - * - * It should never be exported from a dylib, so it is marked - * visibility hidden. - */ +// __eprintf() was used in an old version of <assert.h>. +// It can eventually go away, but it is needed when linking +// .o files built with the old <assert.h>. +// +// It should never be exported from a dylib, so it is marked +// visibility hidden.  #ifndef _WIN32  __attribute__((visibility("hidden")))  #endif  COMPILER_RT_ABI void -__eprintf(const char* format, const char* assertion_expression, -	  const char* line, const char* file) -{ -	fprintf(stderr, format, assertion_expression, line, file); -	fflush(stderr); -	compilerrt_abort(); +__eprintf(const char *format, const char *assertion_expression, +          const char *line, const char *file) { +  fprintf(stderr, format, assertion_expression, line, file); +  fflush(stderr); +  compilerrt_abort();  } diff --git a/lib/builtins/extenddftf2.c b/lib/builtins/extenddftf2.c index 86dab8f03a8f..849a39da1915 100644 --- a/lib/builtins/extenddftf2.c +++ b/lib/builtins/extenddftf2.c @@ -1,12 +1,10 @@  //===-- lib/extenddftf2.c - double -> quad conversion -------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -//  #define QUAD_PRECISION  #include "fp_lib.h" @@ -17,7 +15,7 @@  #include "fp_extend_impl.inc"  COMPILER_RT_ABI long double __extenddftf2(double a) { -    return __extendXfYf2__(a); +  return __extendXfYf2__(a);  }  #endif diff --git a/lib/builtins/extendhfsf2.c b/lib/builtins/extendhfsf2.c index d9c0db84b0ce..7c1a76eb5851 100644 --- a/lib/builtins/extendhfsf2.c +++ b/lib/builtins/extendhfsf2.c @@ -1,12 +1,10 @@  //===-- lib/extendhfsf2.c - half -> single conversion -------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -//  #define SRC_HALF  #define DST_SINGLE @@ -15,19 +13,15 @@  // Use a forwarding definition and noinline to implement a poor man's alias,  // as there isn't a good cross-platform way of defining one.  COMPILER_RT_ABI NOINLINE float __extendhfsf2(uint16_t a) { -    return __extendXfYf2__(a); +  return __extendXfYf2__(a);  } -COMPILER_RT_ABI float __gnu_h2f_ieee(uint16_t a) { -    return __extendhfsf2(a); -} +COMPILER_RT_ABI float __gnu_h2f_ieee(uint16_t a) { return __extendhfsf2(a); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI float __aeabi_h2f(uint16_t a) { -  return __extendhfsf2(a); -} +AEABI_RTABI float __aeabi_h2f(uint16_t a) { return __extendhfsf2(a); }  #else -AEABI_RTABI float __aeabi_h2f(uint16_t a) COMPILER_RT_ALIAS(__extendhfsf2); +COMPILER_RT_ALIAS(__extendhfsf2, __aeabi_h2f)  #endif  #endif diff --git a/lib/builtins/extendsfdf2.c b/lib/builtins/extendsfdf2.c index 3d84529a6c53..8132d57e6bf6 100644 --- a/lib/builtins/extendsfdf2.c +++ b/lib/builtins/extendsfdf2.c @@ -1,27 +1,21 @@  //===-- lib/extendsfdf2.c - single -> double conversion -----------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -//  #define SRC_SINGLE  #define DST_DOUBLE  #include "fp_extend_impl.inc" -COMPILER_RT_ABI double __extendsfdf2(float a) { -    return __extendXfYf2__(a); -} +COMPILER_RT_ABI double __extendsfdf2(float a) { return __extendXfYf2__(a); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI double __aeabi_f2d(float a) { -  return __extendsfdf2(a); -} +AEABI_RTABI double __aeabi_f2d(float a) { return __extendsfdf2(a); }  #else -AEABI_RTABI double __aeabi_f2d(float a) COMPILER_RT_ALIAS(__extendsfdf2); +COMPILER_RT_ALIAS(__extendsfdf2, __aeabi_f2d)  #endif  #endif diff --git a/lib/builtins/extendsftf2.c b/lib/builtins/extendsftf2.c index 2eeeba284845..c6368406dde1 100644 --- a/lib/builtins/extendsftf2.c +++ b/lib/builtins/extendsftf2.c @@ -1,12 +1,10 @@  //===-- lib/extendsftf2.c - single -> quad conversion -------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -//  #define QUAD_PRECISION  #include "fp_lib.h" @@ -17,7 +15,7 @@  #include "fp_extend_impl.inc"  COMPILER_RT_ABI long double __extendsftf2(float a) { -    return __extendXfYf2__(a); +  return __extendXfYf2__(a);  }  #endif diff --git a/lib/builtins/ffsdi2.c b/lib/builtins/ffsdi2.c index a5ac9900ff10..9c1a24260956 100644 --- a/lib/builtins/ffsdi2.c +++ b/lib/builtins/ffsdi2.c @@ -1,33 +1,27 @@ -/* ===-- ffsdi2.c - Implement __ffsdi2 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ffsdi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ffsdi2.c - Implement __ffsdi2 -------------------------------------===// +// +// 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 implements __ffsdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: the index of the least significant 1-bit in a, or - * the value zero if a is zero. The least significant bit is index one. - */ +// Returns: the index of the least significant 1-bit in a, or +// the value zero if a is zero. The least significant bit is index one. -COMPILER_RT_ABI si_int -__ffsdi2(di_int a) -{ -    dwords x; -    x.all = a; -    if (x.s.low == 0) -    { -        if (x.s.high == 0) -            return 0; -        return __builtin_ctz(x.s.high) + (1 + sizeof(si_int) * CHAR_BIT); -    } -    return __builtin_ctz(x.s.low) + 1; +COMPILER_RT_ABI si_int __ffsdi2(di_int a) { +  dwords x; +  x.all = a; +  if (x.s.low == 0) { +    if (x.s.high == 0) +      return 0; +    return __builtin_ctz(x.s.high) + (1 + sizeof(si_int) * CHAR_BIT); +  } +  return __builtin_ctz(x.s.low) + 1;  } diff --git a/lib/builtins/ffssi2.c b/lib/builtins/ffssi2.c index e5180eff5e08..cba1f72fdc61 100644 --- a/lib/builtins/ffssi2.c +++ b/lib/builtins/ffssi2.c @@ -1,29 +1,23 @@ -/* ===-- ffssi2.c - Implement __ffssi2 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ffssi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ffssi2.c - Implement __ffssi2 -------------------------------------===// +// +// 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 implements __ffssi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: the index of the least significant 1-bit in a, or - * the value zero if a is zero. The least significant bit is index one. - */ +// Returns: the index of the least significant 1-bit in a, or +// the value zero if a is zero. The least significant bit is index one. -COMPILER_RT_ABI si_int -__ffssi2(si_int a) -{ -    if (a == 0) -    { -        return 0; -    } -    return __builtin_ctz(a) + 1; +COMPILER_RT_ABI si_int __ffssi2(si_int a) { +  if (a == 0) { +    return 0; +  } +  return __builtin_ctz(a) + 1;  } diff --git a/lib/builtins/ffsti2.c b/lib/builtins/ffsti2.c index dcdb3bd7f807..a2d7ce08ada1 100644 --- a/lib/builtins/ffsti2.c +++ b/lib/builtins/ffsti2.c @@ -1,37 +1,31 @@ -/* ===-- ffsti2.c - Implement __ffsti2 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ffsti2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ffsti2.c - Implement __ffsti2 -------------------------------------===// +// +// 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 implements __ffsti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: the index of the least significant 1-bit in a, or - * the value zero if a is zero. The least significant bit is index one. - */ +// Returns: the index of the least significant 1-bit in a, or +// the value zero if a is zero. The least significant bit is index one. -COMPILER_RT_ABI si_int -__ffsti2(ti_int a) -{ -    twords x; -    x.all = a; -    if (x.s.low == 0) -    { -        if (x.s.high == 0) -            return 0; -        return __builtin_ctzll(x.s.high) + (1 + sizeof(di_int) * CHAR_BIT); -    } -    return __builtin_ctzll(x.s.low) + 1; +COMPILER_RT_ABI si_int __ffsti2(ti_int a) { +  twords x; +  x.all = a; +  if (x.s.low == 0) { +    if (x.s.high == 0) +      return 0; +    return __builtin_ctzll(x.s.high) + (1 + sizeof(di_int) * CHAR_BIT); +  } +  return __builtin_ctzll(x.s.low) + 1;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/fixdfdi.c b/lib/builtins/fixdfdi.c index 54e312d3c8f7..2ed5261c51b7 100644 --- a/lib/builtins/fixdfdi.c +++ b/lib/builtins/fixdfdi.c @@ -1,55 +1,44 @@ -/* ===-- fixdfdi.c - Implement __fixdfdi -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixdfdi.c - Implement __fixdfdi -----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define DOUBLE_PRECISION  #include "fp_lib.h"  #ifndef __SOFT_FP__ -/* Support for systems that have hardware floating-point; can set the invalid - * flag as a side-effect of computation. - */ +// Support for systems that have hardware floating-point; can set the invalid +// flag as a side-effect of computation.  COMPILER_RT_ABI du_int __fixunsdfdi(double a); -COMPILER_RT_ABI di_int -__fixdfdi(double a) -{ -    if (a < 0.0) { -        return -__fixunsdfdi(-a); -    } -    return __fixunsdfdi(a); +COMPILER_RT_ABI di_int __fixdfdi(double a) { +  if (a < 0.0) { +    return -__fixunsdfdi(-a); +  } +  return __fixunsdfdi(a);  }  #else -/* Support for systems that don't have hardware floating-point; there are no - * flags to set, and we don't want to code-gen to an unknown soft-float - * implementation. - */ +// Support for systems that don't have hardware floating-point; there are no +// flags to set, and we don't want to code-gen to an unknown soft-float +// implementation.  typedef di_int fixint_t;  typedef du_int fixuint_t;  #include "fp_fixint_impl.inc" -COMPILER_RT_ABI di_int -__fixdfdi(fp_t a) { -    return __fixint(a); -} +COMPILER_RT_ABI di_int __fixdfdi(fp_t a) { return __fixint(a); }  #endif  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI di_int __aeabi_d2lz(fp_t a) { -  return __fixdfdi(a); -} +AEABI_RTABI di_int __aeabi_d2lz(fp_t a) { return __fixdfdi(a); }  #else -AEABI_RTABI di_int __aeabi_d2lz(fp_t a) COMPILER_RT_ALIAS(__fixdfdi); +COMPILER_RT_ALIAS(__fixdfdi, __aeabi_d2lz)  #endif  #endif diff --git a/lib/builtins/fixdfsi.c b/lib/builtins/fixdfsi.c index 5b9588175717..f54649993c7f 100644 --- a/lib/builtins/fixdfsi.c +++ b/lib/builtins/fixdfsi.c @@ -1,12 +1,10 @@ -/* ===-- fixdfsi.c - Implement __fixdfsi -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixdfsi.c - Implement __fixdfsi -----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define DOUBLE_PRECISION  #include "fp_lib.h" @@ -14,17 +12,12 @@ typedef si_int fixint_t;  typedef su_int fixuint_t;  #include "fp_fixint_impl.inc" -COMPILER_RT_ABI si_int -__fixdfsi(fp_t a) { -    return __fixint(a); -} +COMPILER_RT_ABI si_int __fixdfsi(fp_t a) { return __fixint(a); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI si_int __aeabi_d2iz(fp_t a) { -  return __fixdfsi(a); -} +AEABI_RTABI si_int __aeabi_d2iz(fp_t a) { return __fixdfsi(a); }  #else -AEABI_RTABI si_int __aeabi_d2iz(fp_t a) COMPILER_RT_ALIAS(__fixdfsi); +COMPILER_RT_ALIAS(__fixdfsi, __aeabi_d2iz)  #endif  #endif diff --git a/lib/builtins/fixdfti.c b/lib/builtins/fixdfti.c index aaf225e74f86..90ca8959dae1 100644 --- a/lib/builtins/fixdfti.c +++ b/lib/builtins/fixdfti.c @@ -1,12 +1,10 @@ -/* ===-- fixdfti.c - Implement __fixdfti -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixdfti.c - Implement __fixdfti -----------------------------------===// +// +// 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 "int_lib.h" @@ -18,9 +16,6 @@ typedef ti_int fixint_t;  typedef tu_int fixuint_t;  #include "fp_fixint_impl.inc" -COMPILER_RT_ABI ti_int -__fixdfti(fp_t a) { -    return __fixint(a); -} +COMPILER_RT_ABI ti_int __fixdfti(fp_t a) { return __fixint(a); } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/fixsfdi.c b/lib/builtins/fixsfdi.c index 32e87c60889f..615e93d4f8d9 100644 --- a/lib/builtins/fixsfdi.c +++ b/lib/builtins/fixsfdi.c @@ -1,55 +1,44 @@ -/* ===-- fixsfdi.c - Implement __fixsfdi -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixsfdi.c - Implement __fixsfdi -----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define SINGLE_PRECISION  #include "fp_lib.h"  #ifndef __SOFT_FP__ -/* Support for systems that have hardware floating-point; can set the invalid - * flag as a side-effect of computation. - */ +// Support for systems that have hardware floating-point; can set the invalid +// flag as a side-effect of computation.  COMPILER_RT_ABI du_int __fixunssfdi(float a); -COMPILER_RT_ABI di_int -__fixsfdi(float a) -{ -    if (a < 0.0f) { -        return -__fixunssfdi(-a); -    } -    return __fixunssfdi(a); +COMPILER_RT_ABI di_int __fixsfdi(float a) { +  if (a < 0.0f) { +    return -__fixunssfdi(-a); +  } +  return __fixunssfdi(a);  }  #else -/* Support for systems that don't have hardware floating-point; there are no - * flags to set, and we don't want to code-gen to an unknown soft-float - * implementation. - */ +// Support for systems that don't have hardware floating-point; there are no +// flags to set, and we don't want to code-gen to an unknown soft-float +// implementation.  typedef di_int fixint_t;  typedef du_int fixuint_t;  #include "fp_fixint_impl.inc" -COMPILER_RT_ABI di_int -__fixsfdi(fp_t a) { -    return __fixint(a); -} +COMPILER_RT_ABI di_int __fixsfdi(fp_t a) { return __fixint(a); }  #endif  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI di_int __aeabi_f2lz(fp_t a) { -  return __fixsfdi(a); -} +AEABI_RTABI di_int __aeabi_f2lz(fp_t a) { return __fixsfdi(a); }  #else -AEABI_RTABI di_int __aeabi_f2lz(fp_t a) COMPILER_RT_ALIAS(__fixsfdi); +COMPILER_RT_ALIAS(__fixsfdi, __aeabi_f2lz)  #endif  #endif diff --git a/lib/builtins/fixsfsi.c b/lib/builtins/fixsfsi.c index e94e5f3dcd68..d83d7e722271 100644 --- a/lib/builtins/fixsfsi.c +++ b/lib/builtins/fixsfsi.c @@ -1,12 +1,10 @@ -/* ===-- fixsfsi.c - Implement __fixsfsi -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixsfsi.c - Implement __fixsfsi -----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define SINGLE_PRECISION  #include "fp_lib.h" @@ -14,17 +12,12 @@ typedef si_int fixint_t;  typedef su_int fixuint_t;  #include "fp_fixint_impl.inc" -COMPILER_RT_ABI si_int -__fixsfsi(fp_t a) { -    return __fixint(a); -} +COMPILER_RT_ABI si_int __fixsfsi(fp_t a) { return __fixint(a); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI si_int __aeabi_f2iz(fp_t a) { -  return __fixsfsi(a); -} +AEABI_RTABI si_int __aeabi_f2iz(fp_t a) { return __fixsfsi(a); }  #else -AEABI_RTABI si_int __aeabi_f2iz(fp_t a) COMPILER_RT_ALIAS(__fixsfsi); +COMPILER_RT_ALIAS(__fixsfsi, __aeabi_f2iz)  #endif  #endif diff --git a/lib/builtins/fixsfti.c b/lib/builtins/fixsfti.c index 3a159b3e18e4..3c01b75e2b23 100644 --- a/lib/builtins/fixsfti.c +++ b/lib/builtins/fixsfti.c @@ -1,12 +1,10 @@ -/* ===-- fixsfti.c - Implement __fixsfti -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixsfti.c - Implement __fixsfti -----------------------------------===// +// +// 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 "int_lib.h" @@ -18,9 +16,6 @@ typedef ti_int fixint_t;  typedef tu_int fixuint_t;  #include "fp_fixint_impl.inc" -COMPILER_RT_ABI ti_int -__fixsfti(fp_t a) { -    return __fixint(a); -} +COMPILER_RT_ABI ti_int __fixsfti(fp_t a) { return __fixint(a); } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/fixtfdi.c b/lib/builtins/fixtfdi.c index bc9dea1f4f81..fe570e6b3755 100644 --- a/lib/builtins/fixtfdi.c +++ b/lib/builtins/fixtfdi.c @@ -1,12 +1,10 @@ -/* ===-- fixtfdi.c - Implement __fixtfdi -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixtfdi.c - Implement __fixtfdi -----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define QUAD_PRECISION  #include "fp_lib.h" @@ -16,8 +14,5 @@ typedef di_int fixint_t;  typedef du_int fixuint_t;  #include "fp_fixint_impl.inc" -COMPILER_RT_ABI di_int -__fixtfdi(fp_t a) { -    return __fixint(a); -} +COMPILER_RT_ABI di_int __fixtfdi(fp_t a) { return __fixint(a); }  #endif diff --git a/lib/builtins/fixtfsi.c b/lib/builtins/fixtfsi.c index feb3de885090..a32bd964caa3 100644 --- a/lib/builtins/fixtfsi.c +++ b/lib/builtins/fixtfsi.c @@ -1,12 +1,10 @@ -/* ===-- fixtfsi.c - Implement __fixtfsi -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixtfsi.c - Implement __fixtfsi -----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define QUAD_PRECISION  #include "fp_lib.h" @@ -16,8 +14,5 @@ typedef si_int fixint_t;  typedef su_int fixuint_t;  #include "fp_fixint_impl.inc" -COMPILER_RT_ABI si_int -__fixtfsi(fp_t a) { -    return __fixint(a); -} +COMPILER_RT_ABI si_int __fixtfsi(fp_t a) { return __fixint(a); }  #endif diff --git a/lib/builtins/fixtfti.c b/lib/builtins/fixtfti.c index ee4ada85cb4a..19f84ce38907 100644 --- a/lib/builtins/fixtfti.c +++ b/lib/builtins/fixtfti.c @@ -1,12 +1,10 @@ -/* ===-- fixtfti.c - Implement __fixtfti -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixtfti.c - Implement __fixtfti -----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define QUAD_PRECISION  #include "fp_lib.h" @@ -16,8 +14,5 @@ typedef ti_int fixint_t;  typedef tu_int fixuint_t;  #include "fp_fixint_impl.inc" -COMPILER_RT_ABI ti_int -__fixtfti(fp_t a) { -    return __fixint(a); -} +COMPILER_RT_ABI ti_int __fixtfti(fp_t a) { return __fixint(a); }  #endif diff --git a/lib/builtins/fixunsdfdi.c b/lib/builtins/fixunsdfdi.c index bfe4dbb25656..d2ba73825cfe 100644 --- a/lib/builtins/fixunsdfdi.c +++ b/lib/builtins/fixunsdfdi.c @@ -1,52 +1,42 @@ -/* ===-- fixunsdfdi.c - Implement __fixunsdfdi -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunsdfdi.c - Implement __fixunsdfdi -----------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define DOUBLE_PRECISION  #include "fp_lib.h"  #ifndef __SOFT_FP__ -/* Support for systems that have hardware floating-point; can set the invalid - * flag as a side-effect of computation. - */ - -COMPILER_RT_ABI du_int -__fixunsdfdi(double a) -{ -    if (a <= 0.0) return 0; -    su_int high = a / 4294967296.f;               /* a / 0x1p32f; */ -    su_int low = a - (double)high * 4294967296.f; /* high * 0x1p32f; */ -    return ((du_int)high << 32) | low; +// Support for systems that have hardware floating-point; can set the invalid +// flag as a side-effect of computation. + +COMPILER_RT_ABI du_int __fixunsdfdi(double a) { +  if (a <= 0.0) +    return 0; +  su_int high = a / 4294967296.f;               // a / 0x1p32f; +  su_int low = a - (double)high * 4294967296.f; // high * 0x1p32f; +  return ((du_int)high << 32) | low;  }  #else -/* Support for systems that don't have hardware floating-point; there are no - * flags to set, and we don't want to code-gen to an unknown soft-float - * implementation. - */ +// Support for systems that don't have hardware floating-point; there are no +// flags to set, and we don't want to code-gen to an unknown soft-float +// implementation.  typedef du_int fixuint_t;  #include "fp_fixuint_impl.inc" -COMPILER_RT_ABI du_int -__fixunsdfdi(fp_t a) { -    return __fixuint(a); -} +COMPILER_RT_ABI du_int __fixunsdfdi(fp_t a) { return __fixuint(a); }  #endif  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI du_int __aeabi_d2ulz(fp_t a) { -  return __fixunsdfdi(a); -} +AEABI_RTABI du_int __aeabi_d2ulz(fp_t a) { return __fixunsdfdi(a); }  #else -AEABI_RTABI du_int __aeabi_d2ulz(fp_t a) COMPILER_RT_ALIAS(__fixunsdfdi); +COMPILER_RT_ALIAS(__fixunsdfdi, __aeabi_d2ulz)  #endif  #endif diff --git a/lib/builtins/fixunsdfsi.c b/lib/builtins/fixunsdfsi.c index 3c5355beae1a..3db2adec09eb 100644 --- a/lib/builtins/fixunsdfsi.c +++ b/lib/builtins/fixunsdfsi.c @@ -1,29 +1,22 @@ -/* ===-- fixunsdfsi.c - Implement __fixunsdfsi -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunsdfsi.c - Implement __fixunsdfsi -----------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define DOUBLE_PRECISION  #include "fp_lib.h"  typedef su_int fixuint_t;  #include "fp_fixuint_impl.inc" -COMPILER_RT_ABI su_int -__fixunsdfsi(fp_t a) { -    return __fixuint(a); -} +COMPILER_RT_ABI su_int __fixunsdfsi(fp_t a) { return __fixuint(a); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI su_int __aeabi_d2uiz(fp_t a) { -  return __fixunsdfsi(a); -} +AEABI_RTABI su_int __aeabi_d2uiz(fp_t a) { return __fixunsdfsi(a); }  #else -AEABI_RTABI su_int __aeabi_d2uiz(fp_t a) COMPILER_RT_ALIAS(__fixunsdfsi); +COMPILER_RT_ALIAS(__fixunsdfsi, __aeabi_d2uiz)  #endif  #endif diff --git a/lib/builtins/fixunsdfti.c b/lib/builtins/fixunsdfti.c index f8046a02632b..be497d0e16af 100644 --- a/lib/builtins/fixunsdfti.c +++ b/lib/builtins/fixunsdfti.c @@ -1,12 +1,10 @@ -/* ===-- fixunsdfti.c - Implement __fixunsdfti -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunsdfti.c - Implement __fixunsdfti -----------------------------===// +// +// 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 "int_lib.h" @@ -16,8 +14,5 @@  typedef tu_int fixuint_t;  #include "fp_fixuint_impl.inc" -COMPILER_RT_ABI tu_int -__fixunsdfti(fp_t a) { -    return __fixuint(a); -} -#endif /* CRT_HAS_128BIT */ +COMPILER_RT_ABI tu_int __fixunsdfti(fp_t a) { return __fixuint(a); } +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/fixunssfdi.c b/lib/builtins/fixunssfdi.c index 080a25bb1e99..2b90dafad8c2 100644 --- a/lib/builtins/fixunssfdi.c +++ b/lib/builtins/fixunssfdi.c @@ -1,53 +1,43 @@ -/* ===-- fixunssfdi.c - Implement __fixunssfdi -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunssfdi.c - Implement __fixunssfdi -----------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define SINGLE_PRECISION  #include "fp_lib.h"  #ifndef __SOFT_FP__ -/* Support for systems that have hardware floating-point; can set the invalid - * flag as a side-effect of computation. - */ - -COMPILER_RT_ABI du_int -__fixunssfdi(float a) -{ -    if (a <= 0.0f) return 0; -    double da = a; -    su_int high = da / 4294967296.f;               /* da / 0x1p32f; */ -    su_int low = da - (double)high * 4294967296.f; /* high * 0x1p32f; */ -    return ((du_int)high << 32) | low; +// Support for systems that have hardware floating-point; can set the invalid +// flag as a side-effect of computation. + +COMPILER_RT_ABI du_int __fixunssfdi(float a) { +  if (a <= 0.0f) +    return 0; +  double da = a; +  su_int high = da / 4294967296.f;               // da / 0x1p32f; +  su_int low = da - (double)high * 4294967296.f; // high * 0x1p32f; +  return ((du_int)high << 32) | low;  }  #else -/* Support for systems that don't have hardware floating-point; there are no - * flags to set, and we don't want to code-gen to an unknown soft-float - * implementation. - */ +// Support for systems that don't have hardware floating-point; there are no +// flags to set, and we don't want to code-gen to an unknown soft-float +// implementation.  typedef du_int fixuint_t;  #include "fp_fixuint_impl.inc" -COMPILER_RT_ABI du_int -__fixunssfdi(fp_t a) { -    return __fixuint(a); -} +COMPILER_RT_ABI du_int __fixunssfdi(fp_t a) { return __fixuint(a); }  #endif  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI du_int __aeabi_f2ulz(fp_t a) { -  return __fixunssfdi(a); -} +AEABI_RTABI du_int __aeabi_f2ulz(fp_t a) { return __fixunssfdi(a); }  #else -AEABI_RTABI du_int __aeabi_f2ulz(fp_t a) COMPILER_RT_ALIAS(__fixunssfdi); +COMPILER_RT_ALIAS(__fixunssfdi, __aeabi_f2ulz)  #endif  #endif diff --git a/lib/builtins/fixunssfsi.c b/lib/builtins/fixunssfsi.c index eca2916a5c88..738c1bb95631 100644 --- a/lib/builtins/fixunssfsi.c +++ b/lib/builtins/fixunssfsi.c @@ -1,33 +1,26 @@ -/* ===-- fixunssfsi.c - Implement __fixunssfsi -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __fixunssfsi for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunssfsi.c - Implement __fixunssfsi -----------------------------===// +// +// 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 implements __fixunssfsi for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #define SINGLE_PRECISION  #include "fp_lib.h"  typedef su_int fixuint_t;  #include "fp_fixuint_impl.inc" -COMPILER_RT_ABI su_int -__fixunssfsi(fp_t a) { -    return __fixuint(a); -} +COMPILER_RT_ABI su_int __fixunssfsi(fp_t a) { return __fixuint(a); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI su_int __aeabi_f2uiz(fp_t a) { -  return __fixunssfsi(a); -} +AEABI_RTABI su_int __aeabi_f2uiz(fp_t a) { return __fixunssfsi(a); }  #else -AEABI_RTABI su_int __aeabi_f2uiz(fp_t a) COMPILER_RT_ALIAS(__fixunssfsi); +COMPILER_RT_ALIAS(__fixunssfsi, __aeabi_f2uiz)  #endif  #endif diff --git a/lib/builtins/fixunssfti.c b/lib/builtins/fixunssfti.c index 862d7bd6c7af..5525d77f26f6 100644 --- a/lib/builtins/fixunssfti.c +++ b/lib/builtins/fixunssfti.c @@ -1,16 +1,14 @@ -/* ===-- fixunssfti.c - Implement __fixunssfti -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __fixunssfti for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunssfti.c - Implement __fixunssfti -----------------------------===// +// +// 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 implements __fixunssfti for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #define SINGLE_PRECISION  #include "fp_lib.h" @@ -19,8 +17,5 @@  typedef tu_int fixuint_t;  #include "fp_fixuint_impl.inc" -COMPILER_RT_ABI tu_int -__fixunssfti(fp_t a) { -    return __fixuint(a); -} +COMPILER_RT_ABI tu_int __fixunssfti(fp_t a) { return __fixuint(a); }  #endif diff --git a/lib/builtins/fixunstfdi.c b/lib/builtins/fixunstfdi.c index b2995f65834a..a0805e63db82 100644 --- a/lib/builtins/fixunstfdi.c +++ b/lib/builtins/fixunstfdi.c @@ -1,12 +1,10 @@ -/* ===-- fixunstfdi.c - Implement __fixunstfdi -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunstfdi.c - Implement __fixunstfdi -----------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define QUAD_PRECISION  #include "fp_lib.h" @@ -15,8 +13,5 @@  typedef du_int fixuint_t;  #include "fp_fixuint_impl.inc" -COMPILER_RT_ABI du_int -__fixunstfdi(fp_t a) { -    return __fixuint(a); -} +COMPILER_RT_ABI du_int __fixunstfdi(fp_t a) { return __fixuint(a); }  #endif diff --git a/lib/builtins/fixunstfsi.c b/lib/builtins/fixunstfsi.c index b5d3f6a7d38d..3a1320ed3e0a 100644 --- a/lib/builtins/fixunstfsi.c +++ b/lib/builtins/fixunstfsi.c @@ -1,12 +1,10 @@ -/* ===-- fixunstfsi.c - Implement __fixunstfsi -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunstfsi.c - Implement __fixunstfsi -----------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define QUAD_PRECISION  #include "fp_lib.h" @@ -15,8 +13,5 @@  typedef su_int fixuint_t;  #include "fp_fixuint_impl.inc" -COMPILER_RT_ABI su_int -__fixunstfsi(fp_t a) { -    return __fixuint(a); -} +COMPILER_RT_ABI su_int __fixunstfsi(fp_t a) { return __fixuint(a); }  #endif diff --git a/lib/builtins/fixunstfti.c b/lib/builtins/fixunstfti.c index 22ff9dfc0339..23cd1ab615a7 100644 --- a/lib/builtins/fixunstfti.c +++ b/lib/builtins/fixunstfti.c @@ -1,12 +1,10 @@ -/* ===-- fixunstfsi.c - Implement __fixunstfsi -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunstfsi.c - Implement __fixunstfsi -----------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===//  #define QUAD_PRECISION  #include "fp_lib.h" @@ -15,8 +13,5 @@  typedef tu_int fixuint_t;  #include "fp_fixuint_impl.inc" -COMPILER_RT_ABI tu_int -__fixunstfti(fp_t a) { -    return __fixuint(a); -} +COMPILER_RT_ABI tu_int __fixunstfti(fp_t a) { return __fixuint(a); }  #endif diff --git a/lib/builtins/fixunsxfdi.c b/lib/builtins/fixunsxfdi.c index 075304e78dc9..75c4f093794f 100644 --- a/lib/builtins/fixunsxfdi.c +++ b/lib/builtins/fixunsxfdi.c @@ -1,46 +1,39 @@ -/* ===-- fixunsxfdi.c - Implement __fixunsxfdi -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __fixunsxfdi for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunsxfdi.c - Implement __fixunsxfdi -----------------------------===// +// +// 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 implements __fixunsxfdi for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #if !_ARCH_PPC  #include "int_lib.h" -/* Returns: convert a to a unsigned long long, rounding toward zero. - *          Negative values all become zero. - */ +// Returns: convert a to a unsigned long long, rounding toward zero. +//          Negative values all become zero. -/* Assumption: long double is an intel 80 bit floating point type padded with 6 bytes - *             du_int is a 64 bit integral type - *             value in long double is representable in du_int or is negative  - *                 (no range checking performed) - */ +// Assumption: long double is an intel 80 bit floating point type padded with 6 +// bytes du_int is a 64 bit integral type value in long double is representable +// in du_int or is negative (no range checking performed) -/* gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | - * 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee +// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm -COMPILER_RT_ABI du_int -__fixunsxfdi(long double a) -{ -    long_double_bits fb; -    fb.f = a; -    int e = (fb.u.high.s.low & 0x00007FFF) - 16383; -    if (e < 0 || (fb.u.high.s.low & 0x00008000)) -        return 0; -    if ((unsigned)e > sizeof(du_int) * CHAR_BIT) -        return ~(du_int)0; -    return fb.u.low.all >> (63 - e); +COMPILER_RT_ABI du_int __fixunsxfdi(long double a) { +  long_double_bits fb; +  fb.f = a; +  int e = (fb.u.high.s.low & 0x00007FFF) - 16383; +  if (e < 0 || (fb.u.high.s.low & 0x00008000)) +    return 0; +  if ((unsigned)e > sizeof(du_int) * CHAR_BIT) +    return ~(du_int)0; +  return fb.u.low.all >> (63 - e);  }  #endif diff --git a/lib/builtins/fixunsxfsi.c b/lib/builtins/fixunsxfsi.c index c3c70f743de8..1432d8ba92d2 100644 --- a/lib/builtins/fixunsxfsi.c +++ b/lib/builtins/fixunsxfsi.c @@ -1,45 +1,39 @@ -/* ===-- fixunsxfsi.c - Implement __fixunsxfsi -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __fixunsxfsi for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunsxfsi.c - Implement __fixunsxfsi -----------------------------===// +// +// 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 implements __fixunsxfsi for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #if !_ARCH_PPC  #include "int_lib.h" -/* Returns: convert a to a unsigned int, rounding toward zero. - *          Negative values all become zero. - */ +// Returns: convert a to a unsigned int, rounding toward zero. +//          Negative values all become zero. -/* Assumption: long double is an intel 80 bit floating point type padded with 6 bytes - *             su_int is a 32 bit integral type - *             value in long double is representable in su_int or is negative  - */ +// Assumption: long double is an intel 80 bit floating point type padded with 6 +// bytes su_int is a 32 bit integral type value in long double is representable +// in su_int or is negative -/* gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | - * 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee +// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm -COMPILER_RT_ABI su_int -__fixunsxfsi(long double a) -{ -    long_double_bits fb; -    fb.f = a; -    int e = (fb.u.high.s.low & 0x00007FFF) - 16383; -    if (e < 0 || (fb.u.high.s.low & 0x00008000)) -        return 0; -    if ((unsigned)e > sizeof(su_int) * CHAR_BIT) -        return ~(su_int)0; -    return fb.u.low.s.high >> (31 - e); +COMPILER_RT_ABI su_int __fixunsxfsi(long double a) { +  long_double_bits fb; +  fb.f = a; +  int e = (fb.u.high.s.low & 0x00007FFF) - 16383; +  if (e < 0 || (fb.u.high.s.low & 0x00008000)) +    return 0; +  if ((unsigned)e > sizeof(su_int) * CHAR_BIT) +    return ~(su_int)0; +  return fb.u.low.s.high >> (31 - e);  } -#endif /* !_ARCH_PPC */ +#endif // !_ARCH_PPC diff --git a/lib/builtins/fixunsxfti.c b/lib/builtins/fixunsxfti.c index fb39d00ff5b2..508554e4f8f6 100644 --- a/lib/builtins/fixunsxfti.c +++ b/lib/builtins/fixunsxfti.c @@ -1,50 +1,44 @@ -/* ===-- fixunsxfti.c - Implement __fixunsxfti -----------------------------=== - * - *      	       The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __fixunsxfti for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixunsxfti.c - Implement __fixunsxfti -----------------------------===// +// +// 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 implements __fixunsxfti for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: convert a to a unsigned long long, rounding toward zero. - *          Negative values all become zero. - */ +// Returns: convert a to a unsigned long long, rounding toward zero. +//          Negative values all become zero. -/* Assumption: long double is an intel 80 bit floating point type padded with 6 bytes - *             tu_int is a 128 bit integral type - *             value in long double is representable in tu_int or is negative  - */ +// Assumption: long double is an intel 80 bit floating point type padded with 6 +// bytes tu_int is a 128 bit integral type value in long double is representable +// in tu_int or is negative -/* gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | - * 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee +// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm -COMPILER_RT_ABI tu_int -__fixunsxfti(long double a) -{ -    long_double_bits fb; -    fb.f = a; -    int e = (fb.u.high.s.low & 0x00007FFF) - 16383; -    if (e < 0 || (fb.u.high.s.low & 0x00008000)) -        return 0; -    if ((unsigned)e > sizeof(tu_int) * CHAR_BIT) -        return ~(tu_int)0; -    tu_int r = fb.u.low.all; -    if (e > 63) -        r <<= (e - 63); -    else -        r >>= (63 - e); -    return r; +COMPILER_RT_ABI tu_int __fixunsxfti(long double a) { +  long_double_bits fb; +  fb.f = a; +  int e = (fb.u.high.s.low & 0x00007FFF) - 16383; +  if (e < 0 || (fb.u.high.s.low & 0x00008000)) +    return 0; +  if ((unsigned)e > sizeof(tu_int) * CHAR_BIT) +    return ~(tu_int)0; +  tu_int r = fb.u.low.all; +  if (e > 63) +    r <<= (e - 63); +  else +    r >>= (63 - e); +  return r;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/fixxfdi.c b/lib/builtins/fixxfdi.c index 011787f9e4b4..4783c0101740 100644 --- a/lib/builtins/fixxfdi.c +++ b/lib/builtins/fixxfdi.c @@ -1,48 +1,43 @@ -/* ===-- fixxfdi.c - Implement __fixxfdi -----------------------------------=== - * - *      	       The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __fixxfdi for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixxfdi.c - Implement __fixxfdi -----------------------------------===// +// +// 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 implements __fixxfdi for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #if !_ARCH_PPC  #include "int_lib.h" -/* Returns: convert a to a signed long long, rounding toward zero. */ +// Returns: convert a to a signed long long, rounding toward zero. -/* Assumption: long double is an intel 80 bit floating point type padded with 6 bytes - *             di_int is a 64 bit integral type - *             value in long double is representable in di_int (no range checking performed) - */ +// Assumption: long double is an intel 80 bit floating point type padded with 6 +// bytes di_int is a 64 bit integral type value in long double is representable +// in di_int (no range checking performed) -/* gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | - * 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee +// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm -COMPILER_RT_ABI di_int -__fixxfdi(long double a) -{ -    const di_int di_max = (di_int)((~(du_int)0) / 2); -    const di_int di_min = -di_max - 1; -    long_double_bits fb; -    fb.f = a; -    int e = (fb.u.high.s.low & 0x00007FFF) - 16383; -    if (e < 0) -        return 0; -    if ((unsigned)e >= sizeof(di_int) * CHAR_BIT) -        return a > 0 ? di_max : di_min; -    di_int s = -(si_int)((fb.u.high.s.low & 0x00008000) >> 15); -    di_int r = fb.u.low.all; -    r = (du_int)r >> (63 - e); -    return (r ^ s) - s; +COMPILER_RT_ABI di_int __fixxfdi(long double a) { +  const di_int di_max = (di_int)((~(du_int)0) / 2); +  const di_int di_min = -di_max - 1; +  long_double_bits fb; +  fb.f = a; +  int e = (fb.u.high.s.low & 0x00007FFF) - 16383; +  if (e < 0) +    return 0; +  if ((unsigned)e >= sizeof(di_int) * CHAR_BIT) +    return a > 0 ? di_max : di_min; +  di_int s = -(si_int)((fb.u.high.s.low & 0x00008000) >> 15); +  di_int r = fb.u.low.all; +  r = (du_int)r >> (63 - e); +  return (r ^ s) - s;  } -#endif /* !_ARCH_PPC */ +#endif // !_ARCH_PPC diff --git a/lib/builtins/fixxfti.c b/lib/builtins/fixxfti.c index 968a4f0d5eea..90e03116e7ca 100644 --- a/lib/builtins/fixxfti.c +++ b/lib/builtins/fixxfti.c @@ -1,51 +1,46 @@ -/* ===-- fixxfti.c - Implement __fixxfti -----------------------------------=== - * - *      	       The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __fixxfti for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- fixxfti.c - Implement __fixxfti -----------------------------------===// +// +// 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 implements __fixxfti for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: convert a to a signed long long, rounding toward zero. */ +// Returns: convert a to a signed long long, rounding toward zero. -/* Assumption: long double is an intel 80 bit floating point type padded with 6 bytes - *             ti_int is a 128 bit integral type - *             value in long double is representable in ti_int - */ +// Assumption: long double is an intel 80 bit floating point type padded with 6 +// bytes ti_int is a 128 bit integral type value in long double is representable +// in ti_int -/* gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | - * 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee +// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm -COMPILER_RT_ABI ti_int -__fixxfti(long double a) -{ -    const ti_int ti_max = (ti_int)((~(tu_int)0) / 2); -    const ti_int ti_min = -ti_max - 1; -    long_double_bits fb; -    fb.f = a; -    int e = (fb.u.high.s.low & 0x00007FFF) - 16383; -    if (e < 0) -        return 0; -    ti_int s = -(si_int)((fb.u.high.s.low & 0x00008000) >> 15); -    ti_int r = fb.u.low.all; -    if ((unsigned)e >= sizeof(ti_int) * CHAR_BIT) -        return a > 0 ? ti_max : ti_min; -    if (e > 63) -        r <<= (e - 63); -    else -        r >>= (63 - e); -    return (r ^ s) - s; +COMPILER_RT_ABI ti_int __fixxfti(long double a) { +  const ti_int ti_max = (ti_int)((~(tu_int)0) / 2); +  const ti_int ti_min = -ti_max - 1; +  long_double_bits fb; +  fb.f = a; +  int e = (fb.u.high.s.low & 0x00007FFF) - 16383; +  if (e < 0) +    return 0; +  ti_int s = -(si_int)((fb.u.high.s.low & 0x00008000) >> 15); +  ti_int r = fb.u.low.all; +  if ((unsigned)e >= sizeof(ti_int) * CHAR_BIT) +    return a > 0 ? ti_max : ti_min; +  if (e > 63) +    r <<= (e - 63); +  else +    r >>= (63 - e); +  return (r ^ s) - s;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/floatdidf.c b/lib/builtins/floatdidf.c index 36b856e078d4..8f887314b9e1 100644 --- a/lib/builtins/floatdidf.c +++ b/lib/builtins/floatdidf.c @@ -1,115 +1,103 @@ -/*===-- floatdidf.c - Implement __floatdidf -------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------=== - * - * This file implements __floatdidf for the compiler_rt library. - * - *===----------------------------------------------------------------------=== - */ +//===-- floatdidf.c - Implement __floatdidf -------------------------------===// +// +// 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 implements __floatdidf for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: convert a to a double, rounding toward even. */ +// Returns: convert a to a double, rounding toward even. -/* Assumption: double is a IEEE 64 bit floating point type - *             di_int is a 64 bit integral type - */ +// Assumption: double is a IEEE 64 bit floating point type +//             di_int is a 64 bit integral type -/* seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm */ +// seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm +// mmmm  #ifndef __SOFT_FP__ -/* Support for systems that have hardware floating-point; we'll set the inexact flag - * as a side-effect of this computation. - */ +// Support for systems that have hardware floating-point; we'll set the inexact +// flag as a side-effect of this computation. -COMPILER_RT_ABI double -__floatdidf(di_int a) -{ -    static const double twop52 = 4503599627370496.0; // 0x1.0p52 -    static const double twop32 = 4294967296.0; // 0x1.0p32 +COMPILER_RT_ABI double __floatdidf(di_int a) { +  static const double twop52 = 4503599627370496.0; // 0x1.0p52 +  static const double twop32 = 4294967296.0;       // 0x1.0p32 -    union { int64_t x; double d; } low = { .d = twop52 }; +  union { +    int64_t x; +    double d; +  } low = {.d = twop52}; -    const double high = (int32_t)(a >> 32) * twop32; -    low.x |= a & INT64_C(0x00000000ffffffff); +  const double high = (int32_t)(a >> 32) * twop32; +  low.x |= a & INT64_C(0x00000000ffffffff); -    const double result = (high - twop52) + low.d; -    return result; +  const double result = (high - twop52) + low.d; +  return result;  }  #else -/* Support for systems that don't have hardware floating-point; there are no flags to - * set, and we don't want to code-gen to an unknown soft-float implementation. - */ +// Support for systems that don't have hardware floating-point; there are no +// flags to set, and we don't want to code-gen to an unknown soft-float +// implementation. -COMPILER_RT_ABI double -__floatdidf(di_int a) -{ -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(di_int) * CHAR_BIT; -    const di_int s = a >> (N-1); -    a = (a ^ s) - s; -    int sd = N - __builtin_clzll(a);  /* number of significant digits */ -    int e = sd - 1;             /* exponent */ -    if (sd > DBL_MANT_DIG) -    { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                                12345678901234567890123456 -         *  1 = msb 1 bit -         *  P = bit DBL_MANT_DIG-1 bits to the right of 1 -         * Q = bit DBL_MANT_DIG bits to the right of 1 -         *  R = "or" of all bits to the right of Q -        */ -        switch (sd) -        { -        case DBL_MANT_DIG + 1: -            a <<= 1; -            break; -        case DBL_MANT_DIG + 2: -            break; -        default: -            a = ((du_int)a >> (sd - (DBL_MANT_DIG+2))) | -                ((a & ((du_int)(-1) >> ((N + DBL_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits */ -        if (a & ((du_int)1 << DBL_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to DBL_MANT_DIG bits */ +COMPILER_RT_ABI double __floatdidf(di_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(di_int) * CHAR_BIT; +  const di_int s = a >> (N - 1); +  a = (a ^ s) - s; +  int sd = N - __builtin_clzll(a); // number of significant digits +  int e = sd - 1;                  // exponent +  if (sd > DBL_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit DBL_MANT_DIG-1 bits to the right of 1 +    // Q = bit DBL_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case DBL_MANT_DIG + 1: +      a <<= 1; +      break; +    case DBL_MANT_DIG + 2: +      break; +    default: +      a = ((du_int)a >> (sd - (DBL_MANT_DIG + 2))) | +          ((a & ((du_int)(-1) >> ((N + DBL_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits +    if (a & ((du_int)1 << DBL_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (DBL_MANT_DIG - sd); -        /* a is now rounded to DBL_MANT_DIG bits */ -    } -    double_bits fb; -    fb.u.s.high = ((su_int)s & 0x80000000) |        /* sign */ -                  ((e + 1023) << 20)       |        /* exponent */ -                  ((su_int)(a >> 32) & 0x000FFFFF); /* mantissa-high */ -    fb.u.s.low = (su_int)a;                         /* mantissa-low */ -    return fb.f; +    // a is now rounded to DBL_MANT_DIG bits +  } else { +    a <<= (DBL_MANT_DIG - sd); +    // a is now rounded to DBL_MANT_DIG bits +  } +  double_bits fb; +  fb.u.s.high = ((su_int)s & 0x80000000) |        // sign +                ((e + 1023) << 20) |              // exponent +                ((su_int)(a >> 32) & 0x000FFFFF); // mantissa-high +  fb.u.s.low = (su_int)a;                         // mantissa-low +  return fb.f;  }  #endif  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI double __aeabi_l2d(di_int a) { -  return __floatdidf(a); -} +AEABI_RTABI double __aeabi_l2d(di_int a) { return __floatdidf(a); }  #else -AEABI_RTABI double __aeabi_l2d(di_int a) COMPILER_RT_ALIAS(__floatdidf); +COMPILER_RT_ALIAS(__floatdidf, __aeabi_l2d)  #endif  #endif diff --git a/lib/builtins/floatdisf.c b/lib/builtins/floatdisf.c index a2f09eb2ed2c..cd9e0a3b78a5 100644 --- a/lib/builtins/floatdisf.c +++ b/lib/builtins/floatdisf.c @@ -1,88 +1,75 @@ -/*===-- floatdisf.c - Implement __floatdisf -------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------=== - * - * This file implements __floatdisf for the compiler_rt library. - * - *===----------------------------------------------------------------------=== - */ +//===-- floatdisf.c - Implement __floatdisf -------------------------------===// +// +// 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 implements __floatdisf for the compiler_rt library. +// +//===----------------------------------------------------------------------===// -/* Returns: convert a to a float, rounding toward even.*/ +// Returns: convert a to a float, rounding toward even. -/* Assumption: float is a IEEE 32 bit floating point type  - *             di_int is a 64 bit integral type - */  +// Assumption: float is a IEEE 32 bit floating point type +//             di_int is a 64 bit integral type -/* seee eeee emmm mmmm mmmm mmmm mmmm mmmm */ +// seee eeee emmm mmmm mmmm mmmm mmmm mmmm  #include "int_lib.h" -COMPILER_RT_ABI float -__floatdisf(di_int a) -{ -    if (a == 0) -        return 0.0F; -    const unsigned N = sizeof(di_int) * CHAR_BIT; -    const di_int s = a >> (N-1); -    a = (a ^ s) - s; -    int sd = N - __builtin_clzll(a);  /* number of significant digits */ -    int e = sd - 1;             /* exponent */ -    if (sd > FLT_MANT_DIG) -    { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx  -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR  -         *                                                12345678901234567890123456  -         *  1 = msb 1 bit  -         *  P = bit FLT_MANT_DIG-1 bits to the right of 1  -         *  Q = bit FLT_MANT_DIG bits to the right of 1    -         *  R = "or" of all bits to the right of Q  -         */ -        switch (sd) -        { -        case FLT_MANT_DIG + 1: -            a <<= 1; -            break; -        case FLT_MANT_DIG + 2: -            break; -        default: -            a = ((du_int)a >> (sd - (FLT_MANT_DIG+2))) | -                ((a & ((du_int)(-1) >> ((N + FLT_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to FLT_MANT_DIG or FLT_MANT_DIG+1 bits */ -        if (a & ((du_int)1 << FLT_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to FLT_MANT_DIG bits */ +COMPILER_RT_ABI float __floatdisf(di_int a) { +  if (a == 0) +    return 0.0F; +  const unsigned N = sizeof(di_int) * CHAR_BIT; +  const di_int s = a >> (N - 1); +  a = (a ^ s) - s; +  int sd = N - __builtin_clzll(a); // number of significant digits +  int e = sd - 1;                  // exponent +  if (sd > FLT_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit FLT_MANT_DIG-1 bits to the right of 1 +    //  Q = bit FLT_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case FLT_MANT_DIG + 1: +      a <<= 1; +      break; +    case FLT_MANT_DIG + 2: +      break; +    default: +      a = ((du_int)a >> (sd - (FLT_MANT_DIG + 2))) | +          ((a & ((du_int)(-1) >> ((N + FLT_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to FLT_MANT_DIG or FLT_MANT_DIG+1 bits +    if (a & ((du_int)1 << FLT_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (FLT_MANT_DIG - sd); -        /* a is now rounded to FLT_MANT_DIG bits */ -    } -    float_bits fb; -    fb.u = ((su_int)s & 0x80000000) |  /* sign */ -           ((e + 127) << 23)       |  /* exponent */ -           ((su_int)a & 0x007FFFFF);   /* mantissa */ -    return fb.f; +    // a is now rounded to FLT_MANT_DIG bits +  } else { +    a <<= (FLT_MANT_DIG - sd); +    // a is now rounded to FLT_MANT_DIG bits +  } +  float_bits fb; +  fb.u = ((su_int)s & 0x80000000) | // sign +         ((e + 127) << 23) |        // exponent +         ((su_int)a & 0x007FFFFF);  // mantissa +  return fb.f;  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI float __aeabi_l2f(di_int a) { -  return __floatdisf(a); -} +AEABI_RTABI float __aeabi_l2f(di_int a) { return __floatdisf(a); }  #else -AEABI_RTABI float __aeabi_l2f(di_int a) COMPILER_RT_ALIAS(__floatdisf); +COMPILER_RT_ALIAS(__floatdisf, __aeabi_l2f)  #endif  #endif diff --git a/lib/builtins/floatditf.c b/lib/builtins/floatditf.c index cd51dd8aade4..9b07b65825b8 100644 --- a/lib/builtins/floatditf.c +++ b/lib/builtins/floatditf.c @@ -1,9 +1,8 @@  //===-- lib/floatditf.c - integer -> quad-precision conversion ----*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -19,32 +18,32 @@  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT)  COMPILER_RT_ABI fp_t __floatditf(di_int a) { -    const int aWidth = sizeof a * CHAR_BIT; +  const int aWidth = sizeof a * CHAR_BIT; -    // Handle zero as a special case to protect clz -    if (a == 0) -        return fromRep(0); +  // Handle zero as a special case to protect clz +  if (a == 0) +    return fromRep(0); -    // All other cases begin by extracting the sign and absolute value of a -    rep_t sign = 0; -    du_int aAbs = (du_int)a; -    if (a < 0) { -        sign = signBit; -        aAbs = ~(du_int)a + 1U; -    } +  // All other cases begin by extracting the sign and absolute value of a +  rep_t sign = 0; +  du_int aAbs = (du_int)a; +  if (a < 0) { +    sign = signBit; +    aAbs = ~(du_int)a + 1U; +  } -    // Exponent of (fp_t)a is the width of abs(a). -    const int exponent = (aWidth - 1) - __builtin_clzll(aAbs); -    rep_t result; +  // Exponent of (fp_t)a is the width of abs(a). +  const int exponent = (aWidth - 1) - __builtin_clzll(aAbs); +  rep_t result; -    // Shift a into the significand field, rounding if it is a right-shift -    const int shift = significandBits - exponent; -    result = (rep_t)aAbs << shift ^ implicitBit; +  // Shift a into the significand field, rounding if it is a right-shift +  const int shift = significandBits - exponent; +  result = (rep_t)aAbs << shift ^ implicitBit; -    // Insert the exponent -    result += (rep_t)(exponent + exponentBias) << significandBits; -    // Insert the sign bit and return -    return fromRep(result | sign); +  // Insert the exponent +  result += (rep_t)(exponent + exponentBias) << significandBits; +  // Insert the sign bit and return +  return fromRep(result | sign);  }  #endif diff --git a/lib/builtins/floatdixf.c b/lib/builtins/floatdixf.c index d39e81d7ca75..ad5deb2d4bf5 100644 --- a/lib/builtins/floatdixf.c +++ b/lib/builtins/floatdixf.c @@ -1,46 +1,41 @@ -/* ===-- floatdixf.c - Implement __floatdixf -------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floatdixf for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */  +//===-- floatdixf.c - Implement __floatdixf -------------------------------===// +// +// 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 implements __floatdixf for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #if !_ARCH_PPC  #include "int_lib.h" -/* Returns: convert a to a long double, rounding toward even. */ +// Returns: convert a to a long double, rounding toward even. -/* Assumption: long double is a IEEE 80 bit floating point type padded to 128 bits - *             di_int is a 64 bit integral type - */ +// Assumption: long double is a IEEE 80 bit floating point type padded to 128 +// bits di_int is a 64 bit integral type -/* gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | - * 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee +// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm -COMPILER_RT_ABI long double -__floatdixf(di_int a) -{ -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(di_int) * CHAR_BIT; -    const di_int s = a >> (N-1); -    a = (a ^ s) - s; -    int clz = __builtin_clzll(a); -    int e = (N - 1) - clz ;    /* exponent */ -    long_double_bits fb; -    fb.u.high.s.low = ((su_int)s & 0x00008000) |  /* sign */ -		      (e + 16383);                /* exponent */ -    fb.u.low.all = a << clz;                    /* mantissa */ -    return fb.f; +COMPILER_RT_ABI long double __floatdixf(di_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(di_int) * CHAR_BIT; +  const di_int s = a >> (N - 1); +  a = (a ^ s) - s; +  int clz = __builtin_clzll(a); +  int e = (N - 1) - clz; // exponent +  long_double_bits fb; +  fb.u.high.s.low = ((su_int)s & 0x00008000) | // sign +                    (e + 16383);               // exponent +  fb.u.low.all = a << clz;                     // mantissa +  return fb.f;  } -#endif /* !_ARCH_PPC */ +#endif // !_ARCH_PPC diff --git a/lib/builtins/floatsidf.c b/lib/builtins/floatsidf.c index fe051123ce7c..2c66167d794d 100644 --- a/lib/builtins/floatsidf.c +++ b/lib/builtins/floatsidf.c @@ -1,9 +1,8 @@  //===-- lib/floatsidf.c - integer -> double-precision conversion --*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -18,44 +17,41 @@  #include "int_lib.h" -COMPILER_RT_ABI fp_t -__floatsidf(int a) { -     -    const int aWidth = sizeof a * CHAR_BIT; -     -    // Handle zero as a special case to protect clz -    if (a == 0) -        return fromRep(0); -     -    // All other cases begin by extracting the sign and absolute value of a -    rep_t sign = 0; -    if (a < 0) { -        sign = signBit; -        a = -a; -    } -     -    // Exponent of (fp_t)a is the width of abs(a). -    const int exponent = (aWidth - 1) - __builtin_clz(a); -    rep_t result; -     -    // Shift a into the significand field and clear the implicit bit.  Extra -    // cast to unsigned int is necessary to get the correct behavior for -    // the input INT_MIN. -    const int shift = significandBits - exponent; -    result = (rep_t)(unsigned int)a << shift ^ implicitBit; -     -    // Insert the exponent -    result += (rep_t)(exponent + exponentBias) << significandBits; -    // Insert the sign bit and return -    return fromRep(result | sign); +COMPILER_RT_ABI fp_t __floatsidf(int a) { + +  const int aWidth = sizeof a * CHAR_BIT; + +  // Handle zero as a special case to protect clz +  if (a == 0) +    return fromRep(0); + +  // All other cases begin by extracting the sign and absolute value of a +  rep_t sign = 0; +  if (a < 0) { +    sign = signBit; +    a = -a; +  } + +  // Exponent of (fp_t)a is the width of abs(a). +  const int exponent = (aWidth - 1) - __builtin_clz(a); +  rep_t result; + +  // Shift a into the significand field and clear the implicit bit.  Extra +  // cast to unsigned int is necessary to get the correct behavior for +  // the input INT_MIN. +  const int shift = significandBits - exponent; +  result = (rep_t)(unsigned int)a << shift ^ implicitBit; + +  // Insert the exponent +  result += (rep_t)(exponent + exponentBias) << significandBits; +  // Insert the sign bit and return +  return fromRep(result | sign);  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_i2d(int a) { -  return __floatsidf(a); -} +AEABI_RTABI fp_t __aeabi_i2d(int a) { return __floatsidf(a); }  #else -AEABI_RTABI fp_t __aeabi_i2d(int a) COMPILER_RT_ALIAS(__floatsidf); +COMPILER_RT_ALIAS(__floatsidf, __aeabi_i2d)  #endif  #endif diff --git a/lib/builtins/floatsisf.c b/lib/builtins/floatsisf.c index bf087ee3c295..fe060407755b 100644 --- a/lib/builtins/floatsisf.c +++ b/lib/builtins/floatsisf.c @@ -1,9 +1,8 @@  //===-- lib/floatsisf.c - integer -> single-precision conversion --*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -18,50 +17,49 @@  #include "int_lib.h" -COMPILER_RT_ABI fp_t -__floatsisf(int a) { -     -    const int aWidth = sizeof a * CHAR_BIT; -     -    // Handle zero as a special case to protect clz -    if (a == 0) -        return fromRep(0); -     -    // All other cases begin by extracting the sign and absolute value of a -    rep_t sign = 0; -    if (a < 0) { -        sign = signBit; -        a = -a; -    } -     -    // Exponent of (fp_t)a is the width of abs(a). -    const int exponent = (aWidth - 1) - __builtin_clz(a); -    rep_t result; -     -    // Shift a into the significand field, rounding if it is a right-shift -    if (exponent <= significandBits) { -        const int shift = significandBits - exponent; -        result = (rep_t)a << shift ^ implicitBit; -    } else { -        const int shift = exponent - significandBits; -        result = (rep_t)a >> shift ^ implicitBit; -        rep_t round = (rep_t)a << (typeWidth - shift); -        if (round > signBit) result++; -        if (round == signBit) result += result & 1; -    } -     -    // Insert the exponent -    result += (rep_t)(exponent + exponentBias) << significandBits; -    // Insert the sign bit and return -    return fromRep(result | sign); +COMPILER_RT_ABI fp_t __floatsisf(int a) { + +  const int aWidth = sizeof a * CHAR_BIT; + +  // Handle zero as a special case to protect clz +  if (a == 0) +    return fromRep(0); + +  // All other cases begin by extracting the sign and absolute value of a +  rep_t sign = 0; +  if (a < 0) { +    sign = signBit; +    a = -a; +  } + +  // Exponent of (fp_t)a is the width of abs(a). +  const int exponent = (aWidth - 1) - __builtin_clz(a); +  rep_t result; + +  // Shift a into the significand field, rounding if it is a right-shift +  if (exponent <= significandBits) { +    const int shift = significandBits - exponent; +    result = (rep_t)a << shift ^ implicitBit; +  } else { +    const int shift = exponent - significandBits; +    result = (rep_t)a >> shift ^ implicitBit; +    rep_t round = (rep_t)a << (typeWidth - shift); +    if (round > signBit) +      result++; +    if (round == signBit) +      result += result & 1; +  } + +  // Insert the exponent +  result += (rep_t)(exponent + exponentBias) << significandBits; +  // Insert the sign bit and return +  return fromRep(result | sign);  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_i2f(int a) { -  return __floatsisf(a); -} +AEABI_RTABI fp_t __aeabi_i2f(int a) { return __floatsisf(a); }  #else -AEABI_RTABI fp_t __aeabi_i2f(int a) COMPILER_RT_ALIAS(__floatsisf); +COMPILER_RT_ALIAS(__floatsisf, __aeabi_i2f)  #endif  #endif diff --git a/lib/builtins/floatsitf.c b/lib/builtins/floatsitf.c index f0abca363b5e..f56063f368d9 100644 --- a/lib/builtins/floatsitf.c +++ b/lib/builtins/floatsitf.c @@ -1,9 +1,8 @@  //===-- lib/floatsitf.c - integer -> quad-precision conversion ----*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -19,32 +18,32 @@  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT)  COMPILER_RT_ABI fp_t __floatsitf(int a) { -    const int aWidth = sizeof a * CHAR_BIT; +  const int aWidth = sizeof a * CHAR_BIT; -    // Handle zero as a special case to protect clz -    if (a == 0) -        return fromRep(0); +  // Handle zero as a special case to protect clz +  if (a == 0) +    return fromRep(0); -    // All other cases begin by extracting the sign and absolute value of a -    rep_t sign = 0; -    unsigned aAbs = (unsigned)a; -    if (a < 0) { -        sign = signBit; -        aAbs = ~(unsigned)a + 1U; -    } +  // All other cases begin by extracting the sign and absolute value of a +  rep_t sign = 0; +  unsigned aAbs = (unsigned)a; +  if (a < 0) { +    sign = signBit; +    aAbs = ~(unsigned)a + 1U; +  } -    // Exponent of (fp_t)a is the width of abs(a). -    const int exponent = (aWidth - 1) - __builtin_clz(aAbs); -    rep_t result; +  // Exponent of (fp_t)a is the width of abs(a). +  const int exponent = (aWidth - 1) - __builtin_clz(aAbs); +  rep_t result; -    // Shift a into the significand field and clear the implicit bit. -    const int shift = significandBits - exponent; -    result = (rep_t)aAbs << shift ^ implicitBit; +  // Shift a into the significand field and clear the implicit bit. +  const int shift = significandBits - exponent; +  result = (rep_t)aAbs << shift ^ implicitBit; -    // Insert the exponent -    result += (rep_t)(exponent + exponentBias) << significandBits; -    // Insert the sign bit and return -    return fromRep(result | sign); +  // Insert the exponent +  result += (rep_t)(exponent + exponentBias) << significandBits; +  // Insert the sign bit and return +  return fromRep(result | sign);  }  #endif diff --git a/lib/builtins/floattidf.c b/lib/builtins/floattidf.c index 2702a3c8a2db..0a1c04bec82e 100644 --- a/lib/builtins/floattidf.c +++ b/lib/builtins/floattidf.c @@ -1,83 +1,73 @@ -/* ===-- floattidf.c - Implement __floattidf -------------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floattidf for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- floattidf.c - Implement __floattidf -------------------------------===// +// +// 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 implements __floattidf for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: convert a to a double, rounding toward even.*/ +// Returns: convert a to a double, rounding toward even. -/* Assumption: double is a IEEE 64 bit floating point type - *            ti_int is a 128 bit integral type - */ +// Assumption: double is a IEEE 64 bit floating point type +//            ti_int is a 128 bit integral type -/* seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm */ +// seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm +// mmmm -COMPILER_RT_ABI double -__floattidf(ti_int a) -{ -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(ti_int) * CHAR_BIT; -    const ti_int s = a >> (N-1); -    a = (a ^ s) - s; -    int sd = N - __clzti2(a);  /* number of significant digits */ -    int e = sd - 1;             /* exponent */ -    if (sd > DBL_MANT_DIG) -    { -        /* start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                               12345678901234567890123456 -         * 1 = msb 1 bit -         * P = bit DBL_MANT_DIG-1 bits to the right of 1 -         * Q = bit DBL_MANT_DIG bits to the right of 1 -         * R = "or" of all bits to the right of Q -         */ -        switch (sd) -        { -        case DBL_MANT_DIG + 1: -            a <<= 1; -            break; -        case DBL_MANT_DIG + 2: -            break; -        default: -            a = ((tu_int)a >> (sd - (DBL_MANT_DIG+2))) | -                ((a & ((tu_int)(-1) >> ((N + DBL_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits */ -        if (a & ((tu_int)1 << DBL_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to DBL_MANT_DIG bits */ +COMPILER_RT_ABI double __floattidf(ti_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(ti_int) * CHAR_BIT; +  const ti_int s = a >> (N - 1); +  a = (a ^ s) - s; +  int sd = N - __clzti2(a); // number of significant digits +  int e = sd - 1;           // exponent +  if (sd > DBL_MANT_DIG) { +    // start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                               12345678901234567890123456 +    // 1 = msb 1 bit +    // P = bit DBL_MANT_DIG-1 bits to the right of 1 +    // Q = bit DBL_MANT_DIG bits to the right of 1 +    // R = "or" of all bits to the right of Q +    switch (sd) { +    case DBL_MANT_DIG + 1: +      a <<= 1; +      break; +    case DBL_MANT_DIG + 2: +      break; +    default: +      a = ((tu_int)a >> (sd - (DBL_MANT_DIG + 2))) | +          ((a & ((tu_int)(-1) >> ((N + DBL_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits +    if (a & ((tu_int)1 << DBL_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (DBL_MANT_DIG - sd); -        /* a is now rounded to DBL_MANT_DIG bits */ -    } -    double_bits fb; -    fb.u.s.high = ((su_int)s & 0x80000000) |        /* sign */ -                ((e + 1023) << 20)      |        /* exponent */ -                ((su_int)(a >> 32) & 0x000FFFFF); /* mantissa-high */ -    fb.u.s.low = (su_int)a;                         /* mantissa-low */ -    return fb.f; +    // a is now rounded to DBL_MANT_DIG bits +  } else { +    a <<= (DBL_MANT_DIG - sd); +    // a is now rounded to DBL_MANT_DIG bits +  } +  double_bits fb; +  fb.u.s.high = ((su_int)s & 0x80000000) |        // sign +                ((e + 1023) << 20) |              // exponent +                ((su_int)(a >> 32) & 0x000FFFFF); // mantissa-high +  fb.u.s.low = (su_int)a;                         // mantissa-low +  return fb.f;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/floattisf.c b/lib/builtins/floattisf.c index f1b585f2c326..a8fcdbe14c07 100644 --- a/lib/builtins/floattisf.c +++ b/lib/builtins/floattisf.c @@ -1,82 +1,71 @@ -/* ===-- floattisf.c - Implement __floattisf -------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floattisf for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- floattisf.c - Implement __floattisf -------------------------------===// +// +// 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 implements __floattisf for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: convert a to a float, rounding toward even. */ +// Returns: convert a to a float, rounding toward even. -/* Assumption: float is a IEEE 32 bit floating point type  - *             ti_int is a 128 bit integral type - */ +// Assumption: float is a IEEE 32 bit floating point type +//             ti_int is a 128 bit integral type -/* seee eeee emmm mmmm mmmm mmmm mmmm mmmm */ +// seee eeee emmm mmmm mmmm mmmm mmmm mmmm -COMPILER_RT_ABI float -__floattisf(ti_int a) -{ -    if (a == 0) -        return 0.0F; -    const unsigned N = sizeof(ti_int) * CHAR_BIT; -    const ti_int s = a >> (N-1); -    a = (a ^ s) - s; -    int sd = N - __clzti2(a);  /* number of significant digits */ -    int e = sd - 1;             /* exponent */ -    if (sd > FLT_MANT_DIG) -    { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -        * finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -        *                                                12345678901234567890123456 -        *  1 = msb 1 bit -        *  P = bit FLT_MANT_DIG-1 bits to the right of 1 -        *  Q = bit FLT_MANT_DIG bits to the right of 1 -        *  R = "or" of all bits to the right of Q -        */ -        switch (sd) -        { -        case FLT_MANT_DIG + 1: -            a <<= 1; -            break; -        case FLT_MANT_DIG + 2: -            break; -        default: -            a = ((tu_int)a >> (sd - (FLT_MANT_DIG+2))) | -                ((a & ((tu_int)(-1) >> ((N + FLT_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to FLT_MANT_DIG or FLT_MANT_DIG+1 bits */ -        if (a & ((tu_int)1 << FLT_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to FLT_MANT_DIG bits */ +COMPILER_RT_ABI float __floattisf(ti_int a) { +  if (a == 0) +    return 0.0F; +  const unsigned N = sizeof(ti_int) * CHAR_BIT; +  const ti_int s = a >> (N - 1); +  a = (a ^ s) - s; +  int sd = N - __clzti2(a); // number of significant digits +  int e = sd - 1;           // exponent +  if (sd > FLT_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    // finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit FLT_MANT_DIG-1 bits to the right of 1 +    //  Q = bit FLT_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case FLT_MANT_DIG + 1: +      a <<= 1; +      break; +    case FLT_MANT_DIG + 2: +      break; +    default: +      a = ((tu_int)a >> (sd - (FLT_MANT_DIG + 2))) | +          ((a & ((tu_int)(-1) >> ((N + FLT_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to FLT_MANT_DIG or FLT_MANT_DIG+1 bits +    if (a & ((tu_int)1 << FLT_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (FLT_MANT_DIG - sd); -        /* a is now rounded to FLT_MANT_DIG bits */ -    } -    float_bits fb; -    fb.u = ((su_int)s & 0x80000000) |  /* sign */ -           ((e + 127) << 23)       |  /* exponent */ -           ((su_int)a & 0x007FFFFF);   /* mantissa */ -    return fb.f; +    // a is now rounded to FLT_MANT_DIG bits +  } else { +    a <<= (FLT_MANT_DIG - sd); +    // a is now rounded to FLT_MANT_DIG bits +  } +  float_bits fb; +  fb.u = ((su_int)s & 0x80000000) | // sign +         ((e + 127) << 23) |        // exponent +         ((su_int)a & 0x007FFFFF);  // mantissa +  return fb.f;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/floattitf.c b/lib/builtins/floattitf.c index 994fded3947b..196cbdae14e0 100644 --- a/lib/builtins/floattitf.c +++ b/lib/builtins/floattitf.c @@ -1,9 +1,8 @@  //===-- lib/floattitf.c - int128 -> quad-precision conversion -----*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -17,66 +16,63 @@  #include "fp_lib.h"  #include "int_lib.h" -/* Returns: convert a ti_int to a fp_t, rounding toward even. */ +// Returns: convert a ti_int to a fp_t, rounding toward even. -/* Assumption: fp_t is a IEEE 128 bit floating point type - *             ti_int is a 128 bit integral type - */ +// Assumption: fp_t is a IEEE 128 bit floating point type +//             ti_int is a 128 bit integral type -/* seee eeee eeee eeee mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | - * mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// seee eeee eeee eeee mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm +// mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT) -COMPILER_RT_ABI fp_t -__floattitf(ti_int a) { -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(ti_int) * CHAR_BIT; -    const ti_int s = a >> (N-1); -    a = (a ^ s) - s; -    int sd = N - __clzti2(a);  /* number of significant digits */ -    int e = sd - 1;            /* exponent */ -    if (sd > LDBL_MANT_DIG) { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                                12345678901234567890123456 -         *  1 = msb 1 bit -         *  P = bit LDBL_MANT_DIG-1 bits to the right of 1 -         *  Q = bit LDBL_MANT_DIG bits to the right of 1 -         *  R = "or" of all bits to the right of Q -         */ -        switch (sd) { -        case LDBL_MANT_DIG + 1: -            a <<= 1; -            break; -        case LDBL_MANT_DIG + 2: -            break; -        default: -            a = ((tu_int)a >> (sd - (LDBL_MANT_DIG+2))) | -                ((a & ((tu_int)(-1) >> ((N + LDBL_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to LDBL_MANT_DIG or LDBL_MANT_DIG+1 bits */ -        if (a & ((tu_int)1 << LDBL_MANT_DIG)) { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to LDBL_MANT_DIG bits */ -    } else { -        a <<= (LDBL_MANT_DIG - sd); -        /* a is now rounded to LDBL_MANT_DIG bits */ +COMPILER_RT_ABI fp_t __floattitf(ti_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(ti_int) * CHAR_BIT; +  const ti_int s = a >> (N - 1); +  a = (a ^ s) - s; +  int sd = N - __clzti2(a); // number of significant digits +  int e = sd - 1;           // exponent +  if (sd > LDBL_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit LDBL_MANT_DIG-1 bits to the right of 1 +    //  Q = bit LDBL_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case LDBL_MANT_DIG + 1: +      a <<= 1; +      break; +    case LDBL_MANT_DIG + 2: +      break; +    default: +      a = ((tu_int)a >> (sd - (LDBL_MANT_DIG + 2))) | +          ((a & ((tu_int)(-1) >> ((N + LDBL_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to LDBL_MANT_DIG or LDBL_MANT_DIG+1 bits +    if (a & ((tu_int)1 << LDBL_MANT_DIG)) { +      a >>= 1; +      ++e;      } +    // a is now rounded to LDBL_MANT_DIG bits +  } else { +    a <<= (LDBL_MANT_DIG - sd); +    // a is now rounded to LDBL_MANT_DIG bits +  } -    long_double_bits fb; -    fb.u.high.all = (s & 0x8000000000000000LL)           /* sign */ -                  | (du_int)(e + 16383) << 48            /* exponent */ -                  | ((a >> 64) & 0x0000ffffffffffffLL);  /* significand */ -    fb.u.low.all = (du_int)(a); -    return fb.f; +  long_double_bits fb; +  fb.u.high.all = (s & 0x8000000000000000LL)            // sign +                  | (du_int)(e + 16383) << 48           // exponent +                  | ((a >> 64) & 0x0000ffffffffffffLL); // significand +  fb.u.low.all = (du_int)(a); +  return fb.f;  }  #endif diff --git a/lib/builtins/floattixf.c b/lib/builtins/floattixf.c index 1203b3a96e75..23796f1bb56f 100644 --- a/lib/builtins/floattixf.c +++ b/lib/builtins/floattixf.c @@ -1,84 +1,73 @@ -/* ===-- floattixf.c - Implement __floattixf -------------------------------=== - * - *      	       The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floattixf for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- floattixf.c - Implement __floattixf -------------------------------===// +// +// 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 implements __floattixf for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: convert a to a long double, rounding toward even. */ +// Returns: convert a to a long double, rounding toward even. -/* Assumption: long double is a IEEE 80 bit floating point type padded to 128 bits - *             ti_int is a 128 bit integral type - */ +// Assumption: long double is a IEEE 80 bit floating point type padded to 128 +// bits ti_int is a 128 bit integral type -/* gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | - * 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee +// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm -COMPILER_RT_ABI long double -__floattixf(ti_int a) -{ -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(ti_int) * CHAR_BIT; -    const ti_int s = a >> (N-1); -    a = (a ^ s) - s; -    int sd = N - __clzti2(a);  /* number of significant digits */ -    int e = sd - 1;             /* exponent */ -    if (sd > LDBL_MANT_DIG) -    { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                                12345678901234567890123456 -         *  1 = msb 1 bit -         *  P = bit LDBL_MANT_DIG-1 bits to the right of 1 -         *  Q = bit LDBL_MANT_DIG bits to the right of 1 -         *  R = "or" of all bits to the right of Q -         */ -        switch (sd) -        { -        case LDBL_MANT_DIG + 1: -            a <<= 1; -            break; -        case LDBL_MANT_DIG + 2: -            break; -        default: -            a = ((tu_int)a >> (sd - (LDBL_MANT_DIG+2))) | -                ((a & ((tu_int)(-1) >> ((N + LDBL_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to LDBL_MANT_DIG or LDBL_MANT_DIG+1 bits */ -        if (a & ((tu_int)1 << LDBL_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to LDBL_MANT_DIG bits */ +COMPILER_RT_ABI long double __floattixf(ti_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(ti_int) * CHAR_BIT; +  const ti_int s = a >> (N - 1); +  a = (a ^ s) - s; +  int sd = N - __clzti2(a); // number of significant digits +  int e = sd - 1;           // exponent +  if (sd > LDBL_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit LDBL_MANT_DIG-1 bits to the right of 1 +    //  Q = bit LDBL_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case LDBL_MANT_DIG + 1: +      a <<= 1; +      break; +    case LDBL_MANT_DIG + 2: +      break; +    default: +      a = ((tu_int)a >> (sd - (LDBL_MANT_DIG + 2))) | +          ((a & ((tu_int)(-1) >> ((N + LDBL_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to LDBL_MANT_DIG or LDBL_MANT_DIG+1 bits +    if (a & ((tu_int)1 << LDBL_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (LDBL_MANT_DIG - sd); -        /* a is now rounded to LDBL_MANT_DIG bits */ -    } -    long_double_bits fb; -    fb.u.high.s.low = ((su_int)s & 0x8000) |        /* sign */ -                    (e + 16383);                  /* exponent */ -    fb.u.low.all = (du_int)a;                     /* mantissa */ -    return fb.f; +    // a is now rounded to LDBL_MANT_DIG bits +  } else { +    a <<= (LDBL_MANT_DIG - sd); +    // a is now rounded to LDBL_MANT_DIG bits +  } +  long_double_bits fb; +  fb.u.high.s.low = ((su_int)s & 0x8000) | // sign +                    (e + 16383);           // exponent +  fb.u.low.all = (du_int)a;                // mantissa +  return fb.f;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/floatundidf.c b/lib/builtins/floatundidf.c index 8bc2a096324f..e7c6aae5ce38 100644 --- a/lib/builtins/floatundidf.c +++ b/lib/builtins/floatundidf.c @@ -1,114 +1,106 @@ -/* ===-- floatundidf.c - Implement __floatundidf ---------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floatundidf for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- floatundidf.c - Implement __floatundidf ---------------------------===// +// +// 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 implements __floatundidf for the compiler_rt library. +// +//===----------------------------------------------------------------------===// -/* Returns: convert a to a double, rounding toward even. */ +// Returns: convert a to a double, rounding toward even. -/* Assumption: double is a IEEE 64 bit floating point type - *             du_int is a 64 bit integral type - */ +// Assumption: double is a IEEE 64 bit floating point type +//             du_int is a 64 bit integral type -/* seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm */ +// seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm +// mmmm  #include "int_lib.h"  #ifndef __SOFT_FP__ -/* Support for systems that have hardware floating-point; we'll set the inexact flag - * as a side-effect of this computation. - */ +// Support for systems that have hardware floating-point; we'll set the inexact +// flag as a side-effect of this computation. -COMPILER_RT_ABI double -__floatundidf(du_int a) -{ -    static const double twop52 = 4503599627370496.0; // 0x1.0p52 -    static const double twop84 = 19342813113834066795298816.0; // 0x1.0p84 -    static const double twop84_plus_twop52 = 19342813118337666422669312.0; // 0x1.00000001p84 +COMPILER_RT_ABI double __floatundidf(du_int a) { +  static const double twop52 = 4503599627370496.0;           // 0x1.0p52 +  static const double twop84 = 19342813113834066795298816.0; // 0x1.0p84 +  static const double twop84_plus_twop52 = +      19342813118337666422669312.0; // 0x1.00000001p84 -    union { uint64_t x; double d; } high = { .d = twop84 }; -    union { uint64_t x; double d; } low = { .d = twop52 }; +  union { +    uint64_t x; +    double d; +  } high = {.d = twop84}; +  union { +    uint64_t x; +    double d; +  } low = {.d = twop52}; -    high.x |= a >> 32; -    low.x |= a & UINT64_C(0x00000000ffffffff); +  high.x |= a >> 32; +  low.x |= a & UINT64_C(0x00000000ffffffff); -    const double result = (high.d - twop84_plus_twop52) + low.d; -    return result; +  const double result = (high.d - twop84_plus_twop52) + low.d; +  return result;  }  #else -/* Support for systems that don't have hardware floating-point; there are no flags to - * set, and we don't want to code-gen to an unknown soft-float implementation. - */ +// Support for systems that don't have hardware floating-point; there are no +// flags to set, and we don't want to code-gen to an unknown soft-float +// implementation. -COMPILER_RT_ABI double -__floatundidf(du_int a) -{ -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(du_int) * CHAR_BIT; -    int sd = N - __builtin_clzll(a);  /* number of significant digits */ -    int e = sd - 1;             /* exponent */ -    if (sd > DBL_MANT_DIG) -    { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                                12345678901234567890123456 -         *  1 = msb 1 bit -         *  P = bit DBL_MANT_DIG-1 bits to the right of 1 -         *  Q = bit DBL_MANT_DIG bits to the right of 1 -         *  R = "or" of all bits to the right of Q -         */ -        switch (sd) -        { -        case DBL_MANT_DIG + 1: -            a <<= 1; -            break; -        case DBL_MANT_DIG + 2: -            break; -        default: -            a = (a >> (sd - (DBL_MANT_DIG+2))) | -                ((a & ((du_int)(-1) >> ((N + DBL_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits */ -        if (a & ((du_int)1 << DBL_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to DBL_MANT_DIG bits */ +COMPILER_RT_ABI double __floatundidf(du_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(du_int) * CHAR_BIT; +  int sd = N - __builtin_clzll(a); // number of significant digits +  int e = sd - 1;                  // exponent +  if (sd > DBL_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit DBL_MANT_DIG-1 bits to the right of 1 +    //  Q = bit DBL_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case DBL_MANT_DIG + 1: +      a <<= 1; +      break; +    case DBL_MANT_DIG + 2: +      break; +    default: +      a = (a >> (sd - (DBL_MANT_DIG + 2))) | +          ((a & ((du_int)(-1) >> ((N + DBL_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits +    if (a & ((du_int)1 << DBL_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (DBL_MANT_DIG - sd); -        /* a is now rounded to DBL_MANT_DIG bits */ -    } -    double_bits fb; -    fb.u.s.high = ((e + 1023) << 20)       |        /* exponent */ -                  ((su_int)(a >> 32) & 0x000FFFFF); /* mantissa-high */ -    fb.u.s.low = (su_int)a;                         /* mantissa-low  */ -    return fb.f; +    // a is now rounded to DBL_MANT_DIG bits +  } else { +    a <<= (DBL_MANT_DIG - sd); +    // a is now rounded to DBL_MANT_DIG bits +  } +  double_bits fb; +  fb.u.s.high = ((e + 1023) << 20) |              // exponent +                ((su_int)(a >> 32) & 0x000FFFFF); // mantissa-high +  fb.u.s.low = (su_int)a;                         // mantissa-low +  return fb.f;  }  #endif  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI double __aeabi_ul2d(du_int a) { -  return __floatundidf(a); -} +AEABI_RTABI double __aeabi_ul2d(du_int a) { return __floatundidf(a); }  #else -AEABI_RTABI double __aeabi_ul2d(du_int a) COMPILER_RT_ALIAS(__floatundidf); +COMPILER_RT_ALIAS(__floatundidf, __aeabi_ul2d)  #endif  #endif diff --git a/lib/builtins/floatundisf.c b/lib/builtins/floatundisf.c index 844786ea7777..87841b761ded 100644 --- a/lib/builtins/floatundisf.c +++ b/lib/builtins/floatundisf.c @@ -1,85 +1,72 @@ -/*===-- floatundisf.c - Implement __floatundisf ---------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floatundisf for the compiler_rt library. - * - *===----------------------------------------------------------------------=== - */ +//===-- floatundisf.c - Implement __floatundisf ---------------------------===// +// +// 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 implements __floatundisf for the compiler_rt library. +// +//===----------------------------------------------------------------------===// -/* Returns: convert a to a float, rounding toward even. */ +// Returns: convert a to a float, rounding toward even. -/* Assumption: float is a IEEE 32 bit floating point type  - *            du_int is a 64 bit integral type - */ +// Assumption: float is a IEEE 32 bit floating point type +//            du_int is a 64 bit integral type -/* seee eeee emmm mmmm mmmm mmmm mmmm mmmm */ +// seee eeee emmm mmmm mmmm mmmm mmmm mmmm  #include "int_lib.h" -COMPILER_RT_ABI float -__floatundisf(du_int a) -{ -    if (a == 0) -        return 0.0F; -    const unsigned N = sizeof(du_int) * CHAR_BIT; -    int sd = N - __builtin_clzll(a);  /* number of significant digits */ -    int e = sd - 1;             /* 8 exponent */ -    if (sd > FLT_MANT_DIG) -    { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                                12345678901234567890123456 -         *  1 = msb 1 bit -         *  P = bit FLT_MANT_DIG-1 bits to the right of 1 -         *  Q = bit FLT_MANT_DIG bits to the right of 1 -         *  R = "or" of all bits to the right of Q -         */ -        switch (sd) -        { -        case FLT_MANT_DIG + 1: -            a <<= 1; -            break; -        case FLT_MANT_DIG + 2: -            break; -        default: -            a = (a >> (sd - (FLT_MANT_DIG+2))) | -                ((a & ((du_int)(-1) >> ((N + FLT_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to FLT_MANT_DIG or FLT_MANT_DIG+1 bits */ -        if (a & ((du_int)1 << FLT_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to FLT_MANT_DIG bits */ +COMPILER_RT_ABI float __floatundisf(du_int a) { +  if (a == 0) +    return 0.0F; +  const unsigned N = sizeof(du_int) * CHAR_BIT; +  int sd = N - __builtin_clzll(a); // number of significant digits +  int e = sd - 1;                  // 8 exponent +  if (sd > FLT_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit FLT_MANT_DIG-1 bits to the right of 1 +    //  Q = bit FLT_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case FLT_MANT_DIG + 1: +      a <<= 1; +      break; +    case FLT_MANT_DIG + 2: +      break; +    default: +      a = (a >> (sd - (FLT_MANT_DIG + 2))) | +          ((a & ((du_int)(-1) >> ((N + FLT_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to FLT_MANT_DIG or FLT_MANT_DIG+1 bits +    if (a & ((du_int)1 << FLT_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (FLT_MANT_DIG - sd); -        /* a is now rounded to FLT_MANT_DIG bits */ -    } -    float_bits fb; -    fb.u = ((e + 127) << 23)       |  /* exponent */ -           ((su_int)a & 0x007FFFFF);  /* mantissa */ -    return fb.f; +    // a is now rounded to FLT_MANT_DIG bits +  } else { +    a <<= (FLT_MANT_DIG - sd); +    // a is now rounded to FLT_MANT_DIG bits +  } +  float_bits fb; +  fb.u = ((e + 127) << 23) |       // exponent +         ((su_int)a & 0x007FFFFF); // mantissa +  return fb.f;  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI float __aeabi_ul2f(du_int a) { -  return __floatundisf(a); -} +AEABI_RTABI float __aeabi_ul2f(du_int a) { return __floatundisf(a); }  #else -AEABI_RTABI float __aeabi_ul2f(du_int a) COMPILER_RT_ALIAS(__floatundisf); +COMPILER_RT_ALIAS(__floatundisf, __aeabi_ul2f)  #endif  #endif diff --git a/lib/builtins/floatunditf.c b/lib/builtins/floatunditf.c index 8098e95e82bc..8d310851e179 100644 --- a/lib/builtins/floatunditf.c +++ b/lib/builtins/floatunditf.c @@ -1,9 +1,8 @@  //===-- lib/floatunditf.c - uint -> quad-precision conversion -----*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -19,22 +18,23 @@  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT)  COMPILER_RT_ABI fp_t __floatunditf(du_int a) { -    const int aWidth = sizeof a * CHAR_BIT; +  const int aWidth = sizeof a * CHAR_BIT; -    // Handle zero as a special case to protect clz -    if (a == 0) return fromRep(0); +  // Handle zero as a special case to protect clz +  if (a == 0) +    return fromRep(0); -    // Exponent of (fp_t)a is the width of abs(a). -    const int exponent = (aWidth - 1) - __builtin_clzll(a); -    rep_t result; +  // Exponent of (fp_t)a is the width of abs(a). +  const int exponent = (aWidth - 1) - __builtin_clzll(a); +  rep_t result; -    // Shift a into the significand field and clear the implicit bit. -    const int shift = significandBits - exponent; -    result = (rep_t)a << shift ^ implicitBit; +  // Shift a into the significand field and clear the implicit bit. +  const int shift = significandBits - exponent; +  result = (rep_t)a << shift ^ implicitBit; -    // Insert the exponent -    result += (rep_t)(exponent + exponentBias) << significandBits; -    return fromRep(result); +  // Insert the exponent +  result += (rep_t)(exponent + exponentBias) << significandBits; +  return fromRep(result);  }  #endif diff --git a/lib/builtins/floatundixf.c b/lib/builtins/floatundixf.c index ca5e06d64dcd..85264adac197 100644 --- a/lib/builtins/floatundixf.c +++ b/lib/builtins/floatundixf.c @@ -1,42 +1,37 @@ -/* ===-- floatundixf.c - Implement __floatundixf ---------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floatundixf for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- floatundixf.c - Implement __floatundixf ---------------------------===// +// +// 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 implements __floatundixf for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #if !_ARCH_PPC  #include "int_lib.h" -/* Returns: convert a to a long double, rounding toward even. */ +// Returns: convert a to a long double, rounding toward even. -/* Assumption: long double is a IEEE 80 bit floating point type padded to 128 bits - *             du_int is a 64 bit integral type - */ +// Assumption: long double is a IEEE 80 bit floating point type padded to 128 +// bits du_int is a 64 bit integral type -/* gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | - * 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ -COMPILER_RT_ABI long double -__floatundixf(du_int a) -{ -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(du_int) * CHAR_BIT; -    int clz = __builtin_clzll(a); -    int e = (N - 1) - clz ;    /* exponent */ -    long_double_bits fb; -    fb.u.high.s.low = (e + 16383);              /* exponent */ -    fb.u.low.all = a << clz;                   /* mantissa */ -    return fb.f; +// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee +// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm +COMPILER_RT_ABI long double __floatundixf(du_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(du_int) * CHAR_BIT; +  int clz = __builtin_clzll(a); +  int e = (N - 1) - clz; // exponent +  long_double_bits fb; +  fb.u.high.s.low = (e + 16383); // exponent +  fb.u.low.all = a << clz;       // mantissa +  return fb.f;  } -#endif /* _ARCH_PPC */ +#endif // _ARCH_PPC diff --git a/lib/builtins/floatunsidf.c b/lib/builtins/floatunsidf.c index 75cf6b9177df..2c01c3041434 100644 --- a/lib/builtins/floatunsidf.c +++ b/lib/builtins/floatunsidf.c @@ -1,9 +1,8 @@  //===-- lib/floatunsidf.c - uint -> double-precision conversion ---*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -18,33 +17,31 @@  #include "int_lib.h" -COMPILER_RT_ABI fp_t -__floatunsidf(unsigned int a) { -     -    const int aWidth = sizeof a * CHAR_BIT; -     -    // Handle zero as a special case to protect clz -    if (a == 0) return fromRep(0); -     -    // Exponent of (fp_t)a is the width of abs(a). -    const int exponent = (aWidth - 1) - __builtin_clz(a); -    rep_t result; -     -    // Shift a into the significand field and clear the implicit bit. -    const int shift = significandBits - exponent; -    result = (rep_t)a << shift ^ implicitBit; -     -    // Insert the exponent -    result += (rep_t)(exponent + exponentBias) << significandBits; -    return fromRep(result); +COMPILER_RT_ABI fp_t __floatunsidf(unsigned int a) { + +  const int aWidth = sizeof a * CHAR_BIT; + +  // Handle zero as a special case to protect clz +  if (a == 0) +    return fromRep(0); + +  // Exponent of (fp_t)a is the width of abs(a). +  const int exponent = (aWidth - 1) - __builtin_clz(a); +  rep_t result; + +  // Shift a into the significand field and clear the implicit bit. +  const int shift = significandBits - exponent; +  result = (rep_t)a << shift ^ implicitBit; + +  // Insert the exponent +  result += (rep_t)(exponent + exponentBias) << significandBits; +  return fromRep(result);  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_ui2d(unsigned int a) { -  return __floatunsidf(a); -} +AEABI_RTABI fp_t __aeabi_ui2d(unsigned int a) { return __floatunsidf(a); }  #else -AEABI_RTABI fp_t __aeabi_ui2d(unsigned int a) COMPILER_RT_ALIAS(__floatunsidf); +COMPILER_RT_ALIAS(__floatunsidf, __aeabi_ui2d)  #endif  #endif diff --git a/lib/builtins/floatunsisf.c b/lib/builtins/floatunsisf.c index 29525ccedbbe..33a1b5ae2a63 100644 --- a/lib/builtins/floatunsisf.c +++ b/lib/builtins/floatunsisf.c @@ -1,9 +1,8 @@  //===-- lib/floatunsisf.c - uint -> single-precision conversion ---*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -18,41 +17,41 @@  #include "int_lib.h" -COMPILER_RT_ABI fp_t -__floatunsisf(unsigned int a) { -     -    const int aWidth = sizeof a * CHAR_BIT; -     -    // Handle zero as a special case to protect clz -    if (a == 0) return fromRep(0); -     -    // Exponent of (fp_t)a is the width of abs(a). -    const int exponent = (aWidth - 1) - __builtin_clz(a); -    rep_t result; -     -    // Shift a into the significand field, rounding if it is a right-shift -    if (exponent <= significandBits) { -        const int shift = significandBits - exponent; -        result = (rep_t)a << shift ^ implicitBit; -    } else { -        const int shift = exponent - significandBits; -        result = (rep_t)a >> shift ^ implicitBit; -        rep_t round = (rep_t)a << (typeWidth - shift); -        if (round > signBit) result++; -        if (round == signBit) result += result & 1; -    } -     -    // Insert the exponent -    result += (rep_t)(exponent + exponentBias) << significandBits; -    return fromRep(result); +COMPILER_RT_ABI fp_t __floatunsisf(unsigned int a) { + +  const int aWidth = sizeof a * CHAR_BIT; + +  // Handle zero as a special case to protect clz +  if (a == 0) +    return fromRep(0); + +  // Exponent of (fp_t)a is the width of abs(a). +  const int exponent = (aWidth - 1) - __builtin_clz(a); +  rep_t result; + +  // Shift a into the significand field, rounding if it is a right-shift +  if (exponent <= significandBits) { +    const int shift = significandBits - exponent; +    result = (rep_t)a << shift ^ implicitBit; +  } else { +    const int shift = exponent - significandBits; +    result = (rep_t)a >> shift ^ implicitBit; +    rep_t round = (rep_t)a << (typeWidth - shift); +    if (round > signBit) +      result++; +    if (round == signBit) +      result += result & 1; +  } + +  // Insert the exponent +  result += (rep_t)(exponent + exponentBias) << significandBits; +  return fromRep(result);  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_ui2f(unsigned int a) { -  return __floatunsisf(a); -} +AEABI_RTABI fp_t __aeabi_ui2f(unsigned int a) { return __floatunsisf(a); }  #else -AEABI_RTABI fp_t __aeabi_ui2f(unsigned int a) COMPILER_RT_ALIAS(__floatunsisf); +COMPILER_RT_ALIAS(__floatunsisf, __aeabi_ui2f)  #endif  #endif diff --git a/lib/builtins/floatunsitf.c b/lib/builtins/floatunsitf.c index 1cd1842e709a..a4bf0f65fe1c 100644 --- a/lib/builtins/floatunsitf.c +++ b/lib/builtins/floatunsitf.c @@ -1,9 +1,8 @@  //===-- lib/floatunsitf.c - uint -> quad-precision conversion -----*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -19,22 +18,23 @@  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT)  COMPILER_RT_ABI fp_t __floatunsitf(unsigned int a) { -    const int aWidth = sizeof a * CHAR_BIT; +  const int aWidth = sizeof a * CHAR_BIT; -    // Handle zero as a special case to protect clz -    if (a == 0) return fromRep(0); +  // Handle zero as a special case to protect clz +  if (a == 0) +    return fromRep(0); -    // Exponent of (fp_t)a is the width of abs(a). -    const int exponent = (aWidth - 1) - __builtin_clz(a); -    rep_t result; +  // Exponent of (fp_t)a is the width of abs(a). +  const int exponent = (aWidth - 1) - __builtin_clz(a); +  rep_t result; -    // Shift a into the significand field and clear the implicit bit. -    const int shift = significandBits - exponent; -    result = (rep_t)a << shift ^ implicitBit; +  // Shift a into the significand field and clear the implicit bit. +  const int shift = significandBits - exponent; +  result = (rep_t)a << shift ^ implicitBit; -    // Insert the exponent -    result += (rep_t)(exponent + exponentBias) << significandBits; -    return fromRep(result); +  // Insert the exponent +  result += (rep_t)(exponent + exponentBias) << significandBits; +  return fromRep(result);  }  #endif diff --git a/lib/builtins/floatuntidf.c b/lib/builtins/floatuntidf.c index 960265d80772..e69e65c1ace4 100644 --- a/lib/builtins/floatuntidf.c +++ b/lib/builtins/floatuntidf.c @@ -1,80 +1,70 @@ -/* ===-- floatuntidf.c - Implement __floatuntidf ---------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floatuntidf for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- floatuntidf.c - Implement __floatuntidf ---------------------------===// +// +// 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 implements __floatuntidf for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: convert a to a double, rounding toward even. */ +// Returns: convert a to a double, rounding toward even. -/* Assumption: double is a IEEE 64 bit floating point type - *             tu_int is a 128 bit integral type - */ +// Assumption: double is a IEEE 64 bit floating point type +//             tu_int is a 128 bit integral type -/* seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm */ +// seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm +// mmmm -COMPILER_RT_ABI double -__floatuntidf(tu_int a) -{ -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(tu_int) * CHAR_BIT; -    int sd = N - __clzti2(a);  /* number of significant digits */ -    int e = sd - 1;             /* exponent */ -    if (sd > DBL_MANT_DIG) -    { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                                12345678901234567890123456 -         *  1 = msb 1 bit -         *  P = bit DBL_MANT_DIG-1 bits to the right of 1 -         *  Q = bit DBL_MANT_DIG bits to the right of 1 -         *  R = "or" of all bits to the right of Q -         */ -        switch (sd) -        { -        case DBL_MANT_DIG + 1: -            a <<= 1; -            break; -        case DBL_MANT_DIG + 2: -            break; -        default: -            a = (a >> (sd - (DBL_MANT_DIG+2))) | -                ((a & ((tu_int)(-1) >> ((N + DBL_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits */ -        if (a & ((tu_int)1 << DBL_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to DBL_MANT_DIG bits */ +COMPILER_RT_ABI double __floatuntidf(tu_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(tu_int) * CHAR_BIT; +  int sd = N - __clzti2(a); // number of significant digits +  int e = sd - 1;           // exponent +  if (sd > DBL_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit DBL_MANT_DIG-1 bits to the right of 1 +    //  Q = bit DBL_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case DBL_MANT_DIG + 1: +      a <<= 1; +      break; +    case DBL_MANT_DIG + 2: +      break; +    default: +      a = (a >> (sd - (DBL_MANT_DIG + 2))) | +          ((a & ((tu_int)(-1) >> ((N + DBL_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits +    if (a & ((tu_int)1 << DBL_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (DBL_MANT_DIG - sd); -        /* a is now rounded to DBL_MANT_DIG bits */ -    } -    double_bits fb; -    fb.u.s.high = ((e + 1023) << 20)      |        /* exponent */ -                ((su_int)(a >> 32) & 0x000FFFFF); /* mantissa-high */ -    fb.u.s.low = (su_int)a;                         /* mantissa-low */ -    return fb.f; +    // a is now rounded to DBL_MANT_DIG bits +  } else { +    a <<= (DBL_MANT_DIG - sd); +    // a is now rounded to DBL_MANT_DIG bits +  } +  double_bits fb; +  fb.u.s.high = ((e + 1023) << 20) |              // exponent +                ((su_int)(a >> 32) & 0x000FFFFF); // mantissa-high +  fb.u.s.low = (su_int)a;                         // mantissa-low +  return fb.f;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/floatuntisf.c b/lib/builtins/floatuntisf.c index c0dd0275ddba..9dec0ab5c58f 100644 --- a/lib/builtins/floatuntisf.c +++ b/lib/builtins/floatuntisf.c @@ -1,79 +1,68 @@ -/* ===-- floatuntisf.c - Implement __floatuntisf ---------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floatuntisf for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- floatuntisf.c - Implement __floatuntisf ---------------------------===// +// +// 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 implements __floatuntisf for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: convert a to a float, rounding toward even. */ +// Returns: convert a to a float, rounding toward even. -/* Assumption: float is a IEEE 32 bit floating point type  - *             tu_int is a 128 bit integral type - */ +// Assumption: float is a IEEE 32 bit floating point type +//             tu_int is a 128 bit integral type -/* seee eeee emmm mmmm mmmm mmmm mmmm mmmm */ +// seee eeee emmm mmmm mmmm mmmm mmmm mmmm -COMPILER_RT_ABI float -__floatuntisf(tu_int a) -{ -    if (a == 0) -        return 0.0F; -    const unsigned N = sizeof(tu_int) * CHAR_BIT; -    int sd = N - __clzti2(a);  /* number of significant digits */ -    int e = sd - 1;             /* exponent */ -    if (sd > FLT_MANT_DIG) -    { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                                12345678901234567890123456 -         *  1 = msb 1 bit -         *  P = bit FLT_MANT_DIG-1 bits to the right of 1 -         *  Q = bit FLT_MANT_DIG bits to the right of 1 -         *  R = "or" of all bits to the right of Q -	 */ -        switch (sd) -        { -        case FLT_MANT_DIG + 1: -            a <<= 1; -            break; -        case FLT_MANT_DIG + 2: -            break; -        default: -            a = (a >> (sd - (FLT_MANT_DIG+2))) | -                ((a & ((tu_int)(-1) >> ((N + FLT_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to FLT_MANT_DIG or FLT_MANT_DIG+1 bits */ -        if (a & ((tu_int)1 << FLT_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to FLT_MANT_DIG bits */ +COMPILER_RT_ABI float __floatuntisf(tu_int a) { +  if (a == 0) +    return 0.0F; +  const unsigned N = sizeof(tu_int) * CHAR_BIT; +  int sd = N - __clzti2(a); // number of significant digits +  int e = sd - 1;           // exponent +  if (sd > FLT_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit FLT_MANT_DIG-1 bits to the right of 1 +    //  Q = bit FLT_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case FLT_MANT_DIG + 1: +      a <<= 1; +      break; +    case FLT_MANT_DIG + 2: +      break; +    default: +      a = (a >> (sd - (FLT_MANT_DIG + 2))) | +          ((a & ((tu_int)(-1) >> ((N + FLT_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to FLT_MANT_DIG or FLT_MANT_DIG+1 bits +    if (a & ((tu_int)1 << FLT_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (FLT_MANT_DIG - sd); -        /* a is now rounded to FLT_MANT_DIG bits */ -    } -    float_bits fb; -    fb.u = ((e + 127) << 23)       |  /* exponent */ -           ((su_int)a & 0x007FFFFF);  /* mantissa */ -    return fb.f; +    // a is now rounded to FLT_MANT_DIG bits +  } else { +    a <<= (FLT_MANT_DIG - sd); +    // a is now rounded to FLT_MANT_DIG bits +  } +  float_bits fb; +  fb.u = ((e + 127) << 23) |       // exponent +         ((su_int)a & 0x007FFFFF); // mantissa +  return fb.f;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/floatuntitf.c b/lib/builtins/floatuntitf.c index e2518c93f234..d308d3118d03 100644 --- a/lib/builtins/floatuntitf.c +++ b/lib/builtins/floatuntitf.c @@ -1,9 +1,8 @@  //===-- lib/floatuntitf.c - uint128 -> quad-precision conversion --*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -17,63 +16,60 @@  #include "fp_lib.h"  #include "int_lib.h" -/* Returns: convert a tu_int to a fp_t, rounding toward even. */ +// Returns: convert a tu_int to a fp_t, rounding toward even. -/* Assumption: fp_t is a IEEE 128 bit floating point type - *             tu_int is a 128 bit integral type - */ +// Assumption: fp_t is a IEEE 128 bit floating point type +//             tu_int is a 128 bit integral type -/* seee eeee eeee eeee mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | - * mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// seee eeee eeee eeee mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm +// mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT) -COMPILER_RT_ABI fp_t -__floatuntitf(tu_int a) { -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(tu_int) * CHAR_BIT; -    int sd = N - __clzti2(a);  /* number of significant digits */ -    int e = sd - 1;            /* exponent */ -    if (sd > LDBL_MANT_DIG) { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                                12345678901234567890123456 -         *  1 = msb 1 bit -         *  P = bit LDBL_MANT_DIG-1 bits to the right of 1 -         *  Q = bit LDBL_MANT_DIG bits to the right of 1 -         *  R = "or" of all bits to the right of Q -         */ -        switch (sd) { -        case LDBL_MANT_DIG + 1: -            a <<= 1; -            break; -        case LDBL_MANT_DIG + 2: -            break; -        default: -            a = (a >> (sd - (LDBL_MANT_DIG+2))) | -                ((a & ((tu_int)(-1) >> ((N + LDBL_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to LDBL_MANT_DIG or LDBL_MANT_DIG+1 bits */ -        if (a & ((tu_int)1 << LDBL_MANT_DIG)) { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to LDBL_MANT_DIG bits */ -    } else { -        a <<= (LDBL_MANT_DIG - sd); -        /* a is now rounded to LDBL_MANT_DIG bits */ +COMPILER_RT_ABI fp_t __floatuntitf(tu_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(tu_int) * CHAR_BIT; +  int sd = N - __clzti2(a); // number of significant digits +  int e = sd - 1;           // exponent +  if (sd > LDBL_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit LDBL_MANT_DIG-1 bits to the right of 1 +    //  Q = bit LDBL_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case LDBL_MANT_DIG + 1: +      a <<= 1; +      break; +    case LDBL_MANT_DIG + 2: +      break; +    default: +      a = (a >> (sd - (LDBL_MANT_DIG + 2))) | +          ((a & ((tu_int)(-1) >> ((N + LDBL_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to LDBL_MANT_DIG or LDBL_MANT_DIG+1 bits +    if (a & ((tu_int)1 << LDBL_MANT_DIG)) { +      a >>= 1; +      ++e;      } +    // a is now rounded to LDBL_MANT_DIG bits +  } else { +    a <<= (LDBL_MANT_DIG - sd); +    // a is now rounded to LDBL_MANT_DIG bits +  } -    long_double_bits fb; -    fb.u.high.all = (du_int)(e + 16383) << 48            /* exponent */ -                  | ((a >> 64) & 0x0000ffffffffffffLL);  /* significand */ -    fb.u.low.all = (du_int)(a); -    return fb.f; +  long_double_bits fb; +  fb.u.high.all = (du_int)(e + 16383) << 48             // exponent +                  | ((a >> 64) & 0x0000ffffffffffffLL); // significand +  fb.u.low.all = (du_int)(a); +  return fb.f;  }  #endif diff --git a/lib/builtins/floatuntixf.c b/lib/builtins/floatuntixf.c index ea81cb1bcdae..efd8a27a0875 100644 --- a/lib/builtins/floatuntixf.c +++ b/lib/builtins/floatuntixf.c @@ -1,81 +1,70 @@ -/* ===-- floatuntixf.c - Implement __floatuntixf ---------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __floatuntixf for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- floatuntixf.c - Implement __floatuntixf ---------------------------===// +// +// 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 implements __floatuntixf for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: convert a to a long double, rounding toward even. */ +// Returns: convert a to a long double, rounding toward even. -/* Assumption: long double is a IEEE 80 bit floating point type padded to 128 bits - *             tu_int is a 128 bit integral type - */ +// Assumption: long double is a IEEE 80 bit floating point type padded to 128 +// bits tu_int is a 128 bit integral type -/* gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | - * 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm - */ +// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee +// eeee | 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm +// mmmm mmmm mmmm -COMPILER_RT_ABI long double -__floatuntixf(tu_int a) -{ -    if (a == 0) -        return 0.0; -    const unsigned N = sizeof(tu_int) * CHAR_BIT; -    int sd = N - __clzti2(a);  /* number of significant digits */ -    int e = sd - 1;             /* exponent */ -    if (sd > LDBL_MANT_DIG) -    { -        /*  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx -         *  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR -         *                                                12345678901234567890123456 -         *  1 = msb 1 bit -         *  P = bit LDBL_MANT_DIG-1 bits to the right of 1 -         *  Q = bit LDBL_MANT_DIG bits to the right of 1 -         *  R = "or" of all bits to the right of Q -	 */ -        switch (sd) -        { -        case LDBL_MANT_DIG + 1: -            a <<= 1; -            break; -        case LDBL_MANT_DIG + 2: -            break; -        default: -            a = (a >> (sd - (LDBL_MANT_DIG+2))) | -                ((a & ((tu_int)(-1) >> ((N + LDBL_MANT_DIG+2) - sd))) != 0); -        }; -        /* finish: */ -        a |= (a & 4) != 0;  /* Or P into R */ -        ++a;  /* round - this step may add a significant bit */ -        a >>= 2;  /* dump Q and R */ -        /* a is now rounded to LDBL_MANT_DIG or LDBL_MANT_DIG+1 bits */ -        if (a & ((tu_int)1 << LDBL_MANT_DIG)) -        { -            a >>= 1; -            ++e; -        } -        /* a is now rounded to LDBL_MANT_DIG bits */ +COMPILER_RT_ABI long double __floatuntixf(tu_int a) { +  if (a == 0) +    return 0.0; +  const unsigned N = sizeof(tu_int) * CHAR_BIT; +  int sd = N - __clzti2(a); // number of significant digits +  int e = sd - 1;           // exponent +  if (sd > LDBL_MANT_DIG) { +    //  start:  0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx +    //  finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR +    //                                                12345678901234567890123456 +    //  1 = msb 1 bit +    //  P = bit LDBL_MANT_DIG-1 bits to the right of 1 +    //  Q = bit LDBL_MANT_DIG bits to the right of 1 +    //  R = "or" of all bits to the right of Q +    switch (sd) { +    case LDBL_MANT_DIG + 1: +      a <<= 1; +      break; +    case LDBL_MANT_DIG + 2: +      break; +    default: +      a = (a >> (sd - (LDBL_MANT_DIG + 2))) | +          ((a & ((tu_int)(-1) >> ((N + LDBL_MANT_DIG + 2) - sd))) != 0); +    }; +    // finish: +    a |= (a & 4) != 0; // Or P into R +    ++a;               // round - this step may add a significant bit +    a >>= 2;           // dump Q and R +    // a is now rounded to LDBL_MANT_DIG or LDBL_MANT_DIG+1 bits +    if (a & ((tu_int)1 << LDBL_MANT_DIG)) { +      a >>= 1; +      ++e;      } -    else -    { -        a <<= (LDBL_MANT_DIG - sd); -        /* a is now rounded to LDBL_MANT_DIG bits */ -    } -    long_double_bits fb; -    fb.u.high.s.low = (e + 16383);                  /* exponent */ -    fb.u.low.all = (du_int)a;                     /* mantissa */ -    return fb.f; +    // a is now rounded to LDBL_MANT_DIG bits +  } else { +    a <<= (LDBL_MANT_DIG - sd); +    // a is now rounded to LDBL_MANT_DIG bits +  } +  long_double_bits fb; +  fb.u.high.s.low = (e + 16383); // exponent +  fb.u.low.all = (du_int)a;      // mantissa +  return fb.f;  }  #endif diff --git a/lib/builtins/fp_add_impl.inc b/lib/builtins/fp_add_impl.inc index b47be1b648e6..da8639341703 100644 --- a/lib/builtins/fp_add_impl.inc +++ b/lib/builtins/fp_add_impl.inc @@ -1,9 +1,8 @@  //===----- lib/fp_add_impl.inc - floaing point addition -----------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -15,130 +14,144 @@  #include "fp_lib.h"  static __inline fp_t __addXf3__(fp_t a, fp_t b) { -    rep_t aRep = toRep(a); -    rep_t bRep = toRep(b); -    const rep_t aAbs = aRep & absMask; -    const rep_t bAbs = bRep & absMask; - -    // Detect if a or b is zero, infinity, or NaN. -    if (aAbs - REP_C(1) >= infRep - REP_C(1) || -        bAbs - REP_C(1) >= infRep - REP_C(1)) { -        // NaN + anything = qNaN -        if (aAbs > infRep) return fromRep(toRep(a) | quietBit); -        // anything + NaN = qNaN -        if (bAbs > infRep) return fromRep(toRep(b) | quietBit); - -        if (aAbs == infRep) { -            // +/-infinity + -/+infinity = qNaN -            if ((toRep(a) ^ toRep(b)) == signBit) return fromRep(qnanRep); -            // +/-infinity + anything remaining = +/- infinity -            else return a; -        } - -        // anything remaining + +/-infinity = +/-infinity -        if (bAbs == infRep) return b; - -        // zero + anything = anything -        if (!aAbs) { -            // but we need to get the sign right for zero + zero -            if (!bAbs) return fromRep(toRep(a) & toRep(b)); -            else return b; -        } - -        // anything + zero = anything -        if (!bAbs) return a; +  rep_t aRep = toRep(a); +  rep_t bRep = toRep(b); +  const rep_t aAbs = aRep & absMask; +  const rep_t bAbs = bRep & absMask; + +  // Detect if a or b is zero, infinity, or NaN. +  if (aAbs - REP_C(1) >= infRep - REP_C(1) || +      bAbs - REP_C(1) >= infRep - REP_C(1)) { +    // NaN + anything = qNaN +    if (aAbs > infRep) +      return fromRep(toRep(a) | quietBit); +    // anything + NaN = qNaN +    if (bAbs > infRep) +      return fromRep(toRep(b) | quietBit); + +    if (aAbs == infRep) { +      // +/-infinity + -/+infinity = qNaN +      if ((toRep(a) ^ toRep(b)) == signBit) +        return fromRep(qnanRep); +      // +/-infinity + anything remaining = +/- infinity +      else +        return a;      } -    // Swap a and b if necessary so that a has the larger absolute value. -    if (bAbs > aAbs) { -        const rep_t temp = aRep; -        aRep = bRep; -        bRep = temp; +    // anything remaining + +/-infinity = +/-infinity +    if (bAbs == infRep) +      return b; + +    // zero + anything = anything +    if (!aAbs) { +      // We need to get the sign right for zero + zero. +      if (!bAbs) +        return fromRep(toRep(a) & toRep(b)); +      else +        return b;      } -    // Extract the exponent and significand from the (possibly swapped) a and b. -    int aExponent = aRep >> significandBits & maxExponent; -    int bExponent = bRep >> significandBits & maxExponent; -    rep_t aSignificand = aRep & significandMask; -    rep_t bSignificand = bRep & significandMask; - -    // Normalize any denormals, and adjust the exponent accordingly. -    if (aExponent == 0) aExponent = normalize(&aSignificand); -    if (bExponent == 0) bExponent = normalize(&bSignificand); - -    // The sign of the result is the sign of the larger operand, a.  If they -    // have opposite signs, we are performing a subtraction; otherwise addition. -    const rep_t resultSign = aRep & signBit; -    const bool subtraction = (aRep ^ bRep) & signBit; - -    // Shift the significands to give us round, guard and sticky, and or in the -    // implicit significand bit.  (If we fell through from the denormal path it -    // was already set by normalize( ), but setting it twice won't hurt -    // anything.) -    aSignificand = (aSignificand | implicitBit) << 3; -    bSignificand = (bSignificand | implicitBit) << 3; - -    // Shift the significand of b by the difference in exponents, with a sticky -    // bottom bit to get rounding correct. -    const unsigned int align = aExponent - bExponent; -    if (align) { -        if (align < typeWidth) { -            const bool sticky = bSignificand << (typeWidth - align); -            bSignificand = bSignificand >> align | sticky; -        } else { -            bSignificand = 1; // sticky; b is known to be non-zero. -        } -    } -    if (subtraction) { -        aSignificand -= bSignificand; -        // If a == -b, return +zero. -        if (aSignificand == 0) return fromRep(0); - -        // If partial cancellation occured, we need to left-shift the result -        // and adjust the exponent: -        if (aSignificand < implicitBit << 3) { -            const int shift = rep_clz(aSignificand) - rep_clz(implicitBit << 3); -            aSignificand <<= shift; -            aExponent -= shift; -        } +    // anything + zero = anything +    if (!bAbs) +      return a; +  } + +  // Swap a and b if necessary so that a has the larger absolute value. +  if (bAbs > aAbs) { +    const rep_t temp = aRep; +    aRep = bRep; +    bRep = temp; +  } + +  // Extract the exponent and significand from the (possibly swapped) a and b. +  int aExponent = aRep >> significandBits & maxExponent; +  int bExponent = bRep >> significandBits & maxExponent; +  rep_t aSignificand = aRep & significandMask; +  rep_t bSignificand = bRep & significandMask; + +  // Normalize any denormals, and adjust the exponent accordingly. +  if (aExponent == 0) +    aExponent = normalize(&aSignificand); +  if (bExponent == 0) +    bExponent = normalize(&bSignificand); + +  // The sign of the result is the sign of the larger operand, a.  If they +  // have opposite signs, we are performing a subtraction.  Otherwise, we +  // perform addition. +  const rep_t resultSign = aRep & signBit; +  const bool subtraction = (aRep ^ bRep) & signBit; + +  // Shift the significands to give us round, guard and sticky, and set the +  // implicit significand bit.  If we fell through from the denormal path it +  // was already set by normalize( ), but setting it twice won't hurt +  // anything. +  aSignificand = (aSignificand | implicitBit) << 3; +  bSignificand = (bSignificand | implicitBit) << 3; + +  // Shift the significand of b by the difference in exponents, with a sticky +  // bottom bit to get rounding correct. +  const unsigned int align = aExponent - bExponent; +  if (align) { +    if (align < typeWidth) { +      const bool sticky = bSignificand << (typeWidth - align); +      bSignificand = bSignificand >> align | sticky; +    } else { +      bSignificand = 1; // Set the sticky bit.  b is known to be non-zero.      } -    else /* addition */ { -        aSignificand += bSignificand; - -        // If the addition carried up, we need to right-shift the result and -        // adjust the exponent: -        if (aSignificand & implicitBit << 4) { -            const bool sticky = aSignificand & 1; -            aSignificand = aSignificand >> 1 | sticky; -            aExponent += 1; -        } +  } +  if (subtraction) { +    aSignificand -= bSignificand; +    // If a == -b, return +zero. +    if (aSignificand == 0) +      return fromRep(0); + +    // If partial cancellation occured, we need to left-shift the result +    // and adjust the exponent. +    if (aSignificand < implicitBit << 3) { +      const int shift = rep_clz(aSignificand) - rep_clz(implicitBit << 3); +      aSignificand <<= shift; +      aExponent -= shift;      } - -    // If we have overflowed the type, return +/- infinity: -    if (aExponent >= maxExponent) return fromRep(infRep | resultSign); - -    if (aExponent <= 0) { -        // Result is denormal before rounding; the exponent is zero and we -        // need to shift the significand. -        const int shift = 1 - aExponent; -        const bool sticky = aSignificand << (typeWidth - shift); -        aSignificand = aSignificand >> shift | sticky; -        aExponent = 0; +  } else /* addition */ { +    aSignificand += bSignificand; + +    // If the addition carried up, we need to right-shift the result and +    // adjust the exponent. +    if (aSignificand & implicitBit << 4) { +      const bool sticky = aSignificand & 1; +      aSignificand = aSignificand >> 1 | sticky; +      aExponent += 1;      } - -    // Low three bits are round, guard, and sticky. -    const int roundGuardSticky = aSignificand & 0x7; - -    // Shift the significand into place, and mask off the implicit bit. -    rep_t result = aSignificand >> 3 & significandMask; - -    // Insert the exponent and sign. -    result |= (rep_t)aExponent << significandBits; -    result |= resultSign; - -    // Final rounding.  The result may overflow to infinity, but that is the -    // correct result in that case. -    if (roundGuardSticky > 0x4) result++; -    if (roundGuardSticky == 0x4) result += result & 1; -    return fromRep(result); +  } + +  // If we have overflowed the type, return +/- infinity. +  if (aExponent >= maxExponent) +    return fromRep(infRep | resultSign); + +  if (aExponent <= 0) { +    // The result is denormal before rounding.  The exponent is zero and we +    // need to shift the significand. +    const int shift = 1 - aExponent; +    const bool sticky = aSignificand << (typeWidth - shift); +    aSignificand = aSignificand >> shift | sticky; +    aExponent = 0; +  } + +  // Low three bits are round, guard, and sticky. +  const int roundGuardSticky = aSignificand & 0x7; + +  // Shift the significand into place, and mask off the implicit bit. +  rep_t result = aSignificand >> 3 & significandMask; + +  // Insert the exponent and sign. +  result |= (rep_t)aExponent << significandBits; +  result |= resultSign; + +  // Perform the final rounding.  The result may overflow to infinity, but +  // that is the correct result in that case. +  if (roundGuardSticky > 0x4) +    result++; +  if (roundGuardSticky == 0x4) +    result += result & 1; +  return fromRep(result);  } diff --git a/lib/builtins/fp_extend.h b/lib/builtins/fp_extend.h index 6d95a0680709..d2083c426722 100644 --- a/lib/builtins/fp_extend.h +++ b/lib/builtins/fp_extend.h @@ -1,9 +1,9 @@ -//===-lib/fp_extend.h - low precision -> high precision conversion -*- C -*-===// +//===-lib/fp_extend.h - low precision -> high precision conversion -*- C +//-*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -30,12 +30,12 @@ typedef uint64_t src_rep_t;  static const int srcSigBits = 52;  static __inline int src_rep_t_clz(src_rep_t a) {  #if defined __LP64__ -    return __builtin_clzl(a); +  return __builtin_clzl(a);  #else -    if (a & REP_C(0xffffffff00000000)) -        return __builtin_clz(a >> 32); -    else -        return 32 + __builtin_clz(a & REP_C(0xffffffff)); +  if (a & REP_C(0xffffffff00000000)) +    return __builtin_clz(a >> 32); +  else +    return 32 + __builtin_clz(a & REP_C(0xffffffff));  #endif  } @@ -48,7 +48,7 @@ static const int srcSigBits = 10;  #else  #error Source should be half, single, or double precision! -#endif //end source precision +#endif // end source precision  #if defined DST_SINGLE  typedef float dst_t; @@ -70,20 +70,26 @@ static const int dstSigBits = 112;  #else  #error Destination should be single, double, or quad precision! -#endif //end destination precision +#endif // end destination precision  // End of specialization parameters.  Two helper routines for conversion to and  // from the representation of floating-point data as integer values follow.  static __inline src_rep_t srcToRep(src_t x) { -    const union { src_t f; src_rep_t i; } rep = {.f = x}; -    return rep.i; +  const union { +    src_t f; +    src_rep_t i; +  } rep = {.f = x}; +  return rep.i;  }  static __inline dst_t dstFromRep(dst_rep_t x) { -    const union { dst_t f; dst_rep_t i; } rep = {.i = x}; -    return rep.f; +  const union { +    dst_t f; +    dst_rep_t i; +  } rep = {.i = x}; +  return rep.f;  }  // End helper routines.  Conversion implementation follows. -#endif //FP_EXTEND_HEADER +#endif // FP_EXTEND_HEADER diff --git a/lib/builtins/fp_extend_impl.inc b/lib/builtins/fp_extend_impl.inc index b785cc7687ad..d1c9c02a00c5 100644 --- a/lib/builtins/fp_extend_impl.inc +++ b/lib/builtins/fp_extend_impl.inc @@ -1,9 +1,8 @@  //=-lib/fp_extend_impl.inc - low precision -> high precision conversion -*-- -//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -28,81 +27,81 @@  //  // Finally, the following assumptions are made:  // -// 1. floating-point types and integer types have the same endianness on the -//    target platform +// 1. Floating-point types and integer types have the same endianness on the +//    target platform.  // -// 2. quiet NaNs, if supported, are indicated by the leading bit of the -//    significand field being set +// 2. Quiet NaNs, if supported, are indicated by the leading bit of the +//    significand field being set.  //  //===----------------------------------------------------------------------===//  #include "fp_extend.h"  static __inline dst_t __extendXfYf2__(src_t a) { -    // Various constants whose values follow from the type parameters. -    // Any reasonable optimizer will fold and propagate all of these. -    const int srcBits = sizeof(src_t)*CHAR_BIT; -    const int srcExpBits = srcBits - srcSigBits - 1; -    const int srcInfExp = (1 << srcExpBits) - 1; -    const int srcExpBias = srcInfExp >> 1; +  // Various constants whose values follow from the type parameters. +  // Any reasonable optimizer will fold and propagate all of these. +  const int srcBits = sizeof(src_t) * CHAR_BIT; +  const int srcExpBits = srcBits - srcSigBits - 1; +  const int srcInfExp = (1 << srcExpBits) - 1; +  const int srcExpBias = srcInfExp >> 1; -    const src_rep_t srcMinNormal = SRC_REP_C(1) << srcSigBits; -    const src_rep_t srcInfinity = (src_rep_t)srcInfExp << srcSigBits; -    const src_rep_t srcSignMask = SRC_REP_C(1) << (srcSigBits + srcExpBits); -    const src_rep_t srcAbsMask = srcSignMask - 1; -    const src_rep_t srcQNaN = SRC_REP_C(1) << (srcSigBits - 1); -    const src_rep_t srcNaNCode = srcQNaN - 1; +  const src_rep_t srcMinNormal = SRC_REP_C(1) << srcSigBits; +  const src_rep_t srcInfinity = (src_rep_t)srcInfExp << srcSigBits; +  const src_rep_t srcSignMask = SRC_REP_C(1) << (srcSigBits + srcExpBits); +  const src_rep_t srcAbsMask = srcSignMask - 1; +  const src_rep_t srcQNaN = SRC_REP_C(1) << (srcSigBits - 1); +  const src_rep_t srcNaNCode = srcQNaN - 1; -    const int dstBits = sizeof(dst_t)*CHAR_BIT; -    const int dstExpBits = dstBits - dstSigBits - 1; -    const int dstInfExp = (1 << dstExpBits) - 1; -    const int dstExpBias = dstInfExp >> 1; +  const int dstBits = sizeof(dst_t) * CHAR_BIT; +  const int dstExpBits = dstBits - dstSigBits - 1; +  const int dstInfExp = (1 << dstExpBits) - 1; +  const int dstExpBias = dstInfExp >> 1; -    const dst_rep_t dstMinNormal = DST_REP_C(1) << dstSigBits; +  const dst_rep_t dstMinNormal = DST_REP_C(1) << dstSigBits; -    // Break a into a sign and representation of the absolute value -    const src_rep_t aRep = srcToRep(a); -    const src_rep_t aAbs = aRep & srcAbsMask; -    const src_rep_t sign = aRep & srcSignMask; -    dst_rep_t absResult; +  // Break a into a sign and representation of the absolute value. +  const src_rep_t aRep = srcToRep(a); +  const src_rep_t aAbs = aRep & srcAbsMask; +  const src_rep_t sign = aRep & srcSignMask; +  dst_rep_t absResult; -    // If sizeof(src_rep_t) < sizeof(int), the subtraction result is promoted -    // to (signed) int.  To avoid that, explicitly cast to src_rep_t. -    if ((src_rep_t)(aAbs - srcMinNormal) < srcInfinity - srcMinNormal) { -        // a is a normal number. -        // Extend to the destination type by shifting the significand and -        // exponent into the proper position and rebiasing the exponent. -        absResult = (dst_rep_t)aAbs << (dstSigBits - srcSigBits); -        absResult += (dst_rep_t)(dstExpBias - srcExpBias) << dstSigBits; -    } +  // If sizeof(src_rep_t) < sizeof(int), the subtraction result is promoted +  // to (signed) int.  To avoid that, explicitly cast to src_rep_t. +  if ((src_rep_t)(aAbs - srcMinNormal) < srcInfinity - srcMinNormal) { +    // a is a normal number. +    // Extend to the destination type by shifting the significand and +    // exponent into the proper position and rebiasing the exponent. +    absResult = (dst_rep_t)aAbs << (dstSigBits - srcSigBits); +    absResult += (dst_rep_t)(dstExpBias - srcExpBias) << dstSigBits; +  } -    else if (aAbs >= srcInfinity) { -        // a is NaN or infinity. -        // Conjure the result by beginning with infinity, then setting the qNaN -        // bit (if needed) and right-aligning the rest of the trailing NaN -        // payload field. -        absResult = (dst_rep_t)dstInfExp << dstSigBits; -        absResult |= (dst_rep_t)(aAbs & srcQNaN) << (dstSigBits - srcSigBits); -        absResult |= (dst_rep_t)(aAbs & srcNaNCode) << (dstSigBits - srcSigBits); -    } +  else if (aAbs >= srcInfinity) { +    // a is NaN or infinity. +    // Conjure the result by beginning with infinity, then setting the qNaN +    // bit (if needed) and right-aligning the rest of the trailing NaN +    // payload field. +    absResult = (dst_rep_t)dstInfExp << dstSigBits; +    absResult |= (dst_rep_t)(aAbs & srcQNaN) << (dstSigBits - srcSigBits); +    absResult |= (dst_rep_t)(aAbs & srcNaNCode) << (dstSigBits - srcSigBits); +  } -    else if (aAbs) { -        // a is denormal. -        // renormalize the significand and clear the leading bit, then insert -        // the correct adjusted exponent in the destination type. -        const int scale = src_rep_t_clz(aAbs) - src_rep_t_clz(srcMinNormal); -        absResult = (dst_rep_t)aAbs << (dstSigBits - srcSigBits + scale); -        absResult ^= dstMinNormal; -        const int resultExponent = dstExpBias - srcExpBias - scale + 1; -        absResult |= (dst_rep_t)resultExponent << dstSigBits; -    } +  else if (aAbs) { +    // a is denormal. +    // renormalize the significand and clear the leading bit, then insert +    // the correct adjusted exponent in the destination type. +    const int scale = src_rep_t_clz(aAbs) - src_rep_t_clz(srcMinNormal); +    absResult = (dst_rep_t)aAbs << (dstSigBits - srcSigBits + scale); +    absResult ^= dstMinNormal; +    const int resultExponent = dstExpBias - srcExpBias - scale + 1; +    absResult |= (dst_rep_t)resultExponent << dstSigBits; +  } -    else { -        // a is zero. -        absResult = 0; -    } +  else { +    // a is zero. +    absResult = 0; +  } -    // Apply the signbit to (dst_t)abs(a). -    const dst_rep_t result = absResult | (dst_rep_t)sign << (dstBits - srcBits); -    return dstFromRep(result); +  // Apply the signbit to the absolute value. +  const dst_rep_t result = absResult | (dst_rep_t)sign << (dstBits - srcBits); +  return dstFromRep(result);  } diff --git a/lib/builtins/fp_fixint_impl.inc b/lib/builtins/fp_fixint_impl.inc index da70d4d39301..2196d712f05f 100644 --- a/lib/builtins/fp_fixint_impl.inc +++ b/lib/builtins/fp_fixint_impl.inc @@ -1,9 +1,8 @@  //===-- lib/fixdfsi.c - Double-precision -> integer conversion ----*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -15,27 +14,27 @@  #include "fp_lib.h"  static __inline fixint_t __fixint(fp_t a) { -    const fixint_t fixint_max = (fixint_t)((~(fixuint_t)0) / 2); -    const fixint_t fixint_min = -fixint_max - 1; -    // Break a into sign, exponent, significand -    const rep_t aRep = toRep(a); -    const rep_t aAbs = aRep & absMask; -    const fixint_t sign = aRep & signBit ? -1 : 1; -    const int exponent = (aAbs >> significandBits) - exponentBias; -    const rep_t significand = (aAbs & significandMask) | implicitBit; +  const fixint_t fixint_max = (fixint_t)((~(fixuint_t)0) / 2); +  const fixint_t fixint_min = -fixint_max - 1; +  // Break a into sign, exponent, significand parts. +  const rep_t aRep = toRep(a); +  const rep_t aAbs = aRep & absMask; +  const fixint_t sign = aRep & signBit ? -1 : 1; +  const int exponent = (aAbs >> significandBits) - exponentBias; +  const rep_t significand = (aAbs & significandMask) | implicitBit; -    // If exponent is negative, the result is zero. -    if (exponent < 0) -        return 0; +  // If exponent is negative, the result is zero. +  if (exponent < 0) +    return 0; -    // If the value is too large for the integer type, saturate. -    if ((unsigned)exponent >= sizeof(fixint_t) * CHAR_BIT) -        return sign == 1 ? fixint_max : fixint_min; +  // If the value is too large for the integer type, saturate. +  if ((unsigned)exponent >= sizeof(fixint_t) * CHAR_BIT) +    return sign == 1 ? fixint_max : fixint_min; -    // If 0 <= exponent < significandBits, right shift to get the result. -    // Otherwise, shift left. -    if (exponent < significandBits) -        return sign * (significand >> (significandBits - exponent)); -    else -        return sign * ((fixint_t)significand << (exponent - significandBits)); +  // If 0 <= exponent < significandBits, right shift to get the result. +  // Otherwise, shift left. +  if (exponent < significandBits) +    return sign * (significand >> (significandBits - exponent)); +  else +    return sign * ((fixint_t)significand << (exponent - significandBits));  } diff --git a/lib/builtins/fp_fixuint_impl.inc b/lib/builtins/fp_fixuint_impl.inc index d68ccf27a79c..cb2bf54ffaf5 100644 --- a/lib/builtins/fp_fixuint_impl.inc +++ b/lib/builtins/fp_fixuint_impl.inc @@ -1,9 +1,8 @@  //===-- lib/fixdfsi.c - Double-precision -> integer conversion ----*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -15,25 +14,25 @@  #include "fp_lib.h"  static __inline fixuint_t __fixuint(fp_t a) { -    // Break a into sign, exponent, significand -    const rep_t aRep = toRep(a); -    const rep_t aAbs = aRep & absMask; -    const int sign = aRep & signBit ? -1 : 1; -    const int exponent = (aAbs >> significandBits) - exponentBias; -    const rep_t significand = (aAbs & significandMask) | implicitBit; +  // Break a into sign, exponent, significand parts. +  const rep_t aRep = toRep(a); +  const rep_t aAbs = aRep & absMask; +  const int sign = aRep & signBit ? -1 : 1; +  const int exponent = (aAbs >> significandBits) - exponentBias; +  const rep_t significand = (aAbs & significandMask) | implicitBit; -    // If either the value or the exponent is negative, the result is zero. -    if (sign == -1 || exponent < 0) -        return 0; +  // If either the value or the exponent is negative, the result is zero. +  if (sign == -1 || exponent < 0) +    return 0; -    // If the value is too large for the integer type, saturate. -    if ((unsigned)exponent >= sizeof(fixuint_t) * CHAR_BIT) -        return ~(fixuint_t)0; +  // If the value is too large for the integer type, saturate. +  if ((unsigned)exponent >= sizeof(fixuint_t) * CHAR_BIT) +    return ~(fixuint_t)0; -    // If 0 <= exponent < significandBits, right shift to get the result. -    // Otherwise, shift left. -    if (exponent < significandBits) -        return significand >> (significandBits - exponent); -    else -        return (fixuint_t)significand << (exponent - significandBits); +  // If 0 <= exponent < significandBits, right shift to get the result. +  // Otherwise, shift left. +  if (exponent < significandBits) +    return significand >> (significandBits - exponent); +  else +    return (fixuint_t)significand << (exponent - significandBits);  } diff --git a/lib/builtins/fp_lib.h b/lib/builtins/fp_lib.h index a0e19ab6a8f6..d1a988ea4713 100644 --- a/lib/builtins/fp_lib.h +++ b/lib/builtins/fp_lib.h @@ -1,9 +1,8 @@  //===-- lib/fp_lib.h - Floating-point utilities -------------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -21,22 +20,22 @@  #ifndef FP_LIB_HEADER  #define FP_LIB_HEADER -#include <stdint.h> -#include <stdbool.h> -#include <limits.h>  #include "int_lib.h"  #include "int_math.h" +#include <limits.h> +#include <stdbool.h> +#include <stdint.h>  // x86_64 FreeBSD prior v9.3 define fixed-width types incorrectly in  // 32-bit mode.  #if defined(__FreeBSD__) && defined(__i386__) -# include <sys/param.h> -# if __FreeBSD_version < 903000  // v9.3 -#  define uint64_t unsigned long long -#  define int64_t long long -#  undef UINT64_C -#  define UINT64_C(c) (c ## ULL) -# endif +#include <sys/param.h> +#if __FreeBSD_version < 903000 // v9.3 +#define uint64_t unsigned long long +#define int64_t long long +#undef UINT64_C +#define UINT64_C(c) (c##ULL) +#endif  #endif  #if defined SINGLE_PRECISION @@ -47,15 +46,13 @@ typedef float fp_t;  #define REP_C UINT32_C  #define significandBits 23 -static __inline int rep_clz(rep_t a) { -    return __builtin_clz(a); -} +static __inline int rep_clz(rep_t a) { return __builtin_clz(a); }  // 32x32 --> 64 bit multiply  static __inline void wideMultiply(rep_t a, rep_t b, rep_t *hi, rep_t *lo) { -    const uint64_t product = (uint64_t)a*b; -    *hi = product >> 32; -    *lo = product; +  const uint64_t product = (uint64_t)a * b; +  *hi = product >> 32; +  *lo = product;  }  COMPILER_RT_ABI fp_t __addsf3(fp_t a, fp_t b); @@ -69,12 +66,12 @@ typedef double fp_t;  static __inline int rep_clz(rep_t a) {  #if defined __LP64__ -    return __builtin_clzl(a); +  return __builtin_clzl(a);  #else -    if (a & REP_C(0xffffffff00000000)) -        return __builtin_clz(a >> 32); -    else -        return 32 + __builtin_clz(a & REP_C(0xffffffff)); +  if (a & REP_C(0xffffffff00000000)) +    return __builtin_clz(a >> 32); +  else +    return 32 + __builtin_clz(a & REP_C(0xffffffff));  #endif  } @@ -85,17 +82,17 @@ static __inline int rep_clz(rep_t a) {  // many 64-bit platforms have this operation, but they tend to have hardware  // floating-point, so we don't bother with a special case for them here.  static __inline void wideMultiply(rep_t a, rep_t b, rep_t *hi, rep_t *lo) { -    // Each of the component 32x32 -> 64 products -    const uint64_t plolo = loWord(a) * loWord(b); -    const uint64_t plohi = loWord(a) * hiWord(b); -    const uint64_t philo = hiWord(a) * loWord(b); -    const uint64_t phihi = hiWord(a) * hiWord(b); -    // Sum terms that contribute to lo in a way that allows us to get the carry -    const uint64_t r0 = loWord(plolo); -    const uint64_t r1 = hiWord(plolo) + loWord(plohi) + loWord(philo); -    *lo = r0 + (r1 << 32); -    // Sum terms contributing to hi with the carry from lo -    *hi = hiWord(plohi) + hiWord(philo) + hiWord(r1) + phihi; +  // Each of the component 32x32 -> 64 products +  const uint64_t plolo = loWord(a) * loWord(b); +  const uint64_t plohi = loWord(a) * hiWord(b); +  const uint64_t philo = hiWord(a) * loWord(b); +  const uint64_t phihi = hiWord(a) * hiWord(b); +  // Sum terms that contribute to lo in a way that allows us to get the carry +  const uint64_t r0 = loWord(plolo); +  const uint64_t r1 = hiWord(plolo) + loWord(plohi) + loWord(philo); +  *lo = r0 + (r1 << 32); +  // Sum terms contributing to hi with the carry from lo +  *hi = hiWord(plohi) + hiWord(philo) + hiWord(r1) + phihi;  }  #undef loWord  #undef hiWord @@ -103,7 +100,7 @@ static __inline void wideMultiply(rep_t a, rep_t b, rep_t *hi, rep_t *lo) {  COMPILER_RT_ABI fp_t __adddf3(fp_t a, fp_t b);  #elif defined QUAD_PRECISION -#if __LDBL_MANT_DIG__ == 113 +#if __LDBL_MANT_DIG__ == 113 && defined(__SIZEOF_INT128__)  #define CRT_LDBL_128BIT  typedef __uint128_t rep_t;  typedef __int128_t srep_t; @@ -114,32 +111,34 @@ typedef long double fp_t;  #define significandBits 112  static __inline int rep_clz(rep_t a) { -    const union -        { -             __uint128_t ll; +  const union { +    __uint128_t ll;  #if _YUGA_BIG_ENDIAN -             struct { uint64_t high, low; } s; +    struct { +      uint64_t high, low; +    } s;  #else -             struct { uint64_t low, high; } s; +    struct { +      uint64_t low, high; +    } s;  #endif -        } uu = { .ll = a }; +  } uu = {.ll = a}; -    uint64_t word; -    uint64_t add; +  uint64_t word; +  uint64_t add; -    if (uu.s.high){ -        word = uu.s.high; -        add = 0; -    } -    else{ -        word = uu.s.low; -        add = 64; -    } -    return __builtin_clzll(word) + add; +  if (uu.s.high) { +    word = uu.s.high; +    add = 0; +  } else { +    word = uu.s.low; +    add = 64; +  } +  return __builtin_clzll(word) + add;  } -#define Word_LoMask   UINT64_C(0x00000000ffffffff) -#define Word_HiMask   UINT64_C(0xffffffff00000000) +#define Word_LoMask UINT64_C(0x00000000ffffffff) +#define Word_HiMask UINT64_C(0xffffffff00000000)  #define Word_FullMask UINT64_C(0xffffffffffffffff)  #define Word_1(a) (uint64_t)((a >> 96) & Word_LoMask)  #define Word_2(a) (uint64_t)((a >> 64) & Word_LoMask) @@ -151,55 +150,41 @@ static __inline int rep_clz(rep_t a) {  // floating-point, so we don't bother with a special case for them here.  static __inline void wideMultiply(rep_t a, rep_t b, rep_t *hi, rep_t *lo) { -    const uint64_t product11 = Word_1(a) * Word_1(b); -    const uint64_t product12 = Word_1(a) * Word_2(b); -    const uint64_t product13 = Word_1(a) * Word_3(b); -    const uint64_t product14 = Word_1(a) * Word_4(b); -    const uint64_t product21 = Word_2(a) * Word_1(b); -    const uint64_t product22 = Word_2(a) * Word_2(b); -    const uint64_t product23 = Word_2(a) * Word_3(b); -    const uint64_t product24 = Word_2(a) * Word_4(b); -    const uint64_t product31 = Word_3(a) * Word_1(b); -    const uint64_t product32 = Word_3(a) * Word_2(b); -    const uint64_t product33 = Word_3(a) * Word_3(b); -    const uint64_t product34 = Word_3(a) * Word_4(b); -    const uint64_t product41 = Word_4(a) * Word_1(b); -    const uint64_t product42 = Word_4(a) * Word_2(b); -    const uint64_t product43 = Word_4(a) * Word_3(b); -    const uint64_t product44 = Word_4(a) * Word_4(b); - -    const __uint128_t sum0 = (__uint128_t)product44; -    const __uint128_t sum1 = (__uint128_t)product34 + -                             (__uint128_t)product43; -    const __uint128_t sum2 = (__uint128_t)product24 + -                             (__uint128_t)product33 + -                             (__uint128_t)product42; -    const __uint128_t sum3 = (__uint128_t)product14 + -                             (__uint128_t)product23 + -                             (__uint128_t)product32 + -                             (__uint128_t)product41; -    const __uint128_t sum4 = (__uint128_t)product13 + -                             (__uint128_t)product22 + -                             (__uint128_t)product31; -    const __uint128_t sum5 = (__uint128_t)product12 + -                             (__uint128_t)product21; -    const __uint128_t sum6 = (__uint128_t)product11; - -    const __uint128_t r0 = (sum0 & Word_FullMask) + -                           ((sum1 & Word_LoMask) << 32); -    const __uint128_t r1 = (sum0 >> 64) + -                           ((sum1 >> 32) & Word_FullMask) + -                           (sum2 & Word_FullMask) + -                           ((sum3 << 32) & Word_HiMask); - -    *lo = r0 + (r1 << 64); -    *hi = (r1 >> 64) + -          (sum1 >> 96) + -          (sum2 >> 64) + -          (sum3 >> 32) + -          sum4 + -          (sum5 << 32) + -          (sum6 << 64); +  const uint64_t product11 = Word_1(a) * Word_1(b); +  const uint64_t product12 = Word_1(a) * Word_2(b); +  const uint64_t product13 = Word_1(a) * Word_3(b); +  const uint64_t product14 = Word_1(a) * Word_4(b); +  const uint64_t product21 = Word_2(a) * Word_1(b); +  const uint64_t product22 = Word_2(a) * Word_2(b); +  const uint64_t product23 = Word_2(a) * Word_3(b); +  const uint64_t product24 = Word_2(a) * Word_4(b); +  const uint64_t product31 = Word_3(a) * Word_1(b); +  const uint64_t product32 = Word_3(a) * Word_2(b); +  const uint64_t product33 = Word_3(a) * Word_3(b); +  const uint64_t product34 = Word_3(a) * Word_4(b); +  const uint64_t product41 = Word_4(a) * Word_1(b); +  const uint64_t product42 = Word_4(a) * Word_2(b); +  const uint64_t product43 = Word_4(a) * Word_3(b); +  const uint64_t product44 = Word_4(a) * Word_4(b); + +  const __uint128_t sum0 = (__uint128_t)product44; +  const __uint128_t sum1 = (__uint128_t)product34 + (__uint128_t)product43; +  const __uint128_t sum2 = +      (__uint128_t)product24 + (__uint128_t)product33 + (__uint128_t)product42; +  const __uint128_t sum3 = (__uint128_t)product14 + (__uint128_t)product23 + +                           (__uint128_t)product32 + (__uint128_t)product41; +  const __uint128_t sum4 = +      (__uint128_t)product13 + (__uint128_t)product22 + (__uint128_t)product31; +  const __uint128_t sum5 = (__uint128_t)product12 + (__uint128_t)product21; +  const __uint128_t sum6 = (__uint128_t)product11; + +  const __uint128_t r0 = (sum0 & Word_FullMask) + ((sum1 & Word_LoMask) << 32); +  const __uint128_t r1 = (sum0 >> 64) + ((sum1 >> 32) & Word_FullMask) + +                         (sum2 & Word_FullMask) + ((sum3 << 32) & Word_HiMask); + +  *lo = r0 + (r1 << 64); +  *hi = (r1 >> 64) + (sum1 >> 96) + (sum2 >> 64) + (sum3 >> 32) + sum4 + +        (sum5 << 32) + (sum6 << 64);  }  #undef Word_1  #undef Word_2 @@ -208,63 +193,70 @@ static __inline void wideMultiply(rep_t a, rep_t b, rep_t *hi, rep_t *lo) {  #undef Word_HiMask  #undef Word_LoMask  #undef Word_FullMask -#endif // __LDBL_MANT_DIG__ == 113 +#endif // __LDBL_MANT_DIG__ == 113 && __SIZEOF_INT128__  #else  #error SINGLE_PRECISION, DOUBLE_PRECISION or QUAD_PRECISION must be defined.  #endif -#if defined(SINGLE_PRECISION) || defined(DOUBLE_PRECISION) || defined(CRT_LDBL_128BIT) -#define typeWidth       (sizeof(rep_t)*CHAR_BIT) -#define exponentBits    (typeWidth - significandBits - 1) -#define maxExponent     ((1 << exponentBits) - 1) -#define exponentBias    (maxExponent >> 1) +#if defined(SINGLE_PRECISION) || defined(DOUBLE_PRECISION) ||                  \ +    defined(CRT_LDBL_128BIT) +#define typeWidth (sizeof(rep_t) * CHAR_BIT) +#define exponentBits (typeWidth - significandBits - 1) +#define maxExponent ((1 << exponentBits) - 1) +#define exponentBias (maxExponent >> 1) -#define implicitBit     (REP_C(1) << significandBits) +#define implicitBit (REP_C(1) << significandBits)  #define significandMask (implicitBit - 1U) -#define signBit         (REP_C(1) << (significandBits + exponentBits)) -#define absMask         (signBit - 1U) -#define exponentMask    (absMask ^ significandMask) -#define oneRep          ((rep_t)exponentBias << significandBits) -#define infRep          exponentMask -#define quietBit        (implicitBit >> 1) -#define qnanRep         (exponentMask | quietBit) +#define signBit (REP_C(1) << (significandBits + exponentBits)) +#define absMask (signBit - 1U) +#define exponentMask (absMask ^ significandMask) +#define oneRep ((rep_t)exponentBias << significandBits) +#define infRep exponentMask +#define quietBit (implicitBit >> 1) +#define qnanRep (exponentMask | quietBit)  static __inline rep_t toRep(fp_t x) { -    const union { fp_t f; rep_t i; } rep = {.f = x}; -    return rep.i; +  const union { +    fp_t f; +    rep_t i; +  } rep = {.f = x}; +  return rep.i;  }  static __inline fp_t fromRep(rep_t x) { -    const union { fp_t f; rep_t i; } rep = {.i = x}; -    return rep.f; +  const union { +    fp_t f; +    rep_t i; +  } rep = {.i = x}; +  return rep.f;  }  static __inline int normalize(rep_t *significand) { -    const int shift = rep_clz(*significand) - rep_clz(implicitBit); -    *significand <<= shift; -    return 1 - shift; +  const int shift = rep_clz(*significand) - rep_clz(implicitBit); +  *significand <<= shift; +  return 1 - shift;  }  static __inline void wideLeftShift(rep_t *hi, rep_t *lo, int count) { -    *hi = *hi << count | *lo >> (typeWidth - count); -    *lo = *lo << count; +  *hi = *hi << count | *lo >> (typeWidth - count); +  *lo = *lo << count;  } -static __inline void wideRightShiftWithSticky(rep_t *hi, rep_t *lo, unsigned int count) { -    if (count < typeWidth) { -        const bool sticky = *lo << (typeWidth - count); -        *lo = *hi << (typeWidth - count) | *lo >> count | sticky; -        *hi = *hi >> count; -    } -    else if (count < 2*typeWidth) { -        const bool sticky = *hi << (2*typeWidth - count) | *lo; -        *lo = *hi >> (count - typeWidth) | sticky; -        *hi = 0; -    } else { -        const bool sticky = *hi | *lo; -        *lo = sticky; -        *hi = 0; -    } +static __inline void wideRightShiftWithSticky(rep_t *hi, rep_t *lo, +                                              unsigned int count) { +  if (count < typeWidth) { +    const bool sticky = *lo << (typeWidth - count); +    *lo = *hi << (typeWidth - count) | *lo >> count | sticky; +    *hi = *hi >> count; +  } else if (count < 2 * typeWidth) { +    const bool sticky = *hi << (2 * typeWidth - count) | *lo; +    *lo = *hi >> (count - typeWidth) | sticky; +    *hi = 0; +  } else { +    const bool sticky = *hi | *lo; +    *lo = sticky; +    *hi = 0; +  }  }  // Implements logb methods (logb, logbf, logbl) for IEEE-754. This avoids @@ -280,9 +272,9 @@ static __inline fp_t __compiler_rt_logbX(fp_t x) {    // 2) 0.0 returns -inf    if (exp == maxExponent) {      if (((rep & signBit) == 0) || (x != x)) { -      return x;  // NaN or +inf: return x +      return x; // NaN or +inf: return x      } else { -      return -x;  // -inf: return -x +      return -x; // -inf: return -x      }    } else if (x == 0.0) {      // 0.0: return -inf @@ -291,13 +283,13 @@ static __inline fp_t __compiler_rt_logbX(fp_t x) {    if (exp != 0) {      // Normal number -    return exp - exponentBias;  // Unbias exponent +    return exp - exponentBias; // Unbias exponent    } else {      // Subnormal number; normalize and repeat      rep &= absMask;      const int shift = 1 - normalize(&rep);      exp = (rep & exponentMask) >> significandBits; -    return exp - exponentBias - shift;  // Unbias exponent +    return exp - exponentBias - shift; // Unbias exponent    }  }  #endif @@ -311,17 +303,17 @@ static __inline fp_t __compiler_rt_logb(fp_t x) {    return __compiler_rt_logbX(x);  }  #elif defined(QUAD_PRECISION) -  #if defined(CRT_LDBL_128BIT) +#if defined(CRT_LDBL_128BIT)  static __inline fp_t __compiler_rt_logbl(fp_t x) {    return __compiler_rt_logbX(x);  } -  #else +#else  // The generic implementation only works for ieee754 floating point. For other  // floating point types, continue to rely on the libm implementation for now.  static __inline long double __compiler_rt_logbl(long double x) {    return crt_logbl(x);  } -  #endif +#endif  #endif  #endif // FP_LIB_HEADER diff --git a/lib/builtins/fp_mul_impl.inc b/lib/builtins/fp_mul_impl.inc index b34aa1b8f544..a93f2d78ad6b 100644 --- a/lib/builtins/fp_mul_impl.inc +++ b/lib/builtins/fp_mul_impl.inc @@ -1,9 +1,8 @@  //===---- lib/fp_mul_impl.inc - floating point multiplication -----*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -15,102 +14,115 @@  #include "fp_lib.h"  static __inline fp_t __mulXf3__(fp_t a, fp_t b) { -    const unsigned int aExponent = toRep(a) >> significandBits & maxExponent; -    const unsigned int bExponent = toRep(b) >> significandBits & maxExponent; -    const rep_t productSign = (toRep(a) ^ toRep(b)) & signBit; - -    rep_t aSignificand = toRep(a) & significandMask; -    rep_t bSignificand = toRep(b) & significandMask; -    int scale = 0; - -    // Detect if a or b is zero, denormal, infinity, or NaN. -    if (aExponent-1U >= maxExponent-1U || bExponent-1U >= maxExponent-1U) { - -        const rep_t aAbs = toRep(a) & absMask; -        const rep_t bAbs = toRep(b) & absMask; - -        // NaN * anything = qNaN -        if (aAbs > infRep) return fromRep(toRep(a) | quietBit); -        // anything * NaN = qNaN -        if (bAbs > infRep) return fromRep(toRep(b) | quietBit); - -        if (aAbs == infRep) { -            // infinity * non-zero = +/- infinity -            if (bAbs) return fromRep(aAbs | productSign); -            // infinity * zero = NaN -            else return fromRep(qnanRep); -        } - -        if (bAbs == infRep) { -            //? non-zero * infinity = +/- infinity -            if (aAbs) return fromRep(bAbs | productSign); -            // zero * infinity = NaN -            else return fromRep(qnanRep); -        } - -        // zero * anything = +/- zero -        if (!aAbs) return fromRep(productSign); -        // anything * zero = +/- zero -        if (!bAbs) return fromRep(productSign); - -        // one or both of a or b is denormal, the other (if applicable) is a -        // normal number.  Renormalize one or both of a and b, and set scale to -        // include the necessary exponent adjustment. -        if (aAbs < implicitBit) scale += normalize(&aSignificand); -        if (bAbs < implicitBit) scale += normalize(&bSignificand); +  const unsigned int aExponent = toRep(a) >> significandBits & maxExponent; +  const unsigned int bExponent = toRep(b) >> significandBits & maxExponent; +  const rep_t productSign = (toRep(a) ^ toRep(b)) & signBit; + +  rep_t aSignificand = toRep(a) & significandMask; +  rep_t bSignificand = toRep(b) & significandMask; +  int scale = 0; + +  // Detect if a or b is zero, denormal, infinity, or NaN. +  if (aExponent - 1U >= maxExponent - 1U || +      bExponent - 1U >= maxExponent - 1U) { + +    const rep_t aAbs = toRep(a) & absMask; +    const rep_t bAbs = toRep(b) & absMask; + +    // NaN * anything = qNaN +    if (aAbs > infRep) +      return fromRep(toRep(a) | quietBit); +    // anything * NaN = qNaN +    if (bAbs > infRep) +      return fromRep(toRep(b) | quietBit); + +    if (aAbs == infRep) { +      // infinity * non-zero = +/- infinity +      if (bAbs) +        return fromRep(aAbs | productSign); +      // infinity * zero = NaN +      else +        return fromRep(qnanRep);      } -    // Or in the implicit significand bit.  (If we fell through from the -    // denormal path it was already set by normalize( ), but setting it twice -    // won't hurt anything.) -    aSignificand |= implicitBit; -    bSignificand |= implicitBit; - -    // Get the significand of a*b.  Before multiplying the significands, shift -    // one of them left to left-align it in the field.  Thus, the product will -    // have (exponentBits + 2) integral digits, all but two of which must be -    // zero.  Normalizing this result is just a conditional left-shift by one -    // and bumping the exponent accordingly. -    rep_t productHi, productLo; -    wideMultiply(aSignificand, bSignificand << exponentBits, -                 &productHi, &productLo); - -    int productExponent = aExponent + bExponent - exponentBias + scale; - -    // Normalize the significand, adjust exponent if needed. -    if (productHi & implicitBit) productExponent++; -    else wideLeftShift(&productHi, &productLo, 1); - -    // If we have overflowed the type, return +/- infinity. -    if (productExponent >= maxExponent) return fromRep(infRep | productSign); - -    if (productExponent <= 0) { -        // Result is denormal before rounding -        // -        // If the result is so small that it just underflows to zero, return -        // a zero of the appropriate sign.  Mathematically there is no need to -        // handle this case separately, but we make it a special case to -        // simplify the shift logic. -        const unsigned int shift = REP_C(1) - (unsigned int)productExponent; -        if (shift >= typeWidth) return fromRep(productSign); - -        // Otherwise, shift the significand of the result so that the round -        // bit is the high bit of productLo. -        wideRightShiftWithSticky(&productHi, &productLo, shift); -    } -    else { -        // Result is normal before rounding; insert the exponent. -        productHi &= significandMask; -        productHi |= (rep_t)productExponent << significandBits; +    if (bAbs == infRep) { +      // non-zero * infinity = +/- infinity +      if (aAbs) +        return fromRep(bAbs | productSign); +      // zero * infinity = NaN +      else +        return fromRep(qnanRep);      } -    // Insert the sign of the result: -    productHi |= productSign; - -    // Final rounding.  The final result may overflow to infinity, or underflow -    // to zero, but those are the correct results in those cases.  We use the -    // default IEEE-754 round-to-nearest, ties-to-even rounding mode. -    if (productLo > signBit) productHi++; -    if (productLo == signBit) productHi += productHi & 1; -    return fromRep(productHi); +    // zero * anything = +/- zero +    if (!aAbs) +      return fromRep(productSign); +    // anything * zero = +/- zero +    if (!bAbs) +      return fromRep(productSign); + +    // One or both of a or b is denormal.  The other (if applicable) is a +    // normal number.  Renormalize one or both of a and b, and set scale to +    // include the necessary exponent adjustment. +    if (aAbs < implicitBit) +      scale += normalize(&aSignificand); +    if (bAbs < implicitBit) +      scale += normalize(&bSignificand); +  } + +  // Set the implicit significand bit.  If we fell through from the +  // denormal path it was already set by normalize( ), but setting it twice +  // won't hurt anything. +  aSignificand |= implicitBit; +  bSignificand |= implicitBit; + +  // Perform a basic multiplication on the significands.  One of them must be +  // shifted beforehand to be aligned with the exponent. +  rep_t productHi, productLo; +  wideMultiply(aSignificand, bSignificand << exponentBits, &productHi, +               &productLo); + +  int productExponent = aExponent + bExponent - exponentBias + scale; + +  // Normalize the significand and adjust the exponent if needed. +  if (productHi & implicitBit) +    productExponent++; +  else +    wideLeftShift(&productHi, &productLo, 1); + +  // If we have overflowed the type, return +/- infinity. +  if (productExponent >= maxExponent) +    return fromRep(infRep | productSign); + +  if (productExponent <= 0) { +    // The result is denormal before rounding. +    // +    // If the result is so small that it just underflows to zero, return +    // zero with the appropriate sign.  Mathematically, there is no need to +    // handle this case separately, but we make it a special case to +    // simplify the shift logic. +    const unsigned int shift = REP_C(1) - (unsigned int)productExponent; +    if (shift >= typeWidth) +      return fromRep(productSign); + +    // Otherwise, shift the significand of the result so that the round +    // bit is the high bit of productLo. +    wideRightShiftWithSticky(&productHi, &productLo, shift); +  } else { +    // The result is normal before rounding.  Insert the exponent. +    productHi &= significandMask; +    productHi |= (rep_t)productExponent << significandBits; +  } + +  // Insert the sign of the result. +  productHi |= productSign; + +  // Perform the final rounding.  The final result may overflow to infinity, +  // or underflow to zero, but those are the correct results in those cases. +  // We use the default IEEE-754 round-to-nearest, ties-to-even rounding mode. +  if (productLo > signBit) +    productHi++; +  if (productLo == signBit) +    productHi += productHi & 1; +  return fromRep(productHi);  } diff --git a/lib/builtins/fp_trunc.h b/lib/builtins/fp_trunc.h index d5e79bb5b863..aca4c9b6e677 100644 --- a/lib/builtins/fp_trunc.h +++ b/lib/builtins/fp_trunc.h @@ -1,9 +1,8 @@  //=== lib/fp_trunc.h - high precision -> low precision conversion *- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -36,7 +35,7 @@ static const int srcSigBits = 112;  #else  #error Source should be double precision or quad precision! -#endif //end source precision +#endif // end source precision  #if defined DST_DOUBLE  typedef double dst_t; @@ -58,19 +57,25 @@ static const int dstSigBits = 10;  #else  #error Destination should be single precision or double precision! -#endif //end destination precision +#endif // end destination precision  // End of specialization parameters.  Two helper routines for conversion to and  // from the representation of floating-point data as integer values follow.  static __inline src_rep_t srcToRep(src_t x) { -    const union { src_t f; src_rep_t i; } rep = {.f = x}; -    return rep.i; +  const union { +    src_t f; +    src_rep_t i; +  } rep = {.f = x}; +  return rep.i;  }  static __inline dst_t dstFromRep(dst_rep_t x) { -    const union { dst_t f; dst_rep_t i; } rep = {.i = x}; -    return rep.f; +  const union { +    dst_t f; +    dst_rep_t i; +  } rep = {.i = x}; +  return rep.f;  }  #endif // FP_TRUNC_HEADER diff --git a/lib/builtins/fp_trunc_impl.inc b/lib/builtins/fp_trunc_impl.inc index d88ae060913f..133c8bbe5c2f 100644 --- a/lib/builtins/fp_trunc_impl.inc +++ b/lib/builtins/fp_trunc_impl.inc @@ -1,9 +1,8 @@  //= lib/fp_trunc_impl.inc - high precision -> low precision conversion *-*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -29,107 +28,105 @@  //  // Finally, the following assumptions are made:  // -// 1. floating-point types and integer types have the same endianness on the -//    target platform +// 1. Floating-point types and integer types have the same endianness on the +//    target platform.  // -// 2. quiet NaNs, if supported, are indicated by the leading bit of the -//    significand field being set +// 2. Quiet NaNs, if supported, are indicated by the leading bit of the +//    significand field being set.  //  //===----------------------------------------------------------------------===//  #include "fp_trunc.h"  static __inline dst_t __truncXfYf2__(src_t a) { -    // Various constants whose values follow from the type parameters. -    // Any reasonable optimizer will fold and propagate all of these. -    const int srcBits = sizeof(src_t)*CHAR_BIT; -    const int srcExpBits = srcBits - srcSigBits - 1; -    const int srcInfExp = (1 << srcExpBits) - 1; -    const int srcExpBias = srcInfExp >> 1; +  // Various constants whose values follow from the type parameters. +  // Any reasonable optimizer will fold and propagate all of these. +  const int srcBits = sizeof(src_t) * CHAR_BIT; +  const int srcExpBits = srcBits - srcSigBits - 1; +  const int srcInfExp = (1 << srcExpBits) - 1; +  const int srcExpBias = srcInfExp >> 1; -    const src_rep_t srcMinNormal = SRC_REP_C(1) << srcSigBits; -    const src_rep_t srcSignificandMask = srcMinNormal - 1; -    const src_rep_t srcInfinity = (src_rep_t)srcInfExp << srcSigBits; -    const src_rep_t srcSignMask = SRC_REP_C(1) << (srcSigBits + srcExpBits); -    const src_rep_t srcAbsMask = srcSignMask - 1; -    const src_rep_t roundMask = (SRC_REP_C(1) << (srcSigBits - dstSigBits)) - 1; -    const src_rep_t halfway = SRC_REP_C(1) << (srcSigBits - dstSigBits - 1); -    const src_rep_t srcQNaN = SRC_REP_C(1) << (srcSigBits - 1); -    const src_rep_t srcNaNCode = srcQNaN - 1; +  const src_rep_t srcMinNormal = SRC_REP_C(1) << srcSigBits; +  const src_rep_t srcSignificandMask = srcMinNormal - 1; +  const src_rep_t srcInfinity = (src_rep_t)srcInfExp << srcSigBits; +  const src_rep_t srcSignMask = SRC_REP_C(1) << (srcSigBits + srcExpBits); +  const src_rep_t srcAbsMask = srcSignMask - 1; +  const src_rep_t roundMask = (SRC_REP_C(1) << (srcSigBits - dstSigBits)) - 1; +  const src_rep_t halfway = SRC_REP_C(1) << (srcSigBits - dstSigBits - 1); +  const src_rep_t srcQNaN = SRC_REP_C(1) << (srcSigBits - 1); +  const src_rep_t srcNaNCode = srcQNaN - 1; -    const int dstBits = sizeof(dst_t)*CHAR_BIT; -    const int dstExpBits = dstBits - dstSigBits - 1; -    const int dstInfExp = (1 << dstExpBits) - 1; -    const int dstExpBias = dstInfExp >> 1; +  const int dstBits = sizeof(dst_t) * CHAR_BIT; +  const int dstExpBits = dstBits - dstSigBits - 1; +  const int dstInfExp = (1 << dstExpBits) - 1; +  const int dstExpBias = dstInfExp >> 1; -    const int underflowExponent = srcExpBias + 1 - dstExpBias; -    const int overflowExponent = srcExpBias + dstInfExp - dstExpBias; -    const src_rep_t underflow = (src_rep_t)underflowExponent << srcSigBits; -    const src_rep_t overflow = (src_rep_t)overflowExponent << srcSigBits; +  const int underflowExponent = srcExpBias + 1 - dstExpBias; +  const int overflowExponent = srcExpBias + dstInfExp - dstExpBias; +  const src_rep_t underflow = (src_rep_t)underflowExponent << srcSigBits; +  const src_rep_t overflow = (src_rep_t)overflowExponent << srcSigBits; -    const dst_rep_t dstQNaN = DST_REP_C(1) << (dstSigBits - 1); -    const dst_rep_t dstNaNCode = dstQNaN - 1; +  const dst_rep_t dstQNaN = DST_REP_C(1) << (dstSigBits - 1); +  const dst_rep_t dstNaNCode = dstQNaN - 1; -    // Break a into a sign and representation of the absolute value -    const src_rep_t aRep = srcToRep(a); -    const src_rep_t aAbs = aRep & srcAbsMask; -    const src_rep_t sign = aRep & srcSignMask; -    dst_rep_t absResult; +  // Break a into a sign and representation of the absolute value. +  const src_rep_t aRep = srcToRep(a); +  const src_rep_t aAbs = aRep & srcAbsMask; +  const src_rep_t sign = aRep & srcSignMask; +  dst_rep_t absResult; -    if (aAbs - underflow < aAbs - overflow) { -        // The exponent of a is within the range of normal numbers in the -        // destination format.  We can convert by simply right-shifting with -        // rounding and adjusting the exponent. -        absResult = aAbs >> (srcSigBits - dstSigBits); -        absResult -= (dst_rep_t)(srcExpBias - dstExpBias) << dstSigBits; +  if (aAbs - underflow < aAbs - overflow) { +    // The exponent of a is within the range of normal numbers in the +    // destination format.  We can convert by simply right-shifting with +    // rounding and adjusting the exponent. +    absResult = aAbs >> (srcSigBits - dstSigBits); +    absResult -= (dst_rep_t)(srcExpBias - dstExpBias) << dstSigBits; -        const src_rep_t roundBits = aAbs & roundMask; -        // Round to nearest -        if (roundBits > halfway) -            absResult++; -        // Ties to even -        else if (roundBits == halfway) -            absResult += absResult & 1; -    } -    else if (aAbs > srcInfinity) { -        // a is NaN. -        // Conjure the result by beginning with infinity, setting the qNaN -        // bit and inserting the (truncated) trailing NaN field. -        absResult = (dst_rep_t)dstInfExp << dstSigBits; -        absResult |= dstQNaN; -        absResult |= ((aAbs & srcNaNCode) >> (srcSigBits - dstSigBits)) & dstNaNCode; -    } -    else if (aAbs >= overflow) { -        // a overflows to infinity. -        absResult = (dst_rep_t)dstInfExp << dstSigBits; -    } -    else { -        // a underflows on conversion to the destination type or is an exact -        // zero.  The result may be a denormal or zero.  Extract the exponent -        // to get the shift amount for the denormalization. -        const int aExp = aAbs >> srcSigBits; -        const int shift = srcExpBias - dstExpBias - aExp + 1; +    const src_rep_t roundBits = aAbs & roundMask; +    // Round to nearest. +    if (roundBits > halfway) +      absResult++; +    // Tie to even. +    else if (roundBits == halfway) +      absResult += absResult & 1; +  } else if (aAbs > srcInfinity) { +    // a is NaN. +    // Conjure the result by beginning with infinity, setting the qNaN +    // bit and inserting the (truncated) trailing NaN field. +    absResult = (dst_rep_t)dstInfExp << dstSigBits; +    absResult |= dstQNaN; +    absResult |= +        ((aAbs & srcNaNCode) >> (srcSigBits - dstSigBits)) & dstNaNCode; +  } else if (aAbs >= overflow) { +    // a overflows to infinity. +    absResult = (dst_rep_t)dstInfExp << dstSigBits; +  } else { +    // a underflows on conversion to the destination type or is an exact +    // zero.  The result may be a denormal or zero.  Extract the exponent +    // to get the shift amount for the denormalization. +    const int aExp = aAbs >> srcSigBits; +    const int shift = srcExpBias - dstExpBias - aExp + 1; -        const src_rep_t significand = (aRep & srcSignificandMask) | srcMinNormal; +    const src_rep_t significand = (aRep & srcSignificandMask) | srcMinNormal; -        // Right shift by the denormalization amount with sticky. -        if (shift > srcSigBits) { -            absResult = 0; -        } else { -            const bool sticky = significand << (srcBits - shift); -            src_rep_t denormalizedSignificand = significand >> shift | sticky; -            absResult = denormalizedSignificand >> (srcSigBits - dstSigBits); -            const src_rep_t roundBits = denormalizedSignificand & roundMask; -            // Round to nearest -            if (roundBits > halfway) -                absResult++; -            // Ties to even -            else if (roundBits == halfway) -                absResult += absResult & 1; -        } +    // Right shift by the denormalization amount with sticky. +    if (shift > srcSigBits) { +      absResult = 0; +    } else { +      const bool sticky = significand << (srcBits - shift); +      src_rep_t denormalizedSignificand = significand >> shift | sticky; +      absResult = denormalizedSignificand >> (srcSigBits - dstSigBits); +      const src_rep_t roundBits = denormalizedSignificand & roundMask; +      // Round to nearest +      if (roundBits > halfway) +        absResult++; +      // Ties to even +      else if (roundBits == halfway) +        absResult += absResult & 1;      } +  } -    // Apply the signbit to (dst_t)abs(a). -    const dst_rep_t result = absResult | sign >> (srcBits - dstBits); -    return dstFromRep(result); +  // Apply the signbit to the absolute value. +  const dst_rep_t result = absResult | sign >> (srcBits - dstBits); +  return dstFromRep(result);  } diff --git a/lib/builtins/gcc_personality_v0.c b/lib/builtins/gcc_personality_v0.c index 68581ef16434..d12ee03c49fe 100644 --- a/lib/builtins/gcc_personality_v0.c +++ b/lib/builtins/gcc_personality_v0.c @@ -1,145 +1,135 @@ -/* ===-- gcc_personality_v0.c - Implement __gcc_personality_v0 -------------=== - * - *      	       The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - */ +//===-- gcc_personality_v0.c - Implement __gcc_personality_v0 -------------===// +// +// 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 "int_lib.h"  #include <unwind.h> -#if defined(__arm__) && !defined(__ARM_DWARF_EH__) && !defined(__USING_SJLJ_EXCEPTIONS__) -/* - * When building with older compilers (e.g. clang <3.9), it is possible that we - * have a version of unwind.h which does not provide the EHABI declarations - * which are quired for the C personality to conform to the specification.  In - * order to provide forward compatibility for such compilers, we re-declare the - * necessary interfaces in the helper to permit a standalone compilation of the - * builtins (which contains the C unwinding personality for historical reasons). - */ +#if defined(__arm__) && !defined(__ARM_DWARF_EH__) &&                          \ +    !defined(__USING_SJLJ_EXCEPTIONS__) +// When building with older compilers (e.g. clang <3.9), it is possible that we +// have a version of unwind.h which does not provide the EHABI declarations +// which are quired for the C personality to conform to the specification.  In +// order to provide forward compatibility for such compilers, we re-declare the +// necessary interfaces in the helper to permit a standalone compilation of the +// builtins (which contains the C unwinding personality for historical reasons).  #include "unwind-ehabi-helpers.h"  #endif -/* - * Pointer encodings documented at: - *   http://refspecs.freestandards.org/LSB_1.3.0/gLSB/gLSB/ehframehdr.html - */ - -#define DW_EH_PE_omit      0xff  /* no data follows */ - -#define DW_EH_PE_absptr    0x00 -#define DW_EH_PE_uleb128   0x01 -#define DW_EH_PE_udata2    0x02 -#define DW_EH_PE_udata4    0x03 -#define DW_EH_PE_udata8    0x04 -#define DW_EH_PE_sleb128   0x09 -#define DW_EH_PE_sdata2    0x0A -#define DW_EH_PE_sdata4    0x0B -#define DW_EH_PE_sdata8    0x0C - -#define DW_EH_PE_pcrel     0x10 -#define DW_EH_PE_textrel   0x20 -#define DW_EH_PE_datarel   0x30 -#define DW_EH_PE_funcrel   0x40 -#define DW_EH_PE_aligned   0x50   -#define DW_EH_PE_indirect  0x80 /* gcc extension */ - - - -/* read a uleb128 encoded value and advance pointer */ -static uintptr_t readULEB128(const uint8_t** data) -{ -    uintptr_t result = 0; -    uintptr_t shift = 0; -    unsigned char byte; -    const uint8_t* p = *data; -    do { -        byte = *p++; -        result |= (byte & 0x7f) << shift; -        shift += 7; -    } while (byte & 0x80); -    *data = p; -    return result; +// Pointer encodings documented at: +//   http://refspecs.freestandards.org/LSB_1.3.0/gLSB/gLSB/ehframehdr.html + +#define DW_EH_PE_omit 0xff // no data follows + +#define DW_EH_PE_absptr 0x00 +#define DW_EH_PE_uleb128 0x01 +#define DW_EH_PE_udata2 0x02 +#define DW_EH_PE_udata4 0x03 +#define DW_EH_PE_udata8 0x04 +#define DW_EH_PE_sleb128 0x09 +#define DW_EH_PE_sdata2 0x0A +#define DW_EH_PE_sdata4 0x0B +#define DW_EH_PE_sdata8 0x0C + +#define DW_EH_PE_pcrel 0x10 +#define DW_EH_PE_textrel 0x20 +#define DW_EH_PE_datarel 0x30 +#define DW_EH_PE_funcrel 0x40 +#define DW_EH_PE_aligned 0x50 +#define DW_EH_PE_indirect 0x80 // gcc extension + +// read a uleb128 encoded value and advance pointer +static uintptr_t readULEB128(const uint8_t **data) { +  uintptr_t result = 0; +  uintptr_t shift = 0; +  unsigned char byte; +  const uint8_t *p = *data; +  do { +    byte = *p++; +    result |= (byte & 0x7f) << shift; +    shift += 7; +  } while (byte & 0x80); +  *data = p; +  return result;  } -/* read a pointer encoded value and advance pointer */ -static uintptr_t readEncodedPointer(const uint8_t** data, uint8_t encoding) -{ -    const uint8_t* p = *data; -    uintptr_t result = 0; - -    if ( encoding == DW_EH_PE_omit )  -        return 0; - -    /* first get value */ -    switch (encoding & 0x0F) { -        case DW_EH_PE_absptr: -            result = *((const uintptr_t*)p); -            p += sizeof(uintptr_t); -            break; -        case DW_EH_PE_uleb128: -            result = readULEB128(&p); -            break; -        case DW_EH_PE_udata2: -            result = *((const uint16_t*)p); -            p += sizeof(uint16_t); -            break; -        case DW_EH_PE_udata4: -            result = *((const uint32_t*)p); -            p += sizeof(uint32_t); -            break; -        case DW_EH_PE_udata8: -            result = *((const uint64_t*)p); -            p += sizeof(uint64_t); -            break; -        case DW_EH_PE_sdata2: -            result = *((const int16_t*)p); -            p += sizeof(int16_t); -            break; -        case DW_EH_PE_sdata4: -            result = *((const int32_t*)p); -            p += sizeof(int32_t); -            break; -        case DW_EH_PE_sdata8: -            result = *((const int64_t*)p); -            p += sizeof(int64_t); -            break; -        case DW_EH_PE_sleb128: -        default: -            /* not supported */ -            compilerrt_abort(); -            break; -    } - -    /* then add relative offset */ -    switch ( encoding & 0x70 ) { -        case DW_EH_PE_absptr: -            /* do nothing */ -            break; -        case DW_EH_PE_pcrel: -            result += (uintptr_t)(*data); -            break; -        case DW_EH_PE_textrel: -        case DW_EH_PE_datarel: -        case DW_EH_PE_funcrel: -        case DW_EH_PE_aligned: -        default: -            /* not supported */ -            compilerrt_abort(); -            break; -    } - -    /* then apply indirection */ -    if (encoding & DW_EH_PE_indirect) { -        result = *((const uintptr_t*)result); -    } - -    *data = p; -    return result; +// read a pointer encoded value and advance pointer +static uintptr_t readEncodedPointer(const uint8_t **data, uint8_t encoding) { +  const uint8_t *p = *data; +  uintptr_t result = 0; + +  if (encoding == DW_EH_PE_omit) +    return 0; + +  // first get value +  switch (encoding & 0x0F) { +  case DW_EH_PE_absptr: +    result = *((const uintptr_t *)p); +    p += sizeof(uintptr_t); +    break; +  case DW_EH_PE_uleb128: +    result = readULEB128(&p); +    break; +  case DW_EH_PE_udata2: +    result = *((const uint16_t *)p); +    p += sizeof(uint16_t); +    break; +  case DW_EH_PE_udata4: +    result = *((const uint32_t *)p); +    p += sizeof(uint32_t); +    break; +  case DW_EH_PE_udata8: +    result = *((const uint64_t *)p); +    p += sizeof(uint64_t); +    break; +  case DW_EH_PE_sdata2: +    result = *((const int16_t *)p); +    p += sizeof(int16_t); +    break; +  case DW_EH_PE_sdata4: +    result = *((const int32_t *)p); +    p += sizeof(int32_t); +    break; +  case DW_EH_PE_sdata8: +    result = *((const int64_t *)p); +    p += sizeof(int64_t); +    break; +  case DW_EH_PE_sleb128: +  default: +    // not supported +    compilerrt_abort(); +    break; +  } + +  // then add relative offset +  switch (encoding & 0x70) { +  case DW_EH_PE_absptr: +    // do nothing +    break; +  case DW_EH_PE_pcrel: +    result += (uintptr_t)(*data); +    break; +  case DW_EH_PE_textrel: +  case DW_EH_PE_datarel: +  case DW_EH_PE_funcrel: +  case DW_EH_PE_aligned: +  default: +    // not supported +    compilerrt_abort(); +    break; +  } + +  // then apply indirection +  if (encoding & DW_EH_PE_indirect) { +    result = *((const uintptr_t *)result); +  } + +  *data = p; +  return result;  }  #if defined(__arm__) && !defined(__USING_SJLJ_EXCEPTIONS__) &&                 \ @@ -153,99 +143,92 @@ static inline _Unwind_Reason_Code  continueUnwind(struct _Unwind_Exception *exceptionObject,                 struct _Unwind_Context *context) {  #if USING_ARM_EHABI -    /* -     * On ARM EHABI the personality routine is responsible for actually -     * unwinding a single stack frame before returning (ARM EHABI Sec. 6.1). -     */ -    if (__gnu_unwind_frame(exceptionObject, context) != _URC_OK) -        return _URC_FAILURE; +  // On ARM EHABI the personality routine is responsible for actually +  // unwinding a single stack frame before returning (ARM EHABI Sec. 6.1). +  if (__gnu_unwind_frame(exceptionObject, context) != _URC_OK) +    return _URC_FAILURE;  #endif -    return _URC_CONTINUE_UNWIND; +  return _URC_CONTINUE_UNWIND;  } -/* - * The C compiler makes references to __gcc_personality_v0 in - * the dwarf unwind information for translation units that use - * __attribute__((cleanup(xx))) on local variables. - * This personality routine is called by the system unwinder - * on each frame as the stack is unwound during a C++ exception - * throw through a C function compiled with -fexceptions. - */ +// The C compiler makes references to __gcc_personality_v0 in +// the dwarf unwind information for translation units that use +// __attribute__((cleanup(xx))) on local variables. +// This personality routine is called by the system unwinder +// on each frame as the stack is unwound during a C++ exception +// throw through a C function compiled with -fexceptions.  #if __USING_SJLJ_EXCEPTIONS__ -/* the setjump-longjump based exceptions personality routine has a - * different name */ -COMPILER_RT_ABI _Unwind_Reason_Code -__gcc_personality_sj0(int version, _Unwind_Action actions, -         uint64_t exceptionClass, struct _Unwind_Exception* exceptionObject, -         struct _Unwind_Context *context) +// the setjump-longjump based exceptions personality routine has a +// different name +COMPILER_RT_ABI _Unwind_Reason_Code __gcc_personality_sj0( +    int version, _Unwind_Action actions, uint64_t exceptionClass, +    struct _Unwind_Exception *exceptionObject, struct _Unwind_Context *context)  #elif USING_ARM_EHABI -/* The ARM EHABI personality routine has a different signature. */ +// The ARM EHABI personality routine has a different signature.  COMPILER_RT_ABI _Unwind_Reason_Code __gcc_personality_v0( -         _Unwind_State state, struct _Unwind_Exception *exceptionObject, -         struct _Unwind_Context *context) +    _Unwind_State state, struct _Unwind_Exception *exceptionObject, +    struct _Unwind_Context *context)  #else -COMPILER_RT_ABI _Unwind_Reason_Code -__gcc_personality_v0(int version, _Unwind_Action actions, -         uint64_t exceptionClass, struct _Unwind_Exception* exceptionObject, -         struct _Unwind_Context *context) +COMPILER_RT_ABI _Unwind_Reason_Code __gcc_personality_v0( +    int version, _Unwind_Action actions, uint64_t exceptionClass, +    struct _Unwind_Exception *exceptionObject, struct _Unwind_Context *context)  #endif  { -    /* Since C does not have catch clauses, there is nothing to do during */ -    /* phase 1 (the search phase). */ +  // Since C does not have catch clauses, there is nothing to do during +  // phase 1 (the search phase).  #if USING_ARM_EHABI -    /* After resuming from a cleanup we should also continue on to the next -     * frame straight away. */ -    if ((state & _US_ACTION_MASK) != _US_UNWIND_FRAME_STARTING) +  // After resuming from a cleanup we should also continue on to the next +  // frame straight away. +  if ((state & _US_ACTION_MASK) != _US_UNWIND_FRAME_STARTING)  #else -    if ( actions & _UA_SEARCH_PHASE ) +  if (actions & _UA_SEARCH_PHASE)  #endif -        return continueUnwind(exceptionObject, context); - -    /* There is nothing to do if there is no LSDA for this frame. */ -    const uint8_t* lsda = (uint8_t*)_Unwind_GetLanguageSpecificData(context); -    if ( lsda == (uint8_t*) 0 ) -        return continueUnwind(exceptionObject, context); +    return continueUnwind(exceptionObject, context); -    uintptr_t pc = (uintptr_t)_Unwind_GetIP(context)-1; -    uintptr_t funcStart = (uintptr_t)_Unwind_GetRegionStart(context); -    uintptr_t pcOffset = pc - funcStart; +  // There is nothing to do if there is no LSDA for this frame. +  const uint8_t *lsda = (uint8_t *)_Unwind_GetLanguageSpecificData(context); +  if (lsda == (uint8_t *)0) +    return continueUnwind(exceptionObject, context); -    /* Parse LSDA header. */ -    uint8_t lpStartEncoding = *lsda++; -    if (lpStartEncoding != DW_EH_PE_omit) { -        readEncodedPointer(&lsda, lpStartEncoding);  -    } -    uint8_t ttypeEncoding = *lsda++; -    if (ttypeEncoding != DW_EH_PE_omit) { -        readULEB128(&lsda);   -    } -    /* Walk call-site table looking for range that includes current PC. */ -    uint8_t         callSiteEncoding = *lsda++; -    uint32_t        callSiteTableLength = readULEB128(&lsda); -    const uint8_t*  callSiteTableStart = lsda; -    const uint8_t*  callSiteTableEnd = callSiteTableStart + callSiteTableLength; -    const uint8_t* p=callSiteTableStart; -    while (p < callSiteTableEnd) { -        uintptr_t start = readEncodedPointer(&p, callSiteEncoding); -        uintptr_t length = readEncodedPointer(&p, callSiteEncoding); -        uintptr_t landingPad = readEncodedPointer(&p, callSiteEncoding); -        readULEB128(&p); /* action value not used for C code */ -        if ( landingPad == 0 ) -            continue; /* no landing pad for this entry */ -        if ( (start <= pcOffset) && (pcOffset < (start+length)) ) { -            /* Found landing pad for the PC. -             * Set Instruction Pointer to so we re-enter function  -             * at landing pad. The landing pad is created by the compiler -             * to take two parameters in registers. -             */ -            _Unwind_SetGR(context, __builtin_eh_return_data_regno(0), -                          (uintptr_t)exceptionObject); -            _Unwind_SetGR(context, __builtin_eh_return_data_regno(1), 0); -            _Unwind_SetIP(context, (funcStart + landingPad)); -            return _URC_INSTALL_CONTEXT; -        } +  uintptr_t pc = (uintptr_t)_Unwind_GetIP(context) - 1; +  uintptr_t funcStart = (uintptr_t)_Unwind_GetRegionStart(context); +  uintptr_t pcOffset = pc - funcStart; + +  // Parse LSDA header. +  uint8_t lpStartEncoding = *lsda++; +  if (lpStartEncoding != DW_EH_PE_omit) { +    readEncodedPointer(&lsda, lpStartEncoding); +  } +  uint8_t ttypeEncoding = *lsda++; +  if (ttypeEncoding != DW_EH_PE_omit) { +    readULEB128(&lsda); +  } +  // Walk call-site table looking for range that includes current PC. +  uint8_t callSiteEncoding = *lsda++; +  uint32_t callSiteTableLength = readULEB128(&lsda); +  const uint8_t *callSiteTableStart = lsda; +  const uint8_t *callSiteTableEnd = callSiteTableStart + callSiteTableLength; +  const uint8_t *p = callSiteTableStart; +  while (p < callSiteTableEnd) { +    uintptr_t start = readEncodedPointer(&p, callSiteEncoding); +    uintptr_t length = readEncodedPointer(&p, callSiteEncoding); +    uintptr_t landingPad = readEncodedPointer(&p, callSiteEncoding); +    readULEB128(&p); // action value not used for C code +    if (landingPad == 0) +      continue; // no landing pad for this entry +    if ((start <= pcOffset) && (pcOffset < (start + length))) { +      // Found landing pad for the PC. +      // Set Instruction Pointer to so we re-enter function +      // at landing pad. The landing pad is created by the compiler +      // to take two parameters in registers. +      _Unwind_SetGR(context, __builtin_eh_return_data_regno(0), +                    (uintptr_t)exceptionObject); +      _Unwind_SetGR(context, __builtin_eh_return_data_regno(1), 0); +      _Unwind_SetIP(context, (funcStart + landingPad)); +      return _URC_INSTALL_CONTEXT;      } +  } -    /* No landing pad found, continue unwinding. */ -    return continueUnwind(exceptionObject, context); +  // No landing pad found, continue unwinding. +  return continueUnwind(exceptionObject, context);  } diff --git a/lib/builtins/hexagon/common_entry_exit_abi1.S b/lib/builtins/hexagon/common_entry_exit_abi1.S index d5479d2a52fa..23fed01c6eef 100644 --- a/lib/builtins/hexagon/common_entry_exit_abi1.S +++ b/lib/builtins/hexagon/common_entry_exit_abi1.S @@ -1,14 +1,13 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -/* Functions that implement common sequences in function prologues and epilogues -   used to save code size */ +// Functions that implement common sequences in function prologues and epilogues +// used to save code size  	.macro FUNCTION_BEGIN name  	.text @@ -33,16 +32,16 @@ -/* Save r25:24 at fp+#-8 and r27:26 at fp+#-16. */ +// Save r25:24 at fp+#-8 and r27:26 at fp+#-16. -/* The compiler knows that the __save_* functions clobber LR.  No other -   registers should be used without informing the compiler. */ +// The compiler knows that the __save_* functions clobber LR.  No other +// registers should be used without informing the compiler. -/* Since we can only issue one store per packet, we don't hurt performance by -   simply jumping to the right point in this sequence of stores. */ +// Since we can only issue one store per packet, we don't hurt performance by +// simply jumping to the right point in this sequence of stores.  FUNCTION_BEGIN __save_r24_through_r27  		memd(fp+#-16) = r27:26 @@ -56,10 +55,10 @@ FUNCTION_END __save_r24_through_r25 -/* For each of the *_before_tailcall functions, jumpr lr is executed in parallel -   with deallocframe.  That way, the return gets the old value of lr, which is -   where these functions need to return, and at the same time, lr gets the value -   it needs going into the tail call. */ +// For each of the *_before_tailcall functions, jumpr lr is executed in parallel +// with deallocframe.  That way, the return gets the old value of lr, which is +// where these functions need to return, and at the same time, lr gets the value +// it needs going into the tail call.  FUNCTION_BEGIN __restore_r24_through_r27_and_deallocframe_before_tailcall  		r27:26 = memd(fp+#-16) @@ -74,8 +73,8 @@ FUNCTION_END __restore_r24_through_r25_and_deallocframe_before_tailcall -/* Here we use the extra load bandwidth to restore LR early, allowing the return -   to occur in parallel with the deallocframe. */ +// Here we use the extra load bandwidth to restore LR early, allowing the return +// to occur in parallel with the deallocframe.  FUNCTION_BEGIN __restore_r24_through_r27_and_deallocframe  	{ @@ -92,7 +91,7 @@ FUNCTION_END __restore_r24_through_r27_and_deallocframe -/* Here the load bandwidth is maximized. */ +// Here the load bandwidth is maximized.  FUNCTION_BEGIN __restore_r24_through_r25_and_deallocframe  	{ diff --git a/lib/builtins/hexagon/common_entry_exit_abi2.S b/lib/builtins/hexagon/common_entry_exit_abi2.S index 6f470343db49..3b85aea2f600 100644 --- a/lib/builtins/hexagon/common_entry_exit_abi2.S +++ b/lib/builtins/hexagon/common_entry_exit_abi2.S @@ -1,14 +1,13 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -/* Functions that implement common sequences in function prologues and epilogues -   used to save code size */ +// Functions that implement common sequences in function prologues and epilogues +// used to save code size  	.macro FUNCTION_BEGIN name  	.p2align 2 @@ -33,10 +32,10 @@ -/* Save r17:16 at fp+#-8, r19:18 at fp+#-16, r21:20 at fp+#-24, r23:22 at -   fp+#-32, r25:24 at fp+#-40, and r27:26 at fp+#-48. -   The compiler knows that the __save_* functions clobber LR.  No other -   registers should be used without informing the compiler. */ +// Save r17:16 at fp+#-8, r19:18 at fp+#-16, r21:20 at fp+#-24, r23:22 at +// fp+#-32, r25:24 at fp+#-40, and r27:26 at fp+#-48. +// The compiler knows that the __save_* functions clobber LR.  No other +// registers should be used without informing the compiler.  FUNCTION_BEGIN __save_r16_through_r27          { @@ -107,10 +106,10 @@ FUNCTION_BEGIN __save_r16_through_r17          }  FUNCTION_END __save_r16_through_r17 -/* For each of the *_before_tailcall functions, jumpr lr is executed in parallel -   with deallocframe.  That way, the return gets the old value of lr, which is -   where these functions need to return, and at the same time, lr gets the value -   it needs going into the tail call. */ +// For each of the *_before_tailcall functions, jumpr lr is executed in parallel +// with deallocframe.  That way, the return gets the old value of lr, which is +// where these functions need to return, and at the same time, lr gets the value +// it needs going into the tail call.  FUNCTION_BEGIN __restore_r16_through_r27_and_deallocframe_before_tailcall diff --git a/lib/builtins/hexagon/common_entry_exit_legacy.S b/lib/builtins/hexagon/common_entry_exit_legacy.S index 3258f15a3267..8a6044573236 100644 --- a/lib/builtins/hexagon/common_entry_exit_legacy.S +++ b/lib/builtins/hexagon/common_entry_exit_legacy.S @@ -1,15 +1,14 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -/* Functions that implement common sequences in function prologues and epilogues -   used to save code size */ +// Functions that implement common sequences in function prologues and epilogues +// used to save code size  	.macro FUNCTION_BEGIN name  	.text @@ -34,17 +33,17 @@ -/* Save r27:26 at fp+#-8, r25:24 at fp+#-16, r23:22 at fp+#-24, r21:20 at -   fp+#-32, r19:18 at fp+#-40, and r17:16 at fp+#-48. */ +// Save r27:26 at fp+#-8, r25:24 at fp+#-16, r23:22 at fp+#-24, r21:20 at +// fp+#-32, r19:18 at fp+#-40, and r17:16 at fp+#-48. -/* The compiler knows that the __save_* functions clobber LR.  No other -   registers should be used without informing the compiler. */ +// The compiler knows that the __save_* functions clobber LR.  No other +// registers should be used without informing the compiler. -/* Since we can only issue one store per packet, we don't hurt performance by -   simply jumping to the right point in this sequence of stores. */ +// Since we can only issue one store per packet, we don't hurt performance by +// simply jumping to the right point in this sequence of stores.  FUNCTION_BEGIN __save_r27_through_r16  		memd(fp+#-48) = r17:16 @@ -65,10 +64,10 @@ FUNCTION_END __save_r27_through_r24 -/* For each of the *_before_sibcall functions, jumpr lr is executed in parallel -   with deallocframe.  That way, the return gets the old value of lr, which is -   where these functions need to return, and at the same time, lr gets the value -   it needs going into the sibcall. */ +// For each of the *_before_sibcall functions, jumpr lr is executed in parallel +// with deallocframe.  That way, the return gets the old value of lr, which is +// where these functions need to return, and at the same time, lr gets the value +// it needs going into the sibcall.  FUNCTION_BEGIN __restore_r27_through_r20_and_deallocframe_before_sibcall  	{ @@ -108,8 +107,8 @@ FUNCTION_END __restore_r27_through_r26_and_deallocframe_before_sibcall -/* Here we use the extra load bandwidth to restore LR early, allowing the return -   to occur in parallel with the deallocframe. */ +// Here we use the extra load bandwidth to restore LR early, allowing the return +// to occur in parallel with the deallocframe.  FUNCTION_BEGIN __restore_r27_through_r16_and_deallocframe  	{ @@ -136,7 +135,7 @@ FUNCTION_END __restore_r27_through_r24_and_deallocframe -/* Here the load bandwidth is maximized for all three functions. */ +// Here the load bandwidth is maximized for all three functions.  FUNCTION_BEGIN __restore_r27_through_r18_and_deallocframe  	{ diff --git a/lib/builtins/hexagon/dfaddsub.S b/lib/builtins/hexagon/dfaddsub.S index 4173f86a4f54..1b0d34550ff3 100644 --- a/lib/builtins/hexagon/dfaddsub.S +++ b/lib/builtins/hexagon/dfaddsub.S @@ -1,13 +1,12 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -/* Double Precision Multiply */ +// Double Precision Multiply  #define A r1:0  #define AH r1 @@ -179,18 +178,17 @@ __hexagon_subdf3:  .Ladd_ovf_unf:  	// Overflow or Denormal is possible  	// Good news: Underflow flag is not possible! -	/* -	 * ATMP has 2's complement value -	 * -	 * EXPA has A's exponent, EXPB has EXPA-BIAS-60 -	 * -	 * Convert, extract exponent, add adjustment. -	 * If > 2046, overflow -	 * If <= 0, denormal -	 * -	 * Note that we've not done our zero check yet, so do that too -	 * -	 */ + +	// ATMP has 2's complement value +	// +	// EXPA has A's exponent, EXPB has EXPA-BIAS-60 +	// +	// Convert, extract exponent, add adjustment. +	// If > 2046, overflow +	// If <= 0, denormal +	// +	// Note that we've not done our zero check yet, so do that too +  	{  		A = convert_d2df(ATMP)  		p0 = cmp.eq(ATMPH,#0) diff --git a/lib/builtins/hexagon/dfdiv.S b/lib/builtins/hexagon/dfdiv.S index 0c5dbe272c89..202965ec4789 100644 --- a/lib/builtins/hexagon/dfdiv.S +++ b/lib/builtins/hexagon/dfdiv.S @@ -1,13 +1,12 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -/* Double Precision Divide */ +// Double Precision Divide  #define A r1:0  #define AH r1 @@ -237,10 +236,10 @@ __hexagon_divdf3:  		P_TMP = cmp.gt(EXPA,#0)  		if (P_TMP.new) jump:nt .Lpossible_unf		// round up to normal possible...  	} -	/* Underflow */ -	/* We know what the infinite range exponent should be (EXPA) */ -	/* Q is 2's complement, PROD is abs(Q) */ -	/* Normalize Q, shift right, add a high bit, convert, change exponent */ +	// Underflow +	// We know what the infinite range exponent should be (EXPA) +	// Q is 2's complement, PROD is abs(Q) +	// Normalize Q, shift right, add a high bit, convert, change exponent  #define FUDGE1 7	// how much to shift right  #define FUDGE2 4	// how many guard/round to keep at lsbs @@ -287,8 +286,8 @@ __hexagon_divdf3:  .Lpossible_unf: -	/* If upper parts of Q were all F's, but abs(A) == 0x00100000_00000000, we rounded up to min_normal */ -	/* The answer is correct, but we need to raise Underflow */ +	// If upper parts of Q were all F's, but abs(A) == 0x00100000_00000000, we rounded up to min_normal +	// The answer is correct, but we need to raise Underflow  	{  		B = extractu(A,#63,#0)  		TMPPAIR = combine(##0x00100000,#0)		// min normal @@ -321,9 +320,9 @@ __hexagon_divdf3:  	}  .Ldiv_ovf: -	/* -	 * Raise Overflow, and choose the correct overflow value (saturated normal or infinity) -	 */ + +	// Raise Overflow, and choose the correct overflow value (saturated normal or infinity) +  	{  		TMP = USR  		B = combine(##0x7fefffff,#-1) @@ -389,8 +388,8 @@ __hexagon_divdf3:  		if (!P_ZERO) jump .Ldiv_zero_result  		if (!P_INF) jump .Ldiv_inf_result  	} -	/* Now we've narrowed it down to (de)normal / (de)normal */ -	/* Set up A/EXPA B/EXPB and go back */ +	// Now we've narrowed it down to (de)normal / (de)normal +	// Set up A/EXPA B/EXPB and go back  #undef P_ZERO  #undef P_INF  #define P_TMP2 p1 diff --git a/lib/builtins/hexagon/dffma.S b/lib/builtins/hexagon/dffma.S index 97b885a3bf27..c201d3d8be5e 100644 --- a/lib/builtins/hexagon/dffma.S +++ b/lib/builtins/hexagon/dffma.S @@ -1,16 +1,15 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  #define Q6_ALIAS(TAG) .global __qdsp_##TAG ; .set __qdsp_##TAG, __hexagon_##TAG  #define END(TAG) .size TAG,.-TAG -/* Double Precision Multiply */ +// Double Precision Multiply  #define A r1:0 @@ -76,33 +75,29 @@  #define SR_ROUND_OFF 22  #endif -	/* -	 * First, classify for normal values, and abort if abnormal -	 * -	 * Next, unpack mantissa into 0x1000_0000_0000_0000 + mant<<8 -	 * -	 * Since we know that the 2 MSBs of the H registers is zero, we should never carry -	 * the partial products that involve the H registers -	 * -	 * Try to buy X slots, at the expense of latency if needed -	 * -	 * We will have PP_HH with the upper bits of the product, PP_LL with the lower -	 * PP_HH can have a maximum of 0x03FF_FFFF_FFFF_FFFF or thereabouts -	 * PP_HH can have a minimum of 0x0100_0000_0000_0000 -	 * -	 * 0x0100_0000_0000_0000 has EXP of EXPA+EXPB-BIAS -	 * -	 * We need to align CTMP. -	 * If CTMP >> PP, convert PP to 64 bit with sticky, align CTMP, and follow normal add -	 * If CTMP << PP align CTMP and add 128 bits.  Then compute sticky -	 * If CTMP ~= PP, align CTMP and add 128 bits.  May have massive cancellation. -	 * -	 * Convert partial product and CTMP to 2's complement prior to addition -	 * -	 * After we add, we need to normalize into upper 64 bits, then compute sticky. -	 * -	 * -	 */ +	// First, classify for normal values, and abort if abnormal +	// +	// Next, unpack mantissa into 0x1000_0000_0000_0000 + mant<<8 +	// +	// Since we know that the 2 MSBs of the H registers is zero, we should never carry +	// the partial products that involve the H registers +	// +	// Try to buy X slots, at the expense of latency if needed +	// +	// We will have PP_HH with the upper bits of the product, PP_LL with the lower +	// PP_HH can have a maximum of 0x03FF_FFFF_FFFF_FFFF or thereabouts +	// PP_HH can have a minimum of 0x0100_0000_0000_0000 +	// +	// 0x0100_0000_0000_0000 has EXP of EXPA+EXPB-BIAS +	// +	// We need to align CTMP. +	// If CTMP >> PP, convert PP to 64 bit with sticky, align CTMP, and follow normal add +	// If CTMP << PP align CTMP and add 128 bits.  Then compute sticky +	// If CTMP ~= PP, align CTMP and add 128 bits.  May have massive cancellation. +	// +	// Convert partial product and CTMP to 2's complement prior to addition +	// +	// After we add, we need to normalize into upper 64 bits, then compute sticky.  	.text  	.global __hexagon_fmadf4 @@ -182,14 +177,12 @@ fma:  #define EXPCA r19:18  		EXPC = extractu(CH,#EXPBITS,#HI_MANTBITS)  	} -	/* PP_HH:PP_LL now has product */ -	/* CTMP is negated */ -	/* EXPA,B,C are extracted */ -	/* -	 * We need to negate PP -	 * Since we will be adding with carry later, if we need to negate, -	 * just invert all bits now, which we can do conditionally and in parallel -	 */ +	// PP_HH:PP_LL now has product +	// CTMP is negated +	// EXPA,B,C are extracted +	// We need to negate PP +	// Since we will be adding with carry later, if we need to negate, +	// just invert all bits now, which we can do conditionally and in parallel  #define PP_HH_TMP r15:14  #define PP_LL_TMP r7:6  	{ @@ -274,18 +267,16 @@ fma:  		PP_HH = add(CTMP,PP_HH,P_CARRY):carry  		TMP = #62  	} -	/* -	 * PP_HH:PP_LL now holds the sum -	 * We may need to normalize left, up to ??? bits. -	 * -	 * I think that if we have massive cancellation, the range we normalize by -	 * is still limited -	 */ +	// PP_HH:PP_LL now holds the sum +	// We may need to normalize left, up to ??? bits. +	// +	// I think that if we have massive cancellation, the range we normalize by +	// is still limited  	{  		LEFTSHIFT = add(clb(PP_HH),#-2)  		if (!cmp.eq(LEFTSHIFT.new,TMP)) jump:t 1f	// all sign bits?  	} -	/* We had all sign bits, shift left by 62. */ +	// We had all sign bits, shift left by 62.  	{  		CTMP = extractu(PP_LL,#62,#2)  		PP_LL = asl(PP_LL,#62) @@ -330,7 +321,7 @@ fma:  		if (!P_TMP) dealloc_return		// not zero, return  	}  .Ladd_yields_zero: -	/* We had full cancellation.  Return +/- zero (-0 when round-down) */ +	// We had full cancellation.  Return +/- zero (-0 when round-down)  	{  		TMP = USR  		A = #0 @@ -408,9 +399,9 @@ fma:  		EXPA = sub(#1+5,TMP)			// Amount to right shift to denormalize  		p3 = cmp.gt(CTMPH,#-1)  	} -	/* Underflow */ -	/* We know that the infinte range exponent should be EXPA */ -	/* CTMP is 2's complement, ATMP is abs(CTMP) */ +	// Underflow +	// We know that the infinte range exponent should be EXPA +	// CTMP is 2's complement, ATMP is abs(CTMP)  	{  		EXPA = add(EXPA,EXPB)		// how much to shift back right  		ATMP = asl(ATMP,EXPB)		// shift left @@ -593,7 +584,7 @@ fma:  		p1 = dfclass(C,#0x08)  		if (p1.new) jump:nt .Lfma_inf_plus_inf  	} -	/* A*B is +/- inf, C is finite.  Return A */ +	// A*B is +/- inf, C is finite.  Return A  	{  		jumpr r31  	} @@ -649,7 +640,7 @@ fma:  		if (!p0) A = C			// If C is not zero, return C  		if (!p0) jumpr r31  	} -	/* B has correctly signed zero, C is also zero */ +	// B has correctly signed zero, C is also zero  .Lzero_plus_zero:  	{  		p0 = cmp.eq(B,C)		// yes, scalar equals.  +0++0 or -0+-0 @@ -674,8 +665,8 @@ fma:  #define CTMP r11:10  	.falign  .Lfma_abnormal_c: -	/* We know that AB is normal * normal */ -	/* C is not normal: zero, subnormal, inf, or NaN. */ +	// We know that AB is normal * normal +	// C is not normal: zero, subnormal, inf, or NaN.  	{  		p0 = dfclass(C,#0x10)		// is C NaN?  		if (p0.new) jump:nt .Lnan diff --git a/lib/builtins/hexagon/dfminmax.S b/lib/builtins/hexagon/dfminmax.S index 41122911f183..44f031ba11ba 100644 --- a/lib/builtins/hexagon/dfminmax.S +++ b/lib/builtins/hexagon/dfminmax.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -15,17 +14,14 @@  #define Q6_ALIAS(TAG) .global __qdsp_##TAG ; .set __qdsp_##TAG, __hexagon_##TAG  #define END(TAG) .size TAG,.-TAG -/* - * Min and Max return A if B is NaN, or B if A is NaN - * Otherwise, they return the smaller or bigger value - * - * If values are equal, we want to favor -0.0 for min and +0.0 for max. - */ +// Min and Max return A if B is NaN, or B if A is NaN +// Otherwise, they return the smaller or bigger value +// +// If values are equal, we want to favor -0.0 for min and +0.0 for max. + +// Compares always return false for NaN +// if (isnan(A)) A = B; if (A > B) A = B will only trigger at most one of those options. -/* - * Compares always return false for NaN - * if (isnan(A)) A = B; if (A > B) A = B will only trigger at most one of those options. - */  	.text  	.global __hexagon_mindf3  	.global __hexagon_maxdf3 @@ -51,7 +47,7 @@ fmin:  		p2 = dfcmp.eq(A,B)		// if A == B  		if (!p2.new) jumpr:t r31  	} -	/* A == B, return A|B to select -0.0 over 0.0 */ +	// A == B, return A|B to select -0.0 over 0.0  	{  		A = or(ATMP,B)  		jumpr r31 @@ -71,7 +67,7 @@ fmax:  		p2 = dfcmp.eq(A,B)  		if (!p2.new) jumpr:t r31  	} -	/* A == B, return A&B to select 0.0 over -0.0 */ +	// A == B, return A&B to select 0.0 over -0.0  	{  		A = and(ATMP,B)  		jumpr r31 diff --git a/lib/builtins/hexagon/dfmul.S b/lib/builtins/hexagon/dfmul.S index fde6d77bdcff..e6f62c3515f4 100644 --- a/lib/builtins/hexagon/dfmul.S +++ b/lib/builtins/hexagon/dfmul.S @@ -1,13 +1,12 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -/* Double Precision Multiply */ +// Double Precision Multiply  #define A r1:0  #define AH r1  #define AL r0 @@ -47,8 +46,8 @@  #define BIAS 1024  #define MANTISSA_TO_INT_BIAS 52 -/* Some constant to adjust normalization amount in error code */ -/* Amount to right shift the partial product to get to a denorm */ +// Some constant to adjust normalization amount in error code +// Amount to right shift the partial product to get to a denorm  #define FUDGE 5  #define Q6_ALIAS(TAG) .global __qdsp_##TAG ; .set __qdsp_##TAG, __hexagon_##TAG @@ -80,10 +79,10 @@ __hexagon_muldf3:  		PP_ODD = mpyu(BTMPL,ATMPH)  		BTMP = insert(ONE,#2,#62)  	} -	/* since we know that the MSB of the H registers is zero, we should never carry */ -	/* H <= 2^31-1.  L <= 2^32-1.  Therefore, HL <= 2^63-2^32-2^31+1 */ -	/* Adding 2 HLs, we get 2^64-3*2^32+2 maximum.  */ -	/* Therefore, we can add 3 2^32-1 values safely without carry.  We only need one. */ +	// since we know that the MSB of the H registers is zero, we should never carry +	// H <= 2^31-1.  L <= 2^32-1.  Therefore, HL <= 2^63-2^32-2^31+1 +	// Adding 2 HLs, we get 2^64-3*2^32+2 maximum. +	// Therefore, we can add 3 2^32-1 values safely without carry.  We only need one.  	{  		PP_LL = mpyu(ATMPL,BTMPL)  		PP_ODD += mpyu(ATMPL,BTMPH) @@ -99,10 +98,10 @@ __hexagon_muldf3:  		p1 = cmp.eq(PP_LL_L,#0)		// 64 lsb's 0?  		p1 = cmp.eq(PP_ODD_L,#0)	// 64 lsb's 0?  	} -	/* -	 * PP_HH can have a maximum of 0x3FFF_FFFF_FFFF_FFFF or thereabouts -	 * PP_HH can have a minimum of 0x1000_0000_0000_0000 or so -	 */ + +	// PP_HH can have a maximum of 0x3FFF_FFFF_FFFF_FFFF or thereabouts +	// PP_HH can have a minimum of 0x1000_0000_0000_0000 or so +  #undef PP_ODD  #undef PP_ODD_H  #undef PP_ODD_L @@ -137,15 +136,15 @@ __hexagon_muldf3:  	.falign  .Lpossible_unf: -	/* We end up with a positive exponent */ -	/* But we may have rounded up to an exponent of 1. */ -	/* If the exponent is 1, if we rounded up to it -	 * we need to also raise underflow -	 * Fortunately, this is pretty easy to detect, we must have +/- 0x0010_0000_0000_0000 -	 * And the PP should also have more than one bit set -	 */ -	/* Note: ATMP should have abs(PP_HH) */ -	/* Note: BTMPL should have 0x7FEFFFFF */ +	// We end up with a positive exponent +	// But we may have rounded up to an exponent of 1. +	// If the exponent is 1, if we rounded up to it +	// we need to also raise underflow +	// Fortunately, this is pretty easy to detect, we must have +/- 0x0010_0000_0000_0000 +	// And the PP should also have more than one bit set +	// +	// Note: ATMP should have abs(PP_HH) +	// Note: BTMPL should have 0x7FEFFFFF  	{  		p0 = cmp.eq(AL,#0)  		p0 = bitsclr(AH,BTMPL) @@ -194,29 +193,25 @@ __hexagon_muldf3:  		BTMPH = sub(EXP0,BTMPH)  		TMP = #63				// max amount to shift  	} -	/* Underflow */ -	/* -	 * PP_HH has the partial product with sticky LSB. -	 * PP_HH can have a maximum of 0x3FFF_FFFF_FFFF_FFFF or thereabouts -	 * PP_HH can have a minimum of 0x1000_0000_0000_0000 or so -	 * The exponent of PP_HH is in  EXP1, which is non-positive (0 or negative) -	 * That's the exponent that happens after the normalization -	 * -	 * EXP0 has the exponent that, when added to the normalized value, is out of range. -	 * -	 * Strategy: -	 * -	 * * Shift down bits, with sticky bit, such that the bits are aligned according -	 *   to the LZ count and appropriate exponent, but not all the way to mantissa -	 *   field, keep around the last few bits. -	 * * Put a 1 near the MSB -	 * * Check the LSBs for inexact; if inexact also set underflow -	 * * Convert [u]d2df -- will correctly round according to rounding mode -	 * * Replace exponent field with zero -	 * -	 * -	 */ - +	// Underflow +	// +	// PP_HH has the partial product with sticky LSB. +	// PP_HH can have a maximum of 0x3FFF_FFFF_FFFF_FFFF or thereabouts +	// PP_HH can have a minimum of 0x1000_0000_0000_0000 or so +	// The exponent of PP_HH is in  EXP1, which is non-positive (0 or negative) +	// That's the exponent that happens after the normalization +	// +	// EXP0 has the exponent that, when added to the normalized value, is out of range. +	// +	// Strategy: +	// +	// * Shift down bits, with sticky bit, such that the bits are aligned according +	//   to the LZ count and appropriate exponent, but not all the way to mantissa +	//   field, keep around the last few bits. +	// * Put a 1 near the MSB +	// * Check the LSBs for inexact; if inexact also set underflow +	// * Convert [u]d2df -- will correctly round according to rounding mode +	// * Replace exponent field with zero  	{  		BTMPL = #0	 			// offset for extract diff --git a/lib/builtins/hexagon/dfsqrt.S b/lib/builtins/hexagon/dfsqrt.S index 027d9e1fde43..f1435e868319 100644 --- a/lib/builtins/hexagon/dfsqrt.S +++ b/lib/builtins/hexagon/dfsqrt.S @@ -1,13 +1,12 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// -/* Double Precision square root */ +// Double Precision square root  #define EXP r28 @@ -169,9 +168,9 @@ __hexagon_sqrt:  #define P_CARRY1 p2  #define P_CARRY2 p3 -	/* Iteration 0 */ -	/* Maybe we can save a cycle by starting with ERROR=asl(fracrad), then as we multiply */ -	/* We can shift and subtract instead of shift and add? */ +	// Iteration 0 +	// Maybe we can save a cycle by starting with ERROR=asl(fracrad), then as we multiply +	// We can shift and subtract instead of shift and add?  	{  		ERROR = asl(FRACRAD,#15)  		PROD = mpyu(ROOTHI,ROOTHI) @@ -194,7 +193,7 @@ __hexagon_sqrt:  		SHIFTAMT = add(SHIFTAMT,#16)  		ERROR = asl(FRACRAD,#31)		// for next iter  	} -	/* Iteration 1 */ +	// Iteration 1  	{  		PROD = mpyu(ROOTHI,ROOTHI)  		ERROR -= mpyu(ROOTHI,ROOTLO)	// amount is 31, no shift needed @@ -214,7 +213,7 @@ __hexagon_sqrt:  		SHIFTAMT = add(SHIFTAMT,#16)  		ERROR = asl(FRACRAD,#47)	// for next iter  	} -	/* Iteration 2 */ +	// Iteration 2  	{  		PROD = mpyu(ROOTHI,ROOTHI)  	} @@ -245,7 +244,7 @@ __hexagon_sqrt:  #undef RECIPEST  #undef SHIFTAMT  #define TWOROOT_LO r9:8 -	/* Adjust Root */ +	// Adjust Root  	{  		HL = mpyu(ROOTHI,ROOTLO)  		LL = mpyu(ROOTLO,ROOTLO) diff --git a/lib/builtins/hexagon/divdi3.S b/lib/builtins/hexagon/divdi3.S index 49ee8104f305..770601a470f7 100644 --- a/lib/builtins/hexagon/divdi3.S +++ b/lib/builtins/hexagon/divdi3.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/divsi3.S b/lib/builtins/hexagon/divsi3.S index 8e159baa192f..5f406524e88a 100644 --- a/lib/builtins/hexagon/divsi3.S +++ b/lib/builtins/hexagon/divsi3.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/fabs_opt.S b/lib/builtins/hexagon/fabs_opt.S index b09b00734d98..6bf9b84b3d20 100644 --- a/lib/builtins/hexagon/fabs_opt.S +++ b/lib/builtins/hexagon/fabs_opt.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/fastmath2_dlib_asm.S b/lib/builtins/hexagon/fastmath2_dlib_asm.S index 9286df06c26d..574a04432f2c 100644 --- a/lib/builtins/hexagon/fastmath2_dlib_asm.S +++ b/lib/builtins/hexagon/fastmath2_dlib_asm.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  /* ==================================================================== */ diff --git a/lib/builtins/hexagon/fastmath2_ldlib_asm.S b/lib/builtins/hexagon/fastmath2_ldlib_asm.S index 4192555351a6..cf623f94c849 100644 --- a/lib/builtins/hexagon/fastmath2_ldlib_asm.S +++ b/lib/builtins/hexagon/fastmath2_ldlib_asm.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  /* ==================================================================== * diff --git a/lib/builtins/hexagon/fastmath_dlib_asm.S b/lib/builtins/hexagon/fastmath_dlib_asm.S index 215936b783ca..3e59526c1e23 100644 --- a/lib/builtins/hexagon/fastmath_dlib_asm.S +++ b/lib/builtins/hexagon/fastmath_dlib_asm.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  /* ==================================================================== */ diff --git a/lib/builtins/hexagon/fma_opt.S b/lib/builtins/hexagon/fma_opt.S index 12378f0da04e..7f566adffd6a 100644 --- a/lib/builtins/hexagon/fma_opt.S +++ b/lib/builtins/hexagon/fma_opt.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/fmax_opt.S b/lib/builtins/hexagon/fmax_opt.S index f3a218c9769b..81d711dff8d2 100644 --- a/lib/builtins/hexagon/fmax_opt.S +++ b/lib/builtins/hexagon/fmax_opt.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/fmin_opt.S b/lib/builtins/hexagon/fmin_opt.S index ef9b0ff854a2..d043f1d7a698 100644 --- a/lib/builtins/hexagon/fmin_opt.S +++ b/lib/builtins/hexagon/fmin_opt.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/memcpy_forward_vp4cp4n2.S b/lib/builtins/hexagon/memcpy_forward_vp4cp4n2.S index fbe09086cd33..10b81f653343 100644 --- a/lib/builtins/hexagon/memcpy_forward_vp4cp4n2.S +++ b/lib/builtins/hexagon/memcpy_forward_vp4cp4n2.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // diff --git a/lib/builtins/hexagon/memcpy_likely_aligned.S b/lib/builtins/hexagon/memcpy_likely_aligned.S index bbc85c22db08..492298f10326 100644 --- a/lib/builtins/hexagon/memcpy_likely_aligned.S +++ b/lib/builtins/hexagon/memcpy_likely_aligned.S @@ -1,9 +1,8 @@  //===------------------------- memcopy routines ---------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/moddi3.S b/lib/builtins/hexagon/moddi3.S index 12a0595fe465..d4246b61bdc3 100644 --- a/lib/builtins/hexagon/moddi3.S +++ b/lib/builtins/hexagon/moddi3.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/modsi3.S b/lib/builtins/hexagon/modsi3.S index 5afda9e2978b..4015d5e06891 100644 --- a/lib/builtins/hexagon/modsi3.S +++ b/lib/builtins/hexagon/modsi3.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/sfdiv_opt.S b/lib/builtins/hexagon/sfdiv_opt.S index 6bdd4808c2b8..7c9ae14b718f 100644 --- a/lib/builtins/hexagon/sfdiv_opt.S +++ b/lib/builtins/hexagon/sfdiv_opt.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/sfsqrt_opt.S b/lib/builtins/hexagon/sfsqrt_opt.S index 7f619002774f..532df9a06d2d 100644 --- a/lib/builtins/hexagon/sfsqrt_opt.S +++ b/lib/builtins/hexagon/sfsqrt_opt.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/udivdi3.S b/lib/builtins/hexagon/udivdi3.S index 1ca326b75208..23f931d4f587 100644 --- a/lib/builtins/hexagon/udivdi3.S +++ b/lib/builtins/hexagon/udivdi3.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/udivmoddi4.S b/lib/builtins/hexagon/udivmoddi4.S index deb5aae0924d..6dbfc59bd650 100644 --- a/lib/builtins/hexagon/udivmoddi4.S +++ b/lib/builtins/hexagon/udivmoddi4.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/udivmodsi4.S b/lib/builtins/hexagon/udivmodsi4.S index 25bbe7cd5925..9e231212d6c8 100644 --- a/lib/builtins/hexagon/udivmodsi4.S +++ b/lib/builtins/hexagon/udivmodsi4.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/udivsi3.S b/lib/builtins/hexagon/udivsi3.S index 54f0aa409f93..d68599a8e04d 100644 --- a/lib/builtins/hexagon/udivsi3.S +++ b/lib/builtins/hexagon/udivsi3.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/umoddi3.S b/lib/builtins/hexagon/umoddi3.S index f091521414af..646ca128dd96 100644 --- a/lib/builtins/hexagon/umoddi3.S +++ b/lib/builtins/hexagon/umoddi3.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/hexagon/umodsi3.S b/lib/builtins/hexagon/umodsi3.S index a8270c2030d5..a92394486209 100644 --- a/lib/builtins/hexagon/umodsi3.S +++ b/lib/builtins/hexagon/umodsi3.S @@ -1,9 +1,8 @@  //===----------------------Hexagon builtin routine ------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/i386/ashldi3.S b/lib/builtins/i386/ashldi3.S index 6f05dcf74443..7ba912692f0d 100644 --- a/lib/builtins/i386/ashldi3.S +++ b/lib/builtins/i386/ashldi3.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/i386/ashrdi3.S b/lib/builtins/i386/ashrdi3.S index 206369f360aa..3cca4782aea3 100644 --- a/lib/builtins/i386/ashrdi3.S +++ b/lib/builtins/i386/ashrdi3.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -22,10 +23,10 @@ DEFINE_COMPILERRT_FUNCTION(__ashrdi3)  #endif  	psrlq		%xmm2,		%xmm0	// unsigned shift input by count -	 +  	testl		%eax,		%eax	// check the sign-bit of the input  	jns			1f					// early out for positive inputs -	 +  	// If the input is negative, we need to construct the shifted sign bit  	// to or into the result, as xmm does not have a signed right shift.  	pcmpeqb		%xmm1,		%xmm1	// -1ULL @@ -35,7 +36,7 @@ DEFINE_COMPILERRT_FUNCTION(__ashrdi3)  	psubq		%xmm1,		%xmm2	// 64 - count  	psllq		%xmm2,		%xmm1	// -1 << (64 - count) = leading sign bits  	por			%xmm1,		%xmm0 -	 +  	// Move the result back to the general purpose registers and return  1:	movd		%xmm0,		%eax  	psrlq		$32,		%xmm0 @@ -51,14 +52,14 @@ DEFINE_COMPILERRT_FUNCTION(__ashrdi3)  	movl	  12(%esp),		%ecx	// Load count  	movl	   8(%esp),		%edx	// Load high  	movl	   4(%esp),		%eax	// Load low -	 +  	testl		$0x20,		%ecx	// If count >= 32  	jnz			1f					//    goto 1  	shrdl		%cl, %edx,	%eax	// right shift low by count  	sarl		%cl,		%edx	// right shift high by count  	ret -	 +  1:	movl		%edx,		%eax	// Move high to low  	sarl		$31,		%edx	// clear high  	sarl		%cl,		%eax	// shift low by count - 32 diff --git a/lib/builtins/i386/chkstk.S b/lib/builtins/i386/chkstk.S index b59974868f21..f0bea2187457 100644 --- a/lib/builtins/i386/chkstk.S +++ b/lib/builtins/i386/chkstk.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/i386/chkstk2.S b/lib/builtins/i386/chkstk2.S index 7d65bb088928..5d6cbdfa5c99 100644 --- a/lib/builtins/i386/chkstk2.S +++ b/lib/builtins/i386/chkstk2.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/i386/divdi3.S b/lib/builtins/i386/divdi3.S index 2fb4bdcad90d..09e1e42eb719 100644 --- a/lib/builtins/i386/divdi3.S +++ b/lib/builtins/i386/divdi3.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -22,9 +23,9 @@  .balign 4  DEFINE_COMPILERRT_FUNCTION(__divdi3) -/* This is currently implemented by wrapping the unsigned divide up in an absolute -   value, then restoring the correct sign at the end of the computation.  This could -   certainly be improved upon. */ +// This is currently implemented by wrapping the unsigned divide up in an absolute +// value, then restoring the correct sign at the end of the computation.  This could +// certainly be improved upon.  	pushl		%esi  	movl	 20(%esp),			%edx	// high word of b @@ -38,7 +39,7 @@ DEFINE_COMPILERRT_FUNCTION(__divdi3)  	movl		%edx,		 20(%esp)  	movl		%eax,		 16(%esp)	// store abs(b) back to stack  	movl		%ecx,			%esi	// set aside sign of b -	 +  	movl	 12(%esp),			%edx	// high word of b  	movl	  8(%esp),			%eax	// low word of b  	movl		%edx,			%ecx @@ -55,11 +56,11 @@ DEFINE_COMPILERRT_FUNCTION(__divdi3)  	movl	 24(%esp),			%ebx	// Find the index i of the leading bit in b.  	bsrl		%ebx,			%ecx	// If the high word of b is zero, jump to  	jz			9f						// the code to handle that special case [9]. -	 -	/* High word of b is known to be non-zero on this branch */ -	 + +	// High word of b is known to be non-zero on this branch +  	movl	 20(%esp),			%eax	// Construct bhi, containing bits [1+i:32+i] of b -	 +  	shrl		%cl,			%eax	// Practically, this means that bhi is given by:  	shrl		%eax					//  	notl		%ecx					//		bhi = (high word of b) << (31 - i) | @@ -68,10 +69,10 @@ DEFINE_COMPILERRT_FUNCTION(__divdi3)  	movl	 16(%esp),			%edx	// Load the high and low words of a, and jump  	movl	 12(%esp),			%eax	// to [1] if the high word is larger than bhi  	cmpl		%ebx,			%edx	// to avoid overflowing the upcoming divide. -	jae			1f						 -		 -	/* High word of a is greater than or equal to (b >> (1 + i)) on this branch */ -	 +	jae			1f + +	// High word of a is greater than or equal to (b >> (1 + i)) on this branch +  	divl		%ebx					// eax <-- qs, edx <-- r such that ahi:alo = bs*qs + r  	pushl		%edi @@ -90,7 +91,7 @@ DEFINE_COMPILERRT_FUNCTION(__divdi3)  	sbbl		$0,				%edi	// decrement q if remainder is negative  	xorl		%edx,			%edx  	movl		%edi,			%eax -	 +  	addl		%esi,			%eax	// Restore correct sign to result  	adcl		%esi,			%edx  	xorl		%esi,			%eax @@ -101,8 +102,8 @@ DEFINE_COMPILERRT_FUNCTION(__divdi3)  	retl								// Return -1:	/* High word of a is greater than or equal to (b >> (1 + i)) on this branch */ -	  +1:	// High word of a is greater than or equal to (b >> (1 + i)) on this branch +  	subl		%ebx,			%edx	// subtract bhi from ahi so that divide will not  	divl		%ebx					// overflow, and find q and r such that  										// @@ -128,7 +129,7 @@ DEFINE_COMPILERRT_FUNCTION(__divdi3)  	sbbl		$0,				%edi	// decrement q if remainder is negative  	xorl		%edx,			%edx  	movl		%edi,			%eax -	 +  	addl		%esi,			%eax	// Restore correct sign to result  	adcl		%esi,			%edx  	xorl		%esi,			%eax @@ -138,8 +139,8 @@ DEFINE_COMPILERRT_FUNCTION(__divdi3)  	popl		%esi  	retl								// Return -	 -9:	/* High word of b is zero on this branch */ + +9:	// High word of b is zero on this branch  	movl	 16(%esp),			%eax	// Find qhi and rhi such that  	movl	 20(%esp),			%ecx	// @@ -149,7 +150,7 @@ DEFINE_COMPILERRT_FUNCTION(__divdi3)  	movl	 12(%esp),			%eax	// Find qlo such that  	divl		%ecx					//  	movl		%ebx,			%edx	//		rhi:alo = qlo*b + rlo  with 0 ≤ rlo < b -	 +  	addl		%esi,			%eax	// Restore correct sign to result  	adcl		%esi,			%edx  	xorl		%esi,			%eax diff --git a/lib/builtins/i386/floatdidf.S b/lib/builtins/i386/floatdidf.S index d75dfe62d6a7..ab7422c312dc 100644 --- a/lib/builtins/i386/floatdidf.S +++ b/lib/builtins/i386/floatdidf.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/i386/floatdisf.S b/lib/builtins/i386/floatdisf.S index 0874eaaa9a98..d91f14e9f330 100644 --- a/lib/builtins/i386/floatdisf.S +++ b/lib/builtins/i386/floatdisf.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/i386/floatdixf.S b/lib/builtins/i386/floatdixf.S index 1044ef55a1a8..df70f5f9e6e3 100644 --- a/lib/builtins/i386/floatdixf.S +++ b/lib/builtins/i386/floatdixf.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/i386/floatundidf.S b/lib/builtins/i386/floatundidf.S index fe032348e829..8b1b666ce1ec 100644 --- a/lib/builtins/i386/floatundidf.S +++ b/lib/builtins/i386/floatundidf.S @@ -1,9 +1,8 @@  //===-- floatundidf.S - Implement __floatundidf for i386 ------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // diff --git a/lib/builtins/i386/floatundisf.S b/lib/builtins/i386/floatundisf.S index 16000b576026..44301719edda 100644 --- a/lib/builtins/i386/floatundisf.S +++ b/lib/builtins/i386/floatundisf.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -48,7 +49,7 @@ END_COMPILERRT_FUNCTION(__floatundisf)  */ -/* branch-free, x87-free implementation - faster at the expense of code size */ +// branch-free, x87-free implementation - faster at the expense of code size  #ifdef __i386__ @@ -78,7 +79,7 @@ DEFINE_COMPILERRT_FUNCTION(__floatundisf)  	movd		8(%esp),		%xmm1  	movd		4(%esp),		%xmm0  	punpckldq	%xmm1,			%xmm0 -	 +  	calll		0f  0:	popl		%ecx  	shrl		%eax					// high 31 bits of input as sint32 diff --git a/lib/builtins/i386/floatundixf.S b/lib/builtins/i386/floatundixf.S index c935670cb52f..30b4d9f4b96c 100644 --- a/lib/builtins/i386/floatundixf.S +++ b/lib/builtins/i386/floatundixf.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/i386/lshrdi3.S b/lib/builtins/i386/lshrdi3.S index 53e95cf76527..896633e85d35 100644 --- a/lib/builtins/i386/lshrdi3.S +++ b/lib/builtins/i386/lshrdi3.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -41,14 +42,14 @@ DEFINE_COMPILERRT_FUNCTION(__lshrdi3)  	movl	  12(%esp),		%ecx	// Load count  	movl	   8(%esp),		%edx	// Load high  	movl	   4(%esp),		%eax	// Load low -	 +  	testl		$0x20,		%ecx	// If count >= 32  	jnz			1f					//    goto 1  	shrdl		%cl, %edx,	%eax	// right shift low by count  	shrl		%cl,		%edx	// right shift high by count  	ret -	 +  1:	movl		%edx,		%eax	// Move high to low  	xorl		%edx,		%edx	// clear high  	shrl		%cl,		%eax	// shift low by count - 32 diff --git a/lib/builtins/i386/moddi3.S b/lib/builtins/i386/moddi3.S index a5bf9ce8ea0f..4580f20ead15 100644 --- a/lib/builtins/i386/moddi3.S +++ b/lib/builtins/i386/moddi3.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -23,8 +24,8 @@  .balign 4  DEFINE_COMPILERRT_FUNCTION(__moddi3) -/* This is currently implemented by wrapping the unsigned modulus up in an absolute -   value.  This could certainly be improved upon. */ +// This is currently implemented by wrapping the unsigned modulus up in an absolute +// value.  This could certainly be improved upon.  	pushl		%esi  	movl	 20(%esp),			%edx	// high word of b @@ -37,7 +38,7 @@ DEFINE_COMPILERRT_FUNCTION(__moddi3)  	sbbl		%ecx,			%edx	// EDX:EAX = abs(b)  	movl		%edx,		 20(%esp)  	movl		%eax,		 16(%esp)	// store abs(b) back to stack -	 +  	movl	 12(%esp),			%edx	// high word of b  	movl	  8(%esp),			%eax	// low word of b  	movl		%edx,			%ecx @@ -54,11 +55,11 @@ DEFINE_COMPILERRT_FUNCTION(__moddi3)  	movl	 24(%esp),			%ebx	// Find the index i of the leading bit in b.  	bsrl		%ebx,			%ecx	// If the high word of b is zero, jump to  	jz			9f						// the code to handle that special case [9]. -	 -	/* High word of b is known to be non-zero on this branch */ -	 + +	// High word of b is known to be non-zero on this branch +  	movl	 20(%esp),			%eax	// Construct bhi, containing bits [1+i:32+i] of b -	 +  	shrl		%cl,			%eax	// Practically, this means that bhi is given by:  	shrl		%eax					//  	notl		%ecx					//		bhi = (high word of b) << (31 - i) | @@ -67,10 +68,10 @@ DEFINE_COMPILERRT_FUNCTION(__moddi3)  	movl	 16(%esp),			%edx	// Load the high and low words of a, and jump  	movl	 12(%esp),			%eax	// to [2] if the high word is larger than bhi  	cmpl		%ebx,			%edx	// to avoid overflowing the upcoming divide. -	jae			2f						 -		 -	/* High word of a is greater than or equal to (b >> (1 + i)) on this branch */ -	 +	jae			2f + +	// High word of a is greater than or equal to (b >> (1 + i)) on this branch +  	divl		%ebx					// eax <-- qs, edx <-- r such that ahi:alo = bs*qs + r  	pushl		%edi @@ -86,13 +87,13 @@ DEFINE_COMPILERRT_FUNCTION(__moddi3)  	movl	 28(%esp),			%eax  	imull		%edi,			%eax	// q*bhi  	subl		%eax,			%ecx	// ECX:EBX = a - q*b -	 +  	jnc			1f						// if positive, this is the result.  	addl	 24(%esp),			%ebx	// otherwise  	adcl	 28(%esp),			%ecx	// ECX:EBX = a - (q-1)*b = result  1:	movl		%ebx,			%eax  	movl		%ecx,			%edx -	 +  	addl		%esi,			%eax	// Restore correct sign to result  	adcl		%esi,			%edx  	xorl		%esi,			%eax @@ -102,8 +103,8 @@ DEFINE_COMPILERRT_FUNCTION(__moddi3)  	popl		%esi  	retl								// Return -2:	/* High word of a is greater than or equal to (b >> (1 + i)) on this branch */ -	  +2:	// High word of a is greater than or equal to (b >> (1 + i)) on this branch +  	subl		%ebx,			%edx	// subtract bhi from ahi so that divide will not  	divl		%ebx					// overflow, and find q and r such that  										// @@ -132,7 +133,7 @@ DEFINE_COMPILERRT_FUNCTION(__moddi3)  	adcl	 28(%esp),			%ecx	// ECX:EBX = a - (q-1)*b = result  3:	movl		%ebx,			%eax  	movl		%ecx,			%edx -	 +  	addl		%esi,			%eax	// Restore correct sign to result  	adcl		%esi,			%edx  	xorl		%esi,			%eax @@ -141,8 +142,8 @@ DEFINE_COMPILERRT_FUNCTION(__moddi3)  	popl		%ebx  	popl		%esi  	retl								// Return -	 -9:	/* High word of b is zero on this branch */ + +9:	// High word of b is zero on this branch  	movl	 16(%esp),			%eax	// Find qhi and rhi such that  	movl	 20(%esp),			%ecx	// diff --git a/lib/builtins/i386/muldi3.S b/lib/builtins/i386/muldi3.S index 12394606421c..a898e2414670 100644 --- a/lib/builtins/i386/muldi3.S +++ b/lib/builtins/i386/muldi3.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -14,15 +15,15 @@ DEFINE_COMPILERRT_FUNCTION(__muldi3)  	movl  16(%esp),		%eax	// b.lo  	movl  12(%esp),		%ecx	// a.hi  	imull	%eax,		%ecx	// b.lo * a.hi -	 +  	movl   8(%esp),		%edx	// a.lo  	movl  20(%esp),		%ebx	// b.hi  	imull	%edx,		%ebx	// a.lo * b.hi -	 +  	mull	%edx				// EDX:EAX = a.lo * b.lo  	addl	%ecx,		%ebx	// EBX = (a.lo*b.hi + a.hi*b.lo)  	addl	%ebx,		%edx -	 +  	popl	%ebx  	retl  END_COMPILERRT_FUNCTION(__muldi3) diff --git a/lib/builtins/i386/udivdi3.S b/lib/builtins/i386/udivdi3.S index 727613639b12..ca390245eabc 100644 --- a/lib/builtins/i386/udivdi3.S +++ b/lib/builtins/i386/udivdi3.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -26,11 +27,11 @@ DEFINE_COMPILERRT_FUNCTION(__udivdi3)  	movl	 20(%esp),			%ebx	// Find the index i of the leading bit in b.  	bsrl		%ebx,			%ecx	// If the high word of b is zero, jump to  	jz			9f						// the code to handle that special case [9]. -	 -	/* High word of b is known to be non-zero on this branch */ -	 + +	// High word of b is known to be non-zero on this branch +  	movl	 16(%esp),			%eax	// Construct bhi, containing bits [1+i:32+i] of b -	 +  	shrl		%cl,			%eax	// Practically, this means that bhi is given by:  	shrl		%eax					//  	notl		%ecx					//		bhi = (high word of b) << (31 - i) | @@ -39,10 +40,10 @@ DEFINE_COMPILERRT_FUNCTION(__udivdi3)  	movl	 12(%esp),			%edx	// Load the high and low words of a, and jump  	movl	  8(%esp),			%eax	// to [1] if the high word is larger than bhi  	cmpl		%ebx,			%edx	// to avoid overflowing the upcoming divide. -	jae			1f						 -		 -	/* High word of a is greater than or equal to (b >> (1 + i)) on this branch */ -	 +	jae			1f + +	// High word of a is greater than or equal to (b >> (1 + i)) on this branch +  	divl		%ebx					// eax <-- qs, edx <-- r such that ahi:alo = bs*qs + r  	pushl		%edi @@ -66,8 +67,8 @@ DEFINE_COMPILERRT_FUNCTION(__udivdi3)  	retl -1:	/* High word of a is greater than or equal to (b >> (1 + i)) on this branch */ -	  +1:	// High word of a is greater than or equal to (b >> (1 + i)) on this branch +  	subl		%ebx,			%edx	// subtract bhi from ahi so that divide will not  	divl		%ebx					// overflow, and find q and r such that  										// @@ -97,8 +98,8 @@ DEFINE_COMPILERRT_FUNCTION(__udivdi3)  	popl		%ebx  	retl -	 -9:	/* High word of b is zero on this branch */ + +9:	// High word of b is zero on this branch  	movl	 12(%esp),			%eax	// Find qhi and rhi such that  	movl	 16(%esp),			%ecx	// diff --git a/lib/builtins/i386/umoddi3.S b/lib/builtins/i386/umoddi3.S index 763e821946c0..2717e7e5da68 100644 --- a/lib/builtins/i386/umoddi3.S +++ b/lib/builtins/i386/umoddi3.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -27,11 +28,11 @@ DEFINE_COMPILERRT_FUNCTION(__umoddi3)  	movl	 20(%esp),			%ebx	// Find the index i of the leading bit in b.  	bsrl		%ebx,			%ecx	// If the high word of b is zero, jump to  	jz			9f						// the code to handle that special case [9]. -	 -	/* High word of b is known to be non-zero on this branch */ -	 + +	// High word of b is known to be non-zero on this branch +  	movl	 16(%esp),			%eax	// Construct bhi, containing bits [1+i:32+i] of b -	 +  	shrl		%cl,			%eax	// Practically, this means that bhi is given by:  	shrl		%eax					//  	notl		%ecx					//		bhi = (high word of b) << (31 - i) | @@ -40,10 +41,10 @@ DEFINE_COMPILERRT_FUNCTION(__umoddi3)  	movl	 12(%esp),			%edx	// Load the high and low words of a, and jump  	movl	  8(%esp),			%eax	// to [2] if the high word is larger than bhi  	cmpl		%ebx,			%edx	// to avoid overflowing the upcoming divide. -	jae			2f						 -		 -	/* High word of a is greater than or equal to (b >> (1 + i)) on this branch */ -	 +	jae			2f + +	// High word of a is greater than or equal to (b >> (1 + i)) on this branch +  	divl		%ebx					// eax <-- qs, edx <-- r such that ahi:alo = bs*qs + r  	pushl		%edi @@ -59,20 +60,20 @@ DEFINE_COMPILERRT_FUNCTION(__umoddi3)  	movl	 24(%esp),			%eax  	imull		%edi,			%eax	// q*bhi  	subl		%eax,			%ecx	// ECX:EBX = a - q*b -	 +  	jnc			1f						// if positive, this is the result.  	addl	 20(%esp),			%ebx	// otherwise  	adcl	 24(%esp),			%ecx	// ECX:EBX = a - (q-1)*b = result  1:	movl		%ebx,			%eax  	movl		%ecx,			%edx -	 +  	popl		%edi  	popl		%ebx  	retl -2:	/* High word of a is greater than or equal to (b >> (1 + i)) on this branch */ -	  +2:	// High word of a is greater than or equal to (b >> (1 + i)) on this branch +  	subl		%ebx,			%edx	// subtract bhi from ahi so that divide will not  	divl		%ebx					// overflow, and find q and r such that  										// @@ -101,14 +102,14 @@ DEFINE_COMPILERRT_FUNCTION(__umoddi3)  	adcl	 24(%esp),			%ecx	// ECX:EBX = a - (q-1)*b = result  3:	movl		%ebx,			%eax  	movl		%ecx,			%edx -	 +  	popl		%edi  	popl		%ebx  	retl -	 -9:	/* High word of b is zero on this branch */ + +9:	// High word of b is zero on this branch  	movl	 12(%esp),			%eax	// Find qhi and rhi such that  	movl	 16(%esp),			%ecx	// @@ -120,7 +121,7 @@ DEFINE_COMPILERRT_FUNCTION(__umoddi3)  	movl		%edx,			%eax	//		rhi:alo = qlo*b + rlo  with 0 ≤ rlo < b  	popl		%ebx					//  	xorl		%edx,			%edx	// and return 0:rlo -	retl								//  +	retl								//  END_COMPILERRT_FUNCTION(__umoddi3)  #endif // __i386__ diff --git a/lib/builtins/int_endianness.h b/lib/builtins/int_endianness.h index e2586c56bac8..def046c34a62 100644 --- a/lib/builtins/int_endianness.h +++ b/lib/builtins/int_endianness.h @@ -1,51 +1,49 @@ -/* ===-- int_endianness.h - configuration header for compiler-rt ------------=== - * - *		       The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file is a configuration header for compiler-rt. - * This file is not part of the interface of this library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- int_endianness.h - configuration header for compiler-rt -----------===// +// +// 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 a configuration header for compiler-rt. +// This file is not part of the interface of this library. +// +//===----------------------------------------------------------------------===//  #ifndef INT_ENDIANNESS_H  #define INT_ENDIANNESS_H -#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ +#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) &&                \      defined(__ORDER_LITTLE_ENDIAN__) -/* Clang and GCC provide built-in endianness definitions. */ +// Clang and GCC provide built-in endianness definitions.  #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__  #define _YUGA_LITTLE_ENDIAN 0 -#define _YUGA_BIG_ENDIAN    1 +#define _YUGA_BIG_ENDIAN 1  #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  #define _YUGA_LITTLE_ENDIAN 1 -#define _YUGA_BIG_ENDIAN    0 -#endif /* __BYTE_ORDER__ */ +#define _YUGA_BIG_ENDIAN 0 +#endif // __BYTE_ORDER__ -#else /* Compilers other than Clang or GCC. */ +#else // Compilers other than Clang or GCC.  #if defined(__SVR4) && defined(__sun)  #include <sys/byteorder.h>  #if defined(_BIG_ENDIAN)  #define _YUGA_LITTLE_ENDIAN 0 -#define _YUGA_BIG_ENDIAN    1 +#define _YUGA_BIG_ENDIAN 1  #elif defined(_LITTLE_ENDIAN)  #define _YUGA_LITTLE_ENDIAN 1 -#define _YUGA_BIG_ENDIAN    0 -#else /* !_LITTLE_ENDIAN */ +#define _YUGA_BIG_ENDIAN 0 +#else // !_LITTLE_ENDIAN  #error "unknown endianness" -#endif /* !_LITTLE_ENDIAN */ +#endif // !_LITTLE_ENDIAN -#endif /* Solaris and AuroraUX. */ +#endif // Solaris and AuroraUX. -/* .. */ +// ..  #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) ||   \      defined(__minix) @@ -53,64 +51,64 @@  #if _BYTE_ORDER == _BIG_ENDIAN  #define _YUGA_LITTLE_ENDIAN 0 -#define _YUGA_BIG_ENDIAN    1 +#define _YUGA_BIG_ENDIAN 1  #elif _BYTE_ORDER == _LITTLE_ENDIAN  #define _YUGA_LITTLE_ENDIAN 1 -#define _YUGA_BIG_ENDIAN    0 -#endif /* _BYTE_ORDER */ +#define _YUGA_BIG_ENDIAN 0 +#endif // _BYTE_ORDER -#endif /* *BSD */ +#endif // *BSD  #if defined(__OpenBSD__)  #include <machine/endian.h>  #if _BYTE_ORDER == _BIG_ENDIAN  #define _YUGA_LITTLE_ENDIAN 0 -#define _YUGA_BIG_ENDIAN    1 +#define _YUGA_BIG_ENDIAN 1  #elif _BYTE_ORDER == _LITTLE_ENDIAN  #define _YUGA_LITTLE_ENDIAN 1 -#define _YUGA_BIG_ENDIAN    0 -#endif /* _BYTE_ORDER */ +#define _YUGA_BIG_ENDIAN 0 +#endif // _BYTE_ORDER -#endif /* OpenBSD */ +#endif // OpenBSD -/* .. */ +// .. -/* Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the - * compiler (at least with GCC) */ -#if defined(__APPLE__) || defined(__ellcc__ ) +// Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the +// compiler (at least with GCC) +#if defined(__APPLE__) || defined(__ellcc__)  #ifdef __BIG_ENDIAN__  #if __BIG_ENDIAN__  #define _YUGA_LITTLE_ENDIAN 0 -#define _YUGA_BIG_ENDIAN    1 +#define _YUGA_BIG_ENDIAN 1  #endif -#endif /* __BIG_ENDIAN__ */ +#endif // __BIG_ENDIAN__  #ifdef __LITTLE_ENDIAN__  #if __LITTLE_ENDIAN__  #define _YUGA_LITTLE_ENDIAN 1 -#define _YUGA_BIG_ENDIAN    0 +#define _YUGA_BIG_ENDIAN 0  #endif -#endif /* __LITTLE_ENDIAN__ */ +#endif // __LITTLE_ENDIAN__ -#endif /* Mac OSX */ +#endif // Mac OSX -/* .. */ +// ..  #if defined(_WIN32)  #define _YUGA_LITTLE_ENDIAN 1 -#define _YUGA_BIG_ENDIAN    0 +#define _YUGA_BIG_ENDIAN 0 -#endif /* Windows */ +#endif // Windows -#endif /* Clang or GCC. */ +#endif // Clang or GCC. -/* . */ +// .  #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)  #error Unable to determine endian -#endif /* Check we found an endianness correctly. */ +#endif // Check we found an endianness correctly. -#endif /* INT_ENDIANNESS_H */ +#endif // INT_ENDIANNESS_H diff --git a/lib/builtins/int_lib.h b/lib/builtins/int_lib.h index fe8a3bdedc0e..3092f68c084a 100644 --- a/lib/builtins/int_lib.h +++ b/lib/builtins/int_lib.h @@ -1,44 +1,33 @@ -/* ===-- int_lib.h - configuration header for compiler-rt  -----------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file is a configuration header for compiler-rt. - * This file is not part of the interface of this library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- int_lib.h - configuration header for compiler-rt  -----------------===// +// +// 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 a configuration header for compiler-rt. +// This file is not part of the interface of this library. +// +//===----------------------------------------------------------------------===//  #ifndef INT_LIB_H  #define INT_LIB_H -/* Assumption: Signed integral is 2's complement. */ -/* Assumption: Right shift of signed negative is arithmetic shift. */ -/* Assumption: Endianness is little or big (not mixed). */ +// Assumption: Signed integral is 2's complement. +// Assumption: Right shift of signed negative is arithmetic shift. +// Assumption: Endianness is little or big (not mixed). -#if defined(__ELF__) -#define FNALIAS(alias_name, original_name) \ -  void alias_name() __attribute__((__alias__(#original_name))) -#define COMPILER_RT_ALIAS(aliasee) __attribute__((__alias__(#aliasee))) -#else -#define FNALIAS(alias, name) _Pragma("GCC error(\"alias unsupported on this file format\")") -#define COMPILER_RT_ALIAS(aliasee) _Pragma("GCC error(\"alias unsupported on this file format\")") -#endif - -/* ABI macro definitions */ +// ABI macro definitions  #if __ARM_EABI__ -# ifdef COMPILER_RT_ARMHF_TARGET -#   define COMPILER_RT_ABI -# else -#   define COMPILER_RT_ABI __attribute__((__pcs__("aapcs"))) -# endif +#ifdef COMPILER_RT_ARMHF_TARGET +#define COMPILER_RT_ABI +#else +#define COMPILER_RT_ABI __attribute__((__pcs__("aapcs"))) +#endif  #else -# define COMPILER_RT_ABI +#define COMPILER_RT_ABI  #endif  #define AEABI_RTABI __attribute__((__pcs__("aapcs"))) @@ -55,26 +44,44 @@  #define UNUSED __attribute__((unused))  #endif +#define STR(a) #a +#define XSTR(a) STR(a) +#define SYMBOL_NAME(name) XSTR(__USER_LABEL_PREFIX__) #name + +#if defined(__ELF__) || defined(__MINGW32__) || defined(__wasm__) +#define COMPILER_RT_ALIAS(name, aliasname) \ +  COMPILER_RT_ABI __typeof(name) aliasname __attribute__((__alias__(#name))); +#elif defined(__APPLE__) +#define COMPILER_RT_ALIAS(name, aliasname) \ +  __asm__(".globl " SYMBOL_NAME(aliasname)); \ +  __asm__(SYMBOL_NAME(aliasname) " = " SYMBOL_NAME(name)); \ +  COMPILER_RT_ABI __typeof(name) aliasname; +#elif defined(_WIN32) +#define COMPILER_RT_ALIAS(name, aliasname) +#else +#error Unsupported target +#endif +  #if defined(__NetBSD__) && (defined(_KERNEL) || defined(_STANDALONE)) -/* - * Kernel and boot environment can't use normal headers, - * so use the equivalent system headers. - */ -#  include <machine/limits.h> -#  include <sys/stdint.h> -#  include <sys/types.h> +// +// Kernel and boot environment can't use normal headers, +// so use the equivalent system headers. +// +#include <machine/limits.h> +#include <sys/stdint.h> +#include <sys/types.h>  #else -/* Include the standard compiler builtin headers we use functionality from. */ -#  include <limits.h> -#  include <stdint.h> -#  include <stdbool.h> -#  include <float.h> +// Include the standard compiler builtin headers we use functionality from. +#include <float.h> +#include <limits.h> +#include <stdbool.h> +#include <stdint.h>  #endif -/* Include the commonly used internal type definitions. */ +// Include the commonly used internal type definitions.  #include "int_types.h" -/* Include internal utility function declarations. */ +// Include internal utility function declarations.  #include "int_util.h"  COMPILER_RT_ABI si_int __paritysi2(si_int a); @@ -84,14 +91,14 @@ COMPILER_RT_ABI di_int __divdi3(di_int a, di_int b);  COMPILER_RT_ABI si_int __divsi3(si_int a, si_int b);  COMPILER_RT_ABI su_int __udivsi3(su_int n, su_int d); -COMPILER_RT_ABI su_int __udivmodsi4(su_int a, su_int b, su_int* rem); -COMPILER_RT_ABI du_int __udivmoddi4(du_int a, du_int b, du_int* rem); +COMPILER_RT_ABI su_int __udivmodsi4(su_int a, su_int b, su_int *rem); +COMPILER_RT_ABI du_int __udivmoddi4(du_int a, du_int b, du_int *rem);  #ifdef CRT_HAS_128BIT  COMPILER_RT_ABI si_int __clzti2(ti_int a); -COMPILER_RT_ABI tu_int __udivmodti4(tu_int a, tu_int b, tu_int* rem); +COMPILER_RT_ABI tu_int __udivmodti4(tu_int a, tu_int b, tu_int *rem);  #endif -/* Definitions for builtins unavailable on MSVC */ +// Definitions for builtins unavailable on MSVC  #if defined(_MSC_VER) && !defined(__clang__)  #include <intrin.h> @@ -129,6 +136,6 @@ uint32_t __inline __builtin_clzll(uint64_t value) {  #endif  #define __builtin_clzl __builtin_clzll -#endif /* defined(_MSC_VER) && !defined(__clang__) */ +#endif // defined(_MSC_VER) && !defined(__clang__) -#endif /* INT_LIB_H */ +#endif // INT_LIB_H diff --git a/lib/builtins/int_math.h b/lib/builtins/int_math.h index aa3d0721a8ab..58d8990f31b1 100644 --- a/lib/builtins/int_math.h +++ b/lib/builtins/int_math.h @@ -1,34 +1,31 @@ -/* ===-- int_math.h - internal math inlines ---------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===-----------------------------------------------------------------------=== - * - * This file is not part of the interface of this library. - * - * This file defines substitutes for the libm functions used in some of the - * compiler-rt implementations, defined in such a way that there is not a direct - * dependency on libm or math.h. Instead, we use the compiler builtin versions - * where available. This reduces our dependencies on the system SDK by foisting - * the responsibility onto the compiler. - * - * ===-----------------------------------------------------------------------=== - */ +//===-- int_math.h - internal math inlines --------------------------------===// +// +// 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 substitutes for the libm functions used in some of the +// compiler-rt implementations, defined in such a way that there is not a direct +// dependency on libm or math.h. Instead, we use the compiler builtin versions +// where available. This reduces our dependencies on the system SDK by foisting +// the responsibility onto the compiler. +// +//===----------------------------------------------------------------------===//  #ifndef INT_MATH_H  #define INT_MATH_H  #ifndef __has_builtin -#  define  __has_builtin(x) 0 +#define __has_builtin(x) 0  #endif  #if defined(_MSC_VER) && !defined(__clang__)  #include <math.h>  #include <stdlib.h> -#include <ymath.h>  #endif  #if defined(_MSC_VER) && !defined(__clang__) @@ -42,24 +39,23 @@  #define crt_isinf(x) !_finite((x))  #define crt_isnan(x) _isnan((x))  #else -/* Define crt_isfinite in terms of the builtin if available, otherwise provide - * an alternate version in terms of our other functions. This supports some - * versions of GCC which didn't have __builtin_isfinite. - */ +// Define crt_isfinite in terms of the builtin if available, otherwise provide +// an alternate version in terms of our other functions. This supports some +// versions of GCC which didn't have __builtin_isfinite.  #if __has_builtin(__builtin_isfinite) -#  define crt_isfinite(x) __builtin_isfinite((x)) +#define crt_isfinite(x) __builtin_isfinite((x))  #elif defined(__GNUC__) -#  define crt_isfinite(x) \ -  __extension__(({ \ -      __typeof((x)) x_ = (x); \ -      !crt_isinf(x_) && !crt_isnan(x_); \ -    })) +#define crt_isfinite(x)                                                        \ +  __extension__(({                                                             \ +    __typeof((x)) x_ = (x);                                                    \ +    !crt_isinf(x_) && !crt_isnan(x_);                                          \ +  }))  #else -#  error "Do not know how to check for infinity" -#endif /* __has_builtin(__builtin_isfinite) */ +#error "Do not know how to check for infinity" +#endif // __has_builtin(__builtin_isfinite)  #define crt_isinf(x) __builtin_isinf((x))  #define crt_isnan(x) __builtin_isnan((x)) -#endif /* _MSC_VER */ +#endif // _MSC_VER  #if defined(_MSC_VER) && !defined(__clang__)  #define crt_copysign(x, y) copysign((x), (y)) @@ -107,4 +103,4 @@  #define crt_scalbnl(x, y) __builtin_scalbnl((x), (y))  #endif -#endif /* INT_MATH_H */ +#endif // INT_MATH_H diff --git a/lib/builtins/int_types.h b/lib/builtins/int_types.h index 9f8da56cb77b..f89220d54350 100644 --- a/lib/builtins/int_types.h +++ b/lib/builtins/int_types.h @@ -1,63 +1,57 @@ -/* ===-- int_lib.h - configuration header for compiler-rt  -----------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file is not part of the interface of this library. - * - * This file defines various standard types, most importantly a number of unions - * used to access parts of larger types. - * - * ===----------------------------------------------------------------------=== - */ +//===-- int_lib.h - configuration header for compiler-rt  -----------------===// +// +// 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 various standard types, most importantly a number of unions +// used to access parts of larger types. +// +//===----------------------------------------------------------------------===//  #ifndef INT_TYPES_H  #define INT_TYPES_H  #include "int_endianness.h" -/* si_int is defined in Linux sysroot's asm-generic/siginfo.h */ +// si_int is defined in Linux sysroot's asm-generic/siginfo.h  #ifdef si_int  #undef si_int  #endif -typedef      int si_int; +typedef int si_int;  typedef unsigned su_int; -typedef          long long di_int; +typedef long long di_int;  typedef unsigned long long du_int; -typedef union -{ -    di_int all; -    struct -    { +typedef union { +  di_int all; +  struct {  #if _YUGA_LITTLE_ENDIAN -        su_int low; -        si_int high; +    su_int low; +    si_int high;  #else -        si_int high; -        su_int low; -#endif /* _YUGA_LITTLE_ENDIAN */ -    }s; +    si_int high; +    su_int low; +#endif // _YUGA_LITTLE_ENDIAN +  } s;  } dwords; -typedef union -{ -    du_int all; -    struct -    { +typedef union { +  du_int all; +  struct {  #if _YUGA_LITTLE_ENDIAN -        su_int low; -        su_int high; +    su_int low; +    su_int high;  #else -        su_int high; -        su_int low; -#endif /* _YUGA_LITTLE_ENDIAN */ -    }s; +    su_int high; +    su_int low; +#endif // _YUGA_LITTLE_ENDIAN +  } s;  } udwords;  #if defined(__LP64__) || defined(__wasm__) || defined(__mips64) ||             \ @@ -65,103 +59,93 @@ typedef union  #define CRT_HAS_128BIT  #endif -/* MSVC doesn't have a working 128bit integer type. Users should really compile - * compiler-rt with clang, but if they happen to be doing a standalone build for - * asan or something else, disable the 128 bit parts so things sort of work. - */ +// MSVC doesn't have a working 128bit integer type. Users should really compile +// compiler-rt with clang, but if they happen to be doing a standalone build for +// asan or something else, disable the 128 bit parts so things sort of work.  #if defined(_MSC_VER) && !defined(__clang__)  #undef CRT_HAS_128BIT  #endif  #ifdef CRT_HAS_128BIT -typedef int      ti_int __attribute__ ((mode (TI))); -typedef unsigned tu_int __attribute__ ((mode (TI))); - -typedef union -{ -    ti_int all; -    struct -    { +typedef int ti_int __attribute__((mode(TI))); +typedef unsigned tu_int __attribute__((mode(TI))); + +typedef union { +  ti_int all; +  struct {  #if _YUGA_LITTLE_ENDIAN -        du_int low; -        di_int high; +    du_int low; +    di_int high;  #else -        di_int high; -        du_int low; -#endif /* _YUGA_LITTLE_ENDIAN */ -    }s; +    di_int high; +    du_int low; +#endif // _YUGA_LITTLE_ENDIAN +  } s;  } twords; -typedef union -{ -    tu_int all; -    struct -    { +typedef union { +  tu_int all; +  struct {  #if _YUGA_LITTLE_ENDIAN -        du_int low; -        du_int high; +    du_int low; +    du_int high;  #else -        du_int high; -        du_int low; -#endif /* _YUGA_LITTLE_ENDIAN */ -    }s; +    du_int high; +    du_int low; +#endif // _YUGA_LITTLE_ENDIAN +  } s;  } utwords;  static __inline ti_int make_ti(di_int h, di_int l) { -    twords r; -    r.s.high = h; -    r.s.low = l; -    return r.all; +  twords r; +  r.s.high = h; +  r.s.low = l; +  return r.all;  }  static __inline tu_int make_tu(du_int h, du_int l) { -    utwords r; -    r.s.high = h; -    r.s.low = l; -    return r.all; +  utwords r; +  r.s.high = h; +  r.s.low = l; +  return r.all;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT -typedef union -{ -    su_int u; -    float f; +typedef union { +  su_int u; +  float f;  } float_bits; -typedef union -{ -    udwords u; -    double  f; +typedef union { +  udwords u; +  double f;  } double_bits; -typedef struct -{ +typedef struct {  #if _YUGA_LITTLE_ENDIAN -    udwords low; -    udwords high; +  udwords low; +  udwords high;  #else -    udwords high; -    udwords low; -#endif /* _YUGA_LITTLE_ENDIAN */ +  udwords high; +  udwords low; +#endif // _YUGA_LITTLE_ENDIAN  } uqwords; -/* Check if the target supports 80 bit extended precision long doubles. - * Notably, on x86 Windows, MSVC only provides a 64-bit long double, but GCC - * still makes it 80 bits. Clang will match whatever compiler it is trying to - * be compatible with. - */ -#if ((defined(__i386__) || defined(__x86_64__)) && !defined(_MSC_VER)) || \ +// Check if the target supports 80 bit extended precision long doubles. +// Notably, on x86 Windows, MSVC only provides a 64-bit long double, but GCC +// still makes it 80 bits. Clang will match whatever compiler it is trying to +// be compatible with. +#if ((defined(__i386__) || defined(__x86_64__)) && !defined(_MSC_VER)) ||      \      defined(__m68k__) || defined(__ia64__)  #define HAS_80_BIT_LONG_DOUBLE 1  #else  #define HAS_80_BIT_LONG_DOUBLE 0  #endif -typedef union -{ -    uqwords     u; -    long double f; +typedef union { +  uqwords u; +  long double f;  } long_double_bits;  #if __STDC_VERSION__ >= 199901L @@ -172,14 +156,19 @@ typedef long double _Complex Lcomplex;  #define COMPLEX_REAL(x) __real__(x)  #define COMPLEX_IMAGINARY(x) __imag__(x)  #else -typedef struct { float real, imaginary; } Fcomplex; +typedef struct { +  float real, imaginary; +} Fcomplex; -typedef struct { double real, imaginary; } Dcomplex; +typedef struct { +  double real, imaginary; +} Dcomplex; -typedef struct { long double real, imaginary; } Lcomplex; +typedef struct { +  long double real, imaginary; +} Lcomplex;  #define COMPLEX_REAL(x) (x).real  #define COMPLEX_IMAGINARY(x) (x).imaginary  #endif -#endif /* INT_TYPES_H */ - +#endif // INT_TYPES_H diff --git a/lib/builtins/int_util.c b/lib/builtins/int_util.c index 752f2015580e..226a6e93440d 100644 --- a/lib/builtins/int_util.c +++ b/lib/builtins/int_util.c @@ -1,25 +1,21 @@ -/* ===-- int_util.c - Implement internal utilities --------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- int_util.c - Implement internal utilities -------------------------===// +// +// 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 "int_lib.h" -#include "int_util.h" -/* NOTE: The definitions in this file are declared weak because we clients to be - * able to arbitrarily package individual functions into separate .a files. If - * we did not declare these weak, some link situations might end up seeing - * duplicate strong definitions of the same symbol. - * - * We can't use this solution for kernel use (which may not support weak), but - * currently expect that when built for kernel use all the functionality is - * packaged into a single library. - */ +// NOTE: The definitions in this file are declared weak because we clients to be +// able to arbitrarily package individual functions into separate .a files. If +// we did not declare these weak, some link situations might end up seeing +// duplicate strong definitions of the same symbol. +// +// We can't use this solution for kernel use (which may not support weak), but +// currently expect that when built for kernel use all the functionality is +// packaged into a single library.  #ifdef KERNEL_USE @@ -33,7 +29,7 @@ void __compilerrt_abort_impl(const char *file, int line, const char *function) {  #elif __APPLE__ -/* from libSystem.dylib */ +// from libSystem.dylib  NORETURN extern void __assert_rtn(const char *func, const char *file, int line,                                    const char *message); @@ -57,7 +53,7 @@ void __compilerrt_abort_impl(const char *file, int line, const char *function) {  #else -/* Get the system definition of abort() */ +// Get the system definition of abort()  #include <stdlib.h>  #ifndef _WIN32 diff --git a/lib/builtins/int_util.h b/lib/builtins/int_util.h index c3c87381ad8a..5fbdfb57c1e7 100644 --- a/lib/builtins/int_util.h +++ b/lib/builtins/int_util.h @@ -1,25 +1,23 @@ -/* ===-- int_util.h - internal utility functions ----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===-----------------------------------------------------------------------=== - * - * This file is not part of the interface of this library. - * - * This file defines non-inline utilities which are available for use in the - * library. The function definitions themselves are all contained in int_util.c - * which will always be compiled into any compiler-rt library. - * - * ===-----------------------------------------------------------------------=== - */ +//===-- int_util.h - internal utility functions ---------------------------===// +// +// 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 non-inline utilities which are available for use in the +// library. The function definitions themselves are all contained in int_util.c +// which will always be compiled into any compiler-rt library. +// +//===----------------------------------------------------------------------===//  #ifndef INT_UTIL_H  #define INT_UTIL_H -/** \brief Trigger a program abort (or panic for kernel code). */ +/// \brief Trigger a program abort (or panic for kernel code).  #define compilerrt_abort() __compilerrt_abort_impl(__FILE__, __LINE__, __func__)  NORETURN void __compilerrt_abort_impl(const char *file, int line, @@ -30,4 +28,4 @@ NORETURN void __compilerrt_abort_impl(const char *file, int line,  #define COMPILE_TIME_ASSERT2(expr, cnt)                                        \    typedef char ct_assert_##cnt[(expr) ? 1 : -1] UNUSED -#endif /* INT_UTIL_H */ +#endif // INT_UTIL_H diff --git a/lib/builtins/lshrdi3.c b/lib/builtins/lshrdi3.c index 67b2a7668345..97e08e1e9ba0 100644 --- a/lib/builtins/lshrdi3.c +++ b/lib/builtins/lshrdi3.c @@ -1,45 +1,38 @@ -/* ===-- lshrdi3.c - Implement __lshrdi3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __lshrdi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- lshrdi3.c - Implement __lshrdi3 -----------------------------------===// +// +// 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 implements __lshrdi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: logical a >> b */ +// Returns: logical a >> b -/* Precondition:  0 <= b < bits_in_dword */ +// Precondition:  0 <= b < bits_in_dword -COMPILER_RT_ABI di_int -__lshrdi3(di_int a, si_int b) -{ -    const int bits_in_word = (int)(sizeof(si_int) * CHAR_BIT); -    udwords input; -    udwords result; -    input.all = a; -    if (b & bits_in_word)  /* bits_in_word <= b < bits_in_dword */ -    { -        result.s.high = 0; -        result.s.low = input.s.high >> (b - bits_in_word); -    } -    else  /* 0 <= b < bits_in_word */ -    { -        if (b == 0) -            return a; -        result.s.high  = input.s.high >> b; -        result.s.low = (input.s.high << (bits_in_word - b)) | (input.s.low >> b); -    } -    return result.all; +COMPILER_RT_ABI di_int __lshrdi3(di_int a, si_int b) { +  const int bits_in_word = (int)(sizeof(si_int) * CHAR_BIT); +  udwords input; +  udwords result; +  input.all = a; +  if (b & bits_in_word) /* bits_in_word <= b < bits_in_dword */ { +    result.s.high = 0; +    result.s.low = input.s.high >> (b - bits_in_word); +  } else /* 0 <= b < bits_in_word */ { +    if (b == 0) +      return a; +    result.s.high = input.s.high >> b; +    result.s.low = (input.s.high << (bits_in_word - b)) | (input.s.low >> b); +  } +  return result.all;  }  #if defined(__ARM_EABI__) -AEABI_RTABI di_int __aeabi_llsr(di_int a, si_int b) COMPILER_RT_ALIAS(__lshrdi3); +COMPILER_RT_ALIAS(__lshrdi3, __aeabi_llsr)  #endif diff --git a/lib/builtins/lshrti3.c b/lib/builtins/lshrti3.c index e4170ff84a5a..d00a22095993 100644 --- a/lib/builtins/lshrti3.c +++ b/lib/builtins/lshrti3.c @@ -1,45 +1,38 @@ -/* ===-- lshrti3.c - Implement __lshrti3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __lshrti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- lshrti3.c - Implement __lshrti3 -----------------------------------===// +// +// 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 implements __lshrti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: logical a >> b */ +// Returns: logical a >> b -/* Precondition:  0 <= b < bits_in_tword */ +// Precondition:  0 <= b < bits_in_tword -COMPILER_RT_ABI ti_int -__lshrti3(ti_int a, si_int b) -{ -    const int bits_in_dword = (int)(sizeof(di_int) * CHAR_BIT); -    utwords input; -    utwords result; -    input.all = a; -    if (b & bits_in_dword)  /* bits_in_dword <= b < bits_in_tword */ -    { -        result.s.high = 0; -        result.s.low = input.s.high >> (b - bits_in_dword); -    } -    else  /* 0 <= b < bits_in_dword */ -    { -        if (b == 0) -            return a; -        result.s.high  = input.s.high >> b; -        result.s.low = (input.s.high << (bits_in_dword - b)) | (input.s.low >> b); -    } -    return result.all; +COMPILER_RT_ABI ti_int __lshrti3(ti_int a, si_int b) { +  const int bits_in_dword = (int)(sizeof(di_int) * CHAR_BIT); +  utwords input; +  utwords result; +  input.all = a; +  if (b & bits_in_dword) /* bits_in_dword <= b < bits_in_tword */ { +    result.s.high = 0; +    result.s.low = input.s.high >> (b - bits_in_dword); +  } else /* 0 <= b < bits_in_dword */ { +    if (b == 0) +      return a; +    result.s.high = input.s.high >> b; +    result.s.low = (input.s.high << (bits_in_dword - b)) | (input.s.low >> b); +  } +  return result.all;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/mingw_fixfloat.c b/lib/builtins/mingw_fixfloat.c index c462e0dbf654..945be9d4344a 100644 --- a/lib/builtins/mingw_fixfloat.c +++ b/lib/builtins/mingw_fixfloat.c @@ -1,12 +1,10 @@ -/* ===-- mingw_fixfloat.c - Wrap int/float conversions for arm/windows -----=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===-- mingw_fixfloat.c - Wrap int/float conversions for arm/windows -----===// +// +// 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 "int_lib.h" diff --git a/lib/builtins/moddi3.c b/lib/builtins/moddi3.c index a04279e3875f..92b0996077c6 100644 --- a/lib/builtins/moddi3.c +++ b/lib/builtins/moddi3.c @@ -1,30 +1,26 @@ -/*===-- moddi3.c - Implement __moddi3 -------------------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __moddi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- moddi3.c - Implement __moddi3 -------------------------------------===// +// +// 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 implements __moddi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a % b */ +// Returns: a % b -COMPILER_RT_ABI di_int -__moddi3(di_int a, di_int b) -{ -    const int bits_in_dword_m1 = (int)(sizeof(di_int) * CHAR_BIT) - 1; -    di_int s = b >> bits_in_dword_m1;  /* s = b < 0 ? -1 : 0 */ -    b = (b ^ s) - s;                   /* negate if s == -1 */ -    s = a >> bits_in_dword_m1;         /* s = a < 0 ? -1 : 0 */ -    a = (a ^ s) - s;                   /* negate if s == -1 */ -    du_int r; -    __udivmoddi4(a, b, &r); -    return ((di_int)r ^ s) - s;                /* negate if s == -1 */ +COMPILER_RT_ABI di_int __moddi3(di_int a, di_int b) { +  const int bits_in_dword_m1 = (int)(sizeof(di_int) * CHAR_BIT) - 1; +  di_int s = b >> bits_in_dword_m1; // s = b < 0 ? -1 : 0 +  b = (b ^ s) - s;                  // negate if s == -1 +  s = a >> bits_in_dword_m1;        // s = a < 0 ? -1 : 0 +  a = (a ^ s) - s;                  // negate if s == -1 +  du_int r; +  __udivmoddi4(a, b, &r); +  return ((di_int)r ^ s) - s; // negate if s == -1  } diff --git a/lib/builtins/modsi3.c b/lib/builtins/modsi3.c index 86c73ce13777..e443b8a59096 100644 --- a/lib/builtins/modsi3.c +++ b/lib/builtins/modsi3.c @@ -1,23 +1,19 @@ -/* ===-- modsi3.c - Implement __modsi3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __modsi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- modsi3.c - Implement __modsi3 -------------------------------------===// +// +// 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 implements __modsi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a % b */ +// Returns: a % b -COMPILER_RT_ABI si_int -__modsi3(si_int a, si_int b) -{ -    return a - __divsi3(a, b) * b; +COMPILER_RT_ABI si_int __modsi3(si_int a, si_int b) { +  return a - __divsi3(a, b) * b;  } diff --git a/lib/builtins/modti3.c b/lib/builtins/modti3.c index d505c07ac162..d11fe220b769 100644 --- a/lib/builtins/modti3.c +++ b/lib/builtins/modti3.c @@ -1,34 +1,30 @@ -/* ===-- modti3.c - Implement __modti3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __modti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- modti3.c - Implement __modti3 -------------------------------------===// +// +// 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 implements __modti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/*Returns: a % b */ +// Returns: a % b -COMPILER_RT_ABI ti_int -__modti3(ti_int a, ti_int b) -{ -    const int bits_in_tword_m1 = (int)(sizeof(ti_int) * CHAR_BIT) - 1; -    ti_int s = b >> bits_in_tword_m1;  /* s = b < 0 ? -1 : 0 */ -    b = (b ^ s) - s;                   /* negate if s == -1 */ -    s = a >> bits_in_tword_m1;         /* s = a < 0 ? -1 : 0 */ -    a = (a ^ s) - s;                   /* negate if s == -1 */ -    tu_int r; -    __udivmodti4(a, b, &r); -    return ((ti_int)r ^ s) - s;                /* negate if s == -1 */ +COMPILER_RT_ABI ti_int __modti3(ti_int a, ti_int b) { +  const int bits_in_tword_m1 = (int)(sizeof(ti_int) * CHAR_BIT) - 1; +  ti_int s = b >> bits_in_tword_m1; // s = b < 0 ? -1 : 0 +  b = (b ^ s) - s;                  // negate if s == -1 +  s = a >> bits_in_tword_m1;        // s = a < 0 ? -1 : 0 +  a = (a ^ s) - s;                  // negate if s == -1 +  tu_int r; +  __udivmodti4(a, b, &r); +  return ((ti_int)r ^ s) - s; // negate if s == -1  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/muldc3.c b/lib/builtins/muldc3.c index 16d8e98390a3..0ea7041c3706 100644 --- a/lib/builtins/muldc3.c +++ b/lib/builtins/muldc3.c @@ -1,73 +1,65 @@ -/* ===-- muldc3.c - Implement __muldc3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __muldc3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- muldc3.c - Implement __muldc3 -------------------------------------===// +// +// 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 implements __muldc3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #include "int_math.h" -/* Returns: the product of a + ib and c + id */ +// Returns: the product of a + ib and c + id -COMPILER_RT_ABI Dcomplex -__muldc3(double __a, double __b, double __c, double __d) -{ -    double __ac = __a * __c; -    double __bd = __b * __d; -    double __ad = __a * __d; -    double __bc = __b * __c; -    Dcomplex z; -    COMPLEX_REAL(z) = __ac - __bd; -    COMPLEX_IMAGINARY(z) = __ad + __bc; -    if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) -    { -        int __recalc = 0; -        if (crt_isinf(__a) || crt_isinf(__b)) -        { -            __a = crt_copysign(crt_isinf(__a) ? 1 : 0, __a); -            __b = crt_copysign(crt_isinf(__b) ? 1 : 0, __b); -            if (crt_isnan(__c)) -                __c = crt_copysign(0, __c); -            if (crt_isnan(__d)) -                __d = crt_copysign(0, __d); -            __recalc = 1; -        } -        if (crt_isinf(__c) || crt_isinf(__d)) -        { -            __c = crt_copysign(crt_isinf(__c) ? 1 : 0, __c); -            __d = crt_copysign(crt_isinf(__d) ? 1 : 0, __d); -            if (crt_isnan(__a)) -                __a = crt_copysign(0, __a); -            if (crt_isnan(__b)) -                __b = crt_copysign(0, __b); -            __recalc = 1; -        } -        if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || -                          crt_isinf(__ad) || crt_isinf(__bc))) -        { -            if (crt_isnan(__a)) -                __a = crt_copysign(0, __a); -            if (crt_isnan(__b)) -                __b = crt_copysign(0, __b); -            if (crt_isnan(__c)) -                __c = crt_copysign(0, __c); -            if (crt_isnan(__d)) -                __d = crt_copysign(0, __d); -            __recalc = 1; -        } -        if (__recalc) -        { -            COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c - __b * __d); -            COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__a * __d + __b * __c); -        } +COMPILER_RT_ABI Dcomplex __muldc3(double __a, double __b, double __c, +                                  double __d) { +  double __ac = __a * __c; +  double __bd = __b * __d; +  double __ad = __a * __d; +  double __bc = __b * __c; +  Dcomplex z; +  COMPLEX_REAL(z) = __ac - __bd; +  COMPLEX_IMAGINARY(z) = __ad + __bc; +  if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { +    int __recalc = 0; +    if (crt_isinf(__a) || crt_isinf(__b)) { +      __a = crt_copysign(crt_isinf(__a) ? 1 : 0, __a); +      __b = crt_copysign(crt_isinf(__b) ? 1 : 0, __b); +      if (crt_isnan(__c)) +        __c = crt_copysign(0, __c); +      if (crt_isnan(__d)) +        __d = crt_copysign(0, __d); +      __recalc = 1;      } -    return z; +    if (crt_isinf(__c) || crt_isinf(__d)) { +      __c = crt_copysign(crt_isinf(__c) ? 1 : 0, __c); +      __d = crt_copysign(crt_isinf(__d) ? 1 : 0, __d); +      if (crt_isnan(__a)) +        __a = crt_copysign(0, __a); +      if (crt_isnan(__b)) +        __b = crt_copysign(0, __b); +      __recalc = 1; +    } +    if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || crt_isinf(__ad) || +                      crt_isinf(__bc))) { +      if (crt_isnan(__a)) +        __a = crt_copysign(0, __a); +      if (crt_isnan(__b)) +        __b = crt_copysign(0, __b); +      if (crt_isnan(__c)) +        __c = crt_copysign(0, __c); +      if (crt_isnan(__d)) +        __d = crt_copysign(0, __d); +      __recalc = 1; +    } +    if (__recalc) { +      COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c - __b * __d); +      COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__a * __d + __b * __c); +    } +  } +  return z;  } diff --git a/lib/builtins/muldf3.c b/lib/builtins/muldf3.c index 1bb103e38c13..f64b5228d7b7 100644 --- a/lib/builtins/muldf3.c +++ b/lib/builtins/muldf3.c @@ -1,9 +1,8 @@  //===-- lib/muldf3.c - Double-precision multiplication ------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -15,16 +14,12 @@  #define DOUBLE_PRECISION  #include "fp_mul_impl.inc" -COMPILER_RT_ABI fp_t __muldf3(fp_t a, fp_t b) { -    return __mulXf3__(a, b); -} +COMPILER_RT_ABI fp_t __muldf3(fp_t a, fp_t b) { return __mulXf3__(a, b); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_dmul(fp_t a, fp_t b) { -  return __muldf3(a, b); -} +AEABI_RTABI fp_t __aeabi_dmul(fp_t a, fp_t b) { return __muldf3(a, b); }  #else -AEABI_RTABI fp_t __aeabi_dmul(fp_t a, fp_t b) COMPILER_RT_ALIAS(__muldf3); +COMPILER_RT_ALIAS(__muldf3, __aeabi_dmul)  #endif  #endif diff --git a/lib/builtins/muldi3.c b/lib/builtins/muldi3.c index a187315e9165..013f669a1833 100644 --- a/lib/builtins/muldi3.c +++ b/lib/builtins/muldi3.c @@ -1,58 +1,51 @@ -/* ===-- muldi3.c - Implement __muldi3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __muldi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- muldi3.c - Implement __muldi3 -------------------------------------===// +// +// 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 implements __muldi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a * b */ +// Returns: a * b -static -di_int -__muldsi3(su_int a, su_int b) -{ -    dwords r; -    const int bits_in_word_2 = (int)(sizeof(si_int) * CHAR_BIT) / 2; -    const su_int lower_mask = (su_int)~0 >> bits_in_word_2; -    r.s.low = (a & lower_mask) * (b & lower_mask); -    su_int t = r.s.low >> bits_in_word_2; -    r.s.low &= lower_mask; -    t += (a >> bits_in_word_2) * (b & lower_mask); -    r.s.low += (t & lower_mask) << bits_in_word_2; -    r.s.high = t >> bits_in_word_2; -    t = r.s.low >> bits_in_word_2; -    r.s.low &= lower_mask; -    t += (b >> bits_in_word_2) * (a & lower_mask); -    r.s.low += (t & lower_mask) << bits_in_word_2; -    r.s.high += t >> bits_in_word_2; -    r.s.high += (a >> bits_in_word_2) * (b >> bits_in_word_2); -    return r.all; +static di_int __muldsi3(su_int a, su_int b) { +  dwords r; +  const int bits_in_word_2 = (int)(sizeof(si_int) * CHAR_BIT) / 2; +  const su_int lower_mask = (su_int)~0 >> bits_in_word_2; +  r.s.low = (a & lower_mask) * (b & lower_mask); +  su_int t = r.s.low >> bits_in_word_2; +  r.s.low &= lower_mask; +  t += (a >> bits_in_word_2) * (b & lower_mask); +  r.s.low += (t & lower_mask) << bits_in_word_2; +  r.s.high = t >> bits_in_word_2; +  t = r.s.low >> bits_in_word_2; +  r.s.low &= lower_mask; +  t += (b >> bits_in_word_2) * (a & lower_mask); +  r.s.low += (t & lower_mask) << bits_in_word_2; +  r.s.high += t >> bits_in_word_2; +  r.s.high += (a >> bits_in_word_2) * (b >> bits_in_word_2); +  return r.all;  } -/* Returns: a * b */ +// Returns: a * b -COMPILER_RT_ABI di_int -__muldi3(di_int a, di_int b) -{ -    dwords x; -    x.all = a; -    dwords y; -    y.all = b; -    dwords r; -    r.all = __muldsi3(x.s.low, y.s.low); -    r.s.high += x.s.high * y.s.low + x.s.low * y.s.high; -    return r.all; +COMPILER_RT_ABI di_int __muldi3(di_int a, di_int b) { +  dwords x; +  x.all = a; +  dwords y; +  y.all = b; +  dwords r; +  r.all = __muldsi3(x.s.low, y.s.low); +  r.s.high += x.s.high * y.s.low + x.s.low * y.s.high; +  return r.all;  }  #if defined(__ARM_EABI__) -AEABI_RTABI di_int __aeabi_lmul(di_int a, di_int b) COMPILER_RT_ALIAS(__muldi3); +COMPILER_RT_ALIAS(__muldi3, __aeabi_lmul)  #endif diff --git a/lib/builtins/mulodi4.c b/lib/builtins/mulodi4.c index d2fd7db2bcd3..23f5571ac468 100644 --- a/lib/builtins/mulodi4.c +++ b/lib/builtins/mulodi4.c @@ -1,58 +1,49 @@ -/*===-- mulodi4.c - Implement __mulodi4 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __mulodi4 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- mulodi4.c - Implement __mulodi4 -----------------------------------===// +// +// 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 implements __mulodi4 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a * b */ +// Returns: a * b -/* Effects: sets *overflow to 1  if a * b overflows */ +// Effects: sets *overflow to 1  if a * b overflows -COMPILER_RT_ABI di_int -__mulodi4(di_int a, di_int b, int* overflow) -{ -    const int N = (int)(sizeof(di_int) * CHAR_BIT); -    const di_int MIN = (di_int)1 << (N-1); -    const di_int MAX = ~MIN; -    *overflow = 0;  -    di_int result = a * b; -    if (a == MIN) -    { -        if (b != 0 && b != 1) -	    *overflow = 1; -	return result; -    } -    if (b == MIN) -    { -        if (a != 0 && a != 1) -	    *overflow = 1; -        return result; -    } -    di_int sa = a >> (N - 1); -    di_int abs_a = (a ^ sa) - sa; -    di_int sb = b >> (N - 1); -    di_int abs_b = (b ^ sb) - sb; -    if (abs_a < 2 || abs_b < 2) -        return result; -    if (sa == sb) -    { -        if (abs_a > MAX / abs_b) -            *overflow = 1; -    } -    else -    { -        if (abs_a > MIN / -abs_b) -            *overflow = 1; -    } +COMPILER_RT_ABI di_int __mulodi4(di_int a, di_int b, int *overflow) { +  const int N = (int)(sizeof(di_int) * CHAR_BIT); +  const di_int MIN = (di_int)1 << (N - 1); +  const di_int MAX = ~MIN; +  *overflow = 0; +  di_int result = a * b; +  if (a == MIN) { +    if (b != 0 && b != 1) +      *overflow = 1;      return result; +  } +  if (b == MIN) { +    if (a != 0 && a != 1) +      *overflow = 1; +    return result; +  } +  di_int sa = a >> (N - 1); +  di_int abs_a = (a ^ sa) - sa; +  di_int sb = b >> (N - 1); +  di_int abs_b = (b ^ sb) - sb; +  if (abs_a < 2 || abs_b < 2) +    return result; +  if (sa == sb) { +    if (abs_a > MAX / abs_b) +      *overflow = 1; +  } else { +    if (abs_a > MIN / -abs_b) +      *overflow = 1; +  } +  return result;  } diff --git a/lib/builtins/mulosi4.c b/lib/builtins/mulosi4.c index 422528085c44..fea4311296f8 100644 --- a/lib/builtins/mulosi4.c +++ b/lib/builtins/mulosi4.c @@ -1,58 +1,49 @@ -/*===-- mulosi4.c - Implement __mulosi4 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __mulosi4 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- mulosi4.c - Implement __mulosi4 -----------------------------------===// +// +// 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 implements __mulosi4 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a * b */ +// Returns: a * b -/* Effects: sets *overflow to 1  if a * b overflows */ +// Effects: sets *overflow to 1  if a * b overflows -COMPILER_RT_ABI si_int -__mulosi4(si_int a, si_int b, int* overflow) -{ -    const int N = (int)(sizeof(si_int) * CHAR_BIT); -    const si_int MIN = (si_int)1 << (N-1); -    const si_int MAX = ~MIN; -    *overflow = 0;  -    si_int result = a * b; -    if (a == MIN) -    { -        if (b != 0 && b != 1) -	    *overflow = 1; -	return result; -    } -    if (b == MIN) -    { -        if (a != 0 && a != 1) -	    *overflow = 1; -        return result; -    } -    si_int sa = a >> (N - 1); -    si_int abs_a = (a ^ sa) - sa; -    si_int sb = b >> (N - 1); -    si_int abs_b = (b ^ sb) - sb; -    if (abs_a < 2 || abs_b < 2) -        return result; -    if (sa == sb) -    { -        if (abs_a > MAX / abs_b) -            *overflow = 1; -    } -    else -    { -        if (abs_a > MIN / -abs_b) -            *overflow = 1; -    } +COMPILER_RT_ABI si_int __mulosi4(si_int a, si_int b, int *overflow) { +  const int N = (int)(sizeof(si_int) * CHAR_BIT); +  const si_int MIN = (si_int)1 << (N - 1); +  const si_int MAX = ~MIN; +  *overflow = 0; +  si_int result = a * b; +  if (a == MIN) { +    if (b != 0 && b != 1) +      *overflow = 1;      return result; +  } +  if (b == MIN) { +    if (a != 0 && a != 1) +      *overflow = 1; +    return result; +  } +  si_int sa = a >> (N - 1); +  si_int abs_a = (a ^ sa) - sa; +  si_int sb = b >> (N - 1); +  si_int abs_b = (b ^ sb) - sb; +  if (abs_a < 2 || abs_b < 2) +    return result; +  if (sa == sb) { +    if (abs_a > MAX / abs_b) +      *overflow = 1; +  } else { +    if (abs_a > MIN / -abs_b) +      *overflow = 1; +  } +  return result;  } diff --git a/lib/builtins/muloti4.c b/lib/builtins/muloti4.c index 16b218920321..9bdd5b649908 100644 --- a/lib/builtins/muloti4.c +++ b/lib/builtins/muloti4.c @@ -1,62 +1,53 @@ -/*===-- muloti4.c - Implement __muloti4 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __muloti4 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- muloti4.c - Implement __muloti4 -----------------------------------===// +// +// 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 implements __muloti4 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: a * b */ +// Returns: a * b -/* Effects: sets *overflow to 1  if a * b overflows */ +// Effects: sets *overflow to 1  if a * b overflows -COMPILER_RT_ABI ti_int -__muloti4(ti_int a, ti_int b, int* overflow) -{ -    const int N = (int)(sizeof(ti_int) * CHAR_BIT); -    const ti_int MIN = (ti_int)1 << (N-1); -    const ti_int MAX = ~MIN; -    *overflow = 0; -    ti_int result = a * b; -    if (a == MIN) -    { -        if (b != 0 && b != 1) -	    *overflow = 1; -	return result; -    } -    if (b == MIN) -    { -        if (a != 0 && a != 1) -	    *overflow = 1; -        return result; -    } -    ti_int sa = a >> (N - 1); -    ti_int abs_a = (a ^ sa) - sa; -    ti_int sb = b >> (N - 1); -    ti_int abs_b = (b ^ sb) - sb; -    if (abs_a < 2 || abs_b < 2) -        return result; -    if (sa == sb) -    { -        if (abs_a > MAX / abs_b) -            *overflow = 1; -    } -    else -    { -        if (abs_a > MIN / -abs_b) -            *overflow = 1; -    } +COMPILER_RT_ABI ti_int __muloti4(ti_int a, ti_int b, int *overflow) { +  const int N = (int)(sizeof(ti_int) * CHAR_BIT); +  const ti_int MIN = (ti_int)1 << (N - 1); +  const ti_int MAX = ~MIN; +  *overflow = 0; +  ti_int result = a * b; +  if (a == MIN) { +    if (b != 0 && b != 1) +      *overflow = 1;      return result; +  } +  if (b == MIN) { +    if (a != 0 && a != 1) +      *overflow = 1; +    return result; +  } +  ti_int sa = a >> (N - 1); +  ti_int abs_a = (a ^ sa) - sa; +  ti_int sb = b >> (N - 1); +  ti_int abs_b = (b ^ sb) - sb; +  if (abs_a < 2 || abs_b < 2) +    return result; +  if (sa == sb) { +    if (abs_a > MAX / abs_b) +      *overflow = 1; +  } else { +    if (abs_a > MIN / -abs_b) +      *overflow = 1; +  } +  return result;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/mulsc3.c b/lib/builtins/mulsc3.c index c89cfd247a15..60653174e440 100644 --- a/lib/builtins/mulsc3.c +++ b/lib/builtins/mulsc3.c @@ -1,73 +1,64 @@ -/* ===-- mulsc3.c - Implement __mulsc3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __mulsc3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- mulsc3.c - Implement __mulsc3 -------------------------------------===// +// +// 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 implements __mulsc3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #include "int_math.h" -/* Returns: the product of a + ib and c + id */ +// Returns: the product of a + ib and c + id -COMPILER_RT_ABI Fcomplex -__mulsc3(float __a, float __b, float __c, float __d) -{ -    float __ac = __a * __c; -    float __bd = __b * __d; -    float __ad = __a * __d; -    float __bc = __b * __c; -    Fcomplex z; -    COMPLEX_REAL(z) = __ac - __bd; -    COMPLEX_IMAGINARY(z) = __ad + __bc; -    if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) -    { -        int __recalc = 0; -        if (crt_isinf(__a) || crt_isinf(__b)) -        { -            __a = crt_copysignf(crt_isinf(__a) ? 1 : 0, __a); -            __b = crt_copysignf(crt_isinf(__b) ? 1 : 0, __b); -            if (crt_isnan(__c)) -                __c = crt_copysignf(0, __c); -            if (crt_isnan(__d)) -                __d = crt_copysignf(0, __d); -            __recalc = 1; -        } -        if (crt_isinf(__c) || crt_isinf(__d)) -        { -            __c = crt_copysignf(crt_isinf(__c) ? 1 : 0, __c); -            __d = crt_copysignf(crt_isinf(__d) ? 1 : 0, __d); -            if (crt_isnan(__a)) -                __a = crt_copysignf(0, __a); -            if (crt_isnan(__b)) -                __b = crt_copysignf(0, __b); -            __recalc = 1; -        } -        if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || -                          crt_isinf(__ad) || crt_isinf(__bc))) -        { -            if (crt_isnan(__a)) -                __a = crt_copysignf(0, __a); -            if (crt_isnan(__b)) -                __b = crt_copysignf(0, __b); -            if (crt_isnan(__c)) -                __c = crt_copysignf(0, __c); -            if (crt_isnan(__d)) -                __d = crt_copysignf(0, __d); -            __recalc = 1; -        } -        if (__recalc) -        { -            COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c - __b * __d); -            COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__a * __d + __b * __c); -        } +COMPILER_RT_ABI Fcomplex __mulsc3(float __a, float __b, float __c, float __d) { +  float __ac = __a * __c; +  float __bd = __b * __d; +  float __ad = __a * __d; +  float __bc = __b * __c; +  Fcomplex z; +  COMPLEX_REAL(z) = __ac - __bd; +  COMPLEX_IMAGINARY(z) = __ad + __bc; +  if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { +    int __recalc = 0; +    if (crt_isinf(__a) || crt_isinf(__b)) { +      __a = crt_copysignf(crt_isinf(__a) ? 1 : 0, __a); +      __b = crt_copysignf(crt_isinf(__b) ? 1 : 0, __b); +      if (crt_isnan(__c)) +        __c = crt_copysignf(0, __c); +      if (crt_isnan(__d)) +        __d = crt_copysignf(0, __d); +      __recalc = 1;      } -    return z; +    if (crt_isinf(__c) || crt_isinf(__d)) { +      __c = crt_copysignf(crt_isinf(__c) ? 1 : 0, __c); +      __d = crt_copysignf(crt_isinf(__d) ? 1 : 0, __d); +      if (crt_isnan(__a)) +        __a = crt_copysignf(0, __a); +      if (crt_isnan(__b)) +        __b = crt_copysignf(0, __b); +      __recalc = 1; +    } +    if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || crt_isinf(__ad) || +                      crt_isinf(__bc))) { +      if (crt_isnan(__a)) +        __a = crt_copysignf(0, __a); +      if (crt_isnan(__b)) +        __b = crt_copysignf(0, __b); +      if (crt_isnan(__c)) +        __c = crt_copysignf(0, __c); +      if (crt_isnan(__d)) +        __d = crt_copysignf(0, __d); +      __recalc = 1; +    } +    if (__recalc) { +      COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c - __b * __d); +      COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__a * __d + __b * __c); +    } +  } +  return z;  } diff --git a/lib/builtins/mulsf3.c b/lib/builtins/mulsf3.c index 1e2cf3e717c9..b9cf39abc784 100644 --- a/lib/builtins/mulsf3.c +++ b/lib/builtins/mulsf3.c @@ -1,9 +1,8 @@  //===-- lib/mulsf3.c - Single-precision multiplication ------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -15,16 +14,12 @@  #define SINGLE_PRECISION  #include "fp_mul_impl.inc" -COMPILER_RT_ABI fp_t __mulsf3(fp_t a, fp_t b) { -    return __mulXf3__(a, b); -} +COMPILER_RT_ABI fp_t __mulsf3(fp_t a, fp_t b) { return __mulXf3__(a, b); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_fmul(fp_t a, fp_t b) { -  return __mulsf3(a, b); -} +AEABI_RTABI fp_t __aeabi_fmul(fp_t a, fp_t b) { return __mulsf3(a, b); }  #else -AEABI_RTABI fp_t __aeabi_fmul(fp_t a, fp_t b) COMPILER_RT_ALIAS(__mulsf3); +COMPILER_RT_ALIAS(__mulsf3, __aeabi_fmul)  #endif  #endif diff --git a/lib/builtins/multc3.c b/lib/builtins/multc3.c index 0518bc2569f1..bb7f6aabfe2c 100644 --- a/lib/builtins/multc3.c +++ b/lib/builtins/multc3.c @@ -1,68 +1,65 @@ -/* ===-- multc3.c - Implement __multc3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __multc3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- multc3.c - Implement __multc3 -------------------------------------===// +// +// 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 implements __multc3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #include "int_math.h" -/* Returns: the product of a + ib and c + id */ +// Returns: the product of a + ib and c + id -COMPILER_RT_ABI long double _Complex -__multc3(long double a, long double b, long double c, long double d) -{ -    long double ac = a * c; -    long double bd = b * d; -    long double ad = a * d; -    long double bc = b * c; -    long double _Complex z; -    __real__ z = ac - bd; -    __imag__ z = ad + bc; -    if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) { -        int recalc = 0; -        if (crt_isinf(a) || crt_isinf(b)) { -            a = crt_copysignl(crt_isinf(a) ? 1 : 0, a); -            b = crt_copysignl(crt_isinf(b) ? 1 : 0, b); -            if (crt_isnan(c)) -                c = crt_copysignl(0, c); -            if (crt_isnan(d)) -                d = crt_copysignl(0, d); -            recalc = 1; -        } -        if (crt_isinf(c) || crt_isinf(d)) { -            c = crt_copysignl(crt_isinf(c) ? 1 : 0, c); -            d = crt_copysignl(crt_isinf(d) ? 1 : 0, d); -            if (crt_isnan(a)) -                a = crt_copysignl(0, a); -            if (crt_isnan(b)) -                b = crt_copysignl(0, b); -            recalc = 1; -        } -        if (!recalc && (crt_isinf(ac) || crt_isinf(bd) || -                          crt_isinf(ad) || crt_isinf(bc))) { -            if (crt_isnan(a)) -                a = crt_copysignl(0, a); -            if (crt_isnan(b)) -                b = crt_copysignl(0, b); -            if (crt_isnan(c)) -                c = crt_copysignl(0, c); -            if (crt_isnan(d)) -                d = crt_copysignl(0, d); -            recalc = 1; -        } -        if (recalc) { -            __real__ z = CRT_INFINITY * (a * c - b * d); -            __imag__ z = CRT_INFINITY * (a * d + b * c); -        } +COMPILER_RT_ABI long double _Complex __multc3(long double a, long double b, +                                              long double c, long double d) { +  long double ac = a * c; +  long double bd = b * d; +  long double ad = a * d; +  long double bc = b * c; +  long double _Complex z; +  __real__ z = ac - bd; +  __imag__ z = ad + bc; +  if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) { +    int recalc = 0; +    if (crt_isinf(a) || crt_isinf(b)) { +      a = crt_copysignl(crt_isinf(a) ? 1 : 0, a); +      b = crt_copysignl(crt_isinf(b) ? 1 : 0, b); +      if (crt_isnan(c)) +        c = crt_copysignl(0, c); +      if (crt_isnan(d)) +        d = crt_copysignl(0, d); +      recalc = 1;      } -    return z; +    if (crt_isinf(c) || crt_isinf(d)) { +      c = crt_copysignl(crt_isinf(c) ? 1 : 0, c); +      d = crt_copysignl(crt_isinf(d) ? 1 : 0, d); +      if (crt_isnan(a)) +        a = crt_copysignl(0, a); +      if (crt_isnan(b)) +        b = crt_copysignl(0, b); +      recalc = 1; +    } +    if (!recalc && +        (crt_isinf(ac) || crt_isinf(bd) || crt_isinf(ad) || crt_isinf(bc))) { +      if (crt_isnan(a)) +        a = crt_copysignl(0, a); +      if (crt_isnan(b)) +        b = crt_copysignl(0, b); +      if (crt_isnan(c)) +        c = crt_copysignl(0, c); +      if (crt_isnan(d)) +        d = crt_copysignl(0, d); +      recalc = 1; +    } +    if (recalc) { +      __real__ z = CRT_INFINITY * (a * c - b * d); +      __imag__ z = CRT_INFINITY * (a * d + b * c); +    } +  } +  return z;  } diff --git a/lib/builtins/multf3.c b/lib/builtins/multf3.c index 0b915923ea09..0626fb8c7fc9 100644 --- a/lib/builtins/multf3.c +++ b/lib/builtins/multf3.c @@ -1,9 +1,8 @@  //===-- lib/multf3.c - Quad-precision multiplication --------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -18,8 +17,6 @@  #if defined(CRT_HAS_128BIT) && defined(CRT_LDBL_128BIT)  #include "fp_mul_impl.inc" -COMPILER_RT_ABI fp_t __multf3(fp_t a, fp_t b) { -    return __mulXf3__(a, b); -} +COMPILER_RT_ABI fp_t __multf3(fp_t a, fp_t b) { return __mulXf3__(a, b); }  #endif diff --git a/lib/builtins/multi3.c b/lib/builtins/multi3.c index e0d52d430b66..d9d8b59cd3ef 100644 --- a/lib/builtins/multi3.c +++ b/lib/builtins/multi3.c @@ -1,58 +1,51 @@ -/* ===-- multi3.c - Implement __multi3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - - * This file implements __multi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- multi3.c - Implement __multi3 -------------------------------------===// +// +// 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 implements __multi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: a * b */ - -static -ti_int -__mulddi3(du_int a, du_int b) -{ -    twords r; -    const int bits_in_dword_2 = (int)(sizeof(di_int) * CHAR_BIT) / 2; -    const du_int lower_mask = (du_int)~0 >> bits_in_dword_2; -    r.s.low = (a & lower_mask) * (b & lower_mask); -    du_int t = r.s.low >> bits_in_dword_2; -    r.s.low &= lower_mask; -    t += (a >> bits_in_dword_2) * (b & lower_mask); -    r.s.low += (t & lower_mask) << bits_in_dword_2; -    r.s.high = t >> bits_in_dword_2; -    t = r.s.low >> bits_in_dword_2; -    r.s.low &= lower_mask; -    t += (b >> bits_in_dword_2) * (a & lower_mask); -    r.s.low += (t & lower_mask) << bits_in_dword_2; -    r.s.high += t >> bits_in_dword_2; -    r.s.high += (a >> bits_in_dword_2) * (b >> bits_in_dword_2); -    return r.all; +// Returns: a * b + +static ti_int __mulddi3(du_int a, du_int b) { +  twords r; +  const int bits_in_dword_2 = (int)(sizeof(di_int) * CHAR_BIT) / 2; +  const du_int lower_mask = (du_int)~0 >> bits_in_dword_2; +  r.s.low = (a & lower_mask) * (b & lower_mask); +  du_int t = r.s.low >> bits_in_dword_2; +  r.s.low &= lower_mask; +  t += (a >> bits_in_dword_2) * (b & lower_mask); +  r.s.low += (t & lower_mask) << bits_in_dword_2; +  r.s.high = t >> bits_in_dword_2; +  t = r.s.low >> bits_in_dword_2; +  r.s.low &= lower_mask; +  t += (b >> bits_in_dword_2) * (a & lower_mask); +  r.s.low += (t & lower_mask) << bits_in_dword_2; +  r.s.high += t >> bits_in_dword_2; +  r.s.high += (a >> bits_in_dword_2) * (b >> bits_in_dword_2); +  return r.all;  } -/* Returns: a * b */ - -COMPILER_RT_ABI ti_int -__multi3(ti_int a, ti_int b) -{ -    twords x; -    x.all = a; -    twords y; -    y.all = b; -    twords r; -    r.all = __mulddi3(x.s.low, y.s.low); -    r.s.high += x.s.high * y.s.low + x.s.low * y.s.high; -    return r.all; +// Returns: a * b + +COMPILER_RT_ABI ti_int __multi3(ti_int a, ti_int b) { +  twords x; +  x.all = a; +  twords y; +  y.all = b; +  twords r; +  r.all = __mulddi3(x.s.low, y.s.low); +  r.s.high += x.s.high * y.s.low + x.s.low * y.s.high; +  return r.all;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/mulvdi3.c b/lib/builtins/mulvdi3.c index e63249e0a04c..cecc97ccf22e 100644 --- a/lib/builtins/mulvdi3.c +++ b/lib/builtins/mulvdi3.c @@ -1,56 +1,47 @@ -/*===-- mulvdi3.c - Implement __mulvdi3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __mulvdi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- mulvdi3.c - Implement __mulvdi3 -----------------------------------===// +// +// 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 implements __mulvdi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a * b */ +// Returns: a * b -/* Effects: aborts if a * b overflows */ +// Effects: aborts if a * b overflows -COMPILER_RT_ABI di_int -__mulvdi3(di_int a, di_int b) -{ -    const int N = (int)(sizeof(di_int) * CHAR_BIT); -    const di_int MIN = (di_int)1 << (N-1); -    const di_int MAX = ~MIN; -    if (a == MIN) -    { -        if (b == 0 || b == 1) -            return a * b; -        compilerrt_abort(); -    } -    if (b == MIN) -    { -        if (a == 0 || a == 1) -            return a * b; -        compilerrt_abort(); -    } -    di_int sa = a >> (N - 1); -    di_int abs_a = (a ^ sa) - sa; -    di_int sb = b >> (N - 1); -    di_int abs_b = (b ^ sb) - sb; -    if (abs_a < 2 || abs_b < 2) -        return a * b; -    if (sa == sb) -    { -        if (abs_a > MAX / abs_b) -            compilerrt_abort(); -    } -    else -    { -        if (abs_a > MIN / -abs_b) -            compilerrt_abort(); -    } +COMPILER_RT_ABI di_int __mulvdi3(di_int a, di_int b) { +  const int N = (int)(sizeof(di_int) * CHAR_BIT); +  const di_int MIN = (di_int)1 << (N - 1); +  const di_int MAX = ~MIN; +  if (a == MIN) { +    if (b == 0 || b == 1) +      return a * b; +    compilerrt_abort(); +  } +  if (b == MIN) { +    if (a == 0 || a == 1) +      return a * b; +    compilerrt_abort(); +  } +  di_int sa = a >> (N - 1); +  di_int abs_a = (a ^ sa) - sa; +  di_int sb = b >> (N - 1); +  di_int abs_b = (b ^ sb) - sb; +  if (abs_a < 2 || abs_b < 2)      return a * b; +  if (sa == sb) { +    if (abs_a > MAX / abs_b) +      compilerrt_abort(); +  } else { +    if (abs_a > MIN / -abs_b) +      compilerrt_abort(); +  } +  return a * b;  } diff --git a/lib/builtins/mulvsi3.c b/lib/builtins/mulvsi3.c index 74ea4f2da226..0d6b18ad01a4 100644 --- a/lib/builtins/mulvsi3.c +++ b/lib/builtins/mulvsi3.c @@ -1,56 +1,47 @@ -/* ===-- mulvsi3.c - Implement __mulvsi3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __mulvsi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- mulvsi3.c - Implement __mulvsi3 -----------------------------------===// +// +// 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 implements __mulvsi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a * b */ +// Returns: a * b -/* Effects: aborts if a * b overflows */ +// Effects: aborts if a * b overflows -COMPILER_RT_ABI si_int -__mulvsi3(si_int a, si_int b) -{ -    const int N = (int)(sizeof(si_int) * CHAR_BIT); -    const si_int MIN = (si_int)1 << (N-1); -    const si_int MAX = ~MIN; -    if (a == MIN) -    { -        if (b == 0 || b == 1) -            return a * b; -        compilerrt_abort(); -    } -    if (b == MIN) -    { -        if (a == 0 || a == 1) -            return a * b; -        compilerrt_abort(); -    } -    si_int sa = a >> (N - 1); -    si_int abs_a = (a ^ sa) - sa; -    si_int sb = b >> (N - 1); -    si_int abs_b = (b ^ sb) - sb; -    if (abs_a < 2 || abs_b < 2) -        return a * b; -    if (sa == sb) -    { -        if (abs_a > MAX / abs_b) -            compilerrt_abort(); -    } -    else -    { -        if (abs_a > MIN / -abs_b) -            compilerrt_abort(); -    } +COMPILER_RT_ABI si_int __mulvsi3(si_int a, si_int b) { +  const int N = (int)(sizeof(si_int) * CHAR_BIT); +  const si_int MIN = (si_int)1 << (N - 1); +  const si_int MAX = ~MIN; +  if (a == MIN) { +    if (b == 0 || b == 1) +      return a * b; +    compilerrt_abort(); +  } +  if (b == MIN) { +    if (a == 0 || a == 1) +      return a * b; +    compilerrt_abort(); +  } +  si_int sa = a >> (N - 1); +  si_int abs_a = (a ^ sa) - sa; +  si_int sb = b >> (N - 1); +  si_int abs_b = (b ^ sb) - sb; +  if (abs_a < 2 || abs_b < 2)      return a * b; +  if (sa == sb) { +    if (abs_a > MAX / abs_b) +      compilerrt_abort(); +  } else { +    if (abs_a > MIN / -abs_b) +      compilerrt_abort(); +  } +  return a * b;  } diff --git a/lib/builtins/mulvti3.c b/lib/builtins/mulvti3.c index f4c7d1612ba9..03963a0ca694 100644 --- a/lib/builtins/mulvti3.c +++ b/lib/builtins/mulvti3.c @@ -1,60 +1,51 @@ -/* ===-- mulvti3.c - Implement __mulvti3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __mulvti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- mulvti3.c - Implement __mulvti3 -----------------------------------===// +// +// 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 implements __mulvti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: a * b */ +// Returns: a * b -/* Effects: aborts if a * b overflows */ +// Effects: aborts if a * b overflows -COMPILER_RT_ABI ti_int -__mulvti3(ti_int a, ti_int b) -{ -    const int N = (int)(sizeof(ti_int) * CHAR_BIT); -    const ti_int MIN = (ti_int)1 << (N-1); -    const ti_int MAX = ~MIN; -    if (a == MIN) -    { -        if (b == 0 || b == 1) -            return a * b; -        compilerrt_abort(); -    } -    if (b == MIN) -    { -        if (a == 0 || a == 1) -            return a * b; -        compilerrt_abort(); -    } -    ti_int sa = a >> (N - 1); -    ti_int abs_a = (a ^ sa) - sa; -    ti_int sb = b >> (N - 1); -    ti_int abs_b = (b ^ sb) - sb; -    if (abs_a < 2 || abs_b < 2) -        return a * b; -    if (sa == sb) -    { -        if (abs_a > MAX / abs_b) -            compilerrt_abort(); -    } -    else -    { -        if (abs_a > MIN / -abs_b) -            compilerrt_abort(); -    } +COMPILER_RT_ABI ti_int __mulvti3(ti_int a, ti_int b) { +  const int N = (int)(sizeof(ti_int) * CHAR_BIT); +  const ti_int MIN = (ti_int)1 << (N - 1); +  const ti_int MAX = ~MIN; +  if (a == MIN) { +    if (b == 0 || b == 1) +      return a * b; +    compilerrt_abort(); +  } +  if (b == MIN) { +    if (a == 0 || a == 1) +      return a * b; +    compilerrt_abort(); +  } +  ti_int sa = a >> (N - 1); +  ti_int abs_a = (a ^ sa) - sa; +  ti_int sb = b >> (N - 1); +  ti_int abs_b = (b ^ sb) - sb; +  if (abs_a < 2 || abs_b < 2)      return a * b; +  if (sa == sb) { +    if (abs_a > MAX / abs_b) +      compilerrt_abort(); +  } else { +    if (abs_a > MIN / -abs_b) +      compilerrt_abort(); +  } +  return a * b;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/mulxc3.c b/lib/builtins/mulxc3.c index ba3221691821..2f7f14c28453 100644 --- a/lib/builtins/mulxc3.c +++ b/lib/builtins/mulxc3.c @@ -1,77 +1,69 @@ -/* ===-- mulxc3.c - Implement __mulxc3 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __mulxc3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- mulxc3.c - Implement __mulxc3 -------------------------------------===// +// +// 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 implements __mulxc3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #if !_ARCH_PPC  #include "int_lib.h"  #include "int_math.h" -/* Returns: the product of a + ib and c + id */ +// Returns: the product of a + ib and c + id -COMPILER_RT_ABI Lcomplex -__mulxc3(long double __a, long double __b, long double __c, long double __d) -{ -    long double __ac = __a * __c; -    long double __bd = __b * __d; -    long double __ad = __a * __d; -    long double __bc = __b * __c; -    Lcomplex z; -    COMPLEX_REAL(z) = __ac - __bd; -    COMPLEX_IMAGINARY(z) = __ad + __bc; -    if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) -    { -        int __recalc = 0; -        if (crt_isinf(__a) || crt_isinf(__b)) -        { -            __a = crt_copysignl(crt_isinf(__a) ? 1 : 0, __a); -            __b = crt_copysignl(crt_isinf(__b) ? 1 : 0, __b); -            if (crt_isnan(__c)) -                __c = crt_copysignl(0, __c); -            if (crt_isnan(__d)) -                __d = crt_copysignl(0, __d); -            __recalc = 1; -        } -        if (crt_isinf(__c) || crt_isinf(__d)) -        { -            __c = crt_copysignl(crt_isinf(__c) ? 1 : 0, __c); -            __d = crt_copysignl(crt_isinf(__d) ? 1 : 0, __d); -            if (crt_isnan(__a)) -                __a = crt_copysignl(0, __a); -            if (crt_isnan(__b)) -                __b = crt_copysignl(0, __b); -            __recalc = 1; -        } -        if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || -                          crt_isinf(__ad) || crt_isinf(__bc))) -        { -            if (crt_isnan(__a)) -                __a = crt_copysignl(0, __a); -            if (crt_isnan(__b)) -                __b = crt_copysignl(0, __b); -            if (crt_isnan(__c)) -                __c = crt_copysignl(0, __c); -            if (crt_isnan(__d)) -                __d = crt_copysignl(0, __d); -            __recalc = 1; -        } -        if (__recalc) -        { -            COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c - __b * __d); -            COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__a * __d + __b * __c); -        } +COMPILER_RT_ABI Lcomplex __mulxc3(long double __a, long double __b, +                                  long double __c, long double __d) { +  long double __ac = __a * __c; +  long double __bd = __b * __d; +  long double __ad = __a * __d; +  long double __bc = __b * __c; +  Lcomplex z; +  COMPLEX_REAL(z) = __ac - __bd; +  COMPLEX_IMAGINARY(z) = __ad + __bc; +  if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { +    int __recalc = 0; +    if (crt_isinf(__a) || crt_isinf(__b)) { +      __a = crt_copysignl(crt_isinf(__a) ? 1 : 0, __a); +      __b = crt_copysignl(crt_isinf(__b) ? 1 : 0, __b); +      if (crt_isnan(__c)) +        __c = crt_copysignl(0, __c); +      if (crt_isnan(__d)) +        __d = crt_copysignl(0, __d); +      __recalc = 1;      } -    return z; +    if (crt_isinf(__c) || crt_isinf(__d)) { +      __c = crt_copysignl(crt_isinf(__c) ? 1 : 0, __c); +      __d = crt_copysignl(crt_isinf(__d) ? 1 : 0, __d); +      if (crt_isnan(__a)) +        __a = crt_copysignl(0, __a); +      if (crt_isnan(__b)) +        __b = crt_copysignl(0, __b); +      __recalc = 1; +    } +    if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || crt_isinf(__ad) || +                      crt_isinf(__bc))) { +      if (crt_isnan(__a)) +        __a = crt_copysignl(0, __a); +      if (crt_isnan(__b)) +        __b = crt_copysignl(0, __b); +      if (crt_isnan(__c)) +        __c = crt_copysignl(0, __c); +      if (crt_isnan(__d)) +        __d = crt_copysignl(0, __d); +      __recalc = 1; +    } +    if (__recalc) { +      COMPLEX_REAL(z) = CRT_INFINITY * (__a * __c - __b * __d); +      COMPLEX_IMAGINARY(z) = CRT_INFINITY * (__a * __d + __b * __c); +    } +  } +  return z;  }  #endif diff --git a/lib/builtins/negdf2.c b/lib/builtins/negdf2.c index f0bfaad24743..f9ceaa374542 100644 --- a/lib/builtins/negdf2.c +++ b/lib/builtins/negdf2.c @@ -1,9 +1,8 @@  //===-- lib/negdf2.c - double-precision negation ------------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -14,17 +13,12 @@  #define DOUBLE_PRECISION  #include "fp_lib.h" -COMPILER_RT_ABI fp_t -__negdf2(fp_t a) { -    return fromRep(toRep(a) ^ signBit); -} +COMPILER_RT_ABI fp_t __negdf2(fp_t a) { return fromRep(toRep(a) ^ signBit); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_dneg(fp_t a) { -  return __negdf2(a); -} +AEABI_RTABI fp_t __aeabi_dneg(fp_t a) { return __negdf2(a); }  #else -AEABI_RTABI fp_t __aeabi_dneg(fp_t a) COMPILER_RT_ALIAS(__negdf2); +COMPILER_RT_ALIAS(__negdf2, __aeabi_dneg)  #endif  #endif diff --git a/lib/builtins/negdi2.c b/lib/builtins/negdi2.c index 3d49ba2899d2..5a525d4b0e55 100644 --- a/lib/builtins/negdi2.c +++ b/lib/builtins/negdi2.c @@ -1,26 +1,21 @@ -/* ===-- negdi2.c - Implement __negdi2 -------------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __negdi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- negdi2.c - Implement __negdi2 -------------------------------------===// +// +// 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 implements __negdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: -a */ +// Returns: -a -COMPILER_RT_ABI di_int -__negdi2(di_int a) -{ -    /* Note: this routine is here for API compatibility; any sane compiler -     * should expand it inline. -     */ -    return -a; +COMPILER_RT_ABI di_int __negdi2(di_int a) { +  // Note: this routine is here for API compatibility; any sane compiler +  // should expand it inline. +  return -a;  } diff --git a/lib/builtins/negsf2.c b/lib/builtins/negsf2.c index 05c97d4d5a11..d59dfe7cf91b 100644 --- a/lib/builtins/negsf2.c +++ b/lib/builtins/negsf2.c @@ -1,9 +1,8 @@  //===-- lib/negsf2.c - single-precision negation ------------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -14,17 +13,12 @@  #define SINGLE_PRECISION  #include "fp_lib.h" -COMPILER_RT_ABI fp_t -__negsf2(fp_t a) { -    return fromRep(toRep(a) ^ signBit); -} +COMPILER_RT_ABI fp_t __negsf2(fp_t a) { return fromRep(toRep(a) ^ signBit); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_fneg(fp_t a) { -  return __negsf2(a); -} +AEABI_RTABI fp_t __aeabi_fneg(fp_t a) { return __negsf2(a); }  #else -AEABI_RTABI fp_t __aeabi_fneg(fp_t a) COMPILER_RT_ALIAS(__negsf2); +COMPILER_RT_ALIAS(__negsf2, __aeabi_fneg)  #endif  #endif diff --git a/lib/builtins/negti2.c b/lib/builtins/negti2.c index 9b00b303f856..d52ba4e13a46 100644 --- a/lib/builtins/negti2.c +++ b/lib/builtins/negti2.c @@ -1,30 +1,25 @@ -/* ===-- negti2.c - Implement __negti2 -------------------------------------=== - * - *      	       The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __negti2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- negti2.c - Implement __negti2 -------------------------------------===// +// +// 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 implements __negti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: -a */ +// Returns: -a -COMPILER_RT_ABI ti_int -__negti2(ti_int a) -{ -    /* Note: this routine is here for API compatibility; any sane compiler -     * should expand it inline. -     */ -    return -a; +COMPILER_RT_ABI ti_int __negti2(ti_int a) { +  // Note: this routine is here for API compatibility; any sane compiler +  // should expand it inline. +  return -a;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/negvdi2.c b/lib/builtins/negvdi2.c index e336ecf28f0d..5c52b3ec2aa6 100644 --- a/lib/builtins/negvdi2.c +++ b/lib/builtins/negvdi2.c @@ -1,28 +1,24 @@ -/* ===-- negvdi2.c - Implement __negvdi2 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __negvdi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- negvdi2.c - Implement __negvdi2 -----------------------------------===// +// +// 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 implements __negvdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: -a */ +// Returns: -a -/* Effects: aborts if -a overflows */ +// Effects: aborts if -a overflows -COMPILER_RT_ABI di_int -__negvdi2(di_int a) -{ -    const di_int MIN = (di_int)1 << ((int)(sizeof(di_int) * CHAR_BIT)-1); -    if (a == MIN) -        compilerrt_abort(); -    return -a; +COMPILER_RT_ABI di_int __negvdi2(di_int a) { +  const di_int MIN = (di_int)1 << ((int)(sizeof(di_int) * CHAR_BIT) - 1); +  if (a == MIN) +    compilerrt_abort(); +  return -a;  } diff --git a/lib/builtins/negvsi2.c b/lib/builtins/negvsi2.c index b9e93fef06c5..cccdee6dc5e5 100644 --- a/lib/builtins/negvsi2.c +++ b/lib/builtins/negvsi2.c @@ -1,28 +1,24 @@ -/* ===-- negvsi2.c - Implement __negvsi2 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __negvsi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- negvsi2.c - Implement __negvsi2 -----------------------------------===// +// +// 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 implements __negvsi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: -a */ +// Returns: -a -/* Effects: aborts if -a overflows */ +// Effects: aborts if -a overflows -COMPILER_RT_ABI si_int -__negvsi2(si_int a) -{ -    const si_int MIN = (si_int)1 << ((int)(sizeof(si_int) * CHAR_BIT)-1); -    if (a == MIN) -        compilerrt_abort(); -    return -a; +COMPILER_RT_ABI si_int __negvsi2(si_int a) { +  const si_int MIN = (si_int)1 << ((int)(sizeof(si_int) * CHAR_BIT) - 1); +  if (a == MIN) +    compilerrt_abort(); +  return -a;  } diff --git a/lib/builtins/negvti2.c b/lib/builtins/negvti2.c index 85f9f7d19d9d..8f92e1046d0c 100644 --- a/lib/builtins/negvti2.c +++ b/lib/builtins/negvti2.c @@ -1,32 +1,28 @@ -/*===-- negvti2.c - Implement __negvti2 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------=== - * - *This file implements __negvti2 for the compiler_rt library. - * - *===----------------------------------------------------------------------=== - */ +//===-- negvti2.c - Implement __negvti2 -----------------------------------===// +// +// 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 implements __negvti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: -a */ +// Returns: -a -/* Effects: aborts if -a overflows */ +// Effects: aborts if -a overflows -COMPILER_RT_ABI ti_int -__negvti2(ti_int a) -{ -    const ti_int MIN = (ti_int)1 << ((int)(sizeof(ti_int) * CHAR_BIT)-1); -    if (a == MIN) -        compilerrt_abort(); -    return -a; +COMPILER_RT_ABI ti_int __negvti2(ti_int a) { +  const ti_int MIN = (ti_int)1 << ((int)(sizeof(ti_int) * CHAR_BIT) - 1); +  if (a == MIN) +    compilerrt_abort(); +  return -a;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/os_version_check.c b/lib/builtins/os_version_check.c index e0d40edc7e38..3794b979434c 100644 --- a/lib/builtins/os_version_check.c +++ b/lib/builtins/os_version_check.c @@ -1,17 +1,15 @@ -/* ===-- os_version_check.c - OS version checking  -------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements the function __isOSVersionAtLeast, used by - * Objective-C's @available - * - * ===----------------------------------------------------------------------=== - */ +//===-- os_version_check.c - OS version checking  -------------------------===// +// +// 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 implements the function __isOSVersionAtLeast, used by +// Objective-C's @available +// +//===----------------------------------------------------------------------===//  #ifdef __APPLE__ @@ -23,15 +21,15 @@  #include <stdlib.h>  #include <string.h> -/* These three variables hold the host's OS version. */ +// These three variables hold the host's OS version.  static int32_t GlobalMajor, GlobalMinor, GlobalSubminor;  static dispatch_once_t DispatchOnceCounter; -/* We can't include <CoreFoundation/CoreFoundation.h> directly from here, so - * just forward declare everything that we need from it. */ +// We can't include <CoreFoundation/CoreFoundation.h> directly from here, so +// just forward declare everything that we need from it.  typedef const void *CFDataRef, *CFAllocatorRef, *CFPropertyListRef, -                   *CFStringRef, *CFDictionaryRef, *CFTypeRef, *CFErrorRef; +    *CFStringRef, *CFDictionaryRef, *CFTypeRef, *CFErrorRef;  #if __LLP64__  typedef unsigned long long CFTypeID; @@ -48,9 +46,9 @@ typedef _Bool Boolean;  typedef CFIndex CFPropertyListFormat;  typedef uint32_t CFStringEncoding; -/* kCFStringEncodingASCII analog. */ +// kCFStringEncodingASCII analog.  #define CF_STRING_ENCODING_ASCII 0x0600 -/* kCFStringEncodingUTF8 analog. */ +// kCFStringEncodingUTF8 analog.  #define CF_STRING_ENCODING_UTF8 0x08000100  #define CF_PROPERTY_LIST_IMMUTABLE 0 @@ -74,10 +72,10 @@ typedef Boolean (*CFStringGetCStringFuncTy)(CFStringRef, char *, CFIndex,                                              CFStringEncoding);  typedef void (*CFReleaseFuncTy)(CFTypeRef); -/* Find and parse the SystemVersion.plist file. */ +// Find and parse the SystemVersion.plist file.  static void parseSystemVersionPList(void *Unused) {    (void)Unused; -  /* Load CoreFoundation dynamically */ +  // Load CoreFoundation dynamically    const void *NullAllocator = dlsym(RTLD_DEFAULT, "kCFAllocatorNull");    if (!NullAllocator)      return; @@ -88,18 +86,18 @@ static void parseSystemVersionPList(void *Unused) {    if (!CFDataCreateWithBytesNoCopyFunc)      return;    CFPropertyListCreateWithDataFuncTy CFPropertyListCreateWithDataFunc = -      (CFPropertyListCreateWithDataFuncTy)dlsym( -          RTLD_DEFAULT, "CFPropertyListCreateWithData"); -/* CFPropertyListCreateWithData was introduced only in macOS 10.6+, so it - * will be NULL on earlier OS versions. */ +      (CFPropertyListCreateWithDataFuncTy)dlsym(RTLD_DEFAULT, +                                                "CFPropertyListCreateWithData"); +// CFPropertyListCreateWithData was introduced only in macOS 10.6+, so it +// will be NULL on earlier OS versions.  #pragma clang diagnostic push  #pragma clang diagnostic ignored "-Wdeprecated-declarations"    CFPropertyListCreateFromXMLDataFuncTy CFPropertyListCreateFromXMLDataFunc =        (CFPropertyListCreateFromXMLDataFuncTy)dlsym(            RTLD_DEFAULT, "CFPropertyListCreateFromXMLData");  #pragma clang diagnostic pop -  /* CFPropertyListCreateFromXMLDataFunc is deprecated in macOS 10.10, so it -   * might be NULL in future OS versions. */ +  // CFPropertyListCreateFromXMLDataFunc is deprecated in macOS 10.10, so it +  // might be NULL in future OS versions.    if (!CFPropertyListCreateWithDataFunc && !CFPropertyListCreateFromXMLDataFunc)      return;    CFStringCreateWithCStringNoCopyFuncTy CFStringCreateWithCStringNoCopyFunc = @@ -143,7 +141,7 @@ static void parseSystemVersionPList(void *Unused) {    if (!PropertyList)      return; -  /* Dynamically allocated stuff. */ +  // Dynamically allocated stuff.    CFDictionaryRef PListRef = NULL;    CFDataRef FileContentsRef = NULL;    UInt8 *PListBuf = NULL; @@ -162,8 +160,8 @@ static void parseSystemVersionPList(void *Unused) {    if (NumRead != (size_t)PListFileSize)      goto Fail; -  /* Get the file buffer into CF's format. We pass in a null allocator here * -   * because we free PListBuf ourselves */ +  // Get the file buffer into CF's format. We pass in a null allocator here * +  // because we free PListBuf ourselves    FileContentsRef = (*CFDataCreateWithBytesNoCopyFunc)(        NULL, PListBuf, (CFIndex)NumRead, AllocatorNull);    if (!FileContentsRef) @@ -204,7 +202,7 @@ Fail:  }  int32_t __isOSVersionAtLeast(int32_t Major, int32_t Minor, int32_t Subminor) { -  /* Populate the global version variables, if they haven't already. */ +  // Populate the global version variables, if they haven't already.    dispatch_once_f(&DispatchOnceCounter, NULL, parseSystemVersionPList);    if (Major < GlobalMajor) @@ -220,7 +218,7 @@ int32_t __isOSVersionAtLeast(int32_t Major, int32_t Minor, int32_t Subminor) {  #else -/* Silence an empty translation unit warning. */ +// Silence an empty translation unit warning.  typedef int unused;  #endif diff --git a/lib/builtins/paritydi2.c b/lib/builtins/paritydi2.c index 8ea5ab4214e9..dd9d45e63ea4 100644 --- a/lib/builtins/paritydi2.c +++ b/lib/builtins/paritydi2.c @@ -1,25 +1,21 @@ -/* ===-- paritydi2.c - Implement __paritydi2 -------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __paritydi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- paritydi2.c - Implement __paritydi2 -------------------------------===// +// +// 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 implements __paritydi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: 1 if number of bits is odd else returns 0 */ +// Returns: 1 if number of bits is odd else returns 0 -COMPILER_RT_ABI si_int -__paritydi2(di_int a) -{ -    dwords x; -    x.all = a; -    return __paritysi2(x.s.high ^ x.s.low); +COMPILER_RT_ABI si_int __paritydi2(di_int a) { +  dwords x; +  x.all = a; +  return __paritysi2(x.s.high ^ x.s.low);  } diff --git a/lib/builtins/paritysi2.c b/lib/builtins/paritysi2.c index 599984663849..3efa961f2f85 100644 --- a/lib/builtins/paritysi2.c +++ b/lib/builtins/paritysi2.c @@ -1,27 +1,23 @@ -/* ===-- paritysi2.c - Implement __paritysi2 -------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __paritysi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- paritysi2.c - Implement __paritysi2 -------------------------------===// +// +// 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 implements __paritysi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: 1 if number of bits is odd else returns 0 */ +// Returns: 1 if number of bits is odd else returns 0 -COMPILER_RT_ABI si_int -__paritysi2(si_int a) -{ -    su_int x = (su_int)a; -    x ^= x >> 16; -    x ^= x >> 8; -    x ^= x >> 4; -    return (0x6996 >> (x & 0xF)) & 1; +COMPILER_RT_ABI si_int __paritysi2(si_int a) { +  su_int x = (su_int)a; +  x ^= x >> 16; +  x ^= x >> 8; +  x ^= x >> 4; +  return (0x6996 >> (x & 0xF)) & 1;  } diff --git a/lib/builtins/parityti2.c b/lib/builtins/parityti2.c index 5a4fe492486f..f3942ba8378c 100644 --- a/lib/builtins/parityti2.c +++ b/lib/builtins/parityti2.c @@ -1,29 +1,25 @@ -/* ===-- parityti2.c - Implement __parityti2 -------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __parityti2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */  +//===-- parityti2.c - Implement __parityti2 -------------------------------===// +// +// 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 implements __parityti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: 1 if number of bits is odd else returns 0 */ +// Returns: 1 if number of bits is odd else returns 0 -COMPILER_RT_ABI si_int -__parityti2(ti_int a) -{ -    twords x; -    x.all = a; -    return __paritydi2(x.s.high ^ x.s.low); +COMPILER_RT_ABI si_int __parityti2(ti_int a) { +  twords x; +  x.all = a; +  return __paritydi2(x.s.high ^ x.s.low);  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/popcountdi2.c b/lib/builtins/popcountdi2.c index 5e8a62f075eb..9bbc39c6608a 100644 --- a/lib/builtins/popcountdi2.c +++ b/lib/builtins/popcountdi2.c @@ -1,36 +1,32 @@ -/* ===-- popcountdi2.c - Implement __popcountdi2 ----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __popcountdi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- popcountdi2.c - Implement __popcountdi2 ---------------------------===// +// +// 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 implements __popcountdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: count of 1 bits */ +// Returns: count of 1 bits -COMPILER_RT_ABI si_int -__popcountdi2(di_int a) -{ -    du_int x2 = (du_int)a; -    x2 = x2 - ((x2 >> 1) & 0x5555555555555555uLL); -    /* Every 2 bits holds the sum of every pair of bits (32) */ -    x2 = ((x2 >> 2) & 0x3333333333333333uLL) + (x2 & 0x3333333333333333uLL); -    /* Every 4 bits holds the sum of every 4-set of bits (3 significant bits) (16) */ -    x2 = (x2 + (x2 >> 4)) & 0x0F0F0F0F0F0F0F0FuLL; -    /* Every 8 bits holds the sum of every 8-set of bits (4 significant bits) (8) */ -    su_int x = (su_int)(x2 + (x2 >> 32)); -    /* The lower 32 bits hold four 16 bit sums (5 significant bits). */ -    /*   Upper 32 bits are garbage */ -    x = x + (x >> 16); -    /* The lower 16 bits hold two 32 bit sums (6 significant bits). */ -    /*   Upper 16 bits are garbage */ -    return (x + (x >> 8)) & 0x0000007F;  /* (7 significant bits) */ +COMPILER_RT_ABI si_int __popcountdi2(di_int a) { +  du_int x2 = (du_int)a; +  x2 = x2 - ((x2 >> 1) & 0x5555555555555555uLL); +  // Every 2 bits holds the sum of every pair of bits (32) +  x2 = ((x2 >> 2) & 0x3333333333333333uLL) + (x2 & 0x3333333333333333uLL); +  // Every 4 bits holds the sum of every 4-set of bits (3 significant bits) (16) +  x2 = (x2 + (x2 >> 4)) & 0x0F0F0F0F0F0F0F0FuLL; +  // Every 8 bits holds the sum of every 8-set of bits (4 significant bits) (8) +  su_int x = (su_int)(x2 + (x2 >> 32)); +  // The lower 32 bits hold four 16 bit sums (5 significant bits). +  //   Upper 32 bits are garbage +  x = x + (x >> 16); +  // The lower 16 bits hold two 32 bit sums (6 significant bits). +  //   Upper 16 bits are garbage +  return (x + (x >> 8)) & 0x0000007F; // (7 significant bits)  } diff --git a/lib/builtins/popcountsi2.c b/lib/builtins/popcountsi2.c index 44544ff49890..75e592a778d9 100644 --- a/lib/builtins/popcountsi2.c +++ b/lib/builtins/popcountsi2.c @@ -1,33 +1,29 @@ -/* ===-- popcountsi2.c - Implement __popcountsi2 ---------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __popcountsi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- popcountsi2.c - Implement __popcountsi2 ---------------------------===// +// +// 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 implements __popcountsi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: count of 1 bits */ +// Returns: count of 1 bits -COMPILER_RT_ABI si_int -__popcountsi2(si_int a) -{ -    su_int x = (su_int)a; -    x = x - ((x >> 1) & 0x55555555); -    /* Every 2 bits holds the sum of every pair of bits */ -    x = ((x >> 2) & 0x33333333) + (x & 0x33333333); -    /* Every 4 bits holds the sum of every 4-set of bits (3 significant bits) */ -    x = (x + (x >> 4)) & 0x0F0F0F0F; -    /* Every 8 bits holds the sum of every 8-set of bits (4 significant bits) */ -    x = (x + (x >> 16)); -    /* The lower 16 bits hold two 8 bit sums (5 significant bits).*/ -    /*    Upper 16 bits are garbage */ -    return (x + (x >> 8)) & 0x0000003F;  /* (6 significant bits) */ +COMPILER_RT_ABI si_int __popcountsi2(si_int a) { +  su_int x = (su_int)a; +  x = x - ((x >> 1) & 0x55555555); +  // Every 2 bits holds the sum of every pair of bits +  x = ((x >> 2) & 0x33333333) + (x & 0x33333333); +  // Every 4 bits holds the sum of every 4-set of bits (3 significant bits) +  x = (x + (x >> 4)) & 0x0F0F0F0F; +  // Every 8 bits holds the sum of every 8-set of bits (4 significant bits) +  x = (x + (x >> 16)); +  // The lower 16 bits hold two 8 bit sums (5 significant bits). +  //    Upper 16 bits are garbage +  return (x + (x >> 8)) & 0x0000003F; // (6 significant bits)  } diff --git a/lib/builtins/popcountti2.c b/lib/builtins/popcountti2.c index 7451bbb286b7..853fd722309e 100644 --- a/lib/builtins/popcountti2.c +++ b/lib/builtins/popcountti2.c @@ -1,44 +1,43 @@ -/* ===-- popcountti2.c - Implement __popcountti2 ----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __popcountti2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- popcountti2.c - Implement __popcountti2 +//----------------------------===// +// +// 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 implements __popcountti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: count of 1 bits */ +// Returns: count of 1 bits -COMPILER_RT_ABI si_int -__popcountti2(ti_int a) -{ -    tu_int x3 = (tu_int)a; -    x3 = x3 - ((x3 >> 1) & (((tu_int)0x5555555555555555uLL << 64) | -                                     0x5555555555555555uLL)); -    /* Every 2 bits holds the sum of every pair of bits (64) */ -    x3 = ((x3 >> 2) & (((tu_int)0x3333333333333333uLL << 64) | 0x3333333333333333uLL)) -       + (x3 & (((tu_int)0x3333333333333333uLL << 64) | 0x3333333333333333uLL)); -    /* Every 4 bits holds the sum of every 4-set of bits (3 significant bits) (32) */ -    x3 = (x3 + (x3 >> 4)) -       & (((tu_int)0x0F0F0F0F0F0F0F0FuLL << 64) | 0x0F0F0F0F0F0F0F0FuLL); -    /* Every 8 bits holds the sum of every 8-set of bits (4 significant bits) (16) */ -    du_int x2 = (du_int)(x3 + (x3 >> 64)); -    /* Every 8 bits holds the sum of every 8-set of bits (5 significant bits) (8) */ -    su_int x = (su_int)(x2 + (x2 >> 32)); -    /* Every 8 bits holds the sum of every 8-set of bits (6 significant bits) (4) */ -    x = x + (x >> 16); -    /* Every 8 bits holds the sum of every 8-set of bits (7 significant bits) (2) */ -    /* Upper 16 bits are garbage */ -    return (x + (x >> 8)) & 0xFF;  /* (8 significant bits) */ +COMPILER_RT_ABI si_int __popcountti2(ti_int a) { +  tu_int x3 = (tu_int)a; +  x3 = x3 - ((x3 >> 1) & +             (((tu_int)0x5555555555555555uLL << 64) | 0x5555555555555555uLL)); +  // Every 2 bits holds the sum of every pair of bits (64) +  x3 = ((x3 >> 2) & +        (((tu_int)0x3333333333333333uLL << 64) | 0x3333333333333333uLL)) + +       (x3 & (((tu_int)0x3333333333333333uLL << 64) | 0x3333333333333333uLL)); +  // Every 4 bits holds the sum of every 4-set of bits (3 significant bits) (32) +  x3 = (x3 + (x3 >> 4)) & +       (((tu_int)0x0F0F0F0F0F0F0F0FuLL << 64) | 0x0F0F0F0F0F0F0F0FuLL); +  // Every 8 bits holds the sum of every 8-set of bits (4 significant bits) (16) +  du_int x2 = (du_int)(x3 + (x3 >> 64)); +  // Every 8 bits holds the sum of every 8-set of bits (5 significant bits) (8) +  su_int x = (su_int)(x2 + (x2 >> 32)); +  // Every 8 bits holds the sum of every 8-set of bits (6 significant bits) (4) +  x = x + (x >> 16); +  // Every 8 bits holds the sum of every 8-set of bits (7 significant bits) (2) +  // +  // Upper 16 bits are garbage +  return (x + (x >> 8)) & 0xFF; // (8 significant bits)  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/powidf2.c b/lib/builtins/powidf2.c index ac13b172b043..9697588484e7 100644 --- a/lib/builtins/powidf2.c +++ b/lib/builtins/powidf2.c @@ -1,34 +1,29 @@ -/* ===-- powidf2.cpp - Implement __powidf2 ---------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __powidf2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- powidf2.cpp - Implement __powidf2 ---------------------------------===// +// +// 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 implements __powidf2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a ^ b */ +// Returns: a ^ b -COMPILER_RT_ABI double -__powidf2(double a, si_int b) -{ -    const int recip = b < 0; -    double r = 1; -    while (1) -    { -        if (b & 1) -            r *= a; -        b /= 2; -        if (b == 0) -            break; -        a *= a; -    } -    return recip ? 1/r : r; +COMPILER_RT_ABI double __powidf2(double a, si_int b) { +  const int recip = b < 0; +  double r = 1; +  while (1) { +    if (b & 1) +      r *= a; +    b /= 2; +    if (b == 0) +      break; +    a *= a; +  } +  return recip ? 1 / r : r;  } diff --git a/lib/builtins/powisf2.c b/lib/builtins/powisf2.c index 0c400ec6dd6a..469402348825 100644 --- a/lib/builtins/powisf2.c +++ b/lib/builtins/powisf2.c @@ -1,34 +1,29 @@ -/*===-- powisf2.cpp - Implement __powisf2 ---------------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __powisf2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- powisf2.cpp - Implement __powisf2 ---------------------------------===// +// +// 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 implements __powisf2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a ^ b */ +// Returns: a ^ b -COMPILER_RT_ABI float -__powisf2(float a, si_int b) -{ -    const int recip = b < 0; -    float r = 1; -    while (1) -    { -        if (b & 1) -            r *= a; -        b /= 2; -        if (b == 0) -            break; -        a *= a; -    } -    return recip ? 1/r : r; +COMPILER_RT_ABI float __powisf2(float a, si_int b) { +  const int recip = b < 0; +  float r = 1; +  while (1) { +    if (b & 1) +      r *= a; +    b /= 2; +    if (b == 0) +      break; +    a *= a; +  } +  return recip ? 1 / r : r;  } diff --git a/lib/builtins/powitf2.c b/lib/builtins/powitf2.c index 172f29f58f25..fcbdb4c2ee2a 100644 --- a/lib/builtins/powitf2.c +++ b/lib/builtins/powitf2.c @@ -1,38 +1,33 @@ -/* ===-- powitf2.cpp - Implement __powitf2 ---------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __powitf2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- powitf2.cpp - Implement __powitf2 ---------------------------------===// +// +// 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 implements __powitf2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #if _ARCH_PPC -/* Returns: a ^ b */ +// Returns: a ^ b -COMPILER_RT_ABI long double -__powitf2(long double a, si_int b) -{ -    const int recip = b < 0; -    long double r = 1; -    while (1) -    { -        if (b & 1) -            r *= a; -        b /= 2; -        if (b == 0) -            break; -        a *= a; -    } -    return recip ? 1/r : r; +COMPILER_RT_ABI long double __powitf2(long double a, si_int b) { +  const int recip = b < 0; +  long double r = 1; +  while (1) { +    if (b & 1) +      r *= a; +    b /= 2; +    if (b == 0) +      break; +    a *= a; +  } +  return recip ? 1 / r : r;  }  #endif diff --git a/lib/builtins/powixf2.c b/lib/builtins/powixf2.c index 0fd96e503e7b..b7b52095afa1 100644 --- a/lib/builtins/powixf2.c +++ b/lib/builtins/powixf2.c @@ -1,38 +1,33 @@ -/* ===-- powixf2.cpp - Implement __powixf2 ---------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __powixf2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- powixf2.cpp - Implement __powixf2 ---------------------------------===// +// +// 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 implements __powixf2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #if !_ARCH_PPC  #include "int_lib.h" -/* Returns: a ^ b */ +// Returns: a ^ b -COMPILER_RT_ABI long double -__powixf2(long double a, si_int b) -{ -    const int recip = b < 0; -    long double r = 1; -    while (1) -    { -        if (b & 1) -            r *= a; -        b /= 2; -        if (b == 0) -            break; -        a *= a; -    } -    return recip ? 1/r : r; +COMPILER_RT_ABI long double __powixf2(long double a, si_int b) { +  const int recip = b < 0; +  long double r = 1; +  while (1) { +    if (b & 1) +      r *= a; +    b /= 2; +    if (b == 0) +      break; +    a *= a; +  } +  return recip ? 1 / r : r;  }  #endif diff --git a/lib/builtins/ppc/DD.h b/lib/builtins/ppc/DD.h index 3e5f9e58c138..8f31a962fc77 100644 --- a/lib/builtins/ppc/DD.h +++ b/lib/builtins/ppc/DD.h @@ -4,20 +4,20 @@  #include "../int_lib.h"  typedef union { -	long double ld; -	struct { -		double hi; -		double lo; -	}s; +  long double ld; +  struct { +    double hi; +    double lo; +  } s;  } DD; -typedef union {  -	double d; -	uint64_t x; +typedef union { +  double d; +  uint64_t x;  } doublebits; -#define LOWORDER(xy,xHi,xLo,yHi,yLo) \ -	(((((xHi)*(yHi) - (xy)) + (xHi)*(yLo)) + (xLo)*(yHi)) + (xLo)*(yLo)) +#define LOWORDER(xy, xHi, xLo, yHi, yLo)                                       \ +  (((((xHi) * (yHi) - (xy)) + (xHi) * (yLo)) + (xLo) * (yHi)) + (xLo) * (yLo))  static __inline ALWAYS_INLINE double local_fabs(double x) {    doublebits result = {.d = x}; @@ -42,4 +42,4 @@ long double __gcc_qsub(long double, long double);  long double __gcc_qmul(long double, long double);  long double __gcc_qdiv(long double, long double); -#endif /* COMPILERRT_DD_HEADER */ +#endif // COMPILERRT_DD_HEADER diff --git a/lib/builtins/ppc/divtc3.c b/lib/builtins/ppc/divtc3.c index ef532b841145..afaccf5a8fd6 100644 --- a/lib/builtins/ppc/divtc3.c +++ b/lib/builtins/ppc/divtc3.c @@ -1,9 +1,9 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 "DD.h"  #include "../int_math.h" +#include "DD.h"  // Use DOUBLE_PRECISION because the soft-fp method we use is logb (on the upper  // half of the long doubles), even though this file defines complex division for  // 128-bit floats. @@ -12,86 +12,85 @@  #if !defined(CRT_INFINITY) && defined(HUGE_VAL)  #define CRT_INFINITY HUGE_VAL -#endif /* CRT_INFINITY */ +#endif // CRT_INFINITY + +#define makeFinite(x)                                                          \ +  {                                                                            \ +    (x).s.hi = crt_copysign(crt_isinf((x).s.hi) ? 1.0 : 0.0, (x).s.hi);        \ +    (x).s.lo = 0.0;                                                            \ +  } + +long double _Complex __divtc3(long double a, long double b, long double c, +                              long double d) { +  DD cDD = {.ld = c}; +  DD dDD = {.ld = d}; + +  int ilogbw = 0; +  const double logbw = +      __compiler_rt_logb(crt_fmax(crt_fabs(cDD.s.hi), crt_fabs(dDD.s.hi))); + +  if (crt_isfinite(logbw)) { +    ilogbw = (int)logbw; + +    cDD.s.hi = crt_scalbn(cDD.s.hi, -ilogbw); +    cDD.s.lo = crt_scalbn(cDD.s.lo, -ilogbw); +    dDD.s.hi = crt_scalbn(dDD.s.hi, -ilogbw); +    dDD.s.lo = crt_scalbn(dDD.s.lo, -ilogbw); +  } + +  const long double denom = +      __gcc_qadd(__gcc_qmul(cDD.ld, cDD.ld), __gcc_qmul(dDD.ld, dDD.ld)); +  const long double realNumerator = +      __gcc_qadd(__gcc_qmul(a, cDD.ld), __gcc_qmul(b, dDD.ld)); +  const long double imagNumerator = +      __gcc_qsub(__gcc_qmul(b, cDD.ld), __gcc_qmul(a, dDD.ld)); + +  DD real = {.ld = __gcc_qdiv(realNumerator, denom)}; +  DD imag = {.ld = __gcc_qdiv(imagNumerator, denom)}; + +  real.s.hi = crt_scalbn(real.s.hi, -ilogbw); +  real.s.lo = crt_scalbn(real.s.lo, -ilogbw); +  imag.s.hi = crt_scalbn(imag.s.hi, -ilogbw); +  imag.s.lo = crt_scalbn(imag.s.lo, -ilogbw); -#define makeFinite(x) { \ -    (x).s.hi = crt_copysign(crt_isinf((x).s.hi) ? 1.0 : 0.0, (x).s.hi); \ -    (x).s.lo = 0.0;                                                     \ +  if (crt_isnan(real.s.hi) && crt_isnan(imag.s.hi)) { +    DD aDD = {.ld = a}; +    DD bDD = {.ld = b}; +    DD rDD = {.ld = denom}; + +    if ((rDD.s.hi == 0.0) && (!crt_isnan(aDD.s.hi) || !crt_isnan(bDD.s.hi))) { +      real.s.hi = crt_copysign(CRT_INFINITY, cDD.s.hi) * aDD.s.hi; +      real.s.lo = 0.0; +      imag.s.hi = crt_copysign(CRT_INFINITY, cDD.s.hi) * bDD.s.hi; +      imag.s.lo = 0.0; +    } + +    else if ((crt_isinf(aDD.s.hi) || crt_isinf(bDD.s.hi)) && +             crt_isfinite(cDD.s.hi) && crt_isfinite(dDD.s.hi)) { +      makeFinite(aDD); +      makeFinite(bDD); +      real.s.hi = CRT_INFINITY * (aDD.s.hi * cDD.s.hi + bDD.s.hi * dDD.s.hi); +      real.s.lo = 0.0; +      imag.s.hi = CRT_INFINITY * (bDD.s.hi * cDD.s.hi - aDD.s.hi * dDD.s.hi); +      imag.s.lo = 0.0; +    } + +    else if ((crt_isinf(cDD.s.hi) || crt_isinf(dDD.s.hi)) && +             crt_isfinite(aDD.s.hi) && crt_isfinite(bDD.s.hi)) { +      makeFinite(cDD); +      makeFinite(dDD); +      real.s.hi = +          crt_copysign(0.0, (aDD.s.hi * cDD.s.hi + bDD.s.hi * dDD.s.hi)); +      real.s.lo = 0.0; +      imag.s.hi = +          crt_copysign(0.0, (bDD.s.hi * cDD.s.hi - aDD.s.hi * dDD.s.hi)); +      imag.s.lo = 0.0; +    }    } -long double _Complex -__divtc3(long double a, long double b, long double c, long double d) -{ -	DD cDD = { .ld = c }; -	DD dDD = { .ld = d }; -	 -	int ilogbw = 0; -	const double logbw = __compiler_rt_logb( -		crt_fmax(crt_fabs(cDD.s.hi), crt_fabs(dDD.s.hi))); - -        if (crt_isfinite(logbw)) -	{ -		ilogbw = (int)logbw; -		 -		cDD.s.hi = crt_scalbn(cDD.s.hi, -ilogbw); -		cDD.s.lo = crt_scalbn(cDD.s.lo, -ilogbw); -		dDD.s.hi = crt_scalbn(dDD.s.hi, -ilogbw); -		dDD.s.lo = crt_scalbn(dDD.s.lo, -ilogbw); -	} -	 -	const long double denom = __gcc_qadd(__gcc_qmul(cDD.ld, cDD.ld), __gcc_qmul(dDD.ld, dDD.ld)); -	const long double realNumerator = __gcc_qadd(__gcc_qmul(a,cDD.ld), __gcc_qmul(b,dDD.ld)); -	const long double imagNumerator = __gcc_qsub(__gcc_qmul(b,cDD.ld), __gcc_qmul(a,dDD.ld)); -	 -	DD real = { .ld = __gcc_qdiv(realNumerator, denom) }; -	DD imag = { .ld = __gcc_qdiv(imagNumerator, denom) }; -	 -	real.s.hi = crt_scalbn(real.s.hi, -ilogbw); -	real.s.lo = crt_scalbn(real.s.lo, -ilogbw); -	imag.s.hi = crt_scalbn(imag.s.hi, -ilogbw); -	imag.s.lo = crt_scalbn(imag.s.lo, -ilogbw); -	 -	if (crt_isnan(real.s.hi) && crt_isnan(imag.s.hi)) -	{ -		DD aDD = { .ld = a }; -		DD bDD = { .ld = b }; -		DD rDD = { .ld = denom }; -		 -		if ((rDD.s.hi == 0.0) && (!crt_isnan(aDD.s.hi) || -                                          !crt_isnan(bDD.s.hi))) -		{ -			real.s.hi = crt_copysign(CRT_INFINITY,cDD.s.hi) * aDD.s.hi; -			real.s.lo = 0.0; -			imag.s.hi = crt_copysign(CRT_INFINITY,cDD.s.hi) * bDD.s.hi; -			imag.s.lo = 0.0; -		} -		 -		else if ((crt_isinf(aDD.s.hi) || crt_isinf(bDD.s.hi)) && -                         crt_isfinite(cDD.s.hi) && crt_isfinite(dDD.s.hi)) -		{ -			makeFinite(aDD); -			makeFinite(bDD); -			real.s.hi = CRT_INFINITY * (aDD.s.hi*cDD.s.hi + bDD.s.hi*dDD.s.hi); -			real.s.lo = 0.0; -			imag.s.hi = CRT_INFINITY * (bDD.s.hi*cDD.s.hi - aDD.s.hi*dDD.s.hi); -			imag.s.lo = 0.0; -		} -		 -		else if ((crt_isinf(cDD.s.hi) || crt_isinf(dDD.s.hi)) && -                         crt_isfinite(aDD.s.hi) && crt_isfinite(bDD.s.hi)) -		{ -			makeFinite(cDD); -			makeFinite(dDD); -			real.s.hi = crt_copysign(0.0,(aDD.s.hi*cDD.s.hi + bDD.s.hi*dDD.s.hi)); -			real.s.lo = 0.0; -			imag.s.hi = crt_copysign(0.0,(bDD.s.hi*cDD.s.hi - aDD.s.hi*dDD.s.hi)); -			imag.s.lo = 0.0; -		} -	} -	 -	long double _Complex z; -	__real__ z = real.ld; -	__imag__ z = imag.ld; -	 -	return z; +  long double _Complex z; +  __real__ z = real.ld; +  __imag__ z = imag.ld; + +  return z;  } diff --git a/lib/builtins/ppc/fixtfdi.c b/lib/builtins/ppc/fixtfdi.c index 2c7c0f8e279f..a97aaf095846 100644 --- a/lib/builtins/ppc/fixtfdi.c +++ b/lib/builtins/ppc/fixtfdi.c @@ -1,104 +1,98 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 -/* int64_t __fixunstfdi(long double x); - * This file implements the PowerPC 128-bit double-double -> int64_t conversion - */ +// int64_t __fixunstfdi(long double x); +// This file implements the PowerPC 128-bit double-double -> int64_t conversion -#include "DD.h"  #include "../int_math.h" +#include "DD.h" + +uint64_t __fixtfdi(long double input) { +  const DD x = {.ld = input}; +  const doublebits hibits = {.d = x.s.hi}; + +  const uint32_t absHighWord = +      (uint32_t)(hibits.x >> 32) & UINT32_C(0x7fffffff); +  const uint32_t absHighWordMinusOne = absHighWord - UINT32_C(0x3ff00000); + +  // If (1.0 - tiny) <= input < 0x1.0p63: +  if (UINT32_C(0x03f00000) > absHighWordMinusOne) { +    // Do an unsigned conversion of the absolute value, then restore the sign. +    const int unbiasedHeadExponent = absHighWordMinusOne >> 20; + +    int64_t result = hibits.x & INT64_C(0x000fffffffffffff); // mantissa(hi) +    result |= INT64_C(0x0010000000000000); // matissa(hi) with implicit bit +    result <<= 10; // mantissa(hi) with one zero preceding bit. + +    const int64_t hiNegationMask = ((int64_t)(hibits.x)) >> 63; + +    // If the tail is non-zero, we need to patch in the tail bits. +    if (0.0 != x.s.lo) { +      const doublebits lobits = {.d = x.s.lo}; +      int64_t tailMantissa = lobits.x & INT64_C(0x000fffffffffffff); +      tailMantissa |= INT64_C(0x0010000000000000); + +      // At this point we have the mantissa of |tail| +      // We need to negate it if head and tail have different signs. +      const int64_t loNegationMask = ((int64_t)(lobits.x)) >> 63; +      const int64_t negationMask = loNegationMask ^ hiNegationMask; +      tailMantissa = (tailMantissa ^ negationMask) - negationMask; + +      // Now we have the mantissa of tail as a signed 2s-complement integer + +      const int biasedTailExponent = (int)(lobits.x >> 52) & 0x7ff; + +      // Shift the tail mantissa into the right position, accounting for the +      // bias of 10 that we shifted the head mantissa by. +      tailMantissa >>= +          (unbiasedHeadExponent - (biasedTailExponent - (1023 - 10))); + +      result += tailMantissa; +    } + +    result >>= (62 - unbiasedHeadExponent); + +    // Restore the sign of the result and return +    result = (result ^ hiNegationMask) - hiNegationMask; +    return result; +  } + +  // Edge cases handled here: + +  // |x| < 1, result is zero. +  if (1.0 > crt_fabs(x.s.hi)) +    return INT64_C(0); + +  // x very close to INT64_MIN, care must be taken to see which side we are on. +  if (x.s.hi == -0x1.0p63) { + +    int64_t result = INT64_MIN; + +    if (0.0 < x.s.lo) { +      // If the tail is positive, the correct result is something other than +      // INT64_MIN. we'll need to figure out what it is. + +      const doublebits lobits = {.d = x.s.lo}; +      int64_t tailMantissa = lobits.x & INT64_C(0x000fffffffffffff); +      tailMantissa |= INT64_C(0x0010000000000000); + +      // Now we negate the tailMantissa +      tailMantissa = (tailMantissa ^ INT64_C(-1)) + INT64_C(1); + +      // And shift it by the appropriate amount +      const int biasedTailExponent = (int)(lobits.x >> 52) & 0x7ff; +      tailMantissa >>= 1075 - biasedTailExponent; + +      result -= tailMantissa; +    } + +    return result; +  } -uint64_t __fixtfdi(long double input) -{ -	const DD x = { .ld = input }; -	const doublebits hibits = { .d = x.s.hi }; -	 -	const uint32_t absHighWord = (uint32_t)(hibits.x >> 32) & UINT32_C(0x7fffffff); -	const uint32_t absHighWordMinusOne = absHighWord - UINT32_C(0x3ff00000); -	 -	/* If (1.0 - tiny) <= input < 0x1.0p63: */ -	if (UINT32_C(0x03f00000) > absHighWordMinusOne) -	{ -		/* Do an unsigned conversion of the absolute value, then restore the sign. */ -		const int unbiasedHeadExponent = absHighWordMinusOne >> 20; -		 -		int64_t result = hibits.x & INT64_C(0x000fffffffffffff); /* mantissa(hi) */ -		result |= INT64_C(0x0010000000000000); /* matissa(hi) with implicit bit */ -		result <<= 10; /* mantissa(hi) with one zero preceding bit. */ -		 -		const int64_t hiNegationMask = ((int64_t)(hibits.x)) >> 63; -		 -		/* If the tail is non-zero, we need to patch in the tail bits. */ -		if (0.0 != x.s.lo) -		{ -			const doublebits lobits = { .d = x.s.lo }; -			int64_t tailMantissa = lobits.x & INT64_C(0x000fffffffffffff); -			tailMantissa |= INT64_C(0x0010000000000000); -			 -			/* At this point we have the mantissa of |tail| */ -			/* We need to negate it if head and tail have different signs. */ -			const int64_t loNegationMask = ((int64_t)(lobits.x)) >> 63; -			const int64_t negationMask = loNegationMask ^ hiNegationMask; -			tailMantissa = (tailMantissa ^ negationMask) - negationMask; -			 -			/* Now we have the mantissa of tail as a signed 2s-complement integer */ -			 -			const int biasedTailExponent = (int)(lobits.x >> 52) & 0x7ff; -			 -			/* Shift the tail mantissa into the right position, accounting for the -			 * bias of 10 that we shifted the head mantissa by. -			 */  -			tailMantissa >>= (unbiasedHeadExponent - (biasedTailExponent - (1023 - 10))); -			 -			result += tailMantissa; -		} -		 -		result >>= (62 - unbiasedHeadExponent); -		 -		/* Restore the sign of the result and return */ -		result = (result ^ hiNegationMask) - hiNegationMask; -		return result; -		 -	} - -	/* Edge cases handled here: */ -	 -	/* |x| < 1, result is zero. */ -	if (1.0 > crt_fabs(x.s.hi)) -		return INT64_C(0); -	 -	/* x very close to INT64_MIN, care must be taken to see which side we are on. */ -	if (x.s.hi == -0x1.0p63) { -		 -		int64_t result = INT64_MIN; -		 -		if (0.0 < x.s.lo) -		{ -			/* If the tail is positive, the correct result is something other than INT64_MIN. -			 * we'll need to figure out what it is. -			 */ - -			const doublebits lobits = { .d = x.s.lo }; -			int64_t tailMantissa = lobits.x & INT64_C(0x000fffffffffffff); -			tailMantissa |= INT64_C(0x0010000000000000); -			 -			/* Now we negate the tailMantissa */ -			tailMantissa = (tailMantissa ^ INT64_C(-1)) + INT64_C(1); -			 -			/* And shift it by the appropriate amount */ -			const int biasedTailExponent = (int)(lobits.x >> 52) & 0x7ff; -			tailMantissa >>= 1075 - biasedTailExponent; -			 -			result -= tailMantissa; -		} -		 -		return result; -	} -	 -	/* Signed overflows, infinities, and NaNs */ -	if (x.s.hi > 0.0) -		return INT64_MAX; -	else -		return INT64_MIN; +  // Signed overflows, infinities, and NaNs +  if (x.s.hi > 0.0) +    return INT64_MAX; +  else +    return INT64_MIN;  } diff --git a/lib/builtins/ppc/fixunstfdi.c b/lib/builtins/ppc/fixunstfdi.c index 5e6e2cedf6ac..8d53f372527a 100644 --- a/lib/builtins/ppc/fixunstfdi.c +++ b/lib/builtins/ppc/fixunstfdi.c @@ -1,59 +1,57 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 -/* uint64_t __fixunstfdi(long double x); */ -/* This file implements the PowerPC 128-bit double-double -> uint64_t conversion */ +// uint64_t __fixunstfdi(long double x); +// This file implements the PowerPC 128-bit double-double -> uint64_t conversion  #include "DD.h" -uint64_t __fixunstfdi(long double input) -{ -	const DD x = { .ld = input }; -	const doublebits hibits = { .d = x.s.hi }; -	 -	const uint32_t highWordMinusOne = (uint32_t)(hibits.x >> 32) - UINT32_C(0x3ff00000); -	 -	/* If (1.0 - tiny) <= input < 0x1.0p64: */ -	if (UINT32_C(0x04000000) > highWordMinusOne) -	{ -		const int unbiasedHeadExponent = highWordMinusOne >> 20; -		 -		uint64_t result = hibits.x & UINT64_C(0x000fffffffffffff); /* mantissa(hi) */ -		result |= UINT64_C(0x0010000000000000); /* matissa(hi) with implicit bit */ -		result <<= 11; /* mantissa(hi) left aligned in the int64 field. */ -		 -		/* If the tail is non-zero, we need to patch in the tail bits. */ -		if (0.0 != x.s.lo) -		{ -			const doublebits lobits = { .d = x.s.lo }; -			int64_t tailMantissa = lobits.x & INT64_C(0x000fffffffffffff); -			tailMantissa |= INT64_C(0x0010000000000000); -			 -			/* At this point we have the mantissa of |tail| */ -			 -			const int64_t negationMask = ((int64_t)(lobits.x)) >> 63; -			tailMantissa = (tailMantissa ^ negationMask) - negationMask; -			 -			/* Now we have the mantissa of tail as a signed 2s-complement integer */ -			 -			const int biasedTailExponent = (int)(lobits.x >> 52) & 0x7ff; -			 -			/* Shift the tail mantissa into the right position, accounting for the -			 * bias of 11 that we shifted the head mantissa by. -			 */ -			tailMantissa >>= (unbiasedHeadExponent - (biasedTailExponent - (1023 - 11))); -			 -			result += tailMantissa; -		} -		 -		result >>= (63 - unbiasedHeadExponent); -		return result; -	} -	 -	/* Edge cases are handled here, with saturation. */ -	if (1.0 > x.s.hi) -		return UINT64_C(0); -	else -		return UINT64_MAX; +uint64_t __fixunstfdi(long double input) { +  const DD x = {.ld = input}; +  const doublebits hibits = {.d = x.s.hi}; + +  const uint32_t highWordMinusOne = +      (uint32_t)(hibits.x >> 32) - UINT32_C(0x3ff00000); + +  // If (1.0 - tiny) <= input < 0x1.0p64: +  if (UINT32_C(0x04000000) > highWordMinusOne) { +    const int unbiasedHeadExponent = highWordMinusOne >> 20; + +    uint64_t result = hibits.x & UINT64_C(0x000fffffffffffff); // mantissa(hi) +    result |= UINT64_C(0x0010000000000000); // matissa(hi) with implicit bit +    result <<= 11; // mantissa(hi) left aligned in the int64 field. + +    // If the tail is non-zero, we need to patch in the tail bits. +    if (0.0 != x.s.lo) { +      const doublebits lobits = {.d = x.s.lo}; +      int64_t tailMantissa = lobits.x & INT64_C(0x000fffffffffffff); +      tailMantissa |= INT64_C(0x0010000000000000); + +      // At this point we have the mantissa of |tail| + +      const int64_t negationMask = ((int64_t)(lobits.x)) >> 63; +      tailMantissa = (tailMantissa ^ negationMask) - negationMask; + +      // Now we have the mantissa of tail as a signed 2s-complement integer + +      const int biasedTailExponent = (int)(lobits.x >> 52) & 0x7ff; + +      // Shift the tail mantissa into the right position, accounting for the +      // bias of 11 that we shifted the head mantissa by. +      tailMantissa >>= +          (unbiasedHeadExponent - (biasedTailExponent - (1023 - 11))); + +      result += tailMantissa; +    } + +    result >>= (63 - unbiasedHeadExponent); +    return result; +  } + +  // Edge cases are handled here, with saturation. +  if (1.0 > x.s.hi) +    return UINT64_C(0); +  else +    return UINT64_MAX;  } diff --git a/lib/builtins/ppc/fixunstfti.c b/lib/builtins/ppc/fixunstfti.c index fa21084cb576..1d19e01e3a91 100644 --- a/lib/builtins/ppc/fixunstfti.c +++ b/lib/builtins/ppc/fixunstfti.c @@ -1,9 +1,8 @@  //===-- lib/builtins/ppc/fixunstfti.c - Convert long double->int128 *-C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -15,10 +14,10 @@  #include "../int_math.h"  #define BIAS 1023 -/* Convert long double into an unsigned 128-bit integer. */ +// Convert long double into an unsigned 128-bit integer.  __uint128_t __fixunstfti(long double input) { -  /* If we are trying to convert a NaN, return the NaN bit pattern. */ +  // If we are trying to convert a NaN, return the NaN bit pattern.    if (crt_isnan(input)) {      return ((__uint128_t)0x7FF8000000000000ll) << 64 |             (__uint128_t)0x0000000000000000ll; @@ -26,59 +25,59 @@ __uint128_t __fixunstfti(long double input) {    __uint128_t result, hiResult, loResult;    int hiExponent, loExponent, shift; -  /* The long double representation, with the high and low portions of -   * the long double, and the corresponding bit patterns of each double. */ +  // The long double representation, with the high and low portions of +  // the long double, and the corresponding bit patterns of each double.    union {      long double ld; -    double d[2]; /* [0] is the high double, [1] is the low double. */ -    unsigned long long ull[2]; /* High and low doubles as 64-bit integers. */ +    double d[2];               // [0] is the high double, [1] is the low double. +    unsigned long long ull[2]; // High and low doubles as 64-bit integers.    } ldUnion; -  /* If the long double is less than 1.0 or negative, -   * return 0.0. */ +  // If the long double is less than 1.0 or negative, +  // return 0.0.    if (input < 1.0)      return 0.0; -  /* Retrieve the 64-bit patterns of high and low doubles. -   * Compute the unbiased exponent of both high and low doubles by -   * removing the signs, isolating the exponent, and subtracting -   * the bias from it. */ +  // Retrieve the 64-bit patterns of high and low doubles. +  // Compute the unbiased exponent of both high and low doubles by +  // removing the signs, isolating the exponent, and subtracting +  // the bias from it.    ldUnion.ld = input;    hiExponent = ((ldUnion.ull[0] & 0x7FFFFFFFFFFFFFFFll) >> 52) - BIAS;    loExponent = ((ldUnion.ull[1] & 0x7FFFFFFFFFFFFFFFll) >> 52) - BIAS; -  /* Convert each double into int64; they will be added to the int128 result. -   * CASE 1: High or low double fits in int64 -   *      - Convert the each double normally into int64. -   * -   * CASE 2: High or low double does not fit in int64 -   *      - Scale the double to fit within a 64-bit integer -   *      - Calculate the shift (amount to scale the double by in the int128) -   *      - Clear all the bits of the exponent (with 0x800FFFFFFFFFFFFF) -   *      - Add BIAS+53 (0x4350000000000000) to exponent to correct the value -   *      - Scale (move) the double to the correct place in the int128 -   *        (Move it by 2^53 places) -   * -   * Note: If the high double is assumed to be positive, an unsigned conversion -   * from long double to 64-bit integer is needed. The low double can be either -   * positive or negative, so a signed conversion is needed to retain the result -   * of the low double and to ensure it does not simply get converted to 0. */ +  // Convert each double into int64; they will be added to the int128 result. +  // CASE 1: High or low double fits in int64 +  //      - Convert the each double normally into int64. +  // +  // CASE 2: High or low double does not fit in int64 +  //      - Scale the double to fit within a 64-bit integer +  //      - Calculate the shift (amount to scale the double by in the int128) +  //      - Clear all the bits of the exponent (with 0x800FFFFFFFFFFFFF) +  //      - Add BIAS+53 (0x4350000000000000) to exponent to correct the value +  //      - Scale (move) the double to the correct place in the int128 +  //        (Move it by 2^53 places) +  // +  // Note: If the high double is assumed to be positive, an unsigned conversion +  // from long double to 64-bit integer is needed. The low double can be either +  // positive or negative, so a signed conversion is needed to retain the result +  // of the low double and to ensure it does not simply get converted to 0. -  /* CASE 1 - High double fits in int64. */ +  // CASE 1 - High double fits in int64.    if (hiExponent < 63) {      hiResult = (unsigned long long)ldUnion.d[0];    } else if (hiExponent < 128) { -    /* CASE 2 - High double does not fit in int64, scale and convert it. */ +    // CASE 2 - High double does not fit in int64, scale and convert it.      shift = hiExponent - 54;      ldUnion.ull[0] &= 0x800FFFFFFFFFFFFFll;      ldUnion.ull[0] |= 0x4350000000000000ll;      hiResult = (unsigned long long)ldUnion.d[0];      hiResult <<= shift;    } else { -    /* Detect cases for overflow. When the exponent of the high -     * double is greater than 128 bits and when the long double -     * input is positive, return the max 128-bit integer. -     * For negative inputs with exponents > 128, return 1, like gcc. */ +    // Detect cases for overflow. When the exponent of the high +    // double is greater than 128 bits and when the long double +    // input is positive, return the max 128-bit integer. +    // For negative inputs with exponents > 128, return 1, like gcc.      if (ldUnion.d[0] > 0) {        return ((__uint128_t)0xFFFFFFFFFFFFFFFFll) << 64 |               (__uint128_t)0xFFFFFFFFFFFFFFFFll; @@ -88,11 +87,11 @@ __uint128_t __fixunstfti(long double input) {      }    } -  /* CASE 1 - Low double fits in int64. */ +  // CASE 1 - Low double fits in int64.    if (loExponent < 63) {      loResult = (long long)ldUnion.d[1];    } else { -    /* CASE 2 - Low double does not fit in int64, scale and convert it. */ +    // CASE 2 - Low double does not fit in int64, scale and convert it.      shift = loExponent - 54;      ldUnion.ull[1] &= 0x800FFFFFFFFFFFFFll;      ldUnion.ull[1] |= 0x4350000000000000ll; @@ -100,7 +99,7 @@ __uint128_t __fixunstfti(long double input) {      loResult <<= shift;    } -  /* Add the high and low doublewords together to form a 128 bit integer. */ +  // Add the high and low doublewords together to form a 128 bit integer.    result = loResult + hiResult;    return result;  } diff --git a/lib/builtins/ppc/floatditf.c b/lib/builtins/ppc/floatditf.c index beabdd017422..4c365418f082 100644 --- a/lib/builtins/ppc/floatditf.c +++ b/lib/builtins/ppc/floatditf.c @@ -1,36 +1,33 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 -/* long double __floatditf(long long x); */ -/* This file implements the PowerPC long long -> long double conversion */ +// long double __floatditf(long long x); +// This file implements the PowerPC long long -> long double conversion  #include "DD.h"  long double __floatditf(int64_t a) { -	 -	static const double twop32 = 0x1.0p32; -	static const double twop52 = 0x1.0p52; -	 -	doublebits low  = { .d = twop52 }; -	low.x |= a & UINT64_C(0x00000000ffffffff);	/* 0x1.0p52 + low 32 bits of a. */ -	 -	const double high_addend = (double)((int32_t)(a >> 32))*twop32 - twop52; -	 -	/* At this point, we have two double precision numbers -	 * high_addend and low.d, and we wish to return their sum -	 * as a canonicalized long double: -	 */ - -	/* This implementation sets the inexact flag spuriously. -	 * This could be avoided, but at some substantial cost. -	*/ - -	DD result; -	 -	result.s.hi = high_addend + low.d; -	result.s.lo = (high_addend - result.s.hi) + low.d; -	 -	return result.ld; -	 + +  static const double twop32 = 0x1.0p32; +  static const double twop52 = 0x1.0p52; + +  doublebits low = {.d = twop52}; +  low.x |= a & UINT64_C(0x00000000ffffffff); // 0x1.0p52 + low 32 bits of a. + +  const double high_addend = (double)((int32_t)(a >> 32)) * twop32 - twop52; + +  // At this point, we have two double precision numbers +  // high_addend and low.d, and we wish to return their sum +  // as a canonicalized long double: + +  // This implementation sets the inexact flag spuriously. +  // This could be avoided, but at some substantial cost. + +  DD result; + +  result.s.hi = high_addend + low.d; +  result.s.lo = (high_addend - result.s.hi) + low.d; + +  return result.ld;  } diff --git a/lib/builtins/ppc/floattitf.c b/lib/builtins/ppc/floattitf.c index b8e297b6b8d9..6deac6498128 100644 --- a/lib/builtins/ppc/floattitf.c +++ b/lib/builtins/ppc/floattitf.c @@ -1,9 +1,8 @@  //===-- lib/builtins/ppc/floattitf.c - Convert int128->long double -*-C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -14,35 +13,34 @@  #include <stdint.h> -/* Conversions from signed and unsigned 64-bit int to long double. */ +// Conversions from signed and unsigned 64-bit int to long double.  long double __floatditf(int64_t);  long double __floatunditf(uint64_t); -/* Convert a signed 128-bit integer to long double. - * This uses the following property:  Let hi and lo be 64-bits each, - * and let signed_val_k() and unsigned_val_k() be the value of the - * argument interpreted as a signed or unsigned k-bit integer. Then, - * - * signed_val_128(hi,lo) = signed_val_64(hi) * 2^64 + unsigned_val_64(lo) - * = (long double)hi * 2^64 + (long double)lo, - * - * where (long double)hi and (long double)lo are signed and - * unsigned 64-bit integer to long double conversions, respectively. - */ +// Convert a signed 128-bit integer to long double. +// This uses the following property:  Let hi and lo be 64-bits each, +// and let signed_val_k() and unsigned_val_k() be the value of the +// argument interpreted as a signed or unsigned k-bit integer. Then, +// +// signed_val_128(hi,lo) = signed_val_64(hi) * 2^64 + unsigned_val_64(lo) +// = (long double)hi * 2^64 + (long double)lo, +// +// where (long double)hi and (long double)lo are signed and +// unsigned 64-bit integer to long double conversions, respectively.  long double __floattitf(__int128_t arg) { -  /* Split the int128 argument into 64-bit high and low int64 parts. */ +  // Split the int128 argument into 64-bit high and low int64 parts.    int64_t ArgHiPart = (int64_t)(arg >> 64);    uint64_t ArgLoPart = (uint64_t)arg; -  /* Convert each 64-bit part into long double. The high part -   * must be a signed conversion and the low part an unsigned conversion -   * to ensure the correct result. */ +  // Convert each 64-bit part into long double. The high part +  // must be a signed conversion and the low part an unsigned conversion +  // to ensure the correct result.    long double ConvertedHiPart = __floatditf(ArgHiPart);    long double ConvertedLoPart = __floatunditf(ArgLoPart); -  /* The low bit of ArgHiPart corresponds to the 2^64 bit in arg. -   * Multiply the high part by 2^64 to undo the right shift by 64-bits -   * done in the splitting. Then, add to the low part to obtain the -   * final result. */ +  // The low bit of ArgHiPart corresponds to the 2^64 bit in arg. +  // Multiply the high part by 2^64 to undo the right shift by 64-bits +  // done in the splitting. Then, add to the low part to obtain the +  // final result.    return ((ConvertedHiPart * 0x1.0p64) + ConvertedLoPart);  } diff --git a/lib/builtins/ppc/floatunditf.c b/lib/builtins/ppc/floatunditf.c index b12e1e738fd0..fb4cd3f91d86 100644 --- a/lib/builtins/ppc/floatunditf.c +++ b/lib/builtins/ppc/floatunditf.c @@ -1,41 +1,39 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 -/* long double __floatunditf(unsigned long long x); */ -/* This file implements the PowerPC unsigned long long -> long double conversion */ +// long double __floatunditf(unsigned long long x); +// This file implements the PowerPC unsigned long long -> long double conversion  #include "DD.h"  long double __floatunditf(uint64_t a) { -	 -	/* Begins with an exact copy of the code from __floatundidf */ -	 -	static const double twop52 = 0x1.0p52; -	static const double twop84 = 0x1.0p84; -	static const double twop84_plus_twop52 = 0x1.00000001p84; -	 -	doublebits high = { .d = twop84 }; -	doublebits low  = { .d = twop52 }; -	 -	high.x |= a >> 32;							/* 0x1.0p84 + high 32 bits of a */ -	low.x |= a & UINT64_C(0x00000000ffffffff);	/* 0x1.0p52 + low 32 bits of a */ -	 -	const double high_addend = high.d - twop84_plus_twop52; -	 -	/* At this point, we have two double precision numbers -	 * high_addend and low.d, and we wish to return their sum -	 * as a canonicalized long double: -	 */ - -	/* This implementation sets the inexact flag spuriously. */ -	/* This could be avoided, but at some substantial cost. */ -	 -	DD result; -	 -	result.s.hi = high_addend + low.d; -	result.s.lo = (high_addend - result.s.hi) + low.d; -	 -	return result.ld; -	 + +  // Begins with an exact copy of the code from __floatundidf + +  static const double twop52 = 0x1.0p52; +  static const double twop84 = 0x1.0p84; +  static const double twop84_plus_twop52 = 0x1.00000001p84; + +  doublebits high = {.d = twop84}; +  doublebits low = {.d = twop52}; + +  high.x |= a >> 32;                         // 0x1.0p84 + high 32 bits of a +  low.x |= a & UINT64_C(0x00000000ffffffff); // 0x1.0p52 + low 32 bits of a + +  const double high_addend = high.d - twop84_plus_twop52; + +  // At this point, we have two double precision numbers +  // high_addend and low.d, and we wish to return their sum +  // as a canonicalized long double: + +  // This implementation sets the inexact flag spuriously. +  // This could be avoided, but at some substantial cost. + +  DD result; + +  result.s.hi = high_addend + low.d; +  result.s.lo = (high_addend - result.s.hi) + low.d; + +  return result.ld;  } diff --git a/lib/builtins/ppc/gcc_qadd.c b/lib/builtins/ppc/gcc_qadd.c index 32e16e9d1d11..6e1e63cb530e 100644 --- a/lib/builtins/ppc/gcc_qadd.c +++ b/lib/builtins/ppc/gcc_qadd.c @@ -1,76 +1,74 @@ -/* This file is distributed under the University of Illinois Open Source - *  License. See LICENSE.TXT for details. - */ +// 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 -/* long double __gcc_qadd(long double x, long double y); - * This file implements the PowerPC 128-bit double-double add operation. - * This implementation is shamelessly cribbed from Apple's DDRT, circa 1993(!) - */ +// long double __gcc_qadd(long double x, long double y); +// This file implements the PowerPC 128-bit double-double add operation. +// This implementation is shamelessly cribbed from Apple's DDRT, circa 1993(!)  #include "DD.h" -long double __gcc_qadd(long double x, long double y) -{ -	static const uint32_t infinityHi = UINT32_C(0x7ff00000); -	 -	DD dst = { .ld = x }, src = { .ld = y }; -	 -	register double A = dst.s.hi, a = dst.s.lo, -					B = src.s.hi, b = src.s.lo; -	 -	/* If both operands are zero: */ -	if ((A == 0.0) && (B == 0.0)) { -		dst.s.hi = A + B; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -	/* If either operand is NaN or infinity: */ -	const doublebits abits = { .d = A }; -	const doublebits bbits = { .d = B }; -	if ((((uint32_t)(abits.x >> 32) & infinityHi) == infinityHi) || -		(((uint32_t)(bbits.x >> 32) & infinityHi) == infinityHi)) { -		dst.s.hi = A + B; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -	/* If the computation overflows: */ -	/* This may be playing things a little bit fast and loose, but it will do for a start. */ -	const double testForOverflow = A + (B + (a + b)); -	const doublebits testbits = { .d = testForOverflow }; -	if (((uint32_t)(testbits.x >> 32) & infinityHi) == infinityHi) { -		dst.s.hi = testForOverflow; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -	double H, h; -	double T, t; -	double W, w; -	double Y; -	 -	H = B + (A - (A + B)); -	T = b + (a - (a + b)); -	h = A + (B - (A + B)); -	t = a + (b - (a + b)); -	 -	if (local_fabs(A) <= local_fabs(B)) -		w = (a + b) + h; -	else -		w = (a + b) + H; -	 -	W = (A + B) + w; -	Y = (A + B) - W; -	Y += w; -	 -	if (local_fabs(a) <= local_fabs(b)) -		w = t + Y; -	else -		w = T + Y; -	 -	dst.s.hi = Y = W + w; -	dst.s.lo = (W - Y) + w; -	 -	return dst.ld; +long double __gcc_qadd(long double x, long double y) { +  static const uint32_t infinityHi = UINT32_C(0x7ff00000); + +  DD dst = {.ld = x}, src = {.ld = y}; + +  register double A = dst.s.hi, a = dst.s.lo, B = src.s.hi, b = src.s.lo; + +  // If both operands are zero: +  if ((A == 0.0) && (B == 0.0)) { +    dst.s.hi = A + B; +    dst.s.lo = 0.0; +    return dst.ld; +  } + +  // If either operand is NaN or infinity: +  const doublebits abits = {.d = A}; +  const doublebits bbits = {.d = B}; +  if ((((uint32_t)(abits.x >> 32) & infinityHi) == infinityHi) || +      (((uint32_t)(bbits.x >> 32) & infinityHi) == infinityHi)) { +    dst.s.hi = A + B; +    dst.s.lo = 0.0; +    return dst.ld; +  } + +  // If the computation overflows: +  // This may be playing things a little bit fast and loose, but it will do for +  // a start. +  const double testForOverflow = A + (B + (a + b)); +  const doublebits testbits = {.d = testForOverflow}; +  if (((uint32_t)(testbits.x >> 32) & infinityHi) == infinityHi) { +    dst.s.hi = testForOverflow; +    dst.s.lo = 0.0; +    return dst.ld; +  } + +  double H, h; +  double T, t; +  double W, w; +  double Y; + +  H = B + (A - (A + B)); +  T = b + (a - (a + b)); +  h = A + (B - (A + B)); +  t = a + (b - (a + b)); + +  if (local_fabs(A) <= local_fabs(B)) +    w = (a + b) + h; +  else +    w = (a + b) + H; + +  W = (A + B) + w; +  Y = (A + B) - W; +  Y += w; + +  if (local_fabs(a) <= local_fabs(b)) +    w = t + Y; +  else +    w = T + Y; + +  dst.s.hi = Y = W + w; +  dst.s.lo = (W - Y) + w; + +  return dst.ld;  } diff --git a/lib/builtins/ppc/gcc_qdiv.c b/lib/builtins/ppc/gcc_qdiv.c index 70aa00b64400..35a3cbc3d3f8 100644 --- a/lib/builtins/ppc/gcc_qdiv.c +++ b/lib/builtins/ppc/gcc_qdiv.c @@ -1,55 +1,52 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 -/* long double __gcc_qdiv(long double x, long double y); - * This file implements the PowerPC 128-bit double-double division operation. - * This implementation is shamelessly cribbed from Apple's DDRT, circa 1993(!) - */ +// long double __gcc_qdiv(long double x, long double y); +// This file implements the PowerPC 128-bit double-double division operation. +// This implementation is shamelessly cribbed from Apple's DDRT, circa 1993(!)  #include "DD.h" -long double __gcc_qdiv(long double a, long double b) -{	 -	static const uint32_t infinityHi = UINT32_C(0x7ff00000); -	DD dst = { .ld = a }, src = { .ld = b }; -	 -	register double x = dst.s.hi, x1 = dst.s.lo, -					y = src.s.hi, y1 = src.s.lo; -	 -    double yHi, yLo, qHi, qLo; -    double yq, tmp, q; -	 -    q = x / y; -	 -	/* Detect special cases */ -	if (q == 0.0) { -		dst.s.hi = q; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -	const doublebits qBits = { .d = q }; -	if (((uint32_t)(qBits.x >> 32) & infinityHi) == infinityHi) { -		dst.s.hi = q; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -    yHi = high26bits(y); -    qHi = high26bits(q); -	 -    yq = y * q; -    yLo = y - yHi; -    qLo = q - qHi; -	 -    tmp = LOWORDER(yq, yHi, yLo, qHi, qLo); -    tmp = (x - yq) - tmp; -    tmp = ((tmp + x1) - y1 * q) / y; -    x = q + tmp; -	 -    dst.s.lo = (q - x) + tmp; -    dst.s.hi = x; -	 +long double __gcc_qdiv(long double a, long double b) { +  static const uint32_t infinityHi = UINT32_C(0x7ff00000); +  DD dst = {.ld = a}, src = {.ld = b}; + +  register double x = dst.s.hi, x1 = dst.s.lo, y = src.s.hi, y1 = src.s.lo; + +  double yHi, yLo, qHi, qLo; +  double yq, tmp, q; + +  q = x / y; + +  // Detect special cases +  if (q == 0.0) { +    dst.s.hi = q; +    dst.s.lo = 0.0; +    return dst.ld; +  } + +  const doublebits qBits = {.d = q}; +  if (((uint32_t)(qBits.x >> 32) & infinityHi) == infinityHi) { +    dst.s.hi = q; +    dst.s.lo = 0.0;      return dst.ld; +  } + +  yHi = high26bits(y); +  qHi = high26bits(q); + +  yq = y * q; +  yLo = y - yHi; +  qLo = q - qHi; + +  tmp = LOWORDER(yq, yHi, yLo, qHi, qLo); +  tmp = (x - yq) - tmp; +  tmp = ((tmp + x1) - y1 * q) / y; +  x = q + tmp; + +  dst.s.lo = (q - x) + tmp; +  dst.s.hi = x; + +  return dst.ld;  } diff --git a/lib/builtins/ppc/gcc_qmul.c b/lib/builtins/ppc/gcc_qmul.c index fb4c5164ccb5..75f519aad6f0 100644 --- a/lib/builtins/ppc/gcc_qmul.c +++ b/lib/builtins/ppc/gcc_qmul.c @@ -1,53 +1,50 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 -/* long double __gcc_qmul(long double x, long double y); - * This file implements the PowerPC 128-bit double-double multiply operation. - * This implementation is shamelessly cribbed from Apple's DDRT, circa 1993(!) - */ +// long double __gcc_qmul(long double x, long double y); +// This file implements the PowerPC 128-bit double-double multiply operation. +// This implementation is shamelessly cribbed from Apple's DDRT, circa 1993(!)  #include "DD.h" -long double __gcc_qmul(long double x, long double y) -{	 -	static const uint32_t infinityHi = UINT32_C(0x7ff00000); -	DD dst = { .ld = x }, src = { .ld = y }; -	 -	register double A = dst.s.hi, a = dst.s.lo, -					B = src.s.hi, b = src.s.lo; -	 -	double aHi, aLo, bHi, bLo; -    double ab, tmp, tau; -	 -	ab = A * B; -	 -	/* Detect special cases */ -	if (ab == 0.0) { -		dst.s.hi = ab; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -	const doublebits abBits = { .d = ab }; -	if (((uint32_t)(abBits.x >> 32) & infinityHi) == infinityHi) { -		dst.s.hi = ab; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -	/* Generic cases handled here. */ -    aHi = high26bits(A); -    bHi = high26bits(B); -    aLo = A - aHi; -    bLo = B - bHi; -	 -    tmp = LOWORDER(ab, aHi, aLo, bHi, bLo); -    tmp += (A * b + a * B); -    tau = ab + tmp; -	 -    dst.s.lo = (ab - tau) + tmp; -    dst.s.hi = tau; -	 +long double __gcc_qmul(long double x, long double y) { +  static const uint32_t infinityHi = UINT32_C(0x7ff00000); +  DD dst = {.ld = x}, src = {.ld = y}; + +  register double A = dst.s.hi, a = dst.s.lo, B = src.s.hi, b = src.s.lo; + +  double aHi, aLo, bHi, bLo; +  double ab, tmp, tau; + +  ab = A * B; + +  // Detect special cases +  if (ab == 0.0) { +    dst.s.hi = ab; +    dst.s.lo = 0.0; +    return dst.ld; +  } + +  const doublebits abBits = {.d = ab}; +  if (((uint32_t)(abBits.x >> 32) & infinityHi) == infinityHi) { +    dst.s.hi = ab; +    dst.s.lo = 0.0;      return dst.ld; +  } + +  // Generic cases handled here. +  aHi = high26bits(A); +  bHi = high26bits(B); +  aLo = A - aHi; +  bLo = B - bHi; + +  tmp = LOWORDER(ab, aHi, aLo, bHi, bLo); +  tmp += (A * b + a * B); +  tau = ab + tmp; + +  dst.s.lo = (ab - tau) + tmp; +  dst.s.hi = tau; + +  return dst.ld;  } diff --git a/lib/builtins/ppc/gcc_qsub.c b/lib/builtins/ppc/gcc_qsub.c index c092e24dbda1..ac08120be0bd 100644 --- a/lib/builtins/ppc/gcc_qsub.c +++ b/lib/builtins/ppc/gcc_qsub.c @@ -1,76 +1,74 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 -/* long double __gcc_qsub(long double x, long double y); - * This file implements the PowerPC 128-bit double-double add operation. - * This implementation is shamelessly cribbed from Apple's DDRT, circa 1993(!) - */ +// long double __gcc_qsub(long double x, long double y); +// This file implements the PowerPC 128-bit double-double add operation. +// This implementation is shamelessly cribbed from Apple's DDRT, circa 1993(!)  #include "DD.h" -long double __gcc_qsub(long double x, long double y) -{ -	static const uint32_t infinityHi = UINT32_C(0x7ff00000); -	 -	DD dst = { .ld = x }, src = { .ld = y }; -	 -	register double A =  dst.s.hi, a =  dst.s.lo, -					B = -src.s.hi, b = -src.s.lo; -	 -	/* If both operands are zero: */ -	if ((A == 0.0) && (B == 0.0)) { -		dst.s.hi = A + B; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -	/* If either operand is NaN or infinity: */ -	const doublebits abits = { .d = A }; -	const doublebits bbits = { .d = B }; -	if ((((uint32_t)(abits.x >> 32) & infinityHi) == infinityHi) || -		(((uint32_t)(bbits.x >> 32) & infinityHi) == infinityHi)) { -		dst.s.hi = A + B; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -	/* If the computation overflows: */ -	/* This may be playing things a little bit fast and loose, but it will do for a start. */ -	const double testForOverflow = A + (B + (a + b)); -	const doublebits testbits = { .d = testForOverflow }; -	if (((uint32_t)(testbits.x >> 32) & infinityHi) == infinityHi) { -		dst.s.hi = testForOverflow; -		dst.s.lo = 0.0; -		return dst.ld; -	} -	 -	double H, h; -	double T, t; -	double W, w; -	double Y; -	 -	H = B + (A - (A + B)); -	T = b + (a - (a + b)); -	h = A + (B - (A + B)); -	t = a + (b - (a + b)); -	 -	if (local_fabs(A) <= local_fabs(B)) -		w = (a + b) + h; -	else -		w = (a + b) + H; -	 -	W = (A + B) + w; -	Y = (A + B) - W; -	Y += w; -	 -	if (local_fabs(a) <= local_fabs(b)) -		w = t + Y; -	else -		w = T + Y; -	 -	dst.s.hi = Y = W + w; -	dst.s.lo = (W - Y) + w; -	 -	return dst.ld; +long double __gcc_qsub(long double x, long double y) { +  static const uint32_t infinityHi = UINT32_C(0x7ff00000); + +  DD dst = {.ld = x}, src = {.ld = y}; + +  register double A = dst.s.hi, a = dst.s.lo, B = -src.s.hi, b = -src.s.lo; + +  // If both operands are zero: +  if ((A == 0.0) && (B == 0.0)) { +    dst.s.hi = A + B; +    dst.s.lo = 0.0; +    return dst.ld; +  } + +  // If either operand is NaN or infinity: +  const doublebits abits = {.d = A}; +  const doublebits bbits = {.d = B}; +  if ((((uint32_t)(abits.x >> 32) & infinityHi) == infinityHi) || +      (((uint32_t)(bbits.x >> 32) & infinityHi) == infinityHi)) { +    dst.s.hi = A + B; +    dst.s.lo = 0.0; +    return dst.ld; +  } + +  // If the computation overflows: +  // This may be playing things a little bit fast and loose, but it will do for +  // a start. +  const double testForOverflow = A + (B + (a + b)); +  const doublebits testbits = {.d = testForOverflow}; +  if (((uint32_t)(testbits.x >> 32) & infinityHi) == infinityHi) { +    dst.s.hi = testForOverflow; +    dst.s.lo = 0.0; +    return dst.ld; +  } + +  double H, h; +  double T, t; +  double W, w; +  double Y; + +  H = B + (A - (A + B)); +  T = b + (a - (a + b)); +  h = A + (B - (A + B)); +  t = a + (b - (a + b)); + +  if (local_fabs(A) <= local_fabs(B)) +    w = (a + b) + h; +  else +    w = (a + b) + H; + +  W = (A + B) + w; +  Y = (A + B) - W; +  Y += w; + +  if (local_fabs(a) <= local_fabs(b)) +    w = t + Y; +  else +    w = T + Y; + +  dst.s.hi = Y = W + w; +  dst.s.lo = (W - Y) + w; + +  return dst.ld;  } diff --git a/lib/builtins/ppc/multc3.c b/lib/builtins/ppc/multc3.c index 9dd79c975dde..f1fd6816d6c8 100644 --- a/lib/builtins/ppc/multc3.c +++ b/lib/builtins/ppc/multc3.c @@ -1,90 +1,85 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 "DD.h"  #include "../int_math.h" +#include "DD.h" -#define makeFinite(x) { \ -    (x).s.hi = crt_copysign(crt_isinf((x).s.hi) ? 1.0 : 0.0, (x).s.hi); \ -    (x).s.lo = 0.0;                                                     \ +#define makeFinite(x)                                                          \ +  {                                                                            \ +    (x).s.hi = crt_copysign(crt_isinf((x).s.hi) ? 1.0 : 0.0, (x).s.hi);        \ +    (x).s.lo = 0.0;                                                            \    } -#define zeroNaN(x) { \ -    if (crt_isnan((x).s.hi)) {                                          \ -      (x).s.hi = crt_copysign(0.0, (x).s.hi);                     \ -      (x).s.lo = 0.0;                                                   \ -    }                                                                   \ +#define zeroNaN(x)                                                             \ +  {                                                                            \ +    if (crt_isnan((x).s.hi)) {                                                 \ +      (x).s.hi = crt_copysign(0.0, (x).s.hi);                                  \ +      (x).s.lo = 0.0;                                                          \ +    }                                                                          \    } -long double _Complex -__multc3(long double a, long double b, long double c, long double d) -{ -	long double ac = __gcc_qmul(a,c); -	long double bd = __gcc_qmul(b,d); -	long double ad = __gcc_qmul(a,d); -	long double bc = __gcc_qmul(b,c); -	 -	DD real = { .ld = __gcc_qsub(ac,bd) }; -	DD imag = { .ld = __gcc_qadd(ad,bc) }; -	 -	if (crt_isnan(real.s.hi) && crt_isnan(imag.s.hi)) -	{ -		int recalc = 0; -		 -		DD aDD = { .ld = a }; -		DD bDD = { .ld = b }; -		DD cDD = { .ld = c }; -		DD dDD = { .ld = d }; -		 -		if (crt_isinf(aDD.s.hi) || crt_isinf(bDD.s.hi)) -		{ -			makeFinite(aDD); -			makeFinite(bDD); -			zeroNaN(cDD); -			zeroNaN(dDD); -			recalc = 1; -		} -		 -		if (crt_isinf(cDD.s.hi) || crt_isinf(dDD.s.hi)) -		{ -			makeFinite(cDD); -			makeFinite(dDD); -			zeroNaN(aDD); -			zeroNaN(bDD); -			recalc = 1; -		} -		 -		if (!recalc) -		{ -			DD acDD = { .ld = ac }; -			DD bdDD = { .ld = bd }; -			DD adDD = { .ld = ad }; -			DD bcDD = { .ld = bc }; -			 -			if (crt_isinf(acDD.s.hi) || crt_isinf(bdDD.s.hi) || -                            crt_isinf(adDD.s.hi) || crt_isinf(bcDD.s.hi)) -			{ -				zeroNaN(aDD); -				zeroNaN(bDD); -				zeroNaN(cDD); -				zeroNaN(dDD); -				recalc = 1; -			} -		} -		 -		if (recalc) -		{ -			real.s.hi = CRT_INFINITY * (aDD.s.hi*cDD.s.hi - bDD.s.hi*dDD.s.hi); -			real.s.lo = 0.0; -			imag.s.hi = CRT_INFINITY * (aDD.s.hi*dDD.s.hi + bDD.s.hi*cDD.s.hi); -			imag.s.lo = 0.0; -		} -	} -	 -	long double _Complex z; -	__real__ z = real.ld; -	__imag__ z = imag.ld; -	 -	return z; +long double _Complex __multc3(long double a, long double b, long double c, +                              long double d) { +  long double ac = __gcc_qmul(a, c); +  long double bd = __gcc_qmul(b, d); +  long double ad = __gcc_qmul(a, d); +  long double bc = __gcc_qmul(b, c); + +  DD real = {.ld = __gcc_qsub(ac, bd)}; +  DD imag = {.ld = __gcc_qadd(ad, bc)}; + +  if (crt_isnan(real.s.hi) && crt_isnan(imag.s.hi)) { +    int recalc = 0; + +    DD aDD = {.ld = a}; +    DD bDD = {.ld = b}; +    DD cDD = {.ld = c}; +    DD dDD = {.ld = d}; + +    if (crt_isinf(aDD.s.hi) || crt_isinf(bDD.s.hi)) { +      makeFinite(aDD); +      makeFinite(bDD); +      zeroNaN(cDD); +      zeroNaN(dDD); +      recalc = 1; +    } + +    if (crt_isinf(cDD.s.hi) || crt_isinf(dDD.s.hi)) { +      makeFinite(cDD); +      makeFinite(dDD); +      zeroNaN(aDD); +      zeroNaN(bDD); +      recalc = 1; +    } + +    if (!recalc) { +      DD acDD = {.ld = ac}; +      DD bdDD = {.ld = bd}; +      DD adDD = {.ld = ad}; +      DD bcDD = {.ld = bc}; + +      if (crt_isinf(acDD.s.hi) || crt_isinf(bdDD.s.hi) || +          crt_isinf(adDD.s.hi) || crt_isinf(bcDD.s.hi)) { +        zeroNaN(aDD); +        zeroNaN(bDD); +        zeroNaN(cDD); +        zeroNaN(dDD); +        recalc = 1; +      } +    } + +    if (recalc) { +      real.s.hi = CRT_INFINITY * (aDD.s.hi * cDD.s.hi - bDD.s.hi * dDD.s.hi); +      real.s.lo = 0.0; +      imag.s.hi = CRT_INFINITY * (aDD.s.hi * dDD.s.hi + bDD.s.hi * cDD.s.hi); +      imag.s.lo = 0.0; +    } +  } + +  long double _Complex z; +  __real__ z = real.ld; +  __imag__ z = imag.ld; + +  return z;  } diff --git a/lib/builtins/ppc/restFP.S b/lib/builtins/ppc/restFP.S index 507e756e18b1..02317bd6a649 100644 --- a/lib/builtins/ppc/restFP.S +++ b/lib/builtins/ppc/restFP.S @@ -1,9 +1,8 @@  //===-- restFP.S - Implement restFP ---------------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/ppc/saveFP.S b/lib/builtins/ppc/saveFP.S index 20b06fff53d9..1ef5532c8a83 100644 --- a/lib/builtins/ppc/saveFP.S +++ b/lib/builtins/ppc/saveFP.S @@ -1,9 +1,8 @@  //===-- saveFP.S - Implement saveFP ---------------------------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/riscv/mulsi3.S b/lib/builtins/riscv/mulsi3.S index a58d237040b6..5464919b26b9 100644 --- a/lib/builtins/riscv/mulsi3.S +++ b/lib/builtins/riscv/mulsi3.S @@ -1,9 +1,8 @@  //===--- mulsi3.S - Integer multiplication routines routines ---===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// diff --git a/lib/builtins/subdf3.c b/lib/builtins/subdf3.c index a892fa603cf2..5346dbc970fa 100644 --- a/lib/builtins/subdf3.c +++ b/lib/builtins/subdf3.c @@ -1,9 +1,8 @@  //===-- lib/adddf3.c - Double-precision subtraction ---------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -16,17 +15,14 @@  #include "fp_lib.h"  // Subtraction; flip the sign bit of b and add. -COMPILER_RT_ABI fp_t -__subdf3(fp_t a, fp_t b) { -    return __adddf3(a, fromRep(toRep(b) ^ signBit)); +COMPILER_RT_ABI fp_t __subdf3(fp_t a, fp_t b) { +  return __adddf3(a, fromRep(toRep(b) ^ signBit));  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_dsub(fp_t a, fp_t b) { -  return __subdf3(a, b); -} +AEABI_RTABI fp_t __aeabi_dsub(fp_t a, fp_t b) { return __subdf3(a, b); }  #else -AEABI_RTABI fp_t __aeabi_dsub(fp_t a, fp_t b) COMPILER_RT_ALIAS(__subdf3); +COMPILER_RT_ALIAS(__subdf3, __aeabi_dsub)  #endif  #endif diff --git a/lib/builtins/subsf3.c b/lib/builtins/subsf3.c index 4b2786177dcc..85bde029b5bc 100644 --- a/lib/builtins/subsf3.c +++ b/lib/builtins/subsf3.c @@ -1,9 +1,8 @@  //===-- lib/subsf3.c - Single-precision subtraction ---------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -16,17 +15,14 @@  #include "fp_lib.h"  // Subtraction; flip the sign bit of b and add. -COMPILER_RT_ABI fp_t -__subsf3(fp_t a, fp_t b) { -    return __addsf3(a, fromRep(toRep(b) ^ signBit)); +COMPILER_RT_ABI fp_t __subsf3(fp_t a, fp_t b) { +  return __addsf3(a, fromRep(toRep(b) ^ signBit));  }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI fp_t __aeabi_fsub(fp_t a, fp_t b) { -  return __subsf3(a, b); -} +AEABI_RTABI fp_t __aeabi_fsub(fp_t a, fp_t b) { return __subsf3(a, b); }  #else -AEABI_RTABI fp_t __aeabi_fsub(fp_t a, fp_t b) COMPILER_RT_ALIAS(__subsf3); +COMPILER_RT_ALIAS(__subsf3, __aeabi_fsub)  #endif  #endif diff --git a/lib/builtins/subtf3.c b/lib/builtins/subtf3.c index 609b816f41e3..c96814692d2c 100644 --- a/lib/builtins/subtf3.c +++ b/lib/builtins/subtf3.c @@ -1,9 +1,8 @@  //===-- lib/subtf3.c - Quad-precision subtraction -----------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -19,9 +18,8 @@  COMPILER_RT_ABI fp_t __addtf3(fp_t a, fp_t b);  // Subtraction; flip the sign bit of b and add. -COMPILER_RT_ABI fp_t -__subtf3(fp_t a, fp_t b) { -    return __addtf3(a, fromRep(toRep(b) ^ signBit)); +COMPILER_RT_ABI fp_t __subtf3(fp_t a, fp_t b) { +  return __addtf3(a, fromRep(toRep(b) ^ signBit));  }  #endif diff --git a/lib/builtins/subvdi3.c b/lib/builtins/subvdi3.c index 71fc70ffa92d..d7d78f1bb34f 100644 --- a/lib/builtins/subvdi3.c +++ b/lib/builtins/subvdi3.c @@ -1,36 +1,29 @@ -/* ===-- subvdi3.c - Implement __subvdi3 -----------------------------------=== - * - *                The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __subvdi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- subvdi3.c - Implement __subvdi3 -----------------------------------===// +// +// 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 implements __subvdi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a - b */ +// Returns: a - b -/* Effects: aborts if a - b overflows */ +// Effects: aborts if a - b overflows -COMPILER_RT_ABI di_int -__subvdi3(di_int a, di_int b) -{ -    di_int s = (du_int) a - (du_int) b; -    if (b >= 0) -    { -        if (s > a) -            compilerrt_abort(); -    } -    else -    { -        if (s <= a) -            compilerrt_abort(); -    } -    return s; +COMPILER_RT_ABI di_int __subvdi3(di_int a, di_int b) { +  di_int s = (du_int)a - (du_int)b; +  if (b >= 0) { +    if (s > a) +      compilerrt_abort(); +  } else { +    if (s <= a) +      compilerrt_abort(); +  } +  return s;  } diff --git a/lib/builtins/subvsi3.c b/lib/builtins/subvsi3.c index e6c0fb688c97..c3cb6e8a217c 100644 --- a/lib/builtins/subvsi3.c +++ b/lib/builtins/subvsi3.c @@ -1,36 +1,29 @@ -/* ===-- subvsi3.c - Implement __subvsi3 -----------------------------------=== - * - *                The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __subvsi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- subvsi3.c - Implement __subvsi3 -----------------------------------===// +// +// 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 implements __subvsi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a - b */ +// Returns: a - b -/* Effects: aborts if a - b overflows */ +// Effects: aborts if a - b overflows -COMPILER_RT_ABI si_int -__subvsi3(si_int a, si_int b) -{ -    si_int s = (su_int) a - (su_int) b; -    if (b >= 0) -    { -        if (s > a) -            compilerrt_abort(); -    } -    else -    { -        if (s <= a) -            compilerrt_abort(); -    } -    return s; +COMPILER_RT_ABI si_int __subvsi3(si_int a, si_int b) { +  si_int s = (su_int)a - (su_int)b; +  if (b >= 0) { +    if (s > a) +      compilerrt_abort(); +  } else { +    if (s <= a) +      compilerrt_abort(); +  } +  return s;  } diff --git a/lib/builtins/subvti3.c b/lib/builtins/subvti3.c index a6804d2d7b95..91ac18834043 100644 --- a/lib/builtins/subvti3.c +++ b/lib/builtins/subvti3.c @@ -1,40 +1,33 @@ -/* ===-- subvti3.c - Implement __subvti3 -----------------------------------=== - * - *      	       The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __subvti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- subvti3.c - Implement __subvti3 -----------------------------------===// +// +// 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 implements __subvti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: a - b */ +// Returns: a - b -/* Effects: aborts if a - b overflows */ +// Effects: aborts if a - b overflows -COMPILER_RT_ABI ti_int -__subvti3(ti_int a, ti_int b) -{ -    ti_int s = (tu_int) a - (tu_int) b; -    if (b >= 0) -    { -        if (s > a) -            compilerrt_abort(); -    } -    else -    { -        if (s <= a) -            compilerrt_abort(); -    } -    return s; +COMPILER_RT_ABI ti_int __subvti3(ti_int a, ti_int b) { +  ti_int s = (tu_int)a - (tu_int)b; +  if (b >= 0) { +    if (s > a) +      compilerrt_abort(); +  } else { +    if (s <= a) +      compilerrt_abort(); +  } +  return s;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/trampoline_setup.c b/lib/builtins/trampoline_setup.c index 25b627ab7658..a62431723d78 100644 --- a/lib/builtins/trampoline_setup.c +++ b/lib/builtins/trampoline_setup.c @@ -1,48 +1,43 @@ -/* ===----- trampoline_setup.c - Implement __trampoline_setup -------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - */ +//===----- trampoline_setup.c - Implement __trampoline_setup -------------===// +// +// 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 "int_lib.h" -extern void __clear_cache(void* start, void* end); +extern void __clear_cache(void *start, void *end); -/* - * The ppc compiler generates calls to __trampoline_setup() when creating  - * trampoline functions on the stack for use with nested functions. - * This function creates a custom 40-byte trampoline function on the stack  - * which loads r11 with a pointer to the outer function's locals - * and then jumps to the target nested function. - */ +// The ppc compiler generates calls to __trampoline_setup() when creating +// trampoline functions on the stack for use with nested functions. +// This function creates a custom 40-byte trampoline function on the stack +// which loads r11 with a pointer to the outer function's locals +// and then jumps to the target nested function.  #if __ppc__ && !defined(__powerpc64__) -COMPILER_RT_ABI void -__trampoline_setup(uint32_t* trampOnStack, int trampSizeAllocated,  -                   const void* realFunc, void* localsPtr) -{ -    /* should never happen, but if compiler did not allocate */ -    /* enough space on stack for the trampoline, abort */ -    if ( trampSizeAllocated < 40 ) -        compilerrt_abort(); -     -    /* create trampoline */ -    trampOnStack[0] = 0x7c0802a6;    /* mflr r0 */ -    trampOnStack[1] = 0x4800000d;    /* bl Lbase */ -    trampOnStack[2] = (uint32_t)realFunc; -    trampOnStack[3] = (uint32_t)localsPtr; -    trampOnStack[4] = 0x7d6802a6;    /* Lbase: mflr r11 */ -    trampOnStack[5] = 0x818b0000;    /* lwz    r12,0(r11) */ -    trampOnStack[6] = 0x7c0803a6;    /* mtlr r0 */ -    trampOnStack[7] = 0x7d8903a6;    /* mtctr r12 */ -    trampOnStack[8] = 0x816b0004;    /* lwz    r11,4(r11) */ -    trampOnStack[9] = 0x4e800420;    /* bctr */ -     -    /* clear instruction cache */ -    __clear_cache(trampOnStack, &trampOnStack[10]); +COMPILER_RT_ABI void __trampoline_setup(uint32_t *trampOnStack, +                                        int trampSizeAllocated, +                                        const void *realFunc, void *localsPtr) { +  // should never happen, but if compiler did not allocate +  // enough space on stack for the trampoline, abort +  if (trampSizeAllocated < 40) +    compilerrt_abort(); + +  // create trampoline +  trampOnStack[0] = 0x7c0802a6; // mflr r0 +  trampOnStack[1] = 0x4800000d; // bl Lbase +  trampOnStack[2] = (uint32_t)realFunc; +  trampOnStack[3] = (uint32_t)localsPtr; +  trampOnStack[4] = 0x7d6802a6; // Lbase: mflr r11 +  trampOnStack[5] = 0x818b0000; // lwz    r12,0(r11) +  trampOnStack[6] = 0x7c0803a6; // mtlr r0 +  trampOnStack[7] = 0x7d8903a6; // mtctr r12 +  trampOnStack[8] = 0x816b0004; // lwz    r11,4(r11) +  trampOnStack[9] = 0x4e800420; // bctr + +  // clear instruction cache +  __clear_cache(trampOnStack, &trampOnStack[10]);  } -#endif /* __ppc__ && !defined(__powerpc64__) */ +#endif // __ppc__ && !defined(__powerpc64__) diff --git a/lib/builtins/truncdfhf2.c b/lib/builtins/truncdfhf2.c index 8354a41b8b6f..90c418a4387f 100644 --- a/lib/builtins/truncdfhf2.c +++ b/lib/builtins/truncdfhf2.c @@ -1,9 +1,8 @@  //===-- lib/truncdfhf2.c - double -> half conversion --------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -11,16 +10,12 @@  #define DST_HALF  #include "fp_trunc_impl.inc" -COMPILER_RT_ABI uint16_t __truncdfhf2(double a) { -    return __truncXfYf2__(a); -} +COMPILER_RT_ABI uint16_t __truncdfhf2(double a) { return __truncXfYf2__(a); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI uint16_t __aeabi_d2h(double a) { -  return __truncdfhf2(a); -} +AEABI_RTABI uint16_t __aeabi_d2h(double a) { return __truncdfhf2(a); }  #else -AEABI_RTABI uint16_t __aeabi_d2h(double a) COMPILER_RT_ALIAS(__truncdfhf2); +COMPILER_RT_ALIAS(__truncdfhf2, __aeabi_d2h)  #endif  #endif diff --git a/lib/builtins/truncdfsf2.c b/lib/builtins/truncdfsf2.c index 195d3e0656e7..44a1299e30ae 100644 --- a/lib/builtins/truncdfsf2.c +++ b/lib/builtins/truncdfsf2.c @@ -1,9 +1,8 @@  //===-- lib/truncdfsf2.c - double -> single conversion ------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -11,16 +10,12 @@  #define DST_SINGLE  #include "fp_trunc_impl.inc" -COMPILER_RT_ABI float __truncdfsf2(double a) { -    return __truncXfYf2__(a); -} +COMPILER_RT_ABI float __truncdfsf2(double a) { return __truncXfYf2__(a); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI float __aeabi_d2f(double a) { -  return __truncdfsf2(a); -} +AEABI_RTABI float __aeabi_d2f(double a) { return __truncdfsf2(a); }  #else -AEABI_RTABI float __aeabi_d2f(double a) COMPILER_RT_ALIAS(__truncdfsf2); +COMPILER_RT_ALIAS(__truncdfsf2, __aeabi_d2f)  #endif  #endif diff --git a/lib/builtins/truncsfhf2.c b/lib/builtins/truncsfhf2.c index 9c84ab4f938a..1f17194c38e5 100644 --- a/lib/builtins/truncsfhf2.c +++ b/lib/builtins/truncsfhf2.c @@ -1,9 +1,8 @@  //===-- lib/truncsfhf2.c - single -> half conversion --------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -14,19 +13,15 @@  // Use a forwarding definition and noinline to implement a poor man's alias,  // as there isn't a good cross-platform way of defining one.  COMPILER_RT_ABI NOINLINE uint16_t __truncsfhf2(float a) { -    return __truncXfYf2__(a); +  return __truncXfYf2__(a);  } -COMPILER_RT_ABI uint16_t __gnu_f2h_ieee(float a) { -    return __truncsfhf2(a); -} +COMPILER_RT_ABI uint16_t __gnu_f2h_ieee(float a) { return __truncsfhf2(a); }  #if defined(__ARM_EABI__)  #if defined(COMPILER_RT_ARMHF_TARGET) -AEABI_RTABI uint16_t __aeabi_f2h(float a) { -  return __truncsfhf2(a); -} +AEABI_RTABI uint16_t __aeabi_f2h(float a) { return __truncsfhf2(a); }  #else -AEABI_RTABI uint16_t __aeabi_f2h(float a) COMPILER_RT_ALIAS(__truncsfhf2); +COMPILER_RT_ALIAS(__truncsfhf2, __aeabi_f2h)  #endif  #endif diff --git a/lib/builtins/trunctfdf2.c b/lib/builtins/trunctfdf2.c index 741a71b33c5a..6857ea54d8a5 100644 --- a/lib/builtins/trunctfdf2.c +++ b/lib/builtins/trunctfdf2.c @@ -1,9 +1,8 @@  //===-- lib/truncdfsf2.c - quad -> double conversion --------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -15,8 +14,6 @@  #define DST_DOUBLE  #include "fp_trunc_impl.inc" -COMPILER_RT_ABI double __trunctfdf2(long double a) { -    return __truncXfYf2__(a); -} +COMPILER_RT_ABI double __trunctfdf2(long double a) { return __truncXfYf2__(a); }  #endif diff --git a/lib/builtins/trunctfsf2.c b/lib/builtins/trunctfsf2.c index de96c1decf63..0261b1e90f5d 100644 --- a/lib/builtins/trunctfsf2.c +++ b/lib/builtins/trunctfsf2.c @@ -1,9 +1,8 @@  //===-- lib/trunctfsf2.c - quad -> single conversion --------------*- C -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===// @@ -15,8 +14,6 @@  #define DST_SINGLE  #include "fp_trunc_impl.inc" -COMPILER_RT_ABI float __trunctfsf2(long double a) { -    return __truncXfYf2__(a); -} +COMPILER_RT_ABI float __trunctfsf2(long double a) { return __truncXfYf2__(a); }  #endif diff --git a/lib/builtins/ucmpdi2.c b/lib/builtins/ucmpdi2.c index 40af23613b1f..0f2edde8358b 100644 --- a/lib/builtins/ucmpdi2.c +++ b/lib/builtins/ucmpdi2.c @@ -1,51 +1,42 @@ -/* ===-- ucmpdi2.c - Implement __ucmpdi2 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ucmpdi2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ucmpdi2.c - Implement __ucmpdi2 -----------------------------------===// +// +// 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 implements __ucmpdi2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns:  if (a <  b) returns 0 - *           if (a == b) returns 1 - *           if (a >  b) returns 2 - */ +// Returns:  if (a <  b) returns 0 +//           if (a == b) returns 1 +//           if (a >  b) returns 2 -COMPILER_RT_ABI si_int -__ucmpdi2(du_int a, du_int b) -{ -    udwords x; -    x.all = a; -    udwords y; -    y.all = b; -    if (x.s.high < y.s.high) -        return 0; -    if (x.s.high > y.s.high) -        return 2; -    if (x.s.low < y.s.low) -        return 0; -    if (x.s.low > y.s.low) -        return 2; -    return 1; +COMPILER_RT_ABI si_int __ucmpdi2(du_int a, du_int b) { +  udwords x; +  x.all = a; +  udwords y; +  y.all = b; +  if (x.s.high < y.s.high) +    return 0; +  if (x.s.high > y.s.high) +    return 2; +  if (x.s.low < y.s.low) +    return 0; +  if (x.s.low > y.s.low) +    return 2; +  return 1;  }  #ifdef __ARM_EABI__ -/* Returns: if (a <  b) returns -1 -*           if (a == b) returns  0 -*           if (a >  b) returns  1 -*/ -COMPILER_RT_ABI si_int -__aeabi_ulcmp(di_int a, di_int b) -{ -	return __ucmpdi2(a, b) - 1; +// Returns: if (a <  b) returns -1 +//           if (a == b) returns  0 +//           if (a >  b) returns  1 +COMPILER_RT_ABI si_int __aeabi_ulcmp(di_int a, di_int b) { +  return __ucmpdi2(a, b) - 1;  }  #endif - diff --git a/lib/builtins/ucmpti2.c b/lib/builtins/ucmpti2.c index bda8083bb2a1..4eb6655b05af 100644 --- a/lib/builtins/ucmpti2.c +++ b/lib/builtins/ucmpti2.c @@ -1,42 +1,37 @@ -/* ===-- ucmpti2.c - Implement __ucmpti2 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __ucmpti2 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- ucmpti2.c - Implement __ucmpti2 -----------------------------------===// +// +// 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 implements __ucmpti2 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns:  if (a <  b) returns 0 - *           if (a == b) returns 1 - *           if (a >  b) returns 2 - */ +// Returns:  if (a <  b) returns 0 +//           if (a == b) returns 1 +//           if (a >  b) returns 2 -COMPILER_RT_ABI si_int -__ucmpti2(tu_int a, tu_int b) -{ -    utwords x; -    x.all = a; -    utwords y; -    y.all = b; -    if (x.s.high < y.s.high) -        return 0; -    if (x.s.high > y.s.high) -        return 2; -    if (x.s.low < y.s.low) -        return 0; -    if (x.s.low > y.s.low) -        return 2; -    return 1; +COMPILER_RT_ABI si_int __ucmpti2(tu_int a, tu_int b) { +  utwords x; +  x.all = a; +  utwords y; +  y.all = b; +  if (x.s.high < y.s.high) +    return 0; +  if (x.s.high > y.s.high) +    return 2; +  if (x.s.low < y.s.low) +    return 0; +  if (x.s.low > y.s.low) +    return 2; +  return 1;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/udivdi3.c b/lib/builtins/udivdi3.c index dc68e154b109..a23139ec947f 100644 --- a/lib/builtins/udivdi3.c +++ b/lib/builtins/udivdi3.c @@ -1,23 +1,19 @@ -/* ===-- udivdi3.c - Implement __udivdi3 -----------------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __udivdi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- udivdi3.c - Implement __udivdi3 -----------------------------------===// +// +// 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 implements __udivdi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a / b */ +// Returns: a / b -COMPILER_RT_ABI du_int -__udivdi3(du_int a, du_int b) -{ -    return __udivmoddi4(a, b, 0); +COMPILER_RT_ABI du_int __udivdi3(du_int a, du_int b) { +  return __udivmoddi4(a, b, 0);  } diff --git a/lib/builtins/udivmoddi4.c b/lib/builtins/udivmoddi4.c index 0c8b4ff46474..2914cc0fb46d 100644 --- a/lib/builtins/udivmoddi4.c +++ b/lib/builtins/udivmoddi4.c @@ -1,231 +1,189 @@ -/* ===-- udivmoddi4.c - Implement __udivmoddi4 -----------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __udivmoddi4 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- udivmoddi4.c - Implement __udivmoddi4 -----------------------------===// +// +// 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 implements __udivmoddi4 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Effects: if rem != 0, *rem = a % b - * Returns: a / b - */ +// Effects: if rem != 0, *rem = a % b +// Returns: a / b -/* Translated from Figure 3-40 of The PowerPC Compiler Writer's Guide */ +// Translated from Figure 3-40 of The PowerPC Compiler Writer's Guide -COMPILER_RT_ABI du_int -__udivmoddi4(du_int a, du_int b, du_int* rem) -{ -    const unsigned n_uword_bits = sizeof(su_int) * CHAR_BIT; -    const unsigned n_udword_bits = sizeof(du_int) * CHAR_BIT; -    udwords n; -    n.all = a; -    udwords d; -    d.all = b; -    udwords q; -    udwords r; -    unsigned sr; -    /* special cases, X is unknown, K != 0 */ -    if (n.s.high == 0) -    { -        if (d.s.high == 0) -        { -            /* 0 X -             * --- -             * 0 X -             */ -            if (rem) -                *rem = n.s.low % d.s.low; -            return n.s.low / d.s.low; -        } -        /* 0 X -         * --- -         * K X -         */ -        if (rem) -            *rem = n.s.low; -        return 0; +COMPILER_RT_ABI du_int __udivmoddi4(du_int a, du_int b, du_int *rem) { +  const unsigned n_uword_bits = sizeof(su_int) * CHAR_BIT; +  const unsigned n_udword_bits = sizeof(du_int) * CHAR_BIT; +  udwords n; +  n.all = a; +  udwords d; +  d.all = b; +  udwords q; +  udwords r; +  unsigned sr; +  // special cases, X is unknown, K != 0 +  if (n.s.high == 0) { +    if (d.s.high == 0) { +      // 0 X +      // --- +      // 0 X +      if (rem) +        *rem = n.s.low % d.s.low; +      return n.s.low / d.s.low; +    } +    // 0 X +    // --- +    // K X +    if (rem) +      *rem = n.s.low; +    return 0; +  } +  // n.s.high != 0 +  if (d.s.low == 0) { +    if (d.s.high == 0) { +      // K X +      // --- +      // 0 0 +      if (rem) +        *rem = n.s.high % d.s.low; +      return n.s.high / d.s.low; +    } +    // d.s.high != 0 +    if (n.s.low == 0) { +      // K 0 +      // --- +      // K 0 +      if (rem) { +        r.s.high = n.s.high % d.s.high; +        r.s.low = 0; +        *rem = r.all; +      } +      return n.s.high / d.s.high; +    } +    // K K +    // --- +    // K 0 +    if ((d.s.high & (d.s.high - 1)) == 0) /* if d is a power of 2 */ { +      if (rem) { +        r.s.low = n.s.low; +        r.s.high = n.s.high & (d.s.high - 1); +        *rem = r.all; +      } +      return n.s.high >> __builtin_ctz(d.s.high);      } -    /* n.s.high != 0 */ -    if (d.s.low == 0) -    { -        if (d.s.high == 0) -        { -            /* K X -             * --- -             * 0 0 -             */  -            if (rem) -                *rem = n.s.high % d.s.low; -            return n.s.high / d.s.low; -        } -        /* d.s.high != 0 */ -        if (n.s.low == 0) -        { -            /* K 0 -             * --- -             * K 0 -             */ -            if (rem) -            { -                r.s.high = n.s.high % d.s.high; -                r.s.low = 0; -                *rem = r.all; -            } -            return n.s.high / d.s.high; -        } -        /* K K -         * --- -         * K 0 -         */ -        if ((d.s.high & (d.s.high - 1)) == 0)     /* if d is a power of 2 */ -        { -            if (rem) -            { -                r.s.low = n.s.low; -                r.s.high = n.s.high & (d.s.high - 1); -                *rem = r.all; -            } -            return n.s.high >> __builtin_ctz(d.s.high); -        } -        /* K K -         * --- -         * K 0 -         */ -        sr = __builtin_clz(d.s.high) - __builtin_clz(n.s.high); -        /* 0 <= sr <= n_uword_bits - 2 or sr large */ -        if (sr > n_uword_bits - 2) -        { -           if (rem) -                *rem = n.all; -            return 0; -        } -        ++sr; -        /* 1 <= sr <= n_uword_bits - 1 */ -        /* q.all = n.all << (n_udword_bits - sr); */ +    // K K +    // --- +    // K 0 +    sr = __builtin_clz(d.s.high) - __builtin_clz(n.s.high); +    // 0 <= sr <= n_uword_bits - 2 or sr large +    if (sr > n_uword_bits - 2) { +      if (rem) +        *rem = n.all; +      return 0; +    } +    ++sr; +    // 1 <= sr <= n_uword_bits - 1 +    // q.all = n.all << (n_udword_bits - sr); +    q.s.low = 0; +    q.s.high = n.s.low << (n_uword_bits - sr); +    // r.all = n.all >> sr; +    r.s.high = n.s.high >> sr; +    r.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); +  } else /* d.s.low != 0 */ { +    if (d.s.high == 0) { +      // K X +      // --- +      // 0 K +      if ((d.s.low & (d.s.low - 1)) == 0) /* if d is a power of 2 */ { +        if (rem) +          *rem = n.s.low & (d.s.low - 1); +        if (d.s.low == 1) +          return n.all; +        sr = __builtin_ctz(d.s.low); +        q.s.high = n.s.high >> sr; +        q.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); +        return q.all; +      } +      // K X +      // --- +      // 0 K +      sr = 1 + n_uword_bits + __builtin_clz(d.s.low) - __builtin_clz(n.s.high); +      // 2 <= sr <= n_udword_bits - 1 +      // q.all = n.all << (n_udword_bits - sr); +      // r.all = n.all >> sr; +      if (sr == n_uword_bits) { +        q.s.low = 0; +        q.s.high = n.s.low; +        r.s.high = 0; +        r.s.low = n.s.high; +      } else if (sr < n_uword_bits) /* 2 <= sr <= n_uword_bits - 1 */ {          q.s.low = 0;          q.s.high = n.s.low << (n_uword_bits - sr); -        /* r.all = n.all >> sr; */          r.s.high = n.s.high >> sr;          r.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); +      } else /* n_uword_bits + 1 <= sr <= n_udword_bits - 1 */ { +        q.s.low = n.s.low << (n_udword_bits - sr); +        q.s.high = (n.s.high << (n_udword_bits - sr)) | +                   (n.s.low >> (sr - n_uword_bits)); +        r.s.high = 0; +        r.s.low = n.s.high >> (sr - n_uword_bits); +      } +    } else { +      // K X +      // --- +      // K K +      sr = __builtin_clz(d.s.high) - __builtin_clz(n.s.high); +      // 0 <= sr <= n_uword_bits - 1 or sr large +      if (sr > n_uword_bits - 1) { +        if (rem) +          *rem = n.all; +        return 0; +      } +      ++sr; +      // 1 <= sr <= n_uword_bits +      // q.all = n.all << (n_udword_bits - sr); +      q.s.low = 0; +      if (sr == n_uword_bits) { +        q.s.high = n.s.low; +        r.s.high = 0; +        r.s.low = n.s.high; +      } else { +        q.s.high = n.s.low << (n_uword_bits - sr); +        r.s.high = n.s.high >> sr; +        r.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); +      }      } -    else  /* d.s.low != 0 */ -    { -        if (d.s.high == 0) -        { -            /* K X -             * --- -             * 0 K -             */ -            if ((d.s.low & (d.s.low - 1)) == 0)     /* if d is a power of 2 */ -            { -                if (rem) -                    *rem = n.s.low & (d.s.low - 1); -                if (d.s.low == 1) -                    return n.all; -                sr = __builtin_ctz(d.s.low); -                q.s.high = n.s.high >> sr; -                q.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); -                return q.all; -            } -            /* K X -             * --- -             * 0 K -             */ -            sr = 1 + n_uword_bits + __builtin_clz(d.s.low) - __builtin_clz(n.s.high); -            /* 2 <= sr <= n_udword_bits - 1 -             * q.all = n.all << (n_udword_bits - sr); -             * r.all = n.all >> sr; -             */ -            if (sr == n_uword_bits) -            { -                q.s.low = 0; -                q.s.high = n.s.low; -                r.s.high = 0; -                r.s.low = n.s.high; -            } -            else if (sr < n_uword_bits)  // 2 <= sr <= n_uword_bits - 1 -            { -                q.s.low = 0; -                q.s.high = n.s.low << (n_uword_bits - sr); -                r.s.high = n.s.high >> sr; -                r.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); -            } -            else              // n_uword_bits + 1 <= sr <= n_udword_bits - 1 -            { -                q.s.low = n.s.low << (n_udword_bits - sr); -                q.s.high = (n.s.high << (n_udword_bits - sr)) | -                           (n.s.low >> (sr - n_uword_bits)); -                r.s.high = 0; -                r.s.low = n.s.high >> (sr - n_uword_bits); -            } -        } -        else -        { -            /* K X -             * --- -             * K K -             */ -            sr = __builtin_clz(d.s.high) - __builtin_clz(n.s.high); -            /* 0 <= sr <= n_uword_bits - 1 or sr large */ -            if (sr > n_uword_bits - 1) -            { -                if (rem) -                    *rem = n.all; -                return 0; -            } -            ++sr; -            /* 1 <= sr <= n_uword_bits */ -            /*  q.all = n.all << (n_udword_bits - sr); */ -            q.s.low = 0; -            if (sr == n_uword_bits) -            { -                q.s.high = n.s.low; -                r.s.high = 0; -                r.s.low = n.s.high; -            } -            else -            { -                q.s.high = n.s.low << (n_uword_bits - sr); -                r.s.high = n.s.high >> sr; -                r.s.low = (n.s.high << (n_uword_bits - sr)) | (n.s.low >> sr); -            } -        } -    } -    /* Not a special case -     * q and r are initialized with: -     * q.all = n.all << (n_udword_bits - sr); -     * r.all = n.all >> sr; -     * 1 <= sr <= n_udword_bits - 1 -     */ -    su_int carry = 0; -    for (; sr > 0; --sr) -    { -        /* r:q = ((r:q)  << 1) | carry */ -        r.s.high = (r.s.high << 1) | (r.s.low  >> (n_uword_bits - 1)); -        r.s.low  = (r.s.low  << 1) | (q.s.high >> (n_uword_bits - 1)); -        q.s.high = (q.s.high << 1) | (q.s.low  >> (n_uword_bits - 1)); -        q.s.low  = (q.s.low  << 1) | carry; -        /* carry = 0; -         * if (r.all >= d.all) -         * { -         *      r.all -= d.all; -         *      carry = 1; -         * } -         */ -        const di_int s = (di_int)(d.all - r.all - 1) >> (n_udword_bits - 1); -        carry = s & 1; -        r.all -= d.all & s; -    } -    q.all = (q.all << 1) | carry; -    if (rem) -        *rem = r.all; -    return q.all; +  } +  // Not a special case +  // q and r are initialized with: +  // q.all = n.all << (n_udword_bits - sr); +  // r.all = n.all >> sr; +  // 1 <= sr <= n_udword_bits - 1 +  su_int carry = 0; +  for (; sr > 0; --sr) { +    // r:q = ((r:q)  << 1) | carry +    r.s.high = (r.s.high << 1) | (r.s.low >> (n_uword_bits - 1)); +    r.s.low = (r.s.low << 1) | (q.s.high >> (n_uword_bits - 1)); +    q.s.high = (q.s.high << 1) | (q.s.low >> (n_uword_bits - 1)); +    q.s.low = (q.s.low << 1) | carry; +    // carry = 0; +    // if (r.all >= d.all) +    // { +    //      r.all -= d.all; +    //      carry = 1; +    // } +    const di_int s = (di_int)(d.all - r.all - 1) >> (n_udword_bits - 1); +    carry = s & 1; +    r.all -= d.all & s; +  } +  q.all = (q.all << 1) | carry; +  if (rem) +    *rem = r.all; +  return q.all;  } diff --git a/lib/builtins/udivmodsi4.c b/lib/builtins/udivmodsi4.c index 789c4b5061e4..753ad6dd96db 100644 --- a/lib/builtins/udivmodsi4.c +++ b/lib/builtins/udivmodsi4.c @@ -1,27 +1,21 @@ -/*===-- udivmodsi4.c - Implement __udivmodsi4 ------------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __udivmodsi4 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- udivmodsi4.c - Implement __udivmodsi4 -----------------------------===// +// +// 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 implements __udivmodsi4 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a / b, *rem = a % b  */ +// Returns: a / b, *rem = a % b -COMPILER_RT_ABI su_int -__udivmodsi4(su_int a, su_int b, su_int* rem) -{ -  si_int d = __udivsi3(a,b); -  *rem = a - (d*b); +COMPILER_RT_ABI su_int __udivmodsi4(su_int a, su_int b, su_int *rem) { +  si_int d = __udivsi3(a, b); +  *rem = a - (d * b);    return d;  } - - diff --git a/lib/builtins/udivmodti4.c b/lib/builtins/udivmodti4.c index 803168849c6c..dd14a8b579ca 100644 --- a/lib/builtins/udivmodti4.c +++ b/lib/builtins/udivmodti4.c @@ -1,238 +1,195 @@ -/* ===-- udivmodti4.c - Implement __udivmodti4 -----------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __udivmodti4 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */  +//===-- udivmodti4.c - Implement __udivmodti4 -----------------------------===// +// +// 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 implements __udivmodti4 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Effects: if rem != 0, *rem = a % b  - * Returns: a / b  - */ +// Effects: if rem != 0, *rem = a % b +// Returns: a / b -/* Translated from Figure 3-40 of The PowerPC Compiler Writer's Guide */ +// Translated from Figure 3-40 of The PowerPC Compiler Writer's Guide -COMPILER_RT_ABI tu_int -__udivmodti4(tu_int a, tu_int b, tu_int* rem) -{ -    const unsigned n_udword_bits = sizeof(du_int) * CHAR_BIT; -    const unsigned n_utword_bits = sizeof(tu_int) * CHAR_BIT; -    utwords n; -    n.all = a; -    utwords d; -    d.all = b; -    utwords q; -    utwords r; -    unsigned sr; -    /* special cases, X is unknown, K != 0 */ -    if (n.s.high == 0) -    { -        if (d.s.high == 0) -        { -            /* 0 X -             * --- -             * 0 X -             */ -            if (rem) -                *rem = n.s.low % d.s.low; -            return n.s.low / d.s.low; -        } -        /* 0 X -         * --- -         * K X -         */ -        if (rem) -            *rem = n.s.low; -        return 0; +COMPILER_RT_ABI tu_int __udivmodti4(tu_int a, tu_int b, tu_int *rem) { +  const unsigned n_udword_bits = sizeof(du_int) * CHAR_BIT; +  const unsigned n_utword_bits = sizeof(tu_int) * CHAR_BIT; +  utwords n; +  n.all = a; +  utwords d; +  d.all = b; +  utwords q; +  utwords r; +  unsigned sr; +  // special cases, X is unknown, K != 0 +  if (n.s.high == 0) { +    if (d.s.high == 0) { +      // 0 X +      // --- +      // 0 X +      if (rem) +        *rem = n.s.low % d.s.low; +      return n.s.low / d.s.low; +    } +    // 0 X +    // --- +    // K X +    if (rem) +      *rem = n.s.low; +    return 0; +  } +  // n.s.high != 0 +  if (d.s.low == 0) { +    if (d.s.high == 0) { +      // K X +      // --- +      // 0 0 +      if (rem) +        *rem = n.s.high % d.s.low; +      return n.s.high / d.s.low; +    } +    // d.s.high != 0 +    if (n.s.low == 0) { +      // K 0 +      // --- +      // K 0 +      if (rem) { +        r.s.high = n.s.high % d.s.high; +        r.s.low = 0; +        *rem = r.all; +      } +      return n.s.high / d.s.high; +    } +    // K K +    // --- +    // K 0 +    if ((d.s.high & (d.s.high - 1)) == 0) /* if d is a power of 2 */ { +      if (rem) { +        r.s.low = n.s.low; +        r.s.high = n.s.high & (d.s.high - 1); +        *rem = r.all; +      } +      return n.s.high >> __builtin_ctzll(d.s.high);      } -    /* n.s.high != 0 */ -    if (d.s.low == 0) -    { -        if (d.s.high == 0) -        { -            /* K X -             * --- -             * 0 0 -             */ -            if (rem) -                *rem = n.s.high % d.s.low; -            return n.s.high / d.s.low; -        } -        /* d.s.high != 0 */ -        if (n.s.low == 0) -        { -            /* K 0 -             * --- -             * K 0 -             */ -            if (rem) -            { -                r.s.high = n.s.high % d.s.high; -                r.s.low = 0; -                *rem = r.all; -            } -            return n.s.high / d.s.high; -        } -        /* K K -         * --- -         * K 0 -         */ -        if ((d.s.high & (d.s.high - 1)) == 0)     /* if d is a power of 2 */ -        { -            if (rem) -            { -                r.s.low = n.s.low; -                r.s.high = n.s.high & (d.s.high - 1); -                *rem = r.all; -            } -            return n.s.high >> __builtin_ctzll(d.s.high); -        } -        /* K K -         * --- -         * K 0 -         */ -        sr = __builtin_clzll(d.s.high) - __builtin_clzll(n.s.high); -        /* 0 <= sr <= n_udword_bits - 2 or sr large */ -        if (sr > n_udword_bits - 2) -        { -           if (rem) -                *rem = n.all; -            return 0; -        } -        ++sr; -        /* 1 <= sr <= n_udword_bits - 1 */ -        /* q.all = n.all << (n_utword_bits - sr); */ +    // K K +    // --- +    // K 0 +    sr = __builtin_clzll(d.s.high) - __builtin_clzll(n.s.high); +    // 0 <= sr <= n_udword_bits - 2 or sr large +    if (sr > n_udword_bits - 2) { +      if (rem) +        *rem = n.all; +      return 0; +    } +    ++sr; +    // 1 <= sr <= n_udword_bits - 1 +    // q.all = n.all << (n_utword_bits - sr); +    q.s.low = 0; +    q.s.high = n.s.low << (n_udword_bits - sr); +    // r.all = n.all >> sr; +    r.s.high = n.s.high >> sr; +    r.s.low = (n.s.high << (n_udword_bits - sr)) | (n.s.low >> sr); +  } else /* d.s.low != 0 */ { +    if (d.s.high == 0) { +      // K X +      // --- +      // 0 K +      if ((d.s.low & (d.s.low - 1)) == 0) /* if d is a power of 2 */ { +        if (rem) +          *rem = n.s.low & (d.s.low - 1); +        if (d.s.low == 1) +          return n.all; +        sr = __builtin_ctzll(d.s.low); +        q.s.high = n.s.high >> sr; +        q.s.low = (n.s.high << (n_udword_bits - sr)) | (n.s.low >> sr); +        return q.all; +      } +      // K X +      // --- +      // 0 K +      sr = 1 + n_udword_bits + __builtin_clzll(d.s.low) - +           __builtin_clzll(n.s.high); +      // 2 <= sr <= n_utword_bits - 1 +      // q.all = n.all << (n_utword_bits - sr); +      // r.all = n.all >> sr; +      if (sr == n_udword_bits) { +        q.s.low = 0; +        q.s.high = n.s.low; +        r.s.high = 0; +        r.s.low = n.s.high; +      } else if (sr < n_udword_bits) /* 2 <= sr <= n_udword_bits - 1 */ {          q.s.low = 0;          q.s.high = n.s.low << (n_udword_bits - sr); -        /* r.all = n.all >> sr; */          r.s.high = n.s.high >> sr;          r.s.low = (n.s.high << (n_udword_bits - sr)) | (n.s.low >> sr); +      } else /* n_udword_bits + 1 <= sr <= n_utword_bits - 1 */ { +        q.s.low = n.s.low << (n_utword_bits - sr); +        q.s.high = (n.s.high << (n_utword_bits - sr)) | +                   (n.s.low >> (sr - n_udword_bits)); +        r.s.high = 0; +        r.s.low = n.s.high >> (sr - n_udword_bits); +      } +    } else { +      // K X +      // --- +      // K K +      sr = __builtin_clzll(d.s.high) - __builtin_clzll(n.s.high); +      // 0 <= sr <= n_udword_bits - 1 or sr large +      if (sr > n_udword_bits - 1) { +        if (rem) +          *rem = n.all; +        return 0; +      } +      ++sr; +      // 1 <= sr <= n_udword_bits +      // q.all = n.all << (n_utword_bits - sr); +      // r.all = n.all >> sr; +      q.s.low = 0; +      if (sr == n_udword_bits) { +        q.s.high = n.s.low; +        r.s.high = 0; +        r.s.low = n.s.high; +      } else { +        r.s.high = n.s.high >> sr; +        r.s.low = (n.s.high << (n_udword_bits - sr)) | (n.s.low >> sr); +        q.s.high = n.s.low << (n_udword_bits - sr); +      }      } -    else  /* d.s.low != 0 */ -    { -        if (d.s.high == 0) -        { -            /* K X -             * --- -             * 0 K -             */ -            if ((d.s.low & (d.s.low - 1)) == 0)     /* if d is a power of 2 */ -            { -                if (rem) -                    *rem = n.s.low & (d.s.low - 1); -                if (d.s.low == 1) -                    return n.all; -                sr = __builtin_ctzll(d.s.low); -                q.s.high = n.s.high >> sr; -                q.s.low = (n.s.high << (n_udword_bits - sr)) | (n.s.low >> sr); -                return q.all; -            } -            /* K X -             * --- -             * 0 K -             */ -            sr = 1 + n_udword_bits + __builtin_clzll(d.s.low) -                                   - __builtin_clzll(n.s.high); -            /* 2 <= sr <= n_utword_bits - 1 -             * q.all = n.all << (n_utword_bits - sr); -             * r.all = n.all >> sr; -             */ -            if (sr == n_udword_bits) -            { -                q.s.low = 0; -                q.s.high = n.s.low; -                r.s.high = 0; -                r.s.low = n.s.high; -            } -            else if (sr < n_udword_bits)  // 2 <= sr <= n_udword_bits - 1 -            { -                q.s.low = 0; -                q.s.high = n.s.low << (n_udword_bits - sr); -                r.s.high = n.s.high >> sr; -                r.s.low = (n.s.high << (n_udword_bits - sr)) | (n.s.low >> sr); -            } -            else              // n_udword_bits + 1 <= sr <= n_utword_bits - 1 -            { -                q.s.low = n.s.low << (n_utword_bits - sr); -                q.s.high = (n.s.high << (n_utword_bits - sr)) | -                           (n.s.low >> (sr - n_udword_bits)); -                r.s.high = 0; -                r.s.low = n.s.high >> (sr - n_udword_bits); -            } -        } -        else -        { -            /* K X -             * --- -             * K K -             */ -            sr = __builtin_clzll(d.s.high) - __builtin_clzll(n.s.high); -            /*0 <= sr <= n_udword_bits - 1 or sr large */ -            if (sr > n_udword_bits - 1) -            { -               if (rem) -                    *rem = n.all; -                return 0; -            } -            ++sr; -            /* 1 <= sr <= n_udword_bits -             * q.all = n.all << (n_utword_bits - sr); -             * r.all = n.all >> sr; -             */ -            q.s.low = 0; -            if (sr == n_udword_bits) -            { -                q.s.high = n.s.low; -                r.s.high = 0; -                r.s.low = n.s.high; -            } -            else -            { -                r.s.high = n.s.high >> sr; -                r.s.low = (n.s.high << (n_udword_bits - sr)) | (n.s.low >> sr); -                q.s.high = n.s.low << (n_udword_bits - sr); -            } -        } -    } -    /* Not a special case -     * q and r are initialized with: -     * q.all = n.all << (n_utword_bits - sr); -     * r.all = n.all >> sr; -     * 1 <= sr <= n_utword_bits - 1 -     */ -    su_int carry = 0; -    for (; sr > 0; --sr) -    { -        /* r:q = ((r:q)  << 1) | carry */ -        r.s.high = (r.s.high << 1) | (r.s.low  >> (n_udword_bits - 1)); -        r.s.low  = (r.s.low  << 1) | (q.s.high >> (n_udword_bits - 1)); -        q.s.high = (q.s.high << 1) | (q.s.low  >> (n_udword_bits - 1)); -        q.s.low  = (q.s.low  << 1) | carry; -        /* carry = 0; -         * if (r.all >= d.all) -         * { -         *     r.all -= d.all; -         *      carry = 1; -         * } -         */ -        const ti_int s = (ti_int)(d.all - r.all - 1) >> (n_utword_bits - 1); -        carry = s & 1; -        r.all -= d.all & s; -    } -    q.all = (q.all << 1) | carry; -    if (rem) -        *rem = r.all; -    return q.all; +  } +  // Not a special case +  // q and r are initialized with: +  // q.all = n.all << (n_utword_bits - sr); +  // r.all = n.all >> sr; +  // 1 <= sr <= n_utword_bits - 1 +  su_int carry = 0; +  for (; sr > 0; --sr) { +    // r:q = ((r:q)  << 1) | carry +    r.s.high = (r.s.high << 1) | (r.s.low >> (n_udword_bits - 1)); +    r.s.low = (r.s.low << 1) | (q.s.high >> (n_udword_bits - 1)); +    q.s.high = (q.s.high << 1) | (q.s.low >> (n_udword_bits - 1)); +    q.s.low = (q.s.low << 1) | carry; +    // carry = 0; +    // if (r.all >= d.all) +    // { +    //     r.all -= d.all; +    //      carry = 1; +    // } +    const ti_int s = (ti_int)(d.all - r.all - 1) >> (n_utword_bits - 1); +    carry = s & 1; +    r.all -= d.all & s; +  } +  q.all = (q.all << 1) | carry; +  if (rem) +    *rem = r.all; +  return q.all;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/udivsi3.c b/lib/builtins/udivsi3.c index bb720f8c382b..18cc96c1b2e0 100644 --- a/lib/builtins/udivsi3.c +++ b/lib/builtins/udivsi3.c @@ -1,68 +1,62 @@ -/* ===-- udivsi3.c - Implement __udivsi3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __udivsi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- udivsi3.c - Implement __udivsi3 -----------------------------------===// +// +// 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 implements __udivsi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a / b */ +// Returns: a / b -/* Translated from Figure 3-40 of The PowerPC Compiler Writer's Guide */ +// Translated from Figure 3-40 of The PowerPC Compiler Writer's Guide -/* This function should not call __divsi3! */ -COMPILER_RT_ABI su_int -__udivsi3(su_int n, su_int d) -{ -    const unsigned n_uword_bits = sizeof(su_int) * CHAR_BIT; -    su_int q; -    su_int r; -    unsigned sr; -    /* special cases */ -    if (d == 0) -        return 0; /* ?! */ -    if (n == 0) -        return 0; -    sr = __builtin_clz(d) - __builtin_clz(n); -    /* 0 <= sr <= n_uword_bits - 1 or sr large */ -    if (sr > n_uword_bits - 1)  /* d > r */ -        return 0; -    if (sr == n_uword_bits - 1)  /* d == 1 */ -        return n; -    ++sr; -    /* 1 <= sr <= n_uword_bits - 1 */ -    /* Not a special case */ -    q = n << (n_uword_bits - sr); -    r = n >> sr; -    su_int carry = 0; -    for (; sr > 0; --sr) -    { -        /* r:q = ((r:q)  << 1) | carry */ -        r = (r << 1) | (q >> (n_uword_bits - 1)); -        q = (q << 1) | carry; -        /* carry = 0; -         * if (r.all >= d.all) -         * { -         *      r.all -= d.all; -         *      carry = 1; -         * } -         */ -        const si_int s = (si_int)(d - r - 1) >> (n_uword_bits - 1); -        carry = s & 1; -        r -= d & s; -    } +// This function should not call __divsi3! +COMPILER_RT_ABI su_int __udivsi3(su_int n, su_int d) { +  const unsigned n_uword_bits = sizeof(su_int) * CHAR_BIT; +  su_int q; +  su_int r; +  unsigned sr; +  // special cases +  if (d == 0) +    return 0; // ?! +  if (n == 0) +    return 0; +  sr = __builtin_clz(d) - __builtin_clz(n); +  // 0 <= sr <= n_uword_bits - 1 or sr large +  if (sr > n_uword_bits - 1) // d > r +    return 0; +  if (sr == n_uword_bits - 1) // d == 1 +    return n; +  ++sr; +  // 1 <= sr <= n_uword_bits - 1 +  // Not a special case +  q = n << (n_uword_bits - sr); +  r = n >> sr; +  su_int carry = 0; +  for (; sr > 0; --sr) { +    // r:q = ((r:q)  << 1) | carry +    r = (r << 1) | (q >> (n_uword_bits - 1));      q = (q << 1) | carry; -    return q; +    // carry = 0; +    // if (r.all >= d.all) +    // { +    //      r.all -= d.all; +    //      carry = 1; +    // } +    const si_int s = (si_int)(d - r - 1) >> (n_uword_bits - 1); +    carry = s & 1; +    r -= d & s; +  } +  q = (q << 1) | carry; +  return q;  }  #if defined(__ARM_EABI__) -AEABI_RTABI su_int __aeabi_uidiv(su_int n, su_int d) COMPILER_RT_ALIAS(__udivsi3); +COMPILER_RT_ALIAS(__udivsi3, __aeabi_uidiv)  #endif diff --git a/lib/builtins/udivti3.c b/lib/builtins/udivti3.c index ec94673e25b0..4c82040b88cb 100644 --- a/lib/builtins/udivti3.c +++ b/lib/builtins/udivti3.c @@ -1,27 +1,23 @@ -/* ===-- udivti3.c - Implement __udivti3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __udivti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- udivti3.c - Implement __udivti3 -----------------------------------===// +// +// 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 implements __udivti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: a / b */ +// Returns: a / b -COMPILER_RT_ABI tu_int -__udivti3(tu_int a, tu_int b) -{ -    return __udivmodti4(a, b, 0); +COMPILER_RT_ABI tu_int __udivti3(tu_int a, tu_int b) { +  return __udivmodti4(a, b, 0);  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/umoddi3.c b/lib/builtins/umoddi3.c index d513f080a1e9..965cf8fc01bd 100644 --- a/lib/builtins/umoddi3.c +++ b/lib/builtins/umoddi3.c @@ -1,25 +1,21 @@ -/* ===-- umoddi3.c - Implement __umoddi3 -----------------------------------=== - * - *                    The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __umoddi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- umoddi3.c - Implement __umoddi3 -----------------------------------===// +// +// 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 implements __umoddi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a % b */ +// Returns: a % b -COMPILER_RT_ABI du_int -__umoddi3(du_int a, du_int b) -{ -    du_int r; -    __udivmoddi4(a, b, &r); -    return r; +COMPILER_RT_ABI du_int __umoddi3(du_int a, du_int b) { +  du_int r; +  __udivmoddi4(a, b, &r); +  return r;  } diff --git a/lib/builtins/umodsi3.c b/lib/builtins/umodsi3.c index d5fda4a6af1f..ce9abcd94ef7 100644 --- a/lib/builtins/umodsi3.c +++ b/lib/builtins/umodsi3.c @@ -1,23 +1,19 @@ -/* ===-- umodsi3.c - Implement __umodsi3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __umodsi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- umodsi3.c - Implement __umodsi3 -----------------------------------===// +// +// 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 implements __umodsi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h" -/* Returns: a % b */ +// Returns: a % b -COMPILER_RT_ABI su_int -__umodsi3(su_int a, su_int b) -{ -    return a - __udivsi3(a, b) * b; +COMPILER_RT_ABI su_int __umodsi3(su_int a, su_int b) { +  return a - __udivsi3(a, b) * b;  } diff --git a/lib/builtins/umodti3.c b/lib/builtins/umodti3.c index 6d1ca7a8cf6f..8cc5cb6b88f7 100644 --- a/lib/builtins/umodti3.c +++ b/lib/builtins/umodti3.c @@ -1,29 +1,25 @@ -/* ===-- umodti3.c - Implement __umodti3 -----------------------------------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __umodti3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- umodti3.c - Implement __umodti3 -----------------------------------===// +// +// 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 implements __umodti3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===//  #include "int_lib.h"  #ifdef CRT_HAS_128BIT -/* Returns: a % b */ +// Returns: a % b -COMPILER_RT_ABI tu_int -__umodti3(tu_int a, tu_int b) -{ -    tu_int r; -    __udivmodti4(a, b, &r); -    return r; +COMPILER_RT_ABI tu_int __umodti3(tu_int a, tu_int b) { +  tu_int r; +  __udivmodti4(a, b, &r); +  return r;  } -#endif /* CRT_HAS_128BIT */ +#endif // CRT_HAS_128BIT diff --git a/lib/builtins/unwind-ehabi-helpers.h b/lib/builtins/unwind-ehabi-helpers.h index ccb0765975a9..1b48cdb75e1b 100644 --- a/lib/builtins/unwind-ehabi-helpers.h +++ b/lib/builtins/unwind-ehabi-helpers.h @@ -1,43 +1,40 @@ -/* ===-- arm-ehabi-helpers.h - Supplementary ARM EHABI declarations --------=== - * - *                     The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===--------------------------------------------------------------------=== */ +//===-- arm-ehabi-helpers.h - Supplementary ARM EHABI declarations --------===// +// +// 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 +// +//===--------------------------------------------------------------------===//  #ifndef UNWIND_EHABI_HELPERS_H  #define UNWIND_EHABI_HELPERS_H  #include <stdint.h> -/* NOTE: see reasoning for this inclusion below */ +// NOTE: see reasoning for this inclusion below  #include <unwind.h>  #if !defined(__ARM_EABI_UNWINDER__) -/* - * NOTE: _URC_OK, _URC_FAILURE must be present as preprocessor tokens.  This - * allows for a substitution of a constant which can be cast into the - * appropriate enumerated type.  This header is expected to always be included - * AFTER unwind.h (which is why it is forcefully included above).  This ensures - * that we do not overwrite the token for the enumeration.  Subsequent uses of - * the token would be clean to rewrite with constant values. - * - * The typedef redeclaration should be safe.  Due to the protection granted to - * us by the `__ARM_EABI_UNWINDER__` above, we are guaranteed that we are in a - * header not vended by gcc.  The HP unwinder (being an itanium unwinder) does - * not support EHABI, and the GNU unwinder, derived from the HP unwinder, also - * does not support EHABI as of the introduction of this header.  As such, we - * are fairly certain that we are in the LLVM case.  Here, _Unwind_State is a - * typedef, and so we can get away with a redeclaration. - * - * Guarded redefinitions of the needed unwind state prevent the redefinition of - * those states. - */ - -#define _URC_OK       0 -#define _URC_FAILURE  9 +// NOTE: _URC_OK, _URC_FAILURE must be present as preprocessor tokens.  This +// allows for a substitution of a constant which can be cast into the +// appropriate enumerated type.  This header is expected to always be included +// AFTER unwind.h (which is why it is forcefully included above).  This ensures +// that we do not overwrite the token for the enumeration.  Subsequent uses of +// the token would be clean to rewrite with constant values. +// +// The typedef redeclaration should be safe.  Due to the protection granted to +// us by the `__ARM_EABI_UNWINDER__` above, we are guaranteed that we are in a +// header not vended by gcc.  The HP unwinder (being an itanium unwinder) does +// not support EHABI, and the GNU unwinder, derived from the HP unwinder, also +// does not support EHABI as of the introduction of this header.  As such, we +// are fairly certain that we are in the LLVM case.  Here, _Unwind_State is a +// typedef, and so we can get away with a redeclaration. +// +// Guarded redefinitions of the needed unwind state prevent the redefinition of +// those states. + +#define _URC_OK 0 +#define _URC_FAILURE 9  typedef uint32_t _Unwind_State; @@ -52,4 +49,3 @@ typedef uint32_t _Unwind_State;  #endif  #endif - diff --git a/lib/builtins/x86_64/chkstk.S b/lib/builtins/x86_64/chkstk.S index 4149ac63d9d0..ad7953a116ac 100644 --- a/lib/builtins/x86_64/chkstk.S +++ b/lib/builtins/x86_64/chkstk.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/x86_64/chkstk2.S b/lib/builtins/x86_64/chkstk2.S index ac1eb920e0e8..33d10d5b63be 100644 --- a/lib/builtins/x86_64/chkstk2.S +++ b/lib/builtins/x86_64/chkstk2.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" diff --git a/lib/builtins/x86_64/floatdidf.c b/lib/builtins/x86_64/floatdidf.c index dead0ed42c65..f83f53a38e9e 100644 --- a/lib/builtins/x86_64/floatdidf.c +++ b/lib/builtins/x86_64/floatdidf.c @@ -1,16 +1,13 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 -/* double __floatdidf(di_int a); */ +// double __floatdidf(di_int a);  #if defined(__x86_64__) || defined(_M_X64)  #include "../int_lib.h" -double __floatdidf(int64_t a) -{ -	return (double)a; -} +double __floatdidf(int64_t a) { return (double)a; } -#endif /* __x86_64__ */ +#endif // __x86_64__ diff --git a/lib/builtins/x86_64/floatdisf.c b/lib/builtins/x86_64/floatdisf.c index 99d5621c6327..06c118cfa18d 100644 --- a/lib/builtins/x86_64/floatdisf.c +++ b/lib/builtins/x86_64/floatdisf.c @@ -1,14 +1,11 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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  #if defined(__x86_64__) || defined(_M_X64)  #include "../int_lib.h" -float __floatdisf(int64_t a) -{ -	return (float)a; -} +float __floatdisf(int64_t a) { return (float)a; } -#endif /* __x86_64__ */ +#endif // __x86_64__ diff --git a/lib/builtins/x86_64/floatdixf.c b/lib/builtins/x86_64/floatdixf.c index c01193a82b5e..cf8450ce6f42 100644 --- a/lib/builtins/x86_64/floatdixf.c +++ b/lib/builtins/x86_64/floatdixf.c @@ -1,16 +1,13 @@ -/* This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - */ +// 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 -/* long double __floatdixf(di_int a); */ +// long double __floatdixf(di_int a);  #ifdef __x86_64__  #include "../int_lib.h" -long double __floatdixf(int64_t a) -{ -	return (long double)a; -} +long double __floatdixf(int64_t a) { return (long double)a; } -#endif /* __i386__ */ +#endif // __i386__ diff --git a/lib/builtins/x86_64/floatundidf.S b/lib/builtins/x86_64/floatundidf.S index 094a68dc3cd4..7f6ef3bbb6bf 100644 --- a/lib/builtins/x86_64/floatundidf.S +++ b/lib/builtins/x86_64/floatundidf.S @@ -1,9 +1,8 @@  //===-- floatundidf.S - Implement __floatundidf for x86_64 ----------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // diff --git a/lib/builtins/x86_64/floatundisf.S b/lib/builtins/x86_64/floatundisf.S index 7c9f75e188eb..246bdff5a4c3 100644 --- a/lib/builtins/x86_64/floatundisf.S +++ b/lib/builtins/x86_64/floatundisf.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -23,7 +24,7 @@ DEFINE_COMPILERRT_FUNCTION(__floatundisf)  	js			1f  	cvtsi2ssq	%rdi,		%xmm0  	ret -	 +  1:	andq		%rdi,		%rsi  	shrq		%rdi  	orq			%rsi,		%rdi diff --git a/lib/builtins/x86_64/floatundixf.S b/lib/builtins/x86_64/floatundixf.S index 28a096b71373..9e3bcedcb7e4 100644 --- a/lib/builtins/x86_64/floatundixf.S +++ b/lib/builtins/x86_64/floatundixf.S @@ -1,5 +1,6 @@ -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. +// 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 "../assembly.h" @@ -57,7 +58,7 @@ DEFINE_COMPILERRT_FUNCTION(__floatundixf)  	orq		REL_ADDR(twop52),	%rsi			// 2^52 + lo (as a double)  	movq	%rdi,			 -8(%rsp)  	movq	%rsi,			-16(%rsp) -	fldl	REL_ADDR(twop84_plus_twop52_neg)	 +	fldl	REL_ADDR(twop84_plus_twop52_neg)  	faddl	-8(%rsp)	// hi - 2^52 (as double extended, no rounding occurs)  	faddl	-16(%rsp)	// hi + lo (as double extended)  	ret  | 
