mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-08-08 06:03:47 +08:00
add sm2
This commit is contained in:
@@ -1,80 +1,59 @@
|
|||||||
|
/* Standard C version of mrmuldv.c */
|
||||||
|
|
||||||
/* GCC inline assembly version for Linux64 */
|
#include <stdio.h>
|
||||||
|
#include "miracl.h"
|
||||||
#include <openssl/miracl.h>
|
|
||||||
|
|
||||||
|
|
||||||
mr_small muldiv(mr_small a,mr_small b,mr_small c,mr_small m,mr_small *rp)
|
mr_small muldiv(mr_small a,mr_small b,mr_small c,mr_small m,mr_small *rp)
|
||||||
{
|
{
|
||||||
mr_small q;
|
mr_small q;
|
||||||
__asm__ __volatile__ (
|
mr_large dble=(mr_large)a*b+c;
|
||||||
"movq %1,%%rax\n"
|
q=(mr_small)MR_LROUND(dble/m);
|
||||||
"mulq %2\n"
|
*rp=(mr_small)(dble-(mr_large)q*m);
|
||||||
"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;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MR_FP_ROUNDING
|
||||||
|
|
||||||
|
mr_small imuldiv(mr_small a,mr_small b,mr_small c,mr_small m,mr_large im,mr_small *rp)
|
||||||
|
{
|
||||||
|
mr_small q;
|
||||||
|
mr_large dble=(mr_large)a*b+c;
|
||||||
|
q=(mr_small)MR_LROUND(dble*im);
|
||||||
|
*rp=(mr_small)(dble-(mr_large)q*m);
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MR_NOFULLWIDTH
|
||||||
|
|
||||||
mr_small muldvm(mr_small a,mr_small c,mr_small m,mr_small *rp)
|
mr_small muldvm(mr_small a,mr_small c,mr_small m,mr_small *rp)
|
||||||
{
|
{
|
||||||
mr_small q;
|
mr_small q;
|
||||||
__asm__ __volatile__ (
|
union doubleword dble;
|
||||||
"movq %1,%%rdx\n"
|
dble.h[MR_BOT]=c;
|
||||||
"movq %2,%%rax\n"
|
dble.h[MR_TOP]=a;
|
||||||
"divq %3\n"
|
q=(mr_small)(dble.d/m);
|
||||||
"movq %4,%%rbx\n"
|
*rp=(mr_small)(dble.d-(mr_large)q*m);
|
||||||
"movq %%rdx,(%%rbx)\n"
|
|
||||||
"movq %%rax,%0\n"
|
|
||||||
: "=m"(q)
|
|
||||||
: "m"(a),"m"(c),"m"(m),"m"(rp)
|
|
||||||
: "rax","rbx","memory"
|
|
||||||
);
|
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
mr_small muldvd(mr_small a,mr_small b,mr_small c,mr_small *rp)
|
mr_small muldvd(mr_small a,mr_small b,mr_small c,mr_small *rp)
|
||||||
{
|
{
|
||||||
mr_small q;
|
union doubleword dble;
|
||||||
__asm__ __volatile__ (
|
dble.d=(mr_large)a*b+c;
|
||||||
"movq %1,%%rax\n"
|
*rp=dble.h[MR_BOT];
|
||||||
"mulq %2\n"
|
return dble.h[MR_TOP];
|
||||||
"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)
|
void muldvd2(mr_small a,mr_small b,mr_small *c,mr_small *rp)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__ (
|
union doubleword dble;
|
||||||
"movq %0,%%rax\n"
|
dble.d=(mr_large)a*b+*c+*rp;
|
||||||
"mulq %1\n"
|
*rp=dble.h[MR_BOT];
|
||||||
"movq %2,%%rbx\n"
|
*c=dble.h[MR_TOP];
|
||||||
"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"
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user