📄 do_func.s
字号:
.long __x_smod_snan | 10,11 inf,nan = nan .long __x_smod_dnan | 11,00 nan,norm = nan .long __x_smod_dnan | 11,01 nan,zero = nan .long __x_smod_dnan | 11,10 nan,inf = nan .long __x_smod_dnan | 11,11 nan,nan = nan .globl __x_pmod__x_pmod: clr.b FPSR_QBYTE(a6) | clear quotient field bfextu a6@(STAG){#0:#3},d0 | stag = d0 bfextu a6@(DTAG){#0:#3},d1 | dtag = d1|| Alias extended denorms to norms for the jump table.| bclr #2,d0 bclr #2,d1 lslb #2,d1 orb d0,d1 | d1{3:2} = dtag, d1{1:0} = stag| | Tag values:| | 00 = norm or denorm| | 01 = zero| | 10 = inf| | 11 = nan lea __x_pmodt,a1 movel a1@(d1:w:4),a1 jmp a1@__x_smod_snan: jra __x_src_nan__x_smod_dnan: jra __x_dst_nan__x_smod_oper: jra __x_t_operr__x_smod_zro: moveb a6@(ETEMP),d1 | get sign of src op moveb a6@(FPTEMP),d0 | get sign of dst op eorb d0,d1 | get exor of sign bits btst #7,d1 | test for sign jeq __x_smod_zsn | if clr, do not set sign big bset #q_sn_bit,a6@(FPSR_QBYTE) | set q-byte sign bit__x_smod_zsn: btst #7,d0 | test if + or - jeq __x_ld_pzero | if pos then load +0 jra __x_ld_mzero | else neg load -0__x_smod_fpn: moveb a6@(ETEMP),d1 | get sign of src op moveb a6@(FPTEMP),d0 | get sign of dst op eorb d0,d1 | get exor of sign bits btst #7,d1 | test for sign jeq __x_smod_fsn | if clr, do not set sign big bset #q_sn_bit,a6@(FPSR_QBYTE) | set q-byte sign bit__x_smod_fsn: tstb a6@(DTAG) | filter out denormal destination case jpl __x_smod_nrm | lea a6@(FPTEMP),a0 | a0<- addr(FPTEMP) jra __x_t_resdnrm | force UNFL(but exact) result__x_smod_nrm: fmovel a6@(USER_FPCR),fpcr /* | use user's rmode and precision */ fmovex a6@(FPTEMP),fp0 | return dest to fp0 rts|| FREM|__x_premt:| | 0x25 frem| | dtag,stag .long __x_srem | 00,00 norm,norm = normal .long __x_srem_oper | 00,01 norm,zero = nan with operr .long __x_srem_fpn | 00,10 norm,inf = fpn .long __x_srem_snan | 00,11 norm,nan = nan .long __x_srem_zro | 01,00 zero,norm = +-zero .long __x_srem_oper | 01,01 zero,zero = nan with operr .long __x_srem_zro | 01,10 zero,inf = +-zero .long __x_srem_snan | 01,11 zero,nan = nan .long __x_srem_oper | 10,00 inf,norm = nan with operr .long __x_srem_oper | 10,01 inf,zero = nan with operr .long __x_srem_oper | 10,10 inf,inf = nan with operr .long __x_srem_snan | 10,11 inf,nan = nan .long __x_srem_dnan | 11,00 nan,norm = nan .long __x_srem_dnan | 11,01 nan,zero = nan .long __x_srem_dnan | 11,10 nan,inf = nan .long __x_srem_dnan | 11,11 nan,nan = nan .globl __x_prem__x_prem: clr.b FPSR_QBYTE(a6) | clear quotient field bfextu a6@(STAG){#0:#3},d0 | stag = d0 bfextu a6@(DTAG){#0:#3},d1 | dtag = d1|| Alias extended denorms to norms for the jump table.| bclr #2,d0 bclr #2,d1 lslb #2,d1 orb d0,d1 | d1{3:2} = dtag, d1{1:0} = stag| | Tag values:| | 00 = norm or denorm| | 01 = zero| | 10 = inf| | 11 = nan lea __x_premt,a1 movel a1@(d1:w:4),a1 jmp a1@__x_srem_snan: jra __x_src_nan__x_srem_dnan: jra __x_dst_nan__x_srem_oper: jra __x_t_operr__x_srem_zro: moveb a6@(ETEMP),d1 | get sign of src op moveb a6@(FPTEMP),d0 | get sign of dst op eorb d0,d1 | get exor of sign bits btst #7,d1 | test for sign jeq __x_srem_zsn | if clr, do not set sign big bset #q_sn_bit,a6@(FPSR_QBYTE) | set q-byte sign bit__x_srem_zsn: btst #7,d0 | test if + or - jeq __x_ld_pzero | if pos then load +0 jra __x_ld_mzero | else neg load -0__x_srem_fpn: moveb a6@(ETEMP),d1 | get sign of src op moveb a6@(FPTEMP),d0 | get sign of dst op eorb d0,d1 | get exor of sign bits btst #7,d1 | test for sign jeq __x_srem_fsn | if clr, do not set sign big bset #q_sn_bit,a6@(FPSR_QBYTE) | set q-byte sign bit__x_srem_fsn: tstb a6@(DTAG) | filter out denormal destination case jpl __x_srem_nrm | lea a6@(FPTEMP),a0 | a0<- addr(FPTEMP) jra __x_t_resdnrm | force UNFL(but exact) result__x_srem_nrm: fmovel a6@(USER_FPCR),fpcr /* | use user's rmode and precision */ fmovex a6@(FPTEMP),fp0 | return dest to fp0 rts|| FSCALE|__x_pscalet:| | 0x26 fscale| | dtag,stag .long __x_sscale | 00,00 norm,norm = result .long __x_sscale | 00,01 norm,zero = fpn .long scl_opr | 00,10 norm,inf = nan with operr .long scl_snan | 00,11 norm,nan = nan .long scl_zro | 01,00 zero,norm = +-zero .long scl_zro | 01,01 zero,zero = +-zero .long scl_opr | 01,10 zero,inf = nan with operr .long scl_snan | 01,11 zero,nan = nan .long scl_inf | 10,00 inf,norm = +-inf .long scl_inf | 10,01 inf,zero = +-inf .long scl_opr | 10,10 inf,inf = nan with operr .long scl_snan | 10,11 inf,nan = nan .long scl_dnan | 11,00 nan,norm = nan .long scl_dnan | 11,01 nan,zero = nan .long scl_dnan | 11,10 nan,inf = nan .long scl_dnan | 11,11 nan,nan = nan .globl __x_pscale__x_pscale: bfextu a6@(STAG){#0:#3},d0 | stag in d0 bfextu a6@(DTAG){#0:#3},d1 | dtag in d1 bclr #2,d0 | alias denorm into norm bclr #2,d1 | alias denorm into norm lslb #2,d1 orb d0,d1 | d1{4:2} = dtag, d1{1:0} = stag| | dtag values stag values:| | 000 = norm 00 = norm| | 001 = zero 01 = zero| | 010 = inf 10 = inf| | 011 = nan 11 = nan| | 100 = dnrm|| lea __x_pscalet,a1 | load start of jump table movel a1@(d1:w:4),a1 | load a1 with label depending on tag jmp a1@ | go to the routinescl_opr: jra __x_t_operrscl_dnan: jra __x_dst_nanscl_zro: btst #sign_bit,a6@(FPTEMP_EX) | test if + or - jeq __x_ld_pzero | if pos then load +0 jra __x_ld_mzero | if neg then load -0scl_inf: btst #sign_bit,a6@(FPTEMP_EX) | test if + or - jeq __x_ld_pinf | if pos then load +inf jra __x_ld_minf | else neg load -infscl_snan: jra __x_src_nan|| FSINCOS| .globl __x_ssincosz__x_ssincosz: btst #sign_bit,a6@(ETEMP) | get sign jeq sincosp fmovex MZERO,fp0 jra sincoscomsincosp: fmovex PZERO,fp0sincoscom: fmovemx PONE,fp1-fp1 | do not allow FPSR to be affected jra __x_sto_cos | store cosine result .globl __x_ssincosi__x_ssincosi: fmovex QNAN,fp1 | load NAN bsrl __x_sto_cos | store cosine result fmovex QNAN,fp0 | load NAN jra __x_t_operr .globl __x_ssincosnan__x_ssincosnan: movel a6@(ETEMP_EX),a6@(FP_SCR1) movel a6@(ETEMP_HI),a6@(FP_SCR1+4) movel a6@(ETEMP_LO),a6@(FP_SCR1+8) bset #signan_bit,a6@(FP_SCR1+4) fmovemx a6@(FP_SCR1),fp1-fp1 bsrl __x_sto_cos jra __x_src_nan|| This code forces default values for the zero, inf, and nan cases| in the transcendentals code. The CC bits must be set in the| stacked FPSR to be correctly reported.||**Returns +PI/2 .globl __x_ld_ppi2__x_ld_ppi2: fmovex PPIBY2,fp0 | load +pi/2 jra __x_t_inx2 | set inex2 exc|**Returns -PI/2 .globl __x_ld_mpi2__x_ld_mpi2: fmovex MPIBY2,fp0 | load -pi/2 orl #neg_mask,a6@(USER_FPSR) | set N bit jra __x_t_inx2 | set inex2 exc|**Returns +inf .globl __x_ld_pinf__x_ld_pinf: fmovex PINF,fp0 | load +inf orl #inf_mask,a6@(USER_FPSR) | set I bit rts|**Returns -inf .globl __x_ld_minf__x_ld_minf: fmovex MINF,fp0 | load -inf orl #neg_mask+inf_mask,a6@(USER_FPSR) | set N and I bits rts|**Returns +1 .globl __x_ld_pone__x_ld_pone: fmovex PONE,fp0 | load +1 rts|**Returns -1 .globl __x_ld_mone__x_ld_mone: fmovex MONE,fp0 | load -1 orl #neg_mask,a6@(USER_FPSR) | set N bit rts|**Returns +0 .globl __x_ld_pzero__x_ld_pzero: fmovex PZERO,fp0 | load +0 orl #z_mask,a6@(USER_FPSR) | set Z bit rts|**Returns -0 .globl __x_ld_mzero__x_ld_mzero: fmovex MZERO,fp0 | load -0 orl #neg_mask+z_mask,a6@(USER_FPSR) | set N and Z bits rts| end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -