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]") \
71inline word
word_add(word x, word y, word* carry)
75 : [x]
"=r"(x), [carry]
"=r"(*carry)
76 :
"0"(x), [y]
"rm"(y),
"1"(*carry)
84inline word
word8_add2(word x[8],
const word y[8], word carry)
89 : [x]
"r"(x), [y]
"r"(y),
"0"(carry)
97inline 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)
110inline word
word_sub(word x, word y, word* carry)
114 : [x]
"=r"(x), [carry]
"=r"(*carry)
115 :
"0"(x), [y]
"rm"(y),
"1"(*carry)
123inline word
word8_sub2(word x[8],
const word y[8], word carry)
128 : [x]
"r"(x), [y]
"r"(y),
"0"(carry)
141 : [x]
"r"(y), [y]
"r"(x), [z]
"r"(x),
"0"(carry)
149inline 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");
175inline 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");
188inline 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");
201inline 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)
218inline
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 DO_8_TIMES(MACRO, ARG)
#define ADDSUB3_OP(OPERATION, INDEX)
#define LINMUL_OP(WRITE_TO, INDEX)
#define ADD_OR_SUBTRACT(CORE_CODE)
#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)
word word8_madd3(word z[8], const word x[8], word y, word carry)
word word_sub(word x, word y, word *carry)
word word8_sub2(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_linmul2(word x[8], word y, word carry)
word word8_add3(word z[8], const word x[8], const word y[8], word carry)
void word3_muladd(word *w2, word *w1, word *w0, word a, word b)
void word3_muladd_2(word *w2, word *w1, word *w0, word a, word b)
word word_add(word x, word y, word *carry)
word word8_sub2_rev(word x[8], const word y[8], word carry)