Botan
1.11.15
|
00001 /* 00002 * Lowest Level MPI Algorithms 00003 * (C) 1999-2008,2013 Jack Lloyd 00004 * 2006 Luca Piccarreta 00005 * 00006 * Botan is released under the Simplified BSD License (see license.txt) 00007 */ 00008 00009 #ifndef BOTAN_MP_WORD_MULADD_H__ 00010 #define BOTAN_MP_WORD_MULADD_H__ 00011 00012 #include <botan/mp_types.h> 00013 00014 namespace Botan { 00015 00016 extern "C" { 00017 00018 /* 00019 * Word Multiply/Add 00020 */ 00021 inline word word_madd2(word a, word b, word* c) 00022 { 00023 #if defined(BOTAN_HAS_MP_DWORD) 00024 const dword s = static_cast<dword>(a) * b + *c; 00025 *c = static_cast<word>(s >> BOTAN_MP_WORD_BITS); 00026 return static_cast<word>(s); 00027 #else 00028 static_assert(BOTAN_MP_WORD_BITS == 64, "Unexpected word size"); 00029 00030 word hi = 0, lo = 0; 00031 00032 mul64x64_128(a, b, &lo, &hi); 00033 00034 lo += *c; 00035 hi += (lo < *c); // carry? 00036 00037 *c = hi; 00038 return lo; 00039 #endif 00040 } 00041 00042 /* 00043 * Word Multiply/Add 00044 */ 00045 inline word word_madd3(word a, word b, word c, word* d) 00046 { 00047 #if defined(BOTAN_HAS_MP_DWORD) 00048 const dword s = static_cast<dword>(a) * b + c + *d; 00049 *d = static_cast<word>(s >> BOTAN_MP_WORD_BITS); 00050 return static_cast<word>(s); 00051 #else 00052 static_assert(BOTAN_MP_WORD_BITS == 64, "Unexpected word size"); 00053 00054 word hi = 0, lo = 0; 00055 00056 mul64x64_128(a, b, &lo, &hi); 00057 00058 lo += c; 00059 hi += (lo < c); // carry? 00060 00061 lo += *d; 00062 hi += (lo < *d); // carry? 00063 00064 *d = hi; 00065 return lo; 00066 #endif 00067 } 00068 00069 } 00070 00071 } 00072 00073 #endif