Botan  1.11.15
src/lib/math/mp/mp_x86_32/mp_madd.h
Go to the documentation of this file.
00001 /*
00002 * Lowest Level MPI Algorithms
00003 * (C) 1999-2008 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 #if (BOTAN_MP_WORD_BITS != 32)
00015    #error The mp_x86_32 module requires that BOTAN_MP_WORD_BITS == 32
00016 #endif
00017 
00018 namespace Botan {
00019 
00020 extern "C" {
00021 
00022 /*
00023 * Helper Macros for x86 Assembly
00024 */
00025 #define ASM(x) x "\n\t"
00026 
00027 /*
00028 * Word Multiply
00029 */
00030 inline word word_madd2(word a, word b, word* c)
00031    {
00032    asm(
00033       ASM("mull %[b]")
00034       ASM("addl %[c],%[a]")
00035       ASM("adcl $0,%[carry]")
00036 
00037       : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*c)
00038       : "0"(a), "1"(b), [c]"g"(*c) : "cc");
00039 
00040    return a;
00041    }
00042 
00043 /*
00044 * Word Multiply/Add
00045 */
00046 inline word word_madd3(word a, word b, word c, word* d)
00047    {
00048    asm(
00049       ASM("mull %[b]")
00050 
00051       ASM("addl %[c],%[a]")
00052       ASM("adcl $0,%[carry]")
00053 
00054       ASM("addl %[d],%[a]")
00055       ASM("adcl $0,%[carry]")
00056 
00057       : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*d)
00058       : "0"(a), "1"(b), [c]"g"(c), [d]"g"(*d) : "cc");
00059 
00060    return a;
00061    }
00062 
00063 }
00064 
00065 }
00066 
00067 #endif