diff --git a/CMakeLists.txt b/CMakeLists.txt index efd744a0e1..cae9d44192 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,6 +217,413 @@ check_c_source_compiles([[#include #endif void main(){};]] LONG_LONG_LIMB) +# longlong.h configuration +set(CMAKE_REQUIRED_INCLUDES ${GMP_INCLUDE_DIRS}) +check_c_source_compiles([[#include +typedef mp_limb_t ulong; +#define FLINT_ASSERT(x) +#define FLINT_DLL +#define FLINT_BITS GMP_LIMB_BITS +#include "${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-x86_64.h.in" +#if !defined(__GNUC__) || GMP_LIMB_BITS != 64 || !defined(__amd64__) +# error +error +#endif +int main(void) +{ + ulong s3, s2, s1, s0; + ulong a3, a2, a1, a0; + ulong b3, b2, b1, b0; + + a0 = 19827; + a1 = 1872; + a2 = 338237; + a3 = 98080; + b0 = 1798291; + b1 = 719271; + b2 = 891; + b3 = 9112; + + s0 = flint_clz(a0); + s1 = flint_ctz(a0); + add_ssaaaa(s1, s0, a1, a0, b1, b0); + add_sssaaaaaa(s2, s1, s0, a2, a1, a0, b2, b1, b0); + add_ssssaaaaaaaa(s3, s2, s1, s0, a3, a2, a1, a0, b3, b2, b1, b0); + sub_ddmmss(s1, s0, a1, a0, b1, b0); + sub_dddmmmsss(s2, s1, s0, a2, a1, a0, b2, b1, b0); + umul_ppmm(s1, s0, a0, b0); + smul_ppmm(s1, s0, a0, b0); + udiv_qrnnd(s1, s0, a1, a0, b0); + sdiv_qrnnd(s1, s0, a1, a0, b0); + byte_swap(s2); + /* udiv_qrnnd_preinv is the same for every header */ + return 0; +}]] LONGLONG_X86_64) + +if(LONGLONG_X86_64) + set(LONGLONG ON) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-x86_64.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong.h + COPYONLY) +endif() + +if(NOT LONGLONG) + check_c_source_compiles([[#include +typedef mp_limb_t ulong; +#define FLINT_ASSERT(x) +#define FLINT_DLL +#define FLINT_BITS GMP_LIMB_BITS +#include "${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-arm64.h.in" +#if !defined(__GNUC__) || GMP_LIMB_BITS != 64 || !defined(__arm64__) +# error +error +#endif +int main(void) +{ + ulong s3, s2, s1, s0; + ulong a3, a2, a1, a0; + ulong b3, b2, b1, b0; + + a0 = 19827; + a1 = 1872; + a2 = 338237; + a3 = 98080; + b0 = 1798291; + b1 = 719271; + b2 = 891; + b3 = 9112; + + s0 = flint_clz(a0); + s1 = flint_ctz(a0); + add_ssaaaa(s1, s0, a1, a0, b1, b0); + add_sssaaaaaa(s2, s1, s0, a2, a1, a0, b2, b1, b0); + add_ssssaaaaaaaa(s3, s2, s1, s0, a3, a2, a1, a0, b3, b2, b1, b0); + sub_ddmmss(s1, s0, a1, a0, b1, b0); + sub_dddmmmsss(s2, s1, s0, a2, a1, a0, b2, b1, b0); + umul_ppmm(s1, s0, a0, b0); + smul_ppmm(s1, s0, a0, b0); + udiv_qrnnd(s1, s0, a1, a0, b0); + sdiv_qrnnd(s1, s0, a1, a0, b0); + byte_swap(s2); + /* udiv_qrnnd_preinv is the same for every header */ + return 0; +}]] LONGLONG_ARM64) + + if(LONGLONG_ARM64) + set(LONGLONG ON) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-arm64.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong.h + COPYONLY) + endif() +endif() + +if(NOT LONGLONG) + check_c_source_compiles([[#include +typedef mp_limb_t ulong; +#define FLINT_ASSERT(x) +#define FLINT_DLL +#define FLINT_BITS GMP_LIMB_BITS +#include "${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-x86.h.in" +#if !defined(__GNUC__) || GMP_LIMB_BITS != 32 || !(defined (__i386__) || defined (__i486__) || defined(__amd64__)) +# error +error +#endif +int main(void) +{ + ulong s3, s2, s1, s0; + ulong a3, a2, a1, a0; + ulong b3, b2, b1, b0; + + a0 = 19827; + a1 = 1872; + a2 = 338237; + a3 = 98080; + b0 = 1798291; + b1 = 719271; + b2 = 891; + b3 = 9112; + + s0 = flint_clz(a0); + s1 = flint_ctz(a0); + add_ssaaaa(s1, s0, a1, a0, b1, b0); + add_sssaaaaaa(s2, s1, s0, a2, a1, a0, b2, b1, b0); + add_ssssaaaaaaaa(s3, s2, s1, s0, a3, a2, a1, a0, b3, b2, b1, b0); + sub_ddmmss(s1, s0, a1, a0, b1, b0); + sub_dddmmmsss(s2, s1, s0, a2, a1, a0, b2, b1, b0); + umul_ppmm(s1, s0, a0, b0); + smul_ppmm(s1, s0, a0, b0); + udiv_qrnnd(s1, s0, a1, a0, b0); + sdiv_qrnnd(s1, s0, a1, a0, b0); + byte_swap(s2); + /* udiv_qrnnd_preinv is the same for every header */ + return 0; +}]] LONGLONG_X86) + + if(LONGLONG_X86) + set(LONGLONG ON) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-x86.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong.h + COPYONLY) + endif() +endif() + +if(NOT LONGLONG) + check_c_source_compiles([[#include +typedef mp_limb_t ulong; +#define FLINT_ASSERT(x) +#define FLINT_DLL +#define FLINT_BITS GMP_LIMB_BITS +#include "${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-arm.h.in" +#if !defined(__GNUC__) || GMP_LIMB_BITS != 32 || !defined(__arm__) +# error +error +#endif +int main(void) +{ + ulong s3, s2, s1, s0; + ulong a3, a2, a1, a0; + ulong b3, b2, b1, b0; + + a0 = 19827; + a1 = 1872; + a2 = 338237; + a3 = 98080; + b0 = 1798291; + b1 = 719271; + b2 = 891; + b3 = 9112; + + s0 = flint_clz(a0); + s1 = flint_ctz(a0); + add_ssaaaa(s1, s0, a1, a0, b1, b0); + add_sssaaaaaa(s2, s1, s0, a2, a1, a0, b2, b1, b0); + add_ssssaaaaaaaa(s3, s2, s1, s0, a3, a2, a1, a0, b3, b2, b1, b0); + sub_ddmmss(s1, s0, a1, a0, b1, b0); + sub_dddmmmsss(s2, s1, s0, a2, a1, a0, b2, b1, b0); + umul_ppmm(s1, s0, a0, b0); + smul_ppmm(s1, s0, a0, b0); + udiv_qrnnd(s1, s0, a1, a0, b0); + sdiv_qrnnd(s1, s0, a1, a0, b0); + byte_swap(s2); + /* udiv_qrnnd_preinv is the same for every header */ + return 0; +}]] LONGLONG_ARM) + + if(LONGLONG_ARM) + set(LONGLONG ON) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-arm.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong.h + COPYONLY) + endif() +endif() + +if(NOT LONGLONG) + check_c_source_compiles([[#include +typedef mp_limb_t ulong; +#define FLINT_ASSERT(x) +#define FLINT_DLL +#define FLINT_BITS GMP_LIMB_BITS +#include "${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-generic_gnu.h.in" +#if !defined(__GNUC__) +# error +error +#endif +int main(void) +{ + ulong s3, s2, s1, s0; + ulong a3, a2, a1, a0; + ulong b3, b2, b1, b0; + + a0 = 19827; + a1 = 1872; + a2 = 338237; + a3 = 98080; + b0 = 1798291; + b1 = 719271; + b2 = 891; + b3 = 9112; + + s0 = flint_clz(a0); + s1 = flint_ctz(a0); + add_ssaaaa(s1, s0, a1, a0, b1, b0); + add_sssaaaaaa(s2, s1, s0, a2, a1, a0, b2, b1, b0); + add_ssssaaaaaaaa(s3, s2, s1, s0, a3, a2, a1, a0, b3, b2, b1, b0); + sub_ddmmss(s1, s0, a1, a0, b1, b0); + sub_dddmmmsss(s2, s1, s0, a2, a1, a0, b2, b1, b0); + umul_ppmm(s1, s0, a0, b0); + smul_ppmm(s1, s0, a0, b0); + udiv_qrnnd(s1, s0, a1, a0, b0); + sdiv_qrnnd(s1, s0, a1, a0, b0); + byte_swap(s2); + /* udiv_qrnnd_preinv is the same for every header */ + return 0; +}]] LONGLONG_GENERIC_GNU) + + if(LONGLONG_GENERIC_GNU) + set(LONGLONG ON) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-generic_gnu.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong.h + COPYONLY) + endif() +endif() + +if(NOT LONGLONG) + check_c_source_compiles([[#include +typedef mp_limb_t ulong; +#define FLINT_ASSERT(x) +#define FLINT_DLL +#define FLINT_BITS GMP_LIMB_BITS +#include "${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-x86_win.h.in" +#if !(defined(_WIN32) || defined(_WIN64)) || !(defined(_M_X64) || defined(_M_IX86)) +# error +error +#endif +int main(void) +{ + ulong s3, s2, s1, s0; + ulong a3, a2, a1, a0; + ulong b3, b2, b1, b0; + + a0 = 19827; + a1 = 1872; + a2 = 338237; + a3 = 98080; + b0 = 1798291; + b1 = 719271; + b2 = 891; + b3 = 9112; + + s0 = flint_clz(a0); + s1 = flint_ctz(a0); + add_ssaaaa(s1, s0, a1, a0, b1, b0); + add_sssaaaaaa(s2, s1, s0, a2, a1, a0, b2, b1, b0); + add_ssssaaaaaaaa(s3, s2, s1, s0, a3, a2, a1, a0, b3, b2, b1, b0); + sub_ddmmss(s1, s0, a1, a0, b1, b0); + sub_dddmmmsss(s2, s1, s0, a2, a1, a0, b2, b1, b0); + umul_ppmm(s1, s0, a0, b0); + smul_ppmm(s1, s0, a0, b0); + udiv_qrnnd(s1, s0, a1, a0, b0); + sdiv_qrnnd(s1, s0, a1, a0, b0); + byte_swap(s2); + /* udiv_qrnnd_preinv is the same for every header */ + return 0; +}]] LONGLONG_X86_WIN) + + if(LONGLONG_X86_WIN) + set(LONGLONG ON) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-x86_win.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong.h + COPYONLY) + endif() +endif() + +if(NOT LONGLONG) + check_c_source_compiles([[#include +typedef mp_limb_t ulong; +#define FLINT_ASSERT(x) +#define FLINT_DLL +#define FLINT_BITS GMP_LIMB_BITS +#include "${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-arm_win.h.in" +#if !(defined(_WIN32) || defined(_WIN64)) || !(defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM_ARMV7VE) || defined(_M_ARM_FP) || defined(_M_ARM64EC)) +# error +error +#endif +int main(void) +{ + ulong s3, s2, s1, s0; + ulong a3, a2, a1, a0; + ulong b3, b2, b1, b0; + + a0 = 19827; + a1 = 1872; + a2 = 338237; + a3 = 98080; + b0 = 1798291; + b1 = 719271; + b2 = 891; + b3 = 9112; + + s0 = flint_clz(a0); + s1 = flint_ctz(a0); + add_ssaaaa(s1, s0, a1, a0, b1, b0); + add_sssaaaaaa(s2, s1, s0, a2, a1, a0, b2, b1, b0); + add_ssssaaaaaaaa(s3, s2, s1, s0, a3, a2, a1, a0, b3, b2, b1, b0); + sub_ddmmss(s1, s0, a1, a0, b1, b0); + sub_dddmmmsss(s2, s1, s0, a2, a1, a0, b2, b1, b0); + umul_ppmm(s1, s0, a0, b0); + smul_ppmm(s1, s0, a0, b0); + udiv_qrnnd(s1, s0, a1, a0, b0); + sdiv_qrnnd(s1, s0, a1, a0, b0); + byte_swap(s2); + /* udiv_qrnnd_preinv is the same for every header */ + return 0; +}]] LONGLONG_ARM_WIN) + + if(LONGLONG_ARM_WIN) + set(LONGLONG ON) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-arm_win.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong.h + COPYONLY) + endif() +endif() + +if(NOT LONGLONG) + check_c_source_compiles([[#include +typedef mp_limb_t ulong; +#define FLINT_ASSERT(x) +#define FLINT_DLL +#define FLINT_BITS GMP_LIMB_BITS +#include "${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-generic.h.in" +int main(void) +{ + ulong s3, s2, s1, s0; + ulong a3, a2, a1, a0; + ulong b3, b2, b1, b0; + + a0 = 19827; + a1 = 1872; + a2 = 338237; + a3 = 98080; + b0 = 1798291; + b1 = 719271; + b2 = 891; + b3 = 9112; + + s0 = flint_clz(a0); + s1 = flint_ctz(a0); + add_ssaaaa(s1, s0, a1, a0, b1, b0); + add_sssaaaaaa(s2, s1, s0, a2, a1, a0, b2, b1, b0); + add_ssssaaaaaaaa(s3, s2, s1, s0, a3, a2, a1, a0, b3, b2, b1, b0); + sub_ddmmss(s1, s0, a1, a0, b1, b0); + sub_dddmmmsss(s2, s1, s0, a2, a1, a0, b2, b1, b0); + umul_ppmm(s1, s0, a0, b0); + smul_ppmm(s1, s0, a0, b0); + udiv_qrnnd(s1, s0, a1, a0, b0); + sdiv_qrnnd(s1, s0, a1, a0, b0); + byte_swap(s2); + /* udiv_qrnnd_preinv is the same for every header */ + return 0; +}]] LONGLONG_GENERIC) + + if(LONGLONG_GENERIC) + set(LONGLONG ON) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong-generic.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/src/longlong.h + COPYONLY) + else() + message(FATAL_ERROR "Could not find a suitable longlong.h that would compile.") + endif() +endif() + + # Populate headers configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/CMake/cmake_config.h.in diff --git a/Makefile.in b/Makefile.in index b962a10670..66f3da52c5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -833,6 +833,9 @@ src/fmpz/fmpz.c: @FMPZ_C_IN@ config.status src/gmpcompat.h: src/@GMPCOMPAT_H_IN@ config.status ./config.status $@ +src/longlong.h: @LONGLONG_H_IN@ config.status + ./config.status $@ + ################################################################################ # maintainer stuff ################################################################################ diff --git a/acinclude.m4 b/acinclude.m4 index 63cc07e6cd..6ea5dda83e 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -53,3 +53,51 @@ AS_VAR_IF(CACHEVAR,yes, [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl ])dnl AX_CHECK_COMPILE_FLAGS + +# AX_CHECK_LONGLONG_HEADER(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-PROLOGUE]) +AC_DEFUN([AX_CHECK_LONGLONG_HEADER], +[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_$1])dnl +AC_CACHE_CHECK([whether system can compile with $1], CACHEVAR, [ +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + typedef mp_limb_t ulong; + #define FLINT_ASSERT(x) + #define FLINT_DLL + #define FLINT_BITS GMP_LIMB_BITS + #include "$1" + $4]], + [[ulong s3, s2, s1, s0; + ulong a3, a2, a1, a0; + ulong b3, b2, b1, b0; + + a0 = 19827; + a1 = 1872; + a2 = 338237; + a3 = 98080; + b0 = 1798291; + b1 = 719271; + b2 = 891; + b3 = 9112; + + s0 = flint_clz(a0); + s1 = flint_ctz(a0); + add_ssaaaa(s1, s0, a1, a0, b1, b0); + add_sssaaaaaa(s2, s1, s0, a2, a1, a0, b2, b1, b0); + add_ssssaaaaaaaa(s3, s2, s1, s0, a3, a2, a1, a0, b3, b2, b1, b0); + sub_ddmmss(s1, s0, a1, a0, b1, b0); + sub_dddmmmsss(s2, s1, s0, a2, a1, a0, b2, b1, b0); + umul_ppmm(s1, s0, a0, b0); + smul_ppmm(s1, s0, a0, b0); + udiv_qrnnd(s1, s0, a1, a0, b0); + sdiv_qrnnd(s1, s0, a1, a0, b0); + byte_swap(s2); + /* udiv_qrnnd_preinv is the same for every header */]] + )], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])])]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_LONGLONG_HEADER diff --git a/configure.ac b/configure.ac index f1b58b7e18..2e23f720d2 100644 --- a/configure.ac +++ b/configure.ac @@ -919,7 +919,6 @@ then AX_CHECK_COMPILE_FLAG([-march=native],[DEFAULT_CFLAGS="-march=native $DEFAULT_CFLAGS"]) fi AX_CHECK_COMPILE_FLAG([-std=c11],[DEFAULT_CFLAGS="-std=c11 $DEFAULT_CFLAGS"]) -AX_CHECK_COMPILE_FLAG([-pedantic],[DEFAULT_CFLAGS="-pedantic $DEFAULT_CFLAGS"]) dnl NOTE: The following flags shouldn't be default. They are leftovers from dnl previous configure script @@ -942,6 +941,90 @@ fi CPPFLAGS="-I./src $CPPFLAGS" +################################################################################ +# check which longlong.h to use +################################################################################ + +save_CFLAGS="$CFLAGS" +CFLAGS="-Wall" + +AX_CHECK_LONGLONG_HEADER([src/longlong-x86_64.h.in], + [longlong_h_in="src/longlong-x86_64.h.in"],[], + [#if !defined(__GNUC__) || GMP_LIMB_BITS != 64 || !defined(__amd64__) + # error + error + #endif]) +if test ! -n "$longlong_h_in"; +then + AX_CHECK_LONGLONG_HEADER([src/longlong-arm64.h.in], + [longlong_h_in="src/longlong-arm64.h.in"],[], + [#if !defined(__GNUC__) || GMP_LIMB_BITS != 64 || !(defined(__aarch64__) || defined(__ARM_ARCH_ISA_A64)) + # error + error + #endif]) +fi +if test ! -n "$longlong_h_in"; +then +AX_CHECK_LONGLONG_HEADER([src/longlong-x86.h.in], + [longlong_h_in="src/longlong-x86.h.in"],[], + [#if !defined(__GNUC__) || GMP_LIMB_BITS != 32 || !(defined (__i386__) || defined (__i486__) || defined(__amd64__)) + # error + error + #endif]) +fi +if test ! -n "$longlong_h_in"; +then +AX_CHECK_LONGLONG_HEADER([src/longlong-arm.h.in], + [longlong_h_in="src/longlong-arm.h.in"],[], + [#if !defined(__GNUC__) || GMP_LIMB_BITS != 32 || !defined(__arm__) + # error + error + #endif]) +fi +if test ! -n "$longlong_h_in"; +then +AX_CHECK_LONGLONG_HEADER([src/longlong-generic_gnu.h.in], + [longlong_h_in="src/longlong-generic_gnu.h.in"],[], + [#if !defined(__GNUC__) + # error + error + #endif]) +fi +if test ! -n "$longlong_h_in"; +then +AX_CHECK_LONGLONG_HEADER([src/longlong-x86_win.h.in], + [longlong_h_in="src/longlong-x86_win.h.in"],[], + [#if !(defined(_WIN32) || defined(_WIN64)) || !(defined(_M_X64) || defined(_M_IX86)) + # error + error + #endif]) +fi +if test ! -n "$longlong_h_in"; +then +AX_CHECK_LONGLONG_HEADER([src/longlong-arm_win.h.in], + [longlong_h_in="src/longlong-arm_win.h.in"],[], + [#if !(defined(_WIN32) || defined(_WIN64)) || !(defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM_ARMV7VE) || defined(_M_ARM_FP) || defined(_M_ARM64EC)) + # error + error + #endif]) +fi +if test ! -n "$longlong_h_in"; +then +AX_CHECK_LONGLONG_HEADER([src/longlong-generic.h.in], + [longlong_h_in="src/longlong-generic.h.in"]) +fi + +if test ! -n "$longlong_h_in"; +then + AC_MSG_ERROR([Could not find a suitable longlong.h. Please submit a bug report to + and specify your operating system.]) +fi + +AC_CONFIG_FILES([src/longlong.h:$longlong_h_in],[],[longlong_h_in="$longlong_h_in"]) +AC_SUBST(LONGLONG_H_IN, $longlong_h_in) + +CFLAGS="$save_CFLAGS" + ################################################################################ # fft_small module ################################################################################ diff --git a/src/longlong-generic_gnu.h.in b/src/longlong-generic_gnu.h.in index 7251323d66..8ca48087a6 100644 --- a/src/longlong-generic_gnu.h.in +++ b/src/longlong-generic_gnu.h.in @@ -46,17 +46,17 @@ extern "C" { # define _flint_adc __builtin_addcl # define _flint_sbc __builtin_subcl # else -# define _flint_adc(a, b, carry_in, carry_out) \ - ({ ulong __s; \ - ulong c1 = __builtin_uaddl_overflow(a, b, &__s); \ - ulong c2 = __builtin_uaddl_overflow(__s, carry_in, &__s);\ - *(carry_out) = c1 | c2; \ +# define _flint_adc(a, b, carry_in, carry_out) \ + ({ ulong __s; \ + ulong __c1 = __builtin_uaddl_overflow(a, b, &__s); \ + ulong __c2 = __builtin_uaddl_overflow(__s, carry_in, &__s);\ + *(carry_out) = __c1 | __c2; \ __s; }) -# define _flint_sbc(a, b, carry_in, carry_out) \ - ({ ulong __s; \ - ulong c1 = __builtin_usubl_overflow(a, b, &__s); \ - ulong c2 = __builtin_usubl_overflow(__s, carry_in, &__s);\ - *(carry_out) = c1 | c2; \ +# define _flint_sbc(a, b, carry_in, carry_out) \ + ({ ulong __s; \ + ulong __c1 = __builtin_usubl_overflow(a, b, &__s); \ + ulong __c2 = __builtin_usubl_overflow(__s, carry_in, &__s);\ + *(carry_out) = __c1 | __c2; \ __s; }) # endif #else @@ -68,17 +68,17 @@ extern "C" { # define _flint_adc __builtin_addcll # define _flint_sbc __builtin_subcll # else -# define _flint_adc(a, b, carry_in, carry_out) \ - ({ ulong __s; \ - ulong c1 = __builtin_uaddll_overflow(a, b, &__s); \ - ulong c2 = __builtin_uaddll_overflow(__s, carry_in, &__s); \ - *(carry_out) = c1 | c2; \ +# define _flint_adc(a, b, carry_in, carry_out) \ + ({ ulong __s; \ + ulong __c1 = __builtin_uaddll_overflow(a, b, &__s); \ + ulong __c2 = __builtin_uaddll_overflow(__s, carry_in, &__s); \ + *(carry_out) = __c1 | __c2; \ __s; }) -# define _flint_sbc(a, b, carry_in, carry_out) \ - ({ ulong __s; \ - ulong c1 = __builtin_usubll_overflow(a, b, &__s); \ - ulong c2 = __builtin_usubll_overflow(__s, carry_in, &__s); \ - *(carry_out) = c1 | c2; \ +# define _flint_sbc(a, b, carry_in, carry_out) \ + ({ ulong __s; \ + ulong __c1 = __builtin_usubll_overflow(a, b, &__s); \ + ulong __c2 = __builtin_usubll_overflow(__s, carry_in, &__s); \ + *(carry_out) = __c1 | __c2; \ __s; }) # endif #endif @@ -125,76 +125,64 @@ extern "C" { #if GMP_LIMB_BITS == 32 # define umul_ppmm(w1, w0, u, v) \ do { \ - unsigned long long int res, a, b; \ - a = (unsigned long long int) (u); \ - b = (unsigned long long int) (v); \ - res = a * b; \ - (w1) = res >> 32; \ - (w0) = res; \ + unsigned long long int __res = (unsigned long long int) (u) * (unsigned long long int) (v); \ + (w1) = __res >> 32; \ + (w0) = __res; \ } while (0) # define smul_ppmm(w1, w0, u, v) \ do { \ - long long int res, a, b; \ - a = (long long int) (u); \ - b = (long long int) (v); \ - res = a * b; \ - (w1) = res >> 32; \ - (w0) = res; \ + long long int __res = (long long int) (u) * (long long int) (v); \ + (w1) = __res >> 32; \ + (w0) = __res; \ } while (0) -# define udiv_qrnnd(q, r, n1, n0, d) \ - do { \ - unsigned long long int n; \ - n = ((unsigned long long int) (n1)) << 32 + (unsigned long long int) (n0); \ - (q) = n / (unsigned long long int) (d); \ - (r) = n % (unsigned long long int) (d); \ +# define udiv_qrnnd(q, r, n1, n0, d) \ + do { \ + unsigned long long int __n; \ + __n = ((unsigned long long int) (n1)) << 32 + (unsigned long long int) (n0); \ + (q) = __n / (unsigned long long int) (d); \ + (r) = __n % (unsigned long long int) (d); \ } while (0) -# define sdiv_qrnnd(q, r, n1, n0, d) \ - do { \ - long long int n; \ - n = ((long long int) (n1)) << 32 + (long long int) (n0); \ - (q) = n / (long long int) (d); \ - (r) = n % (long long int) (d); \ +# define sdiv_qrnnd(q, r, n1, n0, d) \ + do { \ + long long int __n; \ + __n = ((long long int) (n1)) << 32 + (long long int) (n0); \ + (q) = __n / (long long int) (d); \ + (r) = __n % (long long int) (d); \ } while (0) # define byte_swap(n) do { n = __builtin_bswap32(n); } while (0) #else -# define umul_ppmm(w1, w0, u, v) \ - do { \ - unsigned __int128 res, a, b; \ - a = (unsigned __int128) (u); \ - b = (unsigned __int128) (v); \ - res = a * b; \ - (w1) = res >> 64; \ - (w0) = res; \ +# define umul_ppmm(w1, w0, u, v)\ + do { \ + unsigned __int128 __res = (unsigned __int128) (u) * (unsigned __int128) (v); \ + (w1) = __res >> 64; \ + (w0) = __res; \ } while (0) # define smul_ppmm(w1, w0, u, v)\ do { \ - __int128 res, a, b; \ - a = (__int128) (u); \ - b = (__int128) (v); \ - res = a * b; \ - (w1) = res >> 64; \ - (w0) = res; \ + __int128 __res = (unsigned __int128) (u) * (unsigned __int128) (v); \ + (w1) = __res >> 64; \ + (w0) = __res; \ } while (0) # define udiv_qrnnd(q, r, n1, n0, d) \ do { \ - unsigned __int128 n; \ - n = (((unsigned __int128) (n1)) << 64) + (unsigned __int128) (n0); \ - (q) = n / (unsigned __int128) (d); \ - (r) = n % (unsigned __int128) (d); \ + unsigned __int128 __n; \ + __n = (((unsigned __int128) (n1)) << 64) + (unsigned __int128) (n0); \ + (q) = __n / (unsigned __int128) (d);\ + (r) = __n % (unsigned __int128) (d);\ } while (0) -# define sdiv_qrnnd(q, r, n1, n0, d)\ - do { \ - __int128 n; \ - n = (((__int128) (n1)) << 64) + (__int128) (n0); \ - (q) = n / (__int128) (d); \ - (r) = n % (__int128) (d); \ +# define sdiv_qrnnd(q, r, n1, n0, d) \ + do { \ + __int128 __n; \ + __n = (((__int128) (n1)) << 64) + (__int128) (n0); \ + (q) = __n / (__int128) (d); \ + (r) = __n % (__int128) (d); \ } while (0) # define byte_swap(n) do { n = __builtin_bswap64(n); } while (0)