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;