162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * fp_scan.S 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright Roman Zippel, 1997. All rights reserved. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 762306a36Sopenharmony_ci * modification, are permitted provided that the following conditions 862306a36Sopenharmony_ci * are met: 962306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 1062306a36Sopenharmony_ci * notice, and the entire permission notice in its entirety, 1162306a36Sopenharmony_ci * including the disclaimer of warranties. 1262306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 1362306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 1462306a36Sopenharmony_ci * documentation and/or other materials provided with the distribution. 1562306a36Sopenharmony_ci * 3. The name of the author may not be used to endorse or promote 1662306a36Sopenharmony_ci * products derived from this software without specific prior 1762306a36Sopenharmony_ci * written permission. 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * ALTERNATIVELY, this product may be distributed under the terms of 2062306a36Sopenharmony_ci * the GNU General Public License, in which case the provisions of the GPL are 2162306a36Sopenharmony_ci * required INSTEAD OF the above restrictions. (This clause is 2262306a36Sopenharmony_ci * necessary due to a potential bad interaction between the GPL and 2362306a36Sopenharmony_ci * the restrictions contained in a BSD-style copyright.) 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 2662306a36Sopenharmony_ci * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2762306a36Sopenharmony_ci * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2862306a36Sopenharmony_ci * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 2962306a36Sopenharmony_ci * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 3062306a36Sopenharmony_ci * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 3162306a36Sopenharmony_ci * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3262306a36Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3362306a36Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3462306a36Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 3562306a36Sopenharmony_ci * OF THE POSSIBILITY OF SUCH DAMAGE. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#include "fp_emu.h" 3962306a36Sopenharmony_ci#include "fp_decode.h" 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci .globl fp_scan, fp_datasize 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci .data 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci| %d2 - first two instr words 4662306a36Sopenharmony_ci| %d1 - operand size 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* operand formats are: 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci Long = 0, i.e. fmove.l 5162306a36Sopenharmony_ci Single, i.e. fmove.s 5262306a36Sopenharmony_ci Extended, i.e. fmove.x 5362306a36Sopenharmony_ci Packed-BCD, i.e. fmove.p 5462306a36Sopenharmony_ci Word, i.e. fmove.w 5562306a36Sopenharmony_ci Double, i.e. fmove.d 5662306a36Sopenharmony_ci*/ 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci .text 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci| On entry: 6162306a36Sopenharmony_ci| FPDATA - base of emulated FPU registers 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cifp_scan: 6462306a36Sopenharmony_ci| normal fpu instruction? (this excludes fsave/frestore) 6562306a36Sopenharmony_ci fp_get_pc %a0 6662306a36Sopenharmony_ci printf PDECODE,"%08x: ",1,%a0 6762306a36Sopenharmony_ci getuser.b (%a0),%d0,fp_err_ua1,%a0 6862306a36Sopenharmony_ci#if 1 6962306a36Sopenharmony_ci cmp.b #0xf2,%d0 | cpid = 1 7062306a36Sopenharmony_ci#else 7162306a36Sopenharmony_ci cmp.b #0xfc,%d0 | cpid = 6 7262306a36Sopenharmony_ci#endif 7362306a36Sopenharmony_ci jne fp_nonstd 7462306a36Sopenharmony_ci| first two instruction words are kept in %d2 7562306a36Sopenharmony_ci getuser.l (%a0)+,%d2,fp_err_ua1,%a0 7662306a36Sopenharmony_ci fp_put_pc %a0 7762306a36Sopenharmony_cifp_decode_cond: | separate conditional instr 7862306a36Sopenharmony_ci fp_decode_cond_instr_type 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci .long fp_decode_move, fp_fscc 8162306a36Sopenharmony_ci .long fp_fbccw, fp_fbccl 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cifp_decode_move: | separate move instr 8462306a36Sopenharmony_ci fp_decode_move_instr_type 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci .long fp_fgen_fp, fp_ill 8762306a36Sopenharmony_ci .long fp_fgen_ea, fp_fmove_fp2mem 8862306a36Sopenharmony_ci .long fp_fmovem_cr, fp_fmovem_cr 8962306a36Sopenharmony_ci .long fp_fmovem_fp, fp_fmovem_fp 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci| now all arithmetic instr and a few move instr are left 9262306a36Sopenharmony_cifp_fgen_fp: | source is a fpu register 9362306a36Sopenharmony_ci clr.b (FPD_FPSR+2,FPDATA) | clear the exception byte 9462306a36Sopenharmony_ci fp_decode_sourcespec 9562306a36Sopenharmony_ci printf PDECODE,"f<op>.x fp%d",1,%d0 9662306a36Sopenharmony_ci fp_get_fp_reg 9762306a36Sopenharmony_ci lea (FPD_TEMPFP1,FPDATA),%a1 | copy src into a temp location 9862306a36Sopenharmony_ci move.l (%a0)+,(%a1)+ 9962306a36Sopenharmony_ci move.l (%a0)+,(%a1)+ 10062306a36Sopenharmony_ci move.l (%a0),(%a1) 10162306a36Sopenharmony_ci lea (-8,%a1),%a0 10262306a36Sopenharmony_ci jra fp_getdest 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cifp_fgen_ea: | source is <ea> 10562306a36Sopenharmony_ci clr.b (FPD_FPSR+2,FPDATA) | clear the exception byte 10662306a36Sopenharmony_ci | sort out fmovecr, keep data size in %d1 10762306a36Sopenharmony_ci fp_decode_sourcespec 10862306a36Sopenharmony_ci cmp.w #7,%d0 10962306a36Sopenharmony_ci jeq fp_fmovecr 11062306a36Sopenharmony_ci move.w %d0,%d1 | store data size twice in %d1 11162306a36Sopenharmony_ci swap %d1 | one can be trashed below 11262306a36Sopenharmony_ci move.w %d0,%d1 11362306a36Sopenharmony_ci#ifdef FPU_EMU_DEBUG 11462306a36Sopenharmony_ci lea 0f,%a0 11562306a36Sopenharmony_ci clr.l %d0 11662306a36Sopenharmony_ci move.b (%a0,%d1.w),%d0 11762306a36Sopenharmony_ci printf PDECODE,"f<op>.%c ",1,%d0 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci .data 12062306a36Sopenharmony_ci0: .byte 'l','s','x','p','w','d','b',0 12162306a36Sopenharmony_ci .previous 12262306a36Sopenharmony_ci#endif 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci/* 12562306a36Sopenharmony_ci fp_getsource, fp_getdest 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci basically, we end up with a pointer to the source operand in 12862306a36Sopenharmony_ci %a1, and a pointer to the destination operand in %a0. both 12962306a36Sopenharmony_ci are, of course, 96-bit extended floating point numbers. 13062306a36Sopenharmony_ci*/ 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cifp_getsource: 13362306a36Sopenharmony_ci | decode addressing mode for source 13462306a36Sopenharmony_ci fp_decode_addr_mode 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci .long fp_data, fp_ill 13762306a36Sopenharmony_ci .long fp_indirect, fp_postinc 13862306a36Sopenharmony_ci .long fp_predecr, fp_disp16 13962306a36Sopenharmony_ci .long fp_extmode0, fp_extmode1 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci | addressing mode: data register direct 14262306a36Sopenharmony_cifp_data: 14362306a36Sopenharmony_ci fp_mode_data_direct 14462306a36Sopenharmony_ci jsr fp_get_data_reg 14562306a36Sopenharmony_ci lea (FPD_TEMPFP1,FPDATA),%a0 14662306a36Sopenharmony_ci jmp ([0f:w,%pc,%d1.w*4]) 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci .align 4 14962306a36Sopenharmony_ci0: 15062306a36Sopenharmony_ci .long fp_data_long, fp_data_single 15162306a36Sopenharmony_ci .long fp_ill, fp_ill 15262306a36Sopenharmony_ci .long fp_data_word, fp_ill 15362306a36Sopenharmony_ci .long fp_data_byte, fp_ill 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci | data types that fit in an integer data register 15662306a36Sopenharmony_cifp_data_byte: 15762306a36Sopenharmony_ci extb.l %d0 15862306a36Sopenharmony_ci jra fp_data_long 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cifp_data_word: 16162306a36Sopenharmony_ci ext.l %d0 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cifp_data_long: 16462306a36Sopenharmony_ci jsr fp_conv_long2ext 16562306a36Sopenharmony_ci jra fp_getdest 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cifp_data_single: 16862306a36Sopenharmony_ci jsr fp_conv_single2ext 16962306a36Sopenharmony_ci jra fp_getdest 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci | addressing mode: address register indirect 17262306a36Sopenharmony_cifp_indirect: 17362306a36Sopenharmony_ci fp_mode_addr_indirect 17462306a36Sopenharmony_ci jra fp_fetchsource 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci | addressing mode: address register indirect with postincrement 17762306a36Sopenharmony_cifp_postinc: 17862306a36Sopenharmony_ci fp_mode_addr_indirect_postinc 17962306a36Sopenharmony_ci jra fp_fetchsource 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci | addressing mode: address register indirect with predecrement 18262306a36Sopenharmony_cifp_predecr: 18362306a36Sopenharmony_ci fp_mode_addr_indirect_predec 18462306a36Sopenharmony_ci jra fp_fetchsource 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci | addressing mode: address register/programm counter indirect 18762306a36Sopenharmony_ci | with 16bit displacement 18862306a36Sopenharmony_cifp_disp16: 18962306a36Sopenharmony_ci fp_mode_addr_indirect_disp16 19062306a36Sopenharmony_ci jra fp_fetchsource 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci | all other indirect addressing modes will finally end up here 19362306a36Sopenharmony_cifp_extmode0: 19462306a36Sopenharmony_ci fp_mode_addr_indirect_extmode0 19562306a36Sopenharmony_ci jra fp_fetchsource 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci| all pc relative addressing modes and immediate/absolute modes end up here 19862306a36Sopenharmony_ci| the first ones are sent to fp_extmode0 or fp_disp16 19962306a36Sopenharmony_ci| and only the latter are handled here 20062306a36Sopenharmony_cifp_extmode1: 20162306a36Sopenharmony_ci fp_decode_addr_reg 20262306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci .align 4 20562306a36Sopenharmony_ci0: 20662306a36Sopenharmony_ci .long fp_abs_short, fp_abs_long 20762306a36Sopenharmony_ci .long fp_disp16, fp_extmode0 20862306a36Sopenharmony_ci .long fp_immediate, fp_ill 20962306a36Sopenharmony_ci .long fp_ill, fp_ill 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci | addressing mode: absolute short 21262306a36Sopenharmony_cifp_abs_short: 21362306a36Sopenharmony_ci fp_mode_abs_short 21462306a36Sopenharmony_ci jra fp_fetchsource 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci | addressing mode: absolute long 21762306a36Sopenharmony_cifp_abs_long: 21862306a36Sopenharmony_ci fp_mode_abs_long 21962306a36Sopenharmony_ci jra fp_fetchsource 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci | addressing mode: immediate data 22262306a36Sopenharmony_cifp_immediate: 22362306a36Sopenharmony_ci printf PDECODE,"#" 22462306a36Sopenharmony_ci fp_get_pc %a0 22562306a36Sopenharmony_ci move.w (fp_datasize,%d1.w*2),%d0 22662306a36Sopenharmony_ci addq.w #1,%d0 22762306a36Sopenharmony_ci and.w #-2,%d0 22862306a36Sopenharmony_ci#ifdef FPU_EMU_DEBUG 22962306a36Sopenharmony_ci movem.l %d0/%d1,-(%sp) 23062306a36Sopenharmony_ci movel %a0,%a1 23162306a36Sopenharmony_ci clr.l %d1 23262306a36Sopenharmony_ci jra 2f 23362306a36Sopenharmony_ci1: getuser.b (%a1)+,%d1,fp_err_ua1,%a1 23462306a36Sopenharmony_ci printf PDECODE,"%02x",1,%d1 23562306a36Sopenharmony_ci2: dbra %d0,1b 23662306a36Sopenharmony_ci movem.l (%sp)+,%d0/%d1 23762306a36Sopenharmony_ci#endif 23862306a36Sopenharmony_ci lea (%a0,%d0.w),%a1 23962306a36Sopenharmony_ci fp_put_pc %a1 24062306a36Sopenharmony_ci| jra fp_fetchsource 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cifp_fetchsource: 24362306a36Sopenharmony_ci move.l %a0,%a1 24462306a36Sopenharmony_ci swap %d1 24562306a36Sopenharmony_ci lea (FPD_TEMPFP1,FPDATA),%a0 24662306a36Sopenharmony_ci jmp ([0f:w,%pc,%d1.w*4]) 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci .align 4 24962306a36Sopenharmony_ci0: .long fp_long, fp_single 25062306a36Sopenharmony_ci .long fp_ext, fp_pack 25162306a36Sopenharmony_ci .long fp_word, fp_double 25262306a36Sopenharmony_ci .long fp_byte, fp_ill 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_cifp_long: 25562306a36Sopenharmony_ci getuser.l (%a1),%d0,fp_err_ua1,%a1 25662306a36Sopenharmony_ci jsr fp_conv_long2ext 25762306a36Sopenharmony_ci jra fp_getdest 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cifp_single: 26062306a36Sopenharmony_ci getuser.l (%a1),%d0,fp_err_ua1,%a1 26162306a36Sopenharmony_ci jsr fp_conv_single2ext 26262306a36Sopenharmony_ci jra fp_getdest 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cifp_ext: 26562306a36Sopenharmony_ci getuser.l (%a1)+,%d0,fp_err_ua1,%a1 26662306a36Sopenharmony_ci lsr.l #8,%d0 26762306a36Sopenharmony_ci lsr.l #7,%d0 26862306a36Sopenharmony_ci lsr.w #1,%d0 26962306a36Sopenharmony_ci move.l %d0,(%a0)+ 27062306a36Sopenharmony_ci getuser.l (%a1)+,%d0,fp_err_ua1,%a1 27162306a36Sopenharmony_ci move.l %d0,(%a0)+ 27262306a36Sopenharmony_ci getuser.l (%a1),%d0,fp_err_ua1,%a1 27362306a36Sopenharmony_ci move.l %d0,(%a0) 27462306a36Sopenharmony_ci subq.l #8,%a0 27562306a36Sopenharmony_ci jra fp_getdest 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_cifp_pack: 27862306a36Sopenharmony_ci /* not supported yet */ 27962306a36Sopenharmony_ci jra fp_ill 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cifp_word: 28262306a36Sopenharmony_ci getuser.w (%a1),%d0,fp_err_ua1,%a1 28362306a36Sopenharmony_ci ext.l %d0 28462306a36Sopenharmony_ci jsr fp_conv_long2ext 28562306a36Sopenharmony_ci jra fp_getdest 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_cifp_double: 28862306a36Sopenharmony_ci jsr fp_conv_double2ext 28962306a36Sopenharmony_ci jra fp_getdest 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cifp_byte: 29262306a36Sopenharmony_ci getuser.b (%a1),%d0,fp_err_ua1,%a1 29362306a36Sopenharmony_ci extb.l %d0 29462306a36Sopenharmony_ci jsr fp_conv_long2ext 29562306a36Sopenharmony_ci| jra fp_getdest 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cifp_getdest: 29862306a36Sopenharmony_ci move.l %a0,%a1 29962306a36Sopenharmony_ci bfextu %d2{#22,#3},%d0 30062306a36Sopenharmony_ci printf PDECODE,",fp%d\n",1,%d0 30162306a36Sopenharmony_ci fp_get_fp_reg 30262306a36Sopenharmony_ci movem.l %a0/%a1,-(%sp) 30362306a36Sopenharmony_ci pea fp_finalrounding 30462306a36Sopenharmony_ci bfextu %d2{#25,#7},%d0 30562306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci .align 4 30862306a36Sopenharmony_ci0: 30962306a36Sopenharmony_ci .long fp_fmove_mem2fp, fp_fint, fp_fsinh, fp_fintrz 31062306a36Sopenharmony_ci .long fp_fsqrt, fp_ill, fp_flognp1, fp_ill 31162306a36Sopenharmony_ci .long fp_fetoxm1, fp_ftanh, fp_fatan, fp_ill 31262306a36Sopenharmony_ci .long fp_fasin, fp_fatanh, fp_fsin, fp_ftan 31362306a36Sopenharmony_ci .long fp_fetox, fp_ftwotox, fp_ftentox, fp_ill 31462306a36Sopenharmony_ci .long fp_flogn, fp_flog10, fp_flog2, fp_ill 31562306a36Sopenharmony_ci .long fp_fabs, fp_fcosh, fp_fneg, fp_ill 31662306a36Sopenharmony_ci .long fp_facos, fp_fcos, fp_fgetexp, fp_fgetman 31762306a36Sopenharmony_ci .long fp_fdiv, fp_fmod, fp_fadd, fp_fmul 31862306a36Sopenharmony_ci .long fpa_fsgldiv, fp_frem, fp_fscale, fpa_fsglmul 31962306a36Sopenharmony_ci .long fp_fsub, fp_ill, fp_ill, fp_ill 32062306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 32162306a36Sopenharmony_ci .long fp_fsincos0, fp_fsincos1, fp_fsincos2, fp_fsincos3 32262306a36Sopenharmony_ci .long fp_fsincos4, fp_fsincos5, fp_fsincos6, fp_fsincos7 32362306a36Sopenharmony_ci .long fp_fcmp, fp_ill, fp_ftst, fp_ill 32462306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 32562306a36Sopenharmony_ci .long fp_fsmove, fp_fssqrt, fp_ill, fp_ill 32662306a36Sopenharmony_ci .long fp_fdmove, fp_fdsqrt, fp_ill, fp_ill 32762306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 32862306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 32962306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 33062306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 33162306a36Sopenharmony_ci .long fp_fsabs, fp_ill, fp_fsneg, fp_ill 33262306a36Sopenharmony_ci .long fp_fdabs, fp_ill, fp_fdneg, fp_ill 33362306a36Sopenharmony_ci .long fp_fsdiv, fp_ill, fp_fsadd, fp_fsmul 33462306a36Sopenharmony_ci .long fp_fddiv, fp_ill, fp_fdadd, fp_fdmul 33562306a36Sopenharmony_ci .long fp_fssub, fp_ill, fp_ill, fp_ill 33662306a36Sopenharmony_ci .long fp_fdsub, fp_ill, fp_ill, fp_ill 33762306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 33862306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 33962306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 34062306a36Sopenharmony_ci .long fp_ill, fp_ill, fp_ill, fp_ill 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci | Instructions follow 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci | Move an (emulated) ROM constant 34562306a36Sopenharmony_cifp_fmovecr: 34662306a36Sopenharmony_ci bfextu %d2{#27,#5},%d0 34762306a36Sopenharmony_ci printf PINSTR,"fp_fmovecr #%d",1,%d0 34862306a36Sopenharmony_ci move.l %d0,%d1 34962306a36Sopenharmony_ci add.l %d0,%d0 35062306a36Sopenharmony_ci add.l %d1,%d0 35162306a36Sopenharmony_ci lea (fp_constants,%d0*4),%a0 35262306a36Sopenharmony_ci move.l #0x801cc0ff,%d0 35362306a36Sopenharmony_ci addq.l #1,%d1 35462306a36Sopenharmony_ci lsl.l %d1,%d0 35562306a36Sopenharmony_ci jcc 1f 35662306a36Sopenharmony_ci fp_set_sr FPSR_EXC_INEX2 | INEX2 exception 35762306a36Sopenharmony_ci1: moveq #-128,%d0 | continue with fmove 35862306a36Sopenharmony_ci and.l %d0,%d2 35962306a36Sopenharmony_ci jra fp_getdest 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci .data 36262306a36Sopenharmony_ci .align 4 36362306a36Sopenharmony_cifp_constants: 36462306a36Sopenharmony_ci .long 0x00004000,0xc90fdaa2,0x2168c235 | pi 36562306a36Sopenharmony_ci .extend 0,0,0,0,0,0,0,0,0,0 36662306a36Sopenharmony_ci .long 0x00003ffd,0x9a209a84,0xfbcff798 | log10(2) 36762306a36Sopenharmony_ci .long 0x00004000,0xadf85458,0xa2bb4a9a | e 36862306a36Sopenharmony_ci .long 0x00003fff,0xb8aa3b29,0x5c17f0bc | log2(e) 36962306a36Sopenharmony_ci .long 0x00003ffd,0xde5bd8a9,0x37287195 | log10(e) 37062306a36Sopenharmony_ci .long 0x00000000,0x00000000,0x00000000 | 0.0 37162306a36Sopenharmony_ci .long 0x00003ffe,0xb17217f7,0xd1cf79ac | 1n(2) 37262306a36Sopenharmony_ci .long 0x00004000,0x935d8ddd,0xaaa8ac17 | 1n(10) 37362306a36Sopenharmony_ci | read this as "1.0 * 2^0" - note the high bit in the mantissa 37462306a36Sopenharmony_ci .long 0x00003fff,0x80000000,0x00000000 | 10^0 37562306a36Sopenharmony_ci .long 0x00004002,0xa0000000,0x00000000 | 10^1 37662306a36Sopenharmony_ci .long 0x00004005,0xc8000000,0x00000000 | 10^2 37762306a36Sopenharmony_ci .long 0x0000400c,0x9c400000,0x00000000 | 10^4 37862306a36Sopenharmony_ci .long 0x00004019,0xbebc2000,0x00000000 | 10^8 37962306a36Sopenharmony_ci .long 0x00004034,0x8e1bc9bf,0x04000000 | 10^16 38062306a36Sopenharmony_ci .long 0x00004069,0x9dc5ada8,0x2b70b59e | 10^32 38162306a36Sopenharmony_ci .long 0x000040d3,0xc2781f49,0xffcfa6d5 | 10^64 38262306a36Sopenharmony_ci .long 0x000041a8,0x93ba47c9,0x80e98ce0 | 10^128 38362306a36Sopenharmony_ci .long 0x00004351,0xaa7eebfb,0x9df9de8e | 10^256 38462306a36Sopenharmony_ci .long 0x000046a3,0xe319a0ae,0xa60e91c7 | 10^512 38562306a36Sopenharmony_ci .long 0x00004d48,0xc9767586,0x81750c17 | 10^1024 38662306a36Sopenharmony_ci .long 0x00005a92,0x9e8b3b5d,0xc53d5de5 | 10^2048 38762306a36Sopenharmony_ci .long 0x00007525,0xc4605202,0x8a20979b | 10^4096 38862306a36Sopenharmony_ci .previous 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_cifp_fmove_mem2fp: 39162306a36Sopenharmony_ci printf PINSTR,"fmove %p,%p\n",2,%a0,%a1 39262306a36Sopenharmony_ci move.l (%a1)+,(%a0)+ 39362306a36Sopenharmony_ci move.l (%a1)+,(%a0)+ 39462306a36Sopenharmony_ci move.l (%a1),(%a0) 39562306a36Sopenharmony_ci subq.l #8,%a0 39662306a36Sopenharmony_ci rts 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_cifpa_fsglmul: 39962306a36Sopenharmony_ci move.l #fp_finalrounding_single_fast,(%sp) 40062306a36Sopenharmony_ci jra fp_fsglmul 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_cifpa_fsgldiv: 40362306a36Sopenharmony_ci move.l #fp_finalrounding_single_fast,(%sp) 40462306a36Sopenharmony_ci jra fp_fsgldiv 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci.macro fp_dosingleprec instr 40762306a36Sopenharmony_ci printf PINSTR,"single " 40862306a36Sopenharmony_ci move.l #fp_finalrounding_single,(%sp) 40962306a36Sopenharmony_ci jra \instr 41062306a36Sopenharmony_ci.endm 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci.macro fp_dodoubleprec instr 41362306a36Sopenharmony_ci printf PINSTR,"double " 41462306a36Sopenharmony_ci move.l #fp_finalrounding_double,(%sp) 41562306a36Sopenharmony_ci jra \instr 41662306a36Sopenharmony_ci.endm 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_cifp_fsmove: 41962306a36Sopenharmony_ci fp_dosingleprec fp_fmove_mem2fp 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_cifp_fssqrt: 42262306a36Sopenharmony_ci fp_dosingleprec fp_fsqrt 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cifp_fdmove: 42562306a36Sopenharmony_ci fp_dodoubleprec fp_fmove_mem2fp 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_cifp_fdsqrt: 42862306a36Sopenharmony_ci fp_dodoubleprec fp_fsqrt 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_cifp_fsabs: 43162306a36Sopenharmony_ci fp_dosingleprec fp_fabs 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_cifp_fsneg: 43462306a36Sopenharmony_ci fp_dosingleprec fp_fneg 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_cifp_fdabs: 43762306a36Sopenharmony_ci fp_dodoubleprec fp_fabs 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_cifp_fdneg: 44062306a36Sopenharmony_ci fp_dodoubleprec fp_fneg 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_cifp_fsdiv: 44362306a36Sopenharmony_ci fp_dosingleprec fp_fdiv 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_cifp_fsadd: 44662306a36Sopenharmony_ci fp_dosingleprec fp_fadd 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_cifp_fsmul: 44962306a36Sopenharmony_ci fp_dosingleprec fp_fmul 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_cifp_fddiv: 45262306a36Sopenharmony_ci fp_dodoubleprec fp_fdiv 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_cifp_fdadd: 45562306a36Sopenharmony_ci fp_dodoubleprec fp_fadd 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_cifp_fdmul: 45862306a36Sopenharmony_ci fp_dodoubleprec fp_fmul 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cifp_fssub: 46162306a36Sopenharmony_ci fp_dosingleprec fp_fsub 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_cifp_fdsub: 46462306a36Sopenharmony_ci fp_dodoubleprec fp_fsub 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_cifp_nonstd: 46762306a36Sopenharmony_ci fp_get_pc %a0 46862306a36Sopenharmony_ci getuser.l (%a0),%d0,fp_err_ua1,%a0 46962306a36Sopenharmony_ci printf ,"nonstd ((%08x)=%08x)\n",2,%a0,%d0 47062306a36Sopenharmony_ci moveq #-1,%d0 47162306a36Sopenharmony_ci rts 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci .data 47462306a36Sopenharmony_ci .align 4 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci | data sizes corresponding to the operand formats 47762306a36Sopenharmony_cifp_datasize: 47862306a36Sopenharmony_ci .word 4, 4, 12, 12, 2, 8, 1, 0 479