From 4ee6a52f59ad0755503507702ce9923f1a9afb04 Mon Sep 17 00:00:00 2001 From: "[GGSuchao]" <[1500062807@pku.edu.cn]> Date: Thu, 6 Jul 2017 17:37:55 +0800 Subject: [PATCH] add sm2 --- crypto/sm2/miracl/mrmuldv.c | 95 +++++++++++++++---------------------- 1 file changed, 37 insertions(+), 58 deletions(-) diff --git a/crypto/sm2/miracl/mrmuldv.c b/crypto/sm2/miracl/mrmuldv.c index aeab7d1c..2b894f56 100644 --- a/crypto/sm2/miracl/mrmuldv.c +++ b/crypto/sm2/miracl/mrmuldv.c @@ -1,80 +1,59 @@ +/* Standard C version of mrmuldv.c */ -/* GCC inline assembly version for Linux64 */ - -#include - +#include +#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" - ); + mr_large dble=(mr_large)a*b+c; + q=(mr_small)MR_LROUND(dble/m); + *rp=(mr_small)(dble-(mr_large)q*m); 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 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" - ); + union doubleword dble; + dble.h[MR_BOT]=c; + dble.h[MR_TOP]=a; + q=(mr_small)(dble.d/m); + *rp=(mr_small)(dble.d-(mr_large)q*m); 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; + union doubleword dble; + dble.d=(mr_large)a*b+c; + *rp=dble.h[MR_BOT]; + return dble.h[MR_TOP]; } 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" - ); - + union doubleword dble; + dble.d=(mr_large)a*b+*c+*rp; + *rp=dble.h[MR_BOT]; + *c=dble.h[MR_TOP]; } +#endif +