1 /* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */ 2 3 #ifndef _UECC_TYPES_H_ 4 #define _UECC_TYPES_H_ 5 6 #ifndef uECC_PLATFORM 7 #if __AVR__ 8 #define uECC_PLATFORM uECC_avr 9 #elif defined(__thumb2__) || defined(_M_ARMT) /* I think MSVC only supports Thumb-2 targets */ 10 #define uECC_PLATFORM uECC_arm_thumb2 11 #elif defined(__thumb__) 12 #define uECC_PLATFORM uECC_arm_thumb 13 #elif defined(__arm__) || defined(_M_ARM) 14 #define uECC_PLATFORM uECC_arm 15 #elif defined(__aarch64__) 16 #define uECC_PLATFORM uECC_arm64 17 #elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) || defined(__I86__) 18 #define uECC_PLATFORM uECC_x86 19 #elif defined(__amd64__) || defined(_M_X64) 20 #define uECC_PLATFORM uECC_x86_64 21 #else 22 #define uECC_PLATFORM uECC_arch_other 23 #endif 24 #endif 25 26 #ifndef uECC_ARM_USE_UMAAL 27 #if (uECC_PLATFORM == uECC_arm) && (__ARM_ARCH >= 6) 28 #define uECC_ARM_USE_UMAAL 1 29 #elif (uECC_PLATFORM == uECC_arm_thumb2) && (__ARM_ARCH >= 6) && !__ARM_ARCH_7M__ 30 #define uECC_ARM_USE_UMAAL 1 31 #else 32 #define uECC_ARM_USE_UMAAL 0 33 #endif 34 #endif 35 36 #ifndef uECC_WORD_SIZE 37 #if uECC_PLATFORM == uECC_avr 38 #define uECC_WORD_SIZE 1 39 #elif (uECC_PLATFORM == uECC_x86_64 || uECC_PLATFORM == uECC_arm64) 40 #define uECC_WORD_SIZE 8 41 #else 42 #define uECC_WORD_SIZE 4 43 #endif 44 #endif 45 46 #if (uECC_WORD_SIZE != 1) && (uECC_WORD_SIZE != 4) && (uECC_WORD_SIZE != 8) 47 #error "Unsupported value for uECC_WORD_SIZE" 48 #endif 49 50 #if ((uECC_PLATFORM == uECC_avr) && (uECC_WORD_SIZE != 1)) 51 #pragma message ("uECC_WORD_SIZE must be 1 for AVR") 52 #undef uECC_WORD_SIZE 53 #define uECC_WORD_SIZE 1 54 #endif 55 56 #if ((uECC_PLATFORM == uECC_arm || uECC_PLATFORM == uECC_arm_thumb || \ 57 uECC_PLATFORM == uECC_arm_thumb2) && \ 58 (uECC_WORD_SIZE != 4)) 59 #pragma message ("uECC_WORD_SIZE must be 4 for ARM") 60 #undef uECC_WORD_SIZE 61 #define uECC_WORD_SIZE 4 62 #endif 63 64 #if defined(__SIZEOF_INT128__) || ((__clang_major__ * 100 + __clang_minor__) >= 302) 65 #define SUPPORTS_INT128 1 66 #else 67 #define SUPPORTS_INT128 0 68 #endif 69 70 typedef int8_t wordcount_t; 71 typedef int16_t bitcount_t; 72 typedef int8_t cmpresult_t; 73 74 #if (uECC_WORD_SIZE == 1) 75 76 typedef uint8_t uECC_word_t; 77 typedef uint16_t uECC_dword_t; 78 79 #define HIGH_BIT_SET 0x80 80 #define uECC_WORD_BITS 8 81 #define uECC_WORD_BITS_SHIFT 3 82 #define uECC_WORD_BITS_MASK 0x07 83 84 #elif (uECC_WORD_SIZE == 4) 85 86 typedef uint32_t uECC_word_t; 87 typedef uint64_t uECC_dword_t; 88 89 #define HIGH_BIT_SET 0x80000000 90 #define uECC_WORD_BITS 32 91 #define uECC_WORD_BITS_SHIFT 5 92 #define uECC_WORD_BITS_MASK 0x01F 93 94 #elif (uECC_WORD_SIZE == 8) 95 96 typedef uint64_t uECC_word_t; 97 #if SUPPORTS_INT128 98 typedef unsigned __int128 uECC_dword_t; 99 #endif 100 101 #define HIGH_BIT_SET 0x8000000000000000ull 102 #define uECC_WORD_BITS 64 103 #define uECC_WORD_BITS_SHIFT 6 104 #define uECC_WORD_BITS_MASK 0x03F 105 106 #endif /* uECC_WORD_SIZE */ 107 108 #endif /* _UECC_TYPES_H_ */ 109