162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * fp_cond.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_fscc, fp_fbccw, fp_fbccl 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#ifdef FPU_EMU_DEBUG 4462306a36Sopenharmony_cifp_fnop: 4562306a36Sopenharmony_ci printf PDECODE,"fnop\n" 4662306a36Sopenharmony_ci jra fp_end 4762306a36Sopenharmony_ci#else 4862306a36Sopenharmony_ci#define fp_fnop fp_end 4962306a36Sopenharmony_ci#endif 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cifp_fbccw: 5262306a36Sopenharmony_ci tst.w %d2 5362306a36Sopenharmony_ci jeq fp_fnop 5462306a36Sopenharmony_ci printf PDECODE,"fbccw " 5562306a36Sopenharmony_ci fp_get_pc %a0 5662306a36Sopenharmony_ci lea (-2,%a0,%d2.w),%a0 5762306a36Sopenharmony_ci jra 1f 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cifp_fbccl: 6062306a36Sopenharmony_ci printf PDECODE,"fbccl " 6162306a36Sopenharmony_ci fp_get_pc %a0 6262306a36Sopenharmony_ci move.l %d2,%d0 6362306a36Sopenharmony_ci swap %d0 6462306a36Sopenharmony_ci fp_get_instr_word %d0,fp_err_ua1 6562306a36Sopenharmony_ci lea (-2,%a0,%d0.l),%a0 6662306a36Sopenharmony_ci1: printf PDECODE,"%x",1,%a0 6762306a36Sopenharmony_ci move.l %d2,%d0 6862306a36Sopenharmony_ci swap %d0 6962306a36Sopenharmony_ci jsr fp_compute_cond 7062306a36Sopenharmony_ci tst.l %d0 7162306a36Sopenharmony_ci jeq 1f 7262306a36Sopenharmony_ci fp_put_pc %a0,1 7362306a36Sopenharmony_ci1: printf PDECODE,"\n" 7462306a36Sopenharmony_ci jra fp_end 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cifp_fdbcc: 7762306a36Sopenharmony_ci printf PDECODE,"fdbcc " 7862306a36Sopenharmony_ci fp_get_pc %a1 | calculate new pc 7962306a36Sopenharmony_ci fp_get_instr_word %d0,fp_err_ua1 8062306a36Sopenharmony_ci add.w %d0,%a1 8162306a36Sopenharmony_ci fp_decode_addr_reg 8262306a36Sopenharmony_ci printf PDECODE,"d%d,%x\n",2,%d0,%a1 8362306a36Sopenharmony_ci swap %d1 | test condition in %d1 8462306a36Sopenharmony_ci tst.w %d1 8562306a36Sopenharmony_ci jne 2f 8662306a36Sopenharmony_ci move.l %d0,%d1 8762306a36Sopenharmony_ci jsr fp_get_data_reg 8862306a36Sopenharmony_ci subq.w #1,%d0 8962306a36Sopenharmony_ci jcs 1f 9062306a36Sopenharmony_ci fp_put_pc %a1,1 9162306a36Sopenharmony_ci1: jsr fp_put_data_reg 9262306a36Sopenharmony_ci2: jra fp_end 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci| set flags for decode macros for fs<cc> 9562306a36Sopenharmony_cido_fscc=1 9662306a36Sopenharmony_cido_no_pc_mode=1 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cifp_fscc: 9962306a36Sopenharmony_ci printf PDECODE,"fscc " 10062306a36Sopenharmony_ci move.l %d2,%d0 10162306a36Sopenharmony_ci jsr fp_compute_cond 10262306a36Sopenharmony_ci move.w %d0,%d1 10362306a36Sopenharmony_ci swap %d1 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci | decode addressing mode 10662306a36Sopenharmony_ci fp_decode_addr_mode 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci .long fp_data, fp_fdbcc 10962306a36Sopenharmony_ci .long fp_indirect, fp_postinc 11062306a36Sopenharmony_ci .long fp_predecr, fp_disp16 11162306a36Sopenharmony_ci .long fp_extmode0, fp_extmode1 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci | addressing mode: data register direct 11462306a36Sopenharmony_cifp_data: 11562306a36Sopenharmony_ci fp_mode_data_direct 11662306a36Sopenharmony_ci move.w %d0,%d1 | save register nr 11762306a36Sopenharmony_ci jsr fp_get_data_reg 11862306a36Sopenharmony_ci swap %d1 11962306a36Sopenharmony_ci move.b %d1,%d0 12062306a36Sopenharmony_ci swap %d1 12162306a36Sopenharmony_ci jsr fp_put_data_reg 12262306a36Sopenharmony_ci printf PDECODE,"\n" 12362306a36Sopenharmony_ci jra fp_end 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cifp_indirect: 12662306a36Sopenharmony_ci fp_mode_addr_indirect 12762306a36Sopenharmony_ci jra fp_do_scc 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cifp_postinc: 13062306a36Sopenharmony_ci fp_mode_addr_indirect_postinc 13162306a36Sopenharmony_ci jra fp_do_scc 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cifp_predecr: 13462306a36Sopenharmony_ci fp_mode_addr_indirect_predec 13562306a36Sopenharmony_ci jra fp_do_scc 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cifp_disp16: 13862306a36Sopenharmony_ci fp_mode_addr_indirect_disp16 13962306a36Sopenharmony_ci jra fp_do_scc 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cifp_extmode0: 14262306a36Sopenharmony_ci fp_mode_addr_indirect_extmode0 14362306a36Sopenharmony_ci jra fp_do_scc 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cifp_extmode1: 14662306a36Sopenharmony_ci bfextu %d2{#13,#3},%d0 14762306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci .align 4 15062306a36Sopenharmony_ci0: 15162306a36Sopenharmony_ci .long fp_absolute_short, fp_absolute_long 15262306a36Sopenharmony_ci .long fp_ill, fp_ill | NOTE: jump here to ftrap.x 15362306a36Sopenharmony_ci .long fp_ill, fp_ill 15462306a36Sopenharmony_ci .long fp_ill, fp_ill 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cifp_absolute_short: 15762306a36Sopenharmony_ci fp_mode_abs_short 15862306a36Sopenharmony_ci jra fp_do_scc 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cifp_absolute_long: 16162306a36Sopenharmony_ci fp_mode_abs_long 16262306a36Sopenharmony_ci| jra fp_do_scc 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cifp_do_scc: 16562306a36Sopenharmony_ci swap %d1 16662306a36Sopenharmony_ci putuser.b %d1,(%a0),fp_err_ua1,%a0 16762306a36Sopenharmony_ci printf PDECODE,"\n" 16862306a36Sopenharmony_ci jra fp_end 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci#define tst_NAN btst #24,%d1 17262306a36Sopenharmony_ci#define tst_Z btst #26,%d1 17362306a36Sopenharmony_ci#define tst_N btst #27,%d1 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cifp_compute_cond: 17662306a36Sopenharmony_ci move.l (FPD_FPSR,FPDATA),%d1 17762306a36Sopenharmony_ci btst #4,%d0 17862306a36Sopenharmony_ci jeq 1f 17962306a36Sopenharmony_ci tst_NAN 18062306a36Sopenharmony_ci jeq 1f 18162306a36Sopenharmony_ci bset #15,%d1 18262306a36Sopenharmony_ci bset #7,%d1 18362306a36Sopenharmony_ci move.l %d1,(FPD_FPSR,FPDATA) 18462306a36Sopenharmony_ci1: and.w #0xf,%d0 18562306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0.w*4]) 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci .align 4 18862306a36Sopenharmony_ci0: 18962306a36Sopenharmony_ci .long fp_f , fp_eq , fp_ogt, fp_oge 19062306a36Sopenharmony_ci .long fp_olt, fp_ole, fp_ogl, fp_or 19162306a36Sopenharmony_ci .long fp_un , fp_ueq, fp_ugt, fp_uge 19262306a36Sopenharmony_ci .long fp_ult, fp_ule, fp_ne , fp_t 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cifp_f: 19562306a36Sopenharmony_ci moveq #0,%d0 19662306a36Sopenharmony_ci rts 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_cifp_eq: 19962306a36Sopenharmony_ci moveq #0,%d0 20062306a36Sopenharmony_ci tst_Z 20162306a36Sopenharmony_ci jeq 1f 20262306a36Sopenharmony_ci moveq #-1,%d0 20362306a36Sopenharmony_ci1: rts 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cifp_ogt: 20662306a36Sopenharmony_ci moveq #0,%d0 20762306a36Sopenharmony_ci tst_NAN 20862306a36Sopenharmony_ci jne 1f 20962306a36Sopenharmony_ci tst_Z 21062306a36Sopenharmony_ci jne 1f 21162306a36Sopenharmony_ci tst_N 21262306a36Sopenharmony_ci jne 1f 21362306a36Sopenharmony_ci moveq #-1,%d0 21462306a36Sopenharmony_ci1: rts 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cifp_oge: 21762306a36Sopenharmony_ci moveq #-1,%d0 21862306a36Sopenharmony_ci tst_Z 21962306a36Sopenharmony_ci jne 2f 22062306a36Sopenharmony_ci tst_NAN 22162306a36Sopenharmony_ci jne 1f 22262306a36Sopenharmony_ci tst_N 22362306a36Sopenharmony_ci jeq 2f 22462306a36Sopenharmony_ci1: moveq #0,%d0 22562306a36Sopenharmony_ci2: rts 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_cifp_olt: 22862306a36Sopenharmony_ci moveq #0,%d0 22962306a36Sopenharmony_ci tst_NAN 23062306a36Sopenharmony_ci jne 1f 23162306a36Sopenharmony_ci tst_Z 23262306a36Sopenharmony_ci jne 1f 23362306a36Sopenharmony_ci tst_N 23462306a36Sopenharmony_ci jeq 1f 23562306a36Sopenharmony_ci moveq #-1,%d0 23662306a36Sopenharmony_ci1: rts 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cifp_ole: 23962306a36Sopenharmony_ci moveq #-1,%d0 24062306a36Sopenharmony_ci tst_Z 24162306a36Sopenharmony_ci jne 2f 24262306a36Sopenharmony_ci tst_NAN 24362306a36Sopenharmony_ci jne 1f 24462306a36Sopenharmony_ci tst_N 24562306a36Sopenharmony_ci jne 2f 24662306a36Sopenharmony_ci1: moveq #0,%d0 24762306a36Sopenharmony_ci2: rts 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_cifp_ogl: 25062306a36Sopenharmony_ci moveq #0,%d0 25162306a36Sopenharmony_ci tst_NAN 25262306a36Sopenharmony_ci jne 1f 25362306a36Sopenharmony_ci tst_Z 25462306a36Sopenharmony_ci jne 1f 25562306a36Sopenharmony_ci moveq #-1,%d0 25662306a36Sopenharmony_ci1: rts 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cifp_or: 25962306a36Sopenharmony_ci moveq #0,%d0 26062306a36Sopenharmony_ci tst_NAN 26162306a36Sopenharmony_ci jne 1f 26262306a36Sopenharmony_ci moveq #-1,%d0 26362306a36Sopenharmony_ci1: rts 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cifp_un: 26662306a36Sopenharmony_ci moveq #0,%d0 26762306a36Sopenharmony_ci tst_NAN 26862306a36Sopenharmony_ci jeq 1f 26962306a36Sopenharmony_ci moveq #-1,%d0 27062306a36Sopenharmony_ci rts 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cifp_ueq: 27362306a36Sopenharmony_ci moveq #-1,%d0 27462306a36Sopenharmony_ci tst_NAN 27562306a36Sopenharmony_ci jne 1f 27662306a36Sopenharmony_ci tst_Z 27762306a36Sopenharmony_ci jne 1f 27862306a36Sopenharmony_ci moveq #0,%d0 27962306a36Sopenharmony_ci1: rts 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cifp_ugt: 28262306a36Sopenharmony_ci moveq #-1,%d0 28362306a36Sopenharmony_ci tst_NAN 28462306a36Sopenharmony_ci jne 2f 28562306a36Sopenharmony_ci tst_N 28662306a36Sopenharmony_ci jne 1f 28762306a36Sopenharmony_ci tst_Z 28862306a36Sopenharmony_ci jeq 2f 28962306a36Sopenharmony_ci1: moveq #0,%d0 29062306a36Sopenharmony_ci2: rts 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cifp_uge: 29362306a36Sopenharmony_ci moveq #-1,%d0 29462306a36Sopenharmony_ci tst_NAN 29562306a36Sopenharmony_ci jne 1f 29662306a36Sopenharmony_ci tst_Z 29762306a36Sopenharmony_ci jne 1f 29862306a36Sopenharmony_ci tst_N 29962306a36Sopenharmony_ci jeq 1f 30062306a36Sopenharmony_ci moveq #0,%d0 30162306a36Sopenharmony_ci1: rts 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cifp_ult: 30462306a36Sopenharmony_ci moveq #-1,%d0 30562306a36Sopenharmony_ci tst_NAN 30662306a36Sopenharmony_ci jne 2f 30762306a36Sopenharmony_ci tst_Z 30862306a36Sopenharmony_ci jne 1f 30962306a36Sopenharmony_ci tst_N 31062306a36Sopenharmony_ci jne 2f 31162306a36Sopenharmony_ci1: moveq #0,%d0 31262306a36Sopenharmony_ci2: rts 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cifp_ule: 31562306a36Sopenharmony_ci moveq #-1,%d0 31662306a36Sopenharmony_ci tst_NAN 31762306a36Sopenharmony_ci jne 1f 31862306a36Sopenharmony_ci tst_Z 31962306a36Sopenharmony_ci jne 1f 32062306a36Sopenharmony_ci tst_N 32162306a36Sopenharmony_ci jne 1f 32262306a36Sopenharmony_ci moveq #0,%d0 32362306a36Sopenharmony_ci1: rts 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cifp_ne: 32662306a36Sopenharmony_ci moveq #0,%d0 32762306a36Sopenharmony_ci tst_Z 32862306a36Sopenharmony_ci jne 1f 32962306a36Sopenharmony_ci moveq #-1,%d0 33062306a36Sopenharmony_ci1: rts 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cifp_t: 33362306a36Sopenharmony_ci moveq #-1,%d0 33462306a36Sopenharmony_ci rts 335