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)