📄 libm.il
字号:
.end|/* Convert double to complex */| |void|_Fd_conv_c(c, x)| complex *c;| double x;|{| c->real = (float) (x);| c->imag = 0.0;|} .inline __Fd_conv_c,8 movl sp@+,d0 movl sp@+,d1 | pick up argument jsr PREFIX/**/dtos movl sp@+,a0 | a0 points to result c. movl d0,a0@+ | Rc gets x. clrl a0@ | Ic gets 0. .end| Double Precision Complex libF77 routines|| void| d_cmplx(resp,dp1,dp2)| register dcomplex *resp;| register double *dp1, *dp2;| {| resp->real = *dp1;| resp->imag = *dp2;| }| .inline _z_abs,4 movl sp@+,a0 movl a0@+,d0 movl a0@+,d1 jsr PREFIX/**/length2d .end|| Fz_neg(c, a)| dcomplex *c, *a;| {| c->dreal = - a->dreal;| c->dimag = - a->dimag;| }| .inline __Fz_neg,8 movl sp@+,a0 | a0 = c; movl sp@+,a1 | a1 = a; movl a1@+,a0@+ | c->dreal = - a->dreal; eorb #0x80,a0@(-4) movl a1@+,a0@+ | c->dreal = - a->dreal; movl a1@+,a0@+ | c->imag = - a->imag; eorb #0x80,a0@(-4) movl a1@,a0@ | c->imag = - a->imag; .end|| _Ff_conv_z(dp,f) | dcomplex *dp;| union {float f; int i;}f;| {| dp->real = (double)f.f;| dp->imag = 0.0;| }| .inline __Ff_conv_z,8 movl sp@(4),d0 jsr PREFIX/**/stod movl sp@+,a0 movl d0,a0@+ movl d1,a0@+ clrl a0@+ clrl a0@ movl sp@+,d0 | Throw away second argument. .end|| float| Fz_conv_f(dp) | dcomplex *dp;| {| return (float)dp->dreal;| }| .inline __Fz_conv_f,4 movl sp@+,a0 movl a0@+,d0 movl a0@,d1 jsr PREFIX/**/dtos .end|| int| Fz_conv_i(dp) | dcomplex *dp;| {| return (int)dp->dreal;| }| .inline __Fz_conv_i,4 movl sp@+,a0 movl a0@+,d0 movl a0@,d1 jsr PREFIX/**/intd .end|| Fi_conv_z(dp,i) | dcomplex *dp;| int i;| {| dp->dreal = (double)i;| dp->dimag = 0.0;| }| .inline __Fi_conv_z,8 movl sp@(4),d0 jsr PREFIX/**/fltd movl sp@+,a0 movl d0,a0@+ movl sp@+,d0 | Trash. movl d1,a0@+ clrl a0@+ clrl a0@ .end|| double| Fz_conv_d(dp) | dcomplex *dp;| {| return dp->dreal;| }| .inline __Fz_conv_d,4 movl sp@+,a0 movl a0@+,d0 movl a0@,d1 .end|| Fd_conv_z(dp,d) | dcomplex *dp;| double d;| {| dp->dreal = d;| dp->dimag = 0.0;| }| .inline __Fd_conv_z,12 movl sp@+,a0 movl sp@+,a0@+ movl sp@+,a0@+ clrl a0@+ clrl a0@ .end|| double| Fz_conv_c(dp) | dcomplex *dp;| {| union { double d; complex c; } sleaze;| sleaze.cval.real = (float)dp->dreal;| sleaze.cval.imag = (float)dp->dimag;| return sleaze.dval;| }| .inline __Fz_conv_c,4 movl sp@,a0 | pick up real part of argument movl a0@(8),d0 movl a0@(12),d1 jsr PREFIX/**/dtos movl sp@+,a0 | Restore a0. movl d0,sp@- | Save second part of result. movl a0@+,d0 movl a0@,d1 jsr PREFIX/**/dtos movl sp@+,d1 | Restore second part of result. .end | convert complex to double complex | arg1 is address of result; arg2 is complex as a double .inline __Fc_conv_z,12 movl sp@(4),d0 | pick up real part of argument jsr PREFIX/**/stod movl sp@,a0 | get address of result movl d0,a0@+ movl d1,a0@ movl sp@(8),d0 | pick up imaginary part of argument jsr PREFIX/**/stod movl sp@+,a0 | get address of result movl d0,a0@(8) movl d1,a0@(12) lea sp@(8),sp | Bypass second argument. .end/***** end from 3.2 fsoft.il *****/ .inline _c_cmplx,12 movl sp@+,a1 movl sp@+,a0 movl sp@+,d0 movl a0@,a1@+ movl d0,a0 movl a0@,a1@ .end .inline _d_atn2,8 | Implements ATAN2(DOUBLE). movl sp@+,a0 | a0 gets address of first argument. movl sp@+,a1 | a1 gets address of second argument. movl a1@+,d0 | Pop second argument. movl a1@,d1 | Pop second argument. movl d1,sp@- movl d0,sp@- movl a0@+,d0 | Pop first argument. movl a0@,d1 | Pop first argument. movl d1,sp@- movl d0,sp@- jsr _atan2 movl sp@+,a0 movl sp@+,a0 movl sp@+,a0 movl sp@+,a0 .end || void| d_cmplx(resp,dp1,dp2)| register dcomplex *resp.| register double *dp1, *dp2.| {| resp->real = *dp1.| resp->imag = *dp2.| }| .inline _d_cmplx,12 movl sp@+,a1 movl sp@+,a0 movl sp@+,d0 movl a0@+,a1@+ movl a0@,a1@+ movl d0,a0 movl a0@+,a1@+ movl a0@,a1@ .end .inline _d_cnjg,8 movl sp@+,a0 movl sp@+,a1 movl a1@+,a0@+ movl a1@+,a0@+ movl a1@+,a0@+ movl a1@,a0@ eorl #0x80000000,a0@(-4) .end .inline _d_imag,4 movl sp@+,a0 movl a0@(8),d0 movl a0@(12),d1 .end .inline _d_sign,8 movl sp@+,a0 movl a0@+,d0 andl #0x7fffffff,d0 movl a0@,d1 movl sp@+,a0 cmpl #0x80000000,a0@ jhi 2f | Branch if y < -0. jcs 1f | Branch if y >= +0. tstl a0@(4) jeq 1f | Branch if y is -0.2: orl #0x80000000,d01: .end .inline _i_nint,4 | Implements NINT(REAL). movl sp@+,a0 | a0 gets address of argument. movl a0@,d0 | d0 gets argument. jsr PREFIX/**/stod movl d1,sp@- movl d0,sp@- jsr _nint movl sp@+,d1 | pop junk. movl sp@+,d1 | pop junk. .end .inline _i_dnnt,4 | Implements NINT(DOUBLE). movl sp@+,a0 | a0 gets address of argument. movl a0@(4),sp@- movl a0@,sp@- jsr _nint movl sp@+,d1 | pop junk. movl sp@+,d1 | pop junk. .end .inline _d_pow_,8 | double _d_pow_ ( double *x, *y ) movl sp@+,a0 | Load addresses of arguments. movl sp@+,a1 movl a1@+,d0 | Pop argument. movl a1@,sp@- | Push argument. movl d0,sp@- movl a0@+,d0 movl a0@,sp@- movl d0,sp@- jsr _pow movl sp@+,a0 | Remove arguments. movl sp@+,a0 movl sp@+,a0 movl sp@+,a0 .end .inline _pow_dd,8 | Implements DOUBLE**DOUBLE. movl sp@+,a0 | Load addresses of arguments. movl sp@+,a1 movl a1@+,d0 | Pop argument. movl a1@,sp@- | Push argument. movl d0,sp@- movl a0@+,d0 movl a0@,sp@- movl d0,sp@- jsr _pow movl sp@+,a0 | Remove arguments. movl sp@+,a0 movl sp@+,a0 movl sp@+,a0 .end .inline _pow_rr,8 | Implements REAL**REAL. jsr _r_pow_ movl sp@+,a0 | Pop junk. movl sp@+,a0 | Pop junk. .end .inline _r_atn2,8 | Implements ATAN2(REAL). jsr _r_atan2_ movl sp@+,a0 | Pop junk. movl sp@+,a0 | Pop junk. .end .inline _r_cnjg,8 movl sp@+,a0 movl sp@+,a1 movl a1@+,a0@+ movl a1@,a0@ eorb #0x80,a0@ .end .inline _r_imag,4 movl sp@+,a0 movl a0@(4),d0 .end .inline _r_sign,8 movl sp@+,a0 movl a0@,d0 andl #0x7fffffff,d0 movl sp@+,a0 cmpl #0x80000000,a0@ jls 1f | Branch if y >= +0. orl #0x80000000,d01: .end/* Templates for libm "R" routines for single-precision Fortran, Pascal, Modula-2 *//* Templates for libm "D" routines for double-precision Fortran */#define D_F(X) /* double d_X_( double x ) */ \ .inline _d_/**/X/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@(4),sp@- ; \ movl a0@,sp@- ; \ jsr _/**/X ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ .end#define ID_F(X) /* int id_X_( double x ) */ \ .inline _id_/**/X/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@(4),sp@- ; \ movl a0@,sp@- ; \ jsr _/**/X ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ .end#define D_F2(X) /* double d_X_( double x,y ) */ \ .inline _d_/**/X/**/_,8 ; \ movl sp@+,a0 ; \ movl sp@+,a1 ; \ movl a1@(4),sp@- ; \ movl a1@,sp@- ; \ movl a0@(4),sp@- ; \ movl a0@,sp@- ; \ jsr _/**/X ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ .end#define D_FIX(X) /* double d_X_( int n, double y ) */ \ .inline _d_/**/X/**/_,8 ; \ movl sp@+,a0 ; \ movl sp@+,a1 ; \ movl a1@(4),sp@- ; \ movl a1@,sp@- ; \ movl a0@,sp@- ; \ jsr _/**/X ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ .end#define D_FXI(X) /* double d_X_( double n, int y ) */ \ .inline _d_/**/X/**/_,8 ; \ movl sp@+,a0 ; \ movl sp@+,a1 ; \ movl a1@,sp@- ; \ movl a0@(4),sp@- ; \ movl a0@,sp@- ; \ jsr _/**/X ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ .end D_F(acos) D_F(acosh) D_F(cos) D_F(cosh) D_F(asin) D_F(asinh) D_F(sin) D_F(sinh) D_F(atan) D_F(atanh) D_F(tan) D_F(tanh) D_F(cbrt) D_F(erf) D_F(erfc) D_F(exp) D_F(exp2) D_F(exp10) D_F(expm1) D_F(j0) D_F(j1) D_F(lgamma) D_F(log) D_F(log1p) D_F(log2) D_F(log10) D_F(logb) D_F(sqrt) D_F(y0) D_F(y1) ID_F(fp_class) ID_F(ilogb) D_F2(atan2) D_F2(nextafter) D_F2(scalb) D_FIX(jn) D_FIX(yn)#ifdef FSKY#define CDRI(f,g) ; \ .inline _/**/f,8 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ jsr S/**/g/**/d ; \ .end ; \ .inline _id_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ jsr S/**/g/**/d ; \ .end ; \ .inline _ir_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ jsr S/**/g/**/s ; \ .end#define CDRX(f,g) ; \ .inline _/**/f,8 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ jsr S/**/g/**/d ; \ .end ; \ .inline _d_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ jsr S/**/g/**/d ; \ .end ; \ .inline _r_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ jsr S/**/g/**/s ; \ .end#define CDRXX(f,g) ; \ .inline _/**/f,16 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ lea sp@,a0 ; \ jsr S/**/g/**/d ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ .end ; \ .inline _d_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ movl sp@+,a0 ; \ jsr S/**/g/**/d ; \ .end ; \ .inline _r_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ movl sp@+,a0 ; \ movl a0@,d1 ; \ jsr S/**/g/**/s ; \ .end#define CDRXI(f,g) ; \ .inline _/**/f,12 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ lea sp@,a0 ; \ jsr S/**/g/**/d ; \ movl sp@+,a0 ; \ .end ; \ .inline _d_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ movl sp@+,a0 ; \ jsr S/**/g/**/d ; \ .end ; \ .inline _r_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ movl sp@+,a0 ; \ movl a0@,d1 ; \ jsr S/**/g/**/s ; \ .end#endif#ifdef FSOFT#define CDRI(f,g) ; \ .inline _/**/f,8 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ jsr F/**/g/**/d ; \ .end ; \ .inline _id_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ jsr F/**/g/**/d ; \ .end ; \ .inline _ir_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ jsr F/**/g/**/s ; \ .end#define CDRX(f,g) ; \ .inline _/**/f,8 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ jsr F/**/g/**/d ; \ .end ; \ .inline _d_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ jsr F/**/g/**/d ; \ .end ; \ .inline _r_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ jsr F/**/g/**/s ; \ .end#define CDRXX(f,g) ; \ .inline _/**/f,16 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ lea sp@,a0 ; \ jsr F/**/g/**/d ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ .end ; \ .inline _d_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ movl sp@+,a0 ; \ jsr F/**/g/**/d ; \ .end ; \ .inline _r_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ movl sp@+,a0 ; \ movl a0@,d1 ; \ jsr F/**/g/**/s ; \ .end#define CDRXI(f,g) ; \ .inline _/**/f,12 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ lea sp@,a0 ; \ jsr F/**/g/**/d ; \ movl sp@+,a0 ; \ .end ; \ .inline _d_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ movl sp@+,a0 ; \ jsr F/**/g/**/d ; \ .end ; \ .inline _r_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ movl sp@+,a0 ; \ movl a0@,d1 ; \ jsr F/**/g/**/s ; \ .end#endif#ifdef FSWITCH#define CDRI(f,g) ; \ .inline _/**/f,8 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ jsr V/**/g/**/d ; \ .end ; \ .inline _id_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ jsr V/**/g/**/d ; \ .end ; \ .inline _ir_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ jsr V/**/g/**/s ; \ .end#define CDRX(f,g) ; \ .inline _/**/f,8 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ jsr V/**/g/**/d ; \ .end ; \ .inline _d_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ jsr V/**/g/**/d ; \ .end ; \ .inline _r_/**/f/**/_,4 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ jsr V/**/g/**/s ; \ .end#define CDRXX(f,g) ; \ .inline _/**/f,16 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ lea sp@,a0 ; \ jsr V/**/g/**/d ; \ movl sp@+,a0 ; \ movl sp@+,a0 ; \ .end ; \ .inline _d_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ movl sp@+,a0 ; \ jsr V/**/g/**/d ; \ .end ; \ .inline _r_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ movl sp@+,a0 ; \ movl a0@,d1 ; \ jsr V/**/g/**/s ; \ .end#define CDRXI(f,g) ; \ .inline _/**/f,12 ; \ movl sp@+,d0 ; \ movl sp@+,d1 ; \ lea sp@,a0 ; \ jsr V/**/g/**/d ; \ movl sp@+,a0 ; \ .end ; \ .inline _d_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@+,d0 ; \ movl a0@,d1 ; \ movl sp@+,a0 ; \ jsr V/**/g/**/d ; \ .end ; \ .inline _r_/**/f/**/_,8 ; \ movl sp@+,a0 ; \ movl a0@,d0 ; \ movl sp@+,a0 ; \ movl a0@,d1 ; \ jsr V/**/g/**/s ; \ .end#endif#ifndef CDRI#define CDRI(f,g)#define CDRX(f,g)#define CDRXX(f,g)#define CDRXI(f,g)#endif CDRI(nint,nint) CDRI(irint,rint) CDRX(aint,aint) CDRX(anint,anint) CDRX(rint,arint) CDRX(ceil,ceil) CDRX(floor,floor) CDRX(sqrt,sqrt) CDRXX(hypot,length2) CDRXX(fmod,mod) CDRXX(remainder,rem) CDRXI(scalbn,scalei)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -