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; |
|
|