diff --git a/Makefile b/Makefile index 6ee6904..6cc1264 100755 --- a/Makefile +++ b/Makefile @@ -26,6 +26,9 @@ else ifeq "$(ARCH)" "ARM64" ARCHITECTURE=_ARM64_ USE_OPT_LEVEL=_FAST_ ARM_TARGET=YES +else ifeq "$(ARCH)" "PPC64LE" + ARCHITECTURE=_PPC64LE_ + USE_OPT_LEVEL=_GENERIC_ endif ifeq "$(OPT_LEVEL)" "GENERIC" @@ -62,6 +65,9 @@ endif ifeq "$(ARCHITECTURE)" "_S390X_" ADDITIONAL_SETTINGS=-march=z10 endif +ifeq "$(ARCHITECTURE)" "_PPC64LE_" + ADDITIONAL_SETTINGS= +endif VALGRIND_CFLAGS= ifeq "$(DO_VALGRIND_CHECK)" "TRUE" diff --git a/src/P434/P434_internal.h b/src/P434/P434_internal.h index 52c5705..df1ce34 100644 --- a/src/P434/P434_internal.h +++ b/src/P434/P434_internal.h @@ -10,7 +10,7 @@ #include "../config.h" -#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) +#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) || (TARGET == TARGET_PPC64LE) #define NWORDS_FIELD 7 // Number of words of a 434-bit field element #define p434_ZERO_WORDS 3 // Number of "0" digits in the least significant part of p434 + 1 #elif (TARGET == TARGET_x86) || (TARGET == TARGET_ARM) diff --git a/src/P503/P503_internal.h b/src/P503/P503_internal.h index 53afc48..72f507f 100644 --- a/src/P503/P503_internal.h +++ b/src/P503/P503_internal.h @@ -10,7 +10,7 @@ #include "../config.h" -#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) +#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) || (TARGET == TARGET_PPC64LE) #define NWORDS_FIELD 8 // Number of words of a 503-bit field element #define p503_ZERO_WORDS 3 // Number of "0" digits in the least significant part of p503 + 1 #elif (TARGET == TARGET_x86) || (TARGET == TARGET_ARM) diff --git a/src/P610/P610_internal.h b/src/P610/P610_internal.h index b933c42..faf742b 100644 --- a/src/P610/P610_internal.h +++ b/src/P610/P610_internal.h @@ -10,7 +10,7 @@ #include "../config.h" -#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) +#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) || (TARGET == TARGET_PPC64LE) #define NWORDS_FIELD 10 // Number of words of a 610-bit field element #define p610_ZERO_WORDS 4 // Number of "0" digits in the least significant part of p610 + 1 #elif (TARGET == TARGET_x86) || (TARGET == TARGET_ARM) diff --git a/src/P751/P751_internal.h b/src/P751/P751_internal.h index d636e7c..6fab136 100644 --- a/src/P751/P751_internal.h +++ b/src/P751/P751_internal.h @@ -10,7 +10,7 @@ #include "../config.h" -#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) +#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) || (TARGET == TARGET_PPC64LE) #define NWORDS_FIELD 12 // Number of words of a 751-bit field element #define p751_ZERO_WORDS 5 // Number of "0" digits in the least significant part of p751 + 1 #elif (TARGET == TARGET_x86) || (TARGET == TARGET_ARM) diff --git a/src/config.h b/src/config.h index 69a066c..15b62ab 100644 --- a/src/config.h +++ b/src/config.h @@ -50,6 +50,7 @@ #define TARGET_S390X 3 #define TARGET_ARM 4 #define TARGET_ARM64 5 +#define TARGET_PPC64LE 6 #if defined(_AMD64_) #define TARGET TARGET_AMD64 @@ -81,6 +82,12 @@ #define LOG2RADIX 6 typedef uint64_t digit_t; // Unsigned 64-bit digit typedef uint32_t hdigit_t; // Unsigned 32-bit digit +#elif defined(_PPC64LE_) +#define TARGET TARGET_PPC64LE +#define RADIX 64 +#define LOG2RADIX 6 + typedef uint64_t digit_t; // Unsigned 64-bit digit + typedef uint32_t hdigit_t; // Unsigned 32-bit digit #else #error -- "Unsupported ARCHITECTURE" #endif diff --git a/tests/test_extras.c b/tests/test_extras.c index 70a6285..fba6c63 100644 --- a/tests/test_extras.c +++ b/tests/test_extras.c @@ -8,7 +8,7 @@ #if (OS_TARGET == OS_WIN) #include #endif -#if (OS_TARGET == OS_NIX) && (TARGET == TARGET_ARM || TARGET == TARGET_ARM64) +#if (OS_TARGET == OS_NIX) && (TARGET == TARGET_ARM || TARGET == TARGET_ARM64 || TARGET == TARGET_PPC64LE) #include #endif #include @@ -40,7 +40,7 @@ int64_t cpucycles(void) uint64_t tod; __asm__ volatile("stckf %0\n" : "=Q" (tod) : : "cc"); return (tod); -#elif (OS_TARGET == OS_NIX) && (TARGET == TARGET_ARM || TARGET == TARGET_ARM64) +#elif (OS_TARGET == OS_NIX) && (TARGET == TARGET_ARM || TARGET == TARGET_ARM64 || TARGET == TARGET_PPC64LE) struct timespec time; clock_gettime(CLOCK_REALTIME, &time); diff --git a/tests/test_extras.h b/tests/test_extras.h index 8ba7a73..423aab4 100644 --- a/tests/test_extras.h +++ b/tests/test_extras.h @@ -13,7 +13,7 @@ #define FAILED 1 -#if (TARGET == TARGET_ARM || TARGET == TARGET_ARM64) +#if (TARGET == TARGET_ARM || TARGET == TARGET_ARM64 || TARGET == TARGET_PPC64LE) #define print_unit printf("nsec"); #else #define print_unit printf("cycles");