text: /* 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_ */
  