1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * fp_cond.S 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright Roman Zippel, 1997. All rights reserved. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 7*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 8*4882a593Smuzhiyun * are met: 9*4882a593Smuzhiyun * 1. Redistributions of source code must retain the above copyright 10*4882a593Smuzhiyun * notice, and the entire permission notice in its entirety, 11*4882a593Smuzhiyun * including the disclaimer of warranties. 12*4882a593Smuzhiyun * 2. Redistributions in binary form must reproduce the above copyright 13*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in the 14*4882a593Smuzhiyun * documentation and/or other materials provided with the distribution. 15*4882a593Smuzhiyun * 3. The name of the author may not be used to endorse or promote 16*4882a593Smuzhiyun * products derived from this software without specific prior 17*4882a593Smuzhiyun * written permission. 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * ALTERNATIVELY, this product may be distributed under the terms of 20*4882a593Smuzhiyun * the GNU General Public License, in which case the provisions of the GPL are 21*4882a593Smuzhiyun * required INSTEAD OF the above restrictions. (This clause is 22*4882a593Smuzhiyun * necessary due to a potential bad interaction between the GPL and 23*4882a593Smuzhiyun * the restrictions contained in a BSD-style copyright.) 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 26*4882a593Smuzhiyun * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 27*4882a593Smuzhiyun * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 28*4882a593Smuzhiyun * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 29*4882a593Smuzhiyun * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 30*4882a593Smuzhiyun * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 31*4882a593Smuzhiyun * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32*4882a593Smuzhiyun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 33*4882a593Smuzhiyun * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34*4882a593Smuzhiyun * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 35*4882a593Smuzhiyun * OF THE POSSIBILITY OF SUCH DAMAGE. 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun#include "fp_emu.h" 39*4882a593Smuzhiyun#include "fp_decode.h" 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun .globl fp_fscc, fp_fbccw, fp_fbccl 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun#ifdef FPU_EMU_DEBUG 44*4882a593Smuzhiyunfp_fnop: 45*4882a593Smuzhiyun printf PDECODE,"fnop\n" 46*4882a593Smuzhiyun jra fp_end 47*4882a593Smuzhiyun#else 48*4882a593Smuzhiyun#define fp_fnop fp_end 49*4882a593Smuzhiyun#endif 50*4882a593Smuzhiyun 51*4882a593Smuzhiyunfp_fbccw: 52*4882a593Smuzhiyun tst.w %d2 53*4882a593Smuzhiyun jeq fp_fnop 54*4882a593Smuzhiyun printf PDECODE,"fbccw " 55*4882a593Smuzhiyun fp_get_pc %a0 56*4882a593Smuzhiyun lea (-2,%a0,%d2.w),%a0 57*4882a593Smuzhiyun jra 1f 58*4882a593Smuzhiyun 59*4882a593Smuzhiyunfp_fbccl: 60*4882a593Smuzhiyun printf PDECODE,"fbccl " 61*4882a593Smuzhiyun fp_get_pc %a0 62*4882a593Smuzhiyun move.l %d2,%d0 63*4882a593Smuzhiyun swap %d0 64*4882a593Smuzhiyun fp_get_instr_word %d0,fp_err_ua1 65*4882a593Smuzhiyun lea (-2,%a0,%d0.l),%a0 66*4882a593Smuzhiyun1: printf PDECODE,"%x",1,%a0 67*4882a593Smuzhiyun move.l %d2,%d0 68*4882a593Smuzhiyun swap %d0 69*4882a593Smuzhiyun jsr fp_compute_cond 70*4882a593Smuzhiyun tst.l %d0 71*4882a593Smuzhiyun jeq 1f 72*4882a593Smuzhiyun fp_put_pc %a0,1 73*4882a593Smuzhiyun1: printf PDECODE,"\n" 74*4882a593Smuzhiyun jra fp_end 75*4882a593Smuzhiyun 76*4882a593Smuzhiyunfp_fdbcc: 77*4882a593Smuzhiyun printf PDECODE,"fdbcc " 78*4882a593Smuzhiyun fp_get_pc %a1 | calculate new pc 79*4882a593Smuzhiyun fp_get_instr_word %d0,fp_err_ua1 80*4882a593Smuzhiyun add.w %d0,%a1 81*4882a593Smuzhiyun fp_decode_addr_reg 82*4882a593Smuzhiyun printf PDECODE,"d%d,%x\n",2,%d0,%a1 83*4882a593Smuzhiyun swap %d1 | test condition in %d1 84*4882a593Smuzhiyun tst.w %d1 85*4882a593Smuzhiyun jne 2f 86*4882a593Smuzhiyun move.l %d0,%d1 87*4882a593Smuzhiyun jsr fp_get_data_reg 88*4882a593Smuzhiyun subq.w #1,%d0 89*4882a593Smuzhiyun jcs 1f 90*4882a593Smuzhiyun fp_put_pc %a1,1 91*4882a593Smuzhiyun1: jsr fp_put_data_reg 92*4882a593Smuzhiyun2: jra fp_end 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun| set flags for decode macros for fs<cc> 95*4882a593Smuzhiyundo_fscc=1 96*4882a593Smuzhiyundo_no_pc_mode=1 97*4882a593Smuzhiyun 98*4882a593Smuzhiyunfp_fscc: 99*4882a593Smuzhiyun printf PDECODE,"fscc " 100*4882a593Smuzhiyun move.l %d2,%d0 101*4882a593Smuzhiyun jsr fp_compute_cond 102*4882a593Smuzhiyun move.w %d0,%d1 103*4882a593Smuzhiyun swap %d1 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun | decode addressing mode 106*4882a593Smuzhiyun fp_decode_addr_mode 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun .long fp_data, fp_fdbcc 109*4882a593Smuzhiyun .long fp_indirect, fp_postinc 110*4882a593Smuzhiyun .long fp_predecr, fp_disp16 111*4882a593Smuzhiyun .long fp_extmode0, fp_extmode1 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun | addressing mode: data register direct 114*4882a593Smuzhiyunfp_data: 115*4882a593Smuzhiyun fp_mode_data_direct 116*4882a593Smuzhiyun move.w %d0,%d1 | save register nr 117*4882a593Smuzhiyun jsr fp_get_data_reg 118*4882a593Smuzhiyun swap %d1 119*4882a593Smuzhiyun move.b %d1,%d0 120*4882a593Smuzhiyun swap %d1 121*4882a593Smuzhiyun jsr fp_put_data_reg 122*4882a593Smuzhiyun printf PDECODE,"\n" 123*4882a593Smuzhiyun jra fp_end 124*4882a593Smuzhiyun 125*4882a593Smuzhiyunfp_indirect: 126*4882a593Smuzhiyun fp_mode_addr_indirect 127*4882a593Smuzhiyun jra fp_do_scc 128*4882a593Smuzhiyun 129*4882a593Smuzhiyunfp_postinc: 130*4882a593Smuzhiyun fp_mode_addr_indirect_postinc 131*4882a593Smuzhiyun jra fp_do_scc 132*4882a593Smuzhiyun 133*4882a593Smuzhiyunfp_predecr: 134*4882a593Smuzhiyun fp_mode_addr_indirect_predec 135*4882a593Smuzhiyun jra fp_do_scc 136*4882a593Smuzhiyun 137*4882a593Smuzhiyunfp_disp16: 138*4882a593Smuzhiyun fp_mode_addr_indirect_disp16 139*4882a593Smuzhiyun jra fp_do_scc 140*4882a593Smuzhiyun 141*4882a593Smuzhiyunfp_extmode0: 142*4882a593Smuzhiyun fp_mode_addr_indirect_extmode0 143*4882a593Smuzhiyun jra fp_do_scc 144*4882a593Smuzhiyun 145*4882a593Smuzhiyunfp_extmode1: 146*4882a593Smuzhiyun bfextu %d2{#13,#3},%d0 147*4882a593Smuzhiyun jmp ([0f:w,%pc,%d0*4]) 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun .align 4 150*4882a593Smuzhiyun0: 151*4882a593Smuzhiyun .long fp_absolute_short, fp_absolute_long 152*4882a593Smuzhiyun .long fp_ill, fp_ill | NOTE: jump here to ftrap.x 153*4882a593Smuzhiyun .long fp_ill, fp_ill 154*4882a593Smuzhiyun .long fp_ill, fp_ill 155*4882a593Smuzhiyun 156*4882a593Smuzhiyunfp_absolute_short: 157*4882a593Smuzhiyun fp_mode_abs_short 158*4882a593Smuzhiyun jra fp_do_scc 159*4882a593Smuzhiyun 160*4882a593Smuzhiyunfp_absolute_long: 161*4882a593Smuzhiyun fp_mode_abs_long 162*4882a593Smuzhiyun| jra fp_do_scc 163*4882a593Smuzhiyun 164*4882a593Smuzhiyunfp_do_scc: 165*4882a593Smuzhiyun swap %d1 166*4882a593Smuzhiyun putuser.b %d1,(%a0),fp_err_ua1,%a0 167*4882a593Smuzhiyun printf PDECODE,"\n" 168*4882a593Smuzhiyun jra fp_end 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun#define tst_NAN btst #24,%d1 172*4882a593Smuzhiyun#define tst_Z btst #26,%d1 173*4882a593Smuzhiyun#define tst_N btst #27,%d1 174*4882a593Smuzhiyun 175*4882a593Smuzhiyunfp_compute_cond: 176*4882a593Smuzhiyun move.l (FPD_FPSR,FPDATA),%d1 177*4882a593Smuzhiyun btst #4,%d0 178*4882a593Smuzhiyun jeq 1f 179*4882a593Smuzhiyun tst_NAN 180*4882a593Smuzhiyun jeq 1f 181*4882a593Smuzhiyun bset #15,%d1 182*4882a593Smuzhiyun bset #7,%d1 183*4882a593Smuzhiyun move.l %d1,(FPD_FPSR,FPDATA) 184*4882a593Smuzhiyun1: and.w #0xf,%d0 185*4882a593Smuzhiyun jmp ([0f:w,%pc,%d0.w*4]) 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun .align 4 188*4882a593Smuzhiyun0: 189*4882a593Smuzhiyun .long fp_f , fp_eq , fp_ogt, fp_oge 190*4882a593Smuzhiyun .long fp_olt, fp_ole, fp_ogl, fp_or 191*4882a593Smuzhiyun .long fp_un , fp_ueq, fp_ugt, fp_uge 192*4882a593Smuzhiyun .long fp_ult, fp_ule, fp_ne , fp_t 193*4882a593Smuzhiyun 194*4882a593Smuzhiyunfp_f: 195*4882a593Smuzhiyun moveq #0,%d0 196*4882a593Smuzhiyun rts 197*4882a593Smuzhiyun 198*4882a593Smuzhiyunfp_eq: 199*4882a593Smuzhiyun moveq #0,%d0 200*4882a593Smuzhiyun tst_Z 201*4882a593Smuzhiyun jeq 1f 202*4882a593Smuzhiyun moveq #-1,%d0 203*4882a593Smuzhiyun1: rts 204*4882a593Smuzhiyun 205*4882a593Smuzhiyunfp_ogt: 206*4882a593Smuzhiyun moveq #0,%d0 207*4882a593Smuzhiyun tst_NAN 208*4882a593Smuzhiyun jne 1f 209*4882a593Smuzhiyun tst_Z 210*4882a593Smuzhiyun jne 1f 211*4882a593Smuzhiyun tst_N 212*4882a593Smuzhiyun jne 1f 213*4882a593Smuzhiyun moveq #-1,%d0 214*4882a593Smuzhiyun1: rts 215*4882a593Smuzhiyun 216*4882a593Smuzhiyunfp_oge: 217*4882a593Smuzhiyun moveq #-1,%d0 218*4882a593Smuzhiyun tst_Z 219*4882a593Smuzhiyun jne 2f 220*4882a593Smuzhiyun tst_NAN 221*4882a593Smuzhiyun jne 1f 222*4882a593Smuzhiyun tst_N 223*4882a593Smuzhiyun jeq 2f 224*4882a593Smuzhiyun1: moveq #0,%d0 225*4882a593Smuzhiyun2: rts 226*4882a593Smuzhiyun 227*4882a593Smuzhiyunfp_olt: 228*4882a593Smuzhiyun moveq #0,%d0 229*4882a593Smuzhiyun tst_NAN 230*4882a593Smuzhiyun jne 1f 231*4882a593Smuzhiyun tst_Z 232*4882a593Smuzhiyun jne 1f 233*4882a593Smuzhiyun tst_N 234*4882a593Smuzhiyun jeq 1f 235*4882a593Smuzhiyun moveq #-1,%d0 236*4882a593Smuzhiyun1: rts 237*4882a593Smuzhiyun 238*4882a593Smuzhiyunfp_ole: 239*4882a593Smuzhiyun moveq #-1,%d0 240*4882a593Smuzhiyun tst_Z 241*4882a593Smuzhiyun jne 2f 242*4882a593Smuzhiyun tst_NAN 243*4882a593Smuzhiyun jne 1f 244*4882a593Smuzhiyun tst_N 245*4882a593Smuzhiyun jne 2f 246*4882a593Smuzhiyun1: moveq #0,%d0 247*4882a593Smuzhiyun2: rts 248*4882a593Smuzhiyun 249*4882a593Smuzhiyunfp_ogl: 250*4882a593Smuzhiyun moveq #0,%d0 251*4882a593Smuzhiyun tst_NAN 252*4882a593Smuzhiyun jne 1f 253*4882a593Smuzhiyun tst_Z 254*4882a593Smuzhiyun jne 1f 255*4882a593Smuzhiyun moveq #-1,%d0 256*4882a593Smuzhiyun1: rts 257*4882a593Smuzhiyun 258*4882a593Smuzhiyunfp_or: 259*4882a593Smuzhiyun moveq #0,%d0 260*4882a593Smuzhiyun tst_NAN 261*4882a593Smuzhiyun jne 1f 262*4882a593Smuzhiyun moveq #-1,%d0 263*4882a593Smuzhiyun1: rts 264*4882a593Smuzhiyun 265*4882a593Smuzhiyunfp_un: 266*4882a593Smuzhiyun moveq #0,%d0 267*4882a593Smuzhiyun tst_NAN 268*4882a593Smuzhiyun jeq 1f 269*4882a593Smuzhiyun moveq #-1,%d0 270*4882a593Smuzhiyun rts 271*4882a593Smuzhiyun 272*4882a593Smuzhiyunfp_ueq: 273*4882a593Smuzhiyun moveq #-1,%d0 274*4882a593Smuzhiyun tst_NAN 275*4882a593Smuzhiyun jne 1f 276*4882a593Smuzhiyun tst_Z 277*4882a593Smuzhiyun jne 1f 278*4882a593Smuzhiyun moveq #0,%d0 279*4882a593Smuzhiyun1: rts 280*4882a593Smuzhiyun 281*4882a593Smuzhiyunfp_ugt: 282*4882a593Smuzhiyun moveq #-1,%d0 283*4882a593Smuzhiyun tst_NAN 284*4882a593Smuzhiyun jne 2f 285*4882a593Smuzhiyun tst_N 286*4882a593Smuzhiyun jne 1f 287*4882a593Smuzhiyun tst_Z 288*4882a593Smuzhiyun jeq 2f 289*4882a593Smuzhiyun1: moveq #0,%d0 290*4882a593Smuzhiyun2: rts 291*4882a593Smuzhiyun 292*4882a593Smuzhiyunfp_uge: 293*4882a593Smuzhiyun moveq #-1,%d0 294*4882a593Smuzhiyun tst_NAN 295*4882a593Smuzhiyun jne 1f 296*4882a593Smuzhiyun tst_Z 297*4882a593Smuzhiyun jne 1f 298*4882a593Smuzhiyun tst_N 299*4882a593Smuzhiyun jeq 1f 300*4882a593Smuzhiyun moveq #0,%d0 301*4882a593Smuzhiyun1: rts 302*4882a593Smuzhiyun 303*4882a593Smuzhiyunfp_ult: 304*4882a593Smuzhiyun moveq #-1,%d0 305*4882a593Smuzhiyun tst_NAN 306*4882a593Smuzhiyun jne 2f 307*4882a593Smuzhiyun tst_Z 308*4882a593Smuzhiyun jne 1f 309*4882a593Smuzhiyun tst_N 310*4882a593Smuzhiyun jne 2f 311*4882a593Smuzhiyun1: moveq #0,%d0 312*4882a593Smuzhiyun2: rts 313*4882a593Smuzhiyun 314*4882a593Smuzhiyunfp_ule: 315*4882a593Smuzhiyun moveq #-1,%d0 316*4882a593Smuzhiyun tst_NAN 317*4882a593Smuzhiyun jne 1f 318*4882a593Smuzhiyun tst_Z 319*4882a593Smuzhiyun jne 1f 320*4882a593Smuzhiyun tst_N 321*4882a593Smuzhiyun jne 1f 322*4882a593Smuzhiyun moveq #0,%d0 323*4882a593Smuzhiyun1: rts 324*4882a593Smuzhiyun 325*4882a593Smuzhiyunfp_ne: 326*4882a593Smuzhiyun moveq #0,%d0 327*4882a593Smuzhiyun tst_Z 328*4882a593Smuzhiyun jne 1f 329*4882a593Smuzhiyun moveq #-1,%d0 330*4882a593Smuzhiyun1: rts 331*4882a593Smuzhiyun 332*4882a593Smuzhiyunfp_t: 333*4882a593Smuzhiyun moveq #-1,%d0 334*4882a593Smuzhiyun rts 335