| version 1.1.1.1, 1999/12/03 07:39:06 |
version 1.8, 2007/09/15 10:17:07 |
|
|
| /* $OpenXM: OpenXM/src/asir99/asm/ddN.c,v 1.1.1.1 1999/11/10 08:12:25 noro Exp $ */ |
/* |
| |
* Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED |
| |
* All rights reserved. |
| |
* |
| |
* FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited, |
| |
* non-exclusive and royalty-free license to use, copy, modify and |
| |
* redistribute, solely for non-commercial and non-profit purposes, the |
| |
* computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and |
| |
* conditions of this Agreement. For the avoidance of doubt, you acquire |
| |
* only a limited right to use the SOFTWARE hereunder, and FLL or any |
| |
* third party developer retains all rights, including but not limited to |
| |
* copyrights, in and to the SOFTWARE. |
| |
* |
| |
* (1) FLL does not grant you a license in any way for commercial |
| |
* purposes. You may use the SOFTWARE only for non-commercial and |
| |
* non-profit purposes only, such as academic, research and internal |
| |
* business use. |
| |
* (2) The SOFTWARE is protected by the Copyright Law of Japan and |
| |
* international copyright treaties. If you make copies of the SOFTWARE, |
| |
* with or without modification, as permitted hereunder, you shall affix |
| |
* to all such copies of the SOFTWARE the above copyright notice. |
| |
* (3) An explicit reference to this SOFTWARE and its copyright owner |
| |
* shall be made on your publication or presentation in any form of the |
| |
* results obtained by use of the SOFTWARE. |
| |
* (4) In the event that you modify the SOFTWARE, you shall notify FLL by |
| |
* e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification |
| |
* for such modification or the source code of the modified part of the |
| |
* SOFTWARE. |
| |
* |
| |
* THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL |
| |
* MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND |
| |
* EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS |
| |
* FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES' |
| |
* RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY |
| |
* MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY. |
| |
* UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT, |
| |
* OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY |
| |
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL |
| |
* DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES |
| |
* ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES |
| |
* FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY |
| |
* DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF |
| |
* SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART |
| |
* OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY |
| |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
| |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
| |
* |
| |
* $OpenXM: OpenXM_contrib2/asir2000/asm/ddN.c,v 1.7 2007/02/18 05:36:27 ohara Exp $ |
| |
*/ |
| #ifndef FBASE |
#ifndef FBASE |
| #define FBASE |
#define FBASE |
| #endif |
#endif |
|
|
| #include "base.h" |
#include "base.h" |
| #include "inline.h" |
#include "inline.h" |
| |
|
| void bxprintn(N),bprintn(N); |
void divn(N n1,N n2,N *nq,N *nr) |
| void divnmain_special(int,int,unsigned int *,unsigned int *,unsigned int *); |
|
| void dupn(N,N); |
|
| |
|
| void divn(n1,n2,nq,nr) |
|
| N n1,n2,*nq,*nr; |
|
| { |
{ |
| int tmp,b; |
int tmp,b; |
| int i,j,d1,d2,dd; |
int i,j,d1,d2,dd; |
|
| Line 117 N n1,n2,*nq,*nr; |
|
| } |
} |
| } |
} |
| |
|
| void divsn(n1,n2,nq) |
void divsn(N n1,N n2,N *nq) |
| N n1,n2,*nq; |
|
| { |
{ |
| int d1,d2,dd,i,b; |
int d1,d2,dd,i,b; |
| unsigned int *m1,*m2; |
unsigned int *m1,*m2; |
|
|
| } |
} |
| } |
} |
| |
|
| void remn(n1,n2,nr) |
void remn(N n1,N n2,N *nr) |
| N n1,n2,*nr; |
|
| { |
{ |
| int d1,d2,tmp; |
int d1,d2,tmp; |
| unsigned int uq,ur; |
unsigned int uq,ur; |
|
|
| |
|
| /* d = 2^(32*words)-lower */ |
/* d = 2^(32*words)-lower */ |
| |
|
| void remn_special(a,d,bits,lower,b) |
void remn_special(N a,N d,int bits,unsigned int lower,N *b) |
| N a,d; |
|
| int bits; |
|
| unsigned int lower; |
|
| N *b; |
|
| { |
{ |
| int words; |
int words; |
| N r; |
N r; |
|
|
| } else |
} else |
| *b = r; |
*b = r; |
| } |
} |
| void mulin(n,d,p) |
void mulin(N n,unsigned int d,unsigned int *p) |
| N n; |
|
| unsigned int d; |
|
| unsigned int *p; |
|
| { |
{ |
| unsigned int carry; |
unsigned int carry; |
| unsigned int *m,*me; |
unsigned int *m,*me; |
| Line 204 unsigned int *p; |
|
| Line 238 unsigned int *p; |
|
| *p = carry; |
*p = carry; |
| } |
} |
| |
|
| unsigned int divin(n,dvr,q) |
unsigned int divin(N n,unsigned int dvr,N *q) |
| N n; |
|
| unsigned int dvr; |
|
| N *q; |
|
| { |
{ |
| int d; |
int d; |
| unsigned int up; |
unsigned int up; |
|
|
| return ( up ); |
return ( up ); |
| } |
} |
| |
|
| void bprintn(n) |
void bprintn(N n) |
| N n; |
|
| { |
{ |
| int l,i; |
int l,i; |
| unsigned int *b; |
unsigned int *b; |
|
|
| } |
} |
| } |
} |
| |
|
| void bxprintn(n) |
void bxprintn(N n) |
| N n; |
|
| { |
{ |
| int l,i; |
int l,i; |
| unsigned int *b; |
unsigned int *b; |
|
|
| } |
} |
| |
|
| #if defined(VISUAL) || defined(i386) |
#if defined(VISUAL) || defined(i386) |
| void muln(n1,n2,nr) |
void muln(N n1,N n2,N *nr) |
| N n1,n2,*nr; |
|
| { |
{ |
| unsigned int tmp,carry,mul; |
unsigned int tmp,carry,mul; |
| unsigned int *p1,*m1,*m2; |
unsigned int *p1,*m1,*m2; |
|
|
| } |
} |
| } |
} |
| |
|
| void _muln(n1,n2,nr) |
void _muln(N n1,N n2,N nr) |
| N n1,n2,nr; |
|
| { |
{ |
| unsigned int mul; |
unsigned int mul; |
| unsigned int *m1,*m2; |
unsigned int *m1,*m2; |
|
|
| } |
} |
| } |
} |
| |
|
| void muln_1(p,s,d,r) |
void muln_1(unsigned int *p,int s,unsigned int d,unsigned int *r) |
| unsigned int *p; |
|
| int s; |
|
| unsigned int d; |
|
| unsigned int *r; |
|
| { |
{ |
| /* esi : p, edi : r, carry : ebx, s : ecx */ |
/* esi : p, edi : r, carry : ebx, s : ecx */ |
| #if defined(VISUAL) |
#if defined(VISUAL) |
| Line 351 unsigned int *r; |
|
| Line 374 unsigned int *r; |
|
| } |
} |
| #else |
#else |
| asm volatile("\ |
asm volatile("\ |
| |
pushl %%ebx;\ |
| movl %0,%%esi;\ |
movl %0,%%esi;\ |
| movl %1,%%edi;\ |
movl %1,%%edi;\ |
| movl $0,%%ebx;\ |
movl $0,%%ebx;\ |
| Line 367 unsigned int *r; |
|
| Line 391 unsigned int *r; |
|
| leal 4(%%edi),%%edi;\ |
leal 4(%%edi),%%edi;\ |
| decl %3;\ |
decl %3;\ |
| jnz Lstart_muln;\ |
jnz Lstart_muln;\ |
| movl %%ebx,(%%edi)"\ |
movl %%ebx,(%%edi);\ |
| |
popl %%ebx"\ |
| :\ |
:\ |
| :"m"(p),"m"(r),"m"(d),"m"(s)\ |
:"m"(p),"m"(r),"m"(d),"m"(s)\ |
| :"eax","ebx","edx","esi","edi"); |
:"eax","edx","esi","edi"); |
| #endif |
#endif |
| } |
} |
| |
|
| void divnmain(d1,d2,m1,m2,q) |
void divnmain(int d1,int d2,unsigned int *m1,unsigned int *m2,unsigned int *q) |
| int d1,d2; |
|
| unsigned int *m1,*m2,*q; |
|
| { |
{ |
| int i,j; |
int i,j; |
| UL r,ltmp; |
UL r,ltmp; |
| Line 428 unsigned int *m1,*m2,*q; |
|
| Line 451 unsigned int *m1,*m2,*q; |
|
| } |
} |
| } |
} |
| |
|
| void divnmain_special(d1,d2,m1,m2,q) |
void divnmain_special(int d1,int d2,unsigned int *m1,unsigned int *m2,unsigned int *q) |
| int d1,d2; |
|
| unsigned int *m1,*m2,*q; |
|
| { |
{ |
| int i,j; |
int i,j; |
| UL ltmp; |
UL ltmp; |
| Line 459 unsigned int *m1,*m2,*q; |
|
| Line 480 unsigned int *m1,*m2,*q; |
|
| } |
} |
| } |
} |
| |
|
| unsigned int divn_1(p,s,d,r) |
unsigned int divn_1(unsigned int *p,int s,unsigned int d,unsigned int *r) |
| unsigned int *p; |
|
| int s; |
|
| unsigned int d; |
|
| unsigned int *r; |
|
| { |
{ |
| /* |
/* |
| unsigned int borrow,l; |
unsigned int borrow,l; |
| Line 508 unsigned int *r; |
|
| Line 525 unsigned int *r; |
|
| unsigned int borrow; |
unsigned int borrow; |
| |
|
| asm volatile("\ |
asm volatile("\ |
| |
pushl %%ebx;\ |
| movl %1,%%esi;\ |
movl %1,%%esi;\ |
| movl %2,%%edi;\ |
movl %2,%%edi;\ |
| movl $0,%%ebx;\ |
movl $0,%%ebx;\ |
| Line 523 unsigned int *r; |
|
| Line 541 unsigned int *r; |
|
| leal 4(%%edi),%%edi;\ |
leal 4(%%edi),%%edi;\ |
| decl %4;\ |
decl %4;\ |
| jnz Lstart_divn;\ |
jnz Lstart_divn;\ |
| movl %%ebx,%0"\ |
movl %%ebx,%0;\ |
| |
popl %%ebx"\ |
| :"=m"(borrow)\ |
:"=m"(borrow)\ |
| :"m"(p),"m"(r),"m"(d),"m"(s)\ |
:"m"(p),"m"(r),"m"(d),"m"(s)\ |
| :"eax","ebx","edx","esi","edi"); |
:"eax","edx","esi","edi"); |
| |
|
| return borrow; |
return borrow; |
| #endif |
#endif |
| Line 534 unsigned int *r; |
|
| Line 553 unsigned int *r; |
|
| |
|
| #else |
#else |
| |
|
| void muln(n1,n2,nr) |
void muln(N n1,N n2,N *nr) |
| N n1,n2,*nr; |
|
| { |
{ |
| unsigned int tmp,carry,mul; |
unsigned int tmp,carry,mul; |
| unsigned int *p1,*pp,*m1,*m2; |
unsigned int *p1,*pp,*m1,*m2; |
|
|
| } |
} |
| } |
} |
| |
|
| void _muln(n1,n2,nr) |
void _muln(N n1,N n2,N nr) |
| N n1,n2,nr; |
|
| { |
{ |
| unsigned int tmp,carry,mul; |
unsigned int tmp,carry,mul; |
| unsigned int *p1,*pp,*m1,*m2; |
unsigned int *p1,*pp,*m1,*m2; |
|
|
| |
|
| /* r[0...s] = p[0...s-1]*d */ |
/* r[0...s] = p[0...s-1]*d */ |
| |
|
| void muln_1(p,s,d,r) |
void muln_1(unsigned int *p,int s,unsigned int d,unsigned int *r) |
| unsigned int *p; |
|
| int s; |
|
| unsigned int d; |
|
| unsigned int *r; |
|
| { |
{ |
| unsigned int carry; |
unsigned int carry; |
| |
|
| Line 615 unsigned int *r; |
|
| Line 628 unsigned int *r; |
|
| *r = carry; |
*r = carry; |
| } |
} |
| |
|
| void divnmain(d1,d2,m1,m2,q) |
void divnmain(int d1,int d2,unsigned int *m1,unsigned int *m2,unsigned int *q) |
| int d1,d2; |
|
| unsigned int *m1,*m2,*q; |
|
| { |
{ |
| int i,j; |
int i,j; |
| UL r,ltmp; |
UL r,ltmp; |
| Line 663 unsigned int *m1,*m2,*q; |
|
| Line 674 unsigned int *m1,*m2,*q; |
|
| } |
} |
| } |
} |
| |
|
| unsigned int divn_1(p,s,d,r) |
unsigned int divn_1(unsigned int *p,int s,unsigned int d,unsigned int *r) |
| unsigned int *p; |
|
| int s; |
|
| unsigned int d; |
|
| unsigned int *r; |
|
| { |
{ |
| unsigned int borrow,l; |
unsigned int borrow,l; |
| |
|