1 /** 2 * Low Level MPI Types 3 * 4 * Copyright: 5 * (C) 1999-2007 Jack Lloyd 6 * (C) 2014-2015 Etienne Cimon 7 * 8 * License: 9 * Botan is released under the Simplified BSD License (see LICENSE.md) 10 */ 11 module botan_math.mp_types; 12 13 public import botan_math.mem_ops; 14 15 version(X86) { enum BOTAN_HAS_X86_ARCH = true; enum BOTAN_HAS_X86_64_ARCH = false; enum BOTAN_HAS_ARM_ARCH = false; } 16 version(X86_64) { enum BOTAN_HAS_X86_ARCH = false; enum BOTAN_HAS_X86_64_ARCH = true; enum BOTAN_HAS_ARM_ARCH = false; } 17 version(ARM) { enum BOTAN_HAS_X86_ARCH = false; enum BOTAN_HAS_X86_64_ARCH = false; enum BOTAN_HAS_ARM_ARCH = true; } 18 19 enum ERR_ARCH = "Cannot compile the selected module on this processor architecture."; 20 21 static if (BOTAN_HAS_X86_ARCH) 22 enum BOTAN_MP_WORD_BITS = 32; 23 else static if (BOTAN_HAS_X86_64_ARCH) 24 enum BOTAN_MP_WORD_BITS = 64; 25 else static if (BOTAN_HAS_ARM_ARCH) 26 enum BOTAN_MP_WORD_BITS = 32; 27 // todo: else static if (BOTAN_HAS_PPC_ARCH) 28 29 version(D_SIMD) enum BOTAN_HAS_SIMD = true; 30 else version(LDC) enum BOTAN_HAS_SIMD = true; 31 else enum BOTAN_HAS_SIMD = false; 32 33 static if (BOTAN_MP_WORD_BITS == 8) { 34 alias word = ubyte; 35 alias dword = ushort; 36 enum BOTAN_HAS_MP_DWORD = 1; 37 } 38 else static if (BOTAN_MP_WORD_BITS == 16) { 39 alias word = ushort; 40 alias dword = uint; 41 enum BOTAN_HAS_MP_DWORD = 1; 42 } 43 else static if (BOTAN_MP_WORD_BITS == 32) { 44 alias word = uint; 45 alias dword = ulong; 46 enum BOTAN_HAS_MP_DWORD = 1; 47 } 48 else static if (BOTAN_MP_WORD_BITS == 64) { 49 alias word = ulong; 50 51 enum BOTAN_HAS_MP_DWORD = 0; 52 53 } else 54 static assert(false, "BOTAN_MP_WORD_BITS must be 8, 16, 32, or 64"); 55 56 57 __gshared immutable word MP_WORD_MASK = ~cast(word)(0); 58 __gshared immutable word MP_WORD_TOP_BIT = (cast(word) 1) << (8*(word).sizeof - 1); 59 __gshared immutable word MP_WORD_MAX = MP_WORD_MASK;