Botan
1.11.15
|
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