Botan  1.11.15
src/lib/math/mp/mp_generic/mp_madd.h
Go to the documentation of this file.
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