81 lines
1.5 KiB
Plaintext
81 lines
1.5 KiB
Plaintext
|
|
/* GCC inline assembly version for Linux64 */
|
|
|
|
#include "miracl.h"
|
|
|
|
|
|
mr_small muldiv(mr_small a,mr_small b,mr_small c,mr_small m,mr_small *rp)
|
|
{
|
|
mr_small q;
|
|
__asm__ __volatile__ (
|
|
"movq %1,%%rax\n"
|
|
"mulq %2\n"
|
|
"addq %3,%%rax\n"
|
|
"adcq $0,%%rdx\n"
|
|
"divq %4\n"
|
|
"movq %5,%%rbx\n"
|
|
"movq %%rdx,(%%rbx)\n"
|
|
"movq %%rax,%0\n"
|
|
: "=m"(q)
|
|
: "m"(a),"m"(b),"m"(c),"m"(m),"m"(rp)
|
|
: "rax","rbx","memory"
|
|
);
|
|
return q;
|
|
}
|
|
|
|
mr_small muldvm(mr_small a,mr_small c,mr_small m,mr_small *rp)
|
|
{
|
|
mr_small q;
|
|
__asm__ __volatile__ (
|
|
"movq %1,%%rdx\n"
|
|
"movq %2,%%rax\n"
|
|
"divq %3\n"
|
|
"movq %4,%%rbx\n"
|
|
"movq %%rdx,(%%rbx)\n"
|
|
"movq %%rax,%0\n"
|
|
: "=m"(q)
|
|
: "m"(a),"m"(c),"m"(m),"m"(rp)
|
|
: "rax","rbx","memory"
|
|
);
|
|
return q;
|
|
}
|
|
|
|
mr_small muldvd(mr_small a,mr_small b,mr_small c,mr_small *rp)
|
|
{
|
|
mr_small q;
|
|
__asm__ __volatile__ (
|
|
"movq %1,%%rax\n"
|
|
"mulq %2\n"
|
|
"addq %3,%%rax\n"
|
|
"adcq $0,%%rdx\n"
|
|
"movq %4,%%rbx\n"
|
|
"movq %%rax,(%%rbx)\n"
|
|
"movq %%rdx,%0\n"
|
|
: "=m"(q)
|
|
: "m"(a),"m"(b),"m"(c),"m"(rp)
|
|
: "rax","rbx","memory"
|
|
);
|
|
return q;
|
|
}
|
|
|
|
void muldvd2(mr_small a,mr_small b,mr_small *c,mr_small *rp)
|
|
{
|
|
__asm__ __volatile__ (
|
|
"movq %0,%%rax\n"
|
|
"mulq %1\n"
|
|
"movq %2,%%rbx\n"
|
|
"addq (%%rbx),%%rax\n"
|
|
"adcq $0,%%rdx\n"
|
|
"movq %3,%%rsi\n"
|
|
"addq (%%rsi),%%rax\n"
|
|
"adcq $0,%%rdx\n"
|
|
"movq %%rax,(%%rsi)\n"
|
|
"movq %%rdx,(%%rbx)\n"
|
|
:
|
|
: "m"(a),"m"(b),"m"(c),"m"(rp)
|
|
: "rax","rbx","rsi","memory"
|
|
);
|
|
|
|
}
|
|
|