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("movl 4*" #INDEX "(%[y]), %[carry]") \
27 ASM(OPERATION " %[carry], 4*" #INDEX "(%[x])") \
29 #define ADDSUB3_OP(OPERATION, INDEX) \
30 ASM("movl 4*" #INDEX "(%[x]), %[carry]") \
31 ASM(OPERATION " 4*" #INDEX "(%[y]), %[carry]") \
32 ASM("movl %[carry], 4*" #INDEX "(%[z])") \
34 #define LINMUL_OP(WRITE_TO, INDEX) \
35 ASM("movl 4*" #INDEX "(%[x]),%%eax") \
37 ASM("addl %[carry],%%eax") \
38 ASM("adcl $0,%%edx") \
39 ASM("movl %%edx,%[carry]") \
40 ASM("movl %%eax, 4*" #INDEX "(%[" WRITE_TO "])")
42 #define MULADD_OP(IGNORED, INDEX) \
43 ASM("movl 4*" #INDEX "(%[x]),%%eax") \
45 ASM("addl %[carry],%%eax") \
46 ASM("adcl $0,%%edx") \
47 ASM("addl 4*" #INDEX "(%[z]),%%eax") \
48 ASM("adcl $0,%%edx") \
49 ASM("movl %%edx,%[carry]") \
50 ASM("movl %%eax, 4*" #INDEX " (%[z])")
52 #define DO_8_TIMES(MACRO, ARG) \
62 #define ADD_OR_SUBTRACT(CORE_CODE) \
63 ASM("rorl %[carry]") \
65 ASM("sbbl %[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",
"%eax",
"%edx");
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",
"%eax",
"%edx");
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",
"%eax",
"%edx");
201 inline void word3_muladd(word* w2, word* w1, word* w0, word x, word y)
206 ASM("addl %[x],%[w0]")
207 ASM("adcl %[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("addl %[x],%[w0]")
224 ASM("adcl %[y],%[w1]")
227 ASM("addl %[x],%[w0]")
228 ASM("adcl %[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)
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)
#define DO_8_TIMES(MACRO, ARG)
word word8_linmul3(word z[8], const word x[8], word y, word carry)
#define ADDSUB2_OP(OPERATION, INDEX)
word word8_sub2(word x[8], const word y[8], word carry)
#define LINMUL_OP(WRITE_TO, INDEX)
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)
word word_add(word x, word y, word *carry)
#define MULADD_OP(IGNORED, INDEX)
word word8_sub3(word z[8], const word x[8], const word y[8], word carry)
#define ADDSUB3_OP(OPERATION, INDEX)
#define ADD_OR_SUBTRACT(CORE_CODE)