/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */ #ifndef _UECC_TYPES_H_ #define _UECC_TYPES_H_ #ifndef uECC_PLATFORM #if __AVR__ #define uECC_PLATFORM uECC_avr #elif defined(__thumb2__) || defined(_M_ARMT) /* I think MSVC only supports Thumb-2 targets */ #define uECC_PLATFORM uECC_arm_thumb2 #elif defined(__thumb__) #define uECC_PLATFORM uECC_arm_thumb #elif defined(__arm__) || defined(_M_ARM) #define uECC_PLATFORM uECC_arm #elif defined(__aarch64__) #define uECC_PLATFORM uECC_arm64 #elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) || defined(__I86__) #define uECC_PLATFORM uECC_x86 #elif defined(__amd64__) || defined(_M_X64) #define uECC_PLATFORM uECC_x86_64 #else #define uECC_PLATFORM uECC_arch_other #endif #endif #ifndef uECC_ARM_USE_UMAAL #if (uECC_PLATFORM == uECC_arm) && (__ARM_ARCH >= 6) #define uECC_ARM_USE_UMAAL 1 #elif (uECC_PLATFORM == uECC_arm_thumb2) && (__ARM_ARCH >= 6) && !__ARM_ARCH_7M__ #define uECC_ARM_USE_UMAAL 1 #else #define uECC_ARM_USE_UMAAL 0 #endif #endif #ifndef uECC_WORD_SIZE #if uECC_PLATFORM == uECC_avr #define uECC_WORD_SIZE 1 #elif (uECC_PLATFORM == uECC_x86_64 || uECC_PLATFORM == uECC_arm64) #define uECC_WORD_SIZE 8 #else #define uECC_WORD_SIZE 4 #endif #endif #if (uECC_WORD_SIZE != 1) && (uECC_WORD_SIZE != 4) && (uECC_WORD_SIZE != 8) #error "Unsupported value for uECC_WORD_SIZE" #endif #if ((uECC_PLATFORM == uECC_avr) && (uECC_WORD_SIZE != 1)) #pragma message ("uECC_WORD_SIZE must be 1 for AVR") #undef uECC_WORD_SIZE #define uECC_WORD_SIZE 1 #endif #if ((uECC_PLATFORM == uECC_arm || uECC_PLATFORM == uECC_arm_thumb || \ uECC_PLATFORM == uECC_arm_thumb2) && \ (uECC_WORD_SIZE != 4)) #pragma message ("uECC_WORD_SIZE must be 4 for ARM") #undef uECC_WORD_SIZE #define uECC_WORD_SIZE 4 #endif #if defined(__SIZEOF_INT128__) || ((__clang_major__ * 100 + __clang_minor__) >= 302) #define SUPPORTS_INT128 1 #else #define SUPPORTS_INT128 0 #endif typedef int8_t wordcount_t; typedef int16_t bitcount_t; typedef int8_t cmpresult_t; #if (uECC_WORD_SIZE == 1) typedef uint8_t uECC_word_t; typedef uint16_t uECC_dword_t; #define HIGH_BIT_SET 0x80 #define uECC_WORD_BITS 8 #define uECC_WORD_BITS_SHIFT 3 #define uECC_WORD_BITS_MASK 0x07 #elif (uECC_WORD_SIZE == 4) typedef uint32_t uECC_word_t; typedef uint64_t uECC_dword_t; #define HIGH_BIT_SET 0x80000000 #define uECC_WORD_BITS 32 #define uECC_WORD_BITS_SHIFT 5 #define uECC_WORD_BITS_MASK 0x01F #elif (uECC_WORD_SIZE == 8) typedef uint64_t uECC_word_t; #if SUPPORTS_INT128 typedef unsigned __int128 uECC_dword_t; #endif #define HIGH_BIT_SET 0x8000000000000000ull #define uECC_WORD_BITS 64 #define uECC_WORD_BITS_SHIFT 6 #define uECC_WORD_BITS_MASK 0x03F #endif /* uECC_WORD_SIZE */ #endif /* _UECC_TYPES_H_ */