109 lines
2.9 KiB
C
109 lines
2.9 KiB
C
/* 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_ */
|