9 #ifndef BOTAN_MP_ASM_INTERNAL_H__    10 #define BOTAN_MP_ASM_INTERNAL_H__    12 #include <botan/internal/mp_asm.h>    22   #define ASM(x) x "\n\t"    25 #define ADDSUB2_OP(OPERATION, INDEX)                     \    26         ASM("movq 8*" #INDEX "(%[y]), %[carry]")         \    27         ASM(OPERATION " %[carry], 8*" #INDEX "(%[x])")   \    29 #define ADDSUB3_OP(OPERATION, INDEX)                     \    30         ASM("movq 8*" #INDEX "(%[x]), %[carry]")         \    31         ASM(OPERATION " 8*" #INDEX "(%[y]), %[carry]")   \    32         ASM("movq %[carry], 8*" #INDEX "(%[z])")         \    34 #define LINMUL_OP(WRITE_TO, INDEX)                       \    35         ASM("movq 8*" #INDEX "(%[x]),%%rax")             \    37         ASM("addq %[carry],%%rax")                       \    38         ASM("adcq $0,%%rdx")                             \    39         ASM("movq %%rdx,%[carry]")                       \    40         ASM("movq %%rax, 8*" #INDEX "(%[" WRITE_TO "])")    42 #define MULADD_OP(IGNORED, INDEX)                        \    43         ASM("movq 8*" #INDEX "(%[x]),%%rax")             \    45         ASM("addq %[carry],%%rax")                       \    46         ASM("adcq $0,%%rdx")                             \    47         ASM("addq 8*" #INDEX "(%[z]),%%rax")             \    48         ASM("adcq $0,%%rdx")                             \    49         ASM("movq %%rdx,%[carry]")                       \    50         ASM("movq %%rax, 8*" #INDEX " (%[z])")    52 #define DO_8_TIMES(MACRO, ARG) \    62 #define ADD_OR_SUBTRACT(CORE_CODE)     \    63         ASM("rorq %[carry]")           \    65         ASM("sbbq %[carry],%[carry]")  \    71 inline word 
word_add(word x, word y, word* carry)
    75       : [x]
"=r"(x), [carry]
"=r"(*carry)
    76       : 
"0"(x), [y]
"rm"(y), 
"1"(*carry)
    84 inline word 
word8_add2(word x[8], 
const word y[8], word carry)
    89       : [x]
"r"(x), [y]
"r"(y), 
"0"(carry)
    97 inline word 
word8_add3(word z[8], 
const word x[8], 
const word y[8], word carry)
   102       : [x]
"r"(x), [y]
"r"(y), [z]
"r"(z), 
"0"(carry)
   110 inline word 
word_sub(word x, word y, word* carry)
   114       : [x]
"=r"(x), [carry]
"=r"(*carry)
   115       : 
"0"(x), [y]
"rm"(y), 
"1"(*carry)
   123 inline word 
word8_sub2(word x[8], 
const word y[8], word carry)
   128       : [x]
"r"(x), [y]
"r"(y), 
"0"(carry)
   136 inline word 
word8_sub2_rev(word x[8], 
const word y[8], word carry)
   141       : [x]
"r"(y), [y]
"r"(x), [z]
"r"(x), 
"0"(carry)
   149 inline word 
word8_sub3(word z[8], 
const word x[8], 
const word y[8], word carry)
   154       : [x]
"r"(x), [y]
"r"(y), [z]
"r"(z), 
"0"(carry)
   167       : [x]
"r"(x), [y]
"rm"(y), 
"0"(carry)
   168       : 
"cc", 
"%rax", 
"%rdx");
   175 inline word 
word8_linmul3(word z[8], 
const word x[8], word y, word carry)
   180       : [z]
"r"(z), [x]
"r"(x), [y]
"rm"(y), 
"0"(carry)
   181       : 
"cc", 
"%rax", 
"%rdx");
   188 inline word 
word8_madd3(word z[8], 
const word x[8], word y, word carry)
   193       : [z]
"r"(z), [x]
"r"(x), [y]
"rm"(y), 
"0"(carry)
   194       : 
"cc", 
"%rax", 
"%rdx");
   201 inline void word3_muladd(word* w2, word* w1, word* w0, word x, word y)
   206       ASM(
"addq %[x],%[w0]")
   207       ASM(
"adcq %[y],%[w1]")
   210       : [w0]
"=r"(*w0), [w1]
"=r"(*w1), [w2]
"=r"(*w2)
   211       : [x]
"a"(x), [y]
"d"(y), 
"0"(*w0), 
"1"(*w1), 
"2"(*w2)
   218 inline void word3_muladd_2(word* w2, word* w1, word* w0, word x, word y)
   223       ASM(
"addq %[x],%[w0]")
   224       ASM(
"adcq %[y],%[w1]")
   227       ASM(
"addq %[x],%[w0]")
   228       ASM(
"adcq %[y],%[w1]")
   231       : [w0]
"=r"(*w0), [w1]
"=r"(*w1), [w2]
"=r"(*w2)
   232       : [x]
"a"(x), [y]
"d"(y), 
"0"(*w0), 
"1"(*w1), 
"2"(*w2)
   239 #undef ADD_OR_SUBTRACT #define ADDSUB3_OP(OPERATION, INDEX)
#define ADD_OR_SUBTRACT(CORE_CODE)
word word8_sub2_rev(word x[8], const word y[8], word carry)
word word8_add2(word x[8], const word y[8], word carry)
word word8_linmul3(word z[8], const word x[8], word y, word carry)
word word8_sub2(word x[8], const word y[8], word carry)
word word8_madd3(word z[8], const word x[8], word y, word carry)
word word8_linmul2(word x[8], word y, word carry)
void word3_muladd(word *w2, word *w1, word *w0, word a, word b)
word word8_add3(word z[8], const word x[8], const word y[8], word carry)
word word_sub(word x, word y, word *carry)
void word3_muladd_2(word *w2, word *w1, word *w0, word a, word b)
#define LINMUL_OP(WRITE_TO, INDEX)
word word_add(word x, word y, word *carry)
#define MULADD_OP(IGNORED, INDEX)
#define ADDSUB2_OP(OPERATION, INDEX)
word word8_sub3(word z[8], const word x[8], const word y[8], word carry)
#define DO_8_TIMES(MACRO, ARG)