11da177e4SLinus Torvalds/* 21da177e4SLinus Torvalds * fp_cond.S 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Copyright Roman Zippel, 1997. All rights reserved. 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Redistribution and use in source and binary forms, with or without 71da177e4SLinus Torvalds * modification, are permitted provided that the following conditions 81da177e4SLinus Torvalds * are met: 91da177e4SLinus Torvalds * 1. Redistributions of source code must retain the above copyright 101da177e4SLinus Torvalds * notice, and the entire permission notice in its entirety, 111da177e4SLinus Torvalds * including the disclaimer of warranties. 121da177e4SLinus Torvalds * 2. Redistributions in binary form must reproduce the above copyright 131da177e4SLinus Torvalds * notice, this list of conditions and the following disclaimer in the 141da177e4SLinus Torvalds * documentation and/or other materials provided with the distribution. 151da177e4SLinus Torvalds * 3. The name of the author may not be used to endorse or promote 161da177e4SLinus Torvalds * products derived from this software without specific prior 171da177e4SLinus Torvalds * written permission. 181da177e4SLinus Torvalds * 191da177e4SLinus Torvalds * ALTERNATIVELY, this product may be distributed under the terms of 201da177e4SLinus Torvalds * the GNU General Public License, in which case the provisions of the GPL are 211da177e4SLinus Torvalds * required INSTEAD OF the above restrictions. (This clause is 221da177e4SLinus Torvalds * necessary due to a potential bad interaction between the GPL and 231da177e4SLinus Torvalds * the restrictions contained in a BSD-style copyright.) 241da177e4SLinus Torvalds * 251da177e4SLinus Torvalds * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 261da177e4SLinus Torvalds * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 271da177e4SLinus Torvalds * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 281da177e4SLinus Torvalds * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 291da177e4SLinus Torvalds * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 301da177e4SLinus Torvalds * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 311da177e4SLinus Torvalds * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 321da177e4SLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 331da177e4SLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 341da177e4SLinus Torvalds * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 351da177e4SLinus Torvalds * OF THE POSSIBILITY OF SUCH DAMAGE. 361da177e4SLinus Torvalds */ 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds#include "fp_emu.h" 391da177e4SLinus Torvalds#include "fp_decode.h" 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds .globl fp_fscc, fp_fbccw, fp_fbccl 421da177e4SLinus Torvalds 431da177e4SLinus Torvalds#ifdef FPU_EMU_DEBUG 441da177e4SLinus Torvaldsfp_fnop: 451da177e4SLinus Torvalds printf PDECODE,"fnop\n" 461da177e4SLinus Torvalds jra fp_end 471da177e4SLinus Torvalds#else 481da177e4SLinus Torvalds#define fp_fnop fp_end 491da177e4SLinus Torvalds#endif 501da177e4SLinus Torvalds 511da177e4SLinus Torvaldsfp_fbccw: 521da177e4SLinus Torvalds tst.w %d2 531da177e4SLinus Torvalds jeq fp_fnop 541da177e4SLinus Torvalds printf PDECODE,"fbccw " 551da177e4SLinus Torvalds fp_get_pc %a0 561da177e4SLinus Torvalds lea (-2,%a0,%d2.w),%a0 571da177e4SLinus Torvalds jra 1f 581da177e4SLinus Torvalds 591da177e4SLinus Torvaldsfp_fbccl: 601da177e4SLinus Torvalds printf PDECODE,"fbccl " 611da177e4SLinus Torvalds fp_get_pc %a0 621da177e4SLinus Torvalds move.l %d2,%d0 631da177e4SLinus Torvalds swap %d0 641da177e4SLinus Torvalds fp_get_instr_word %d0,fp_err_ua1 651da177e4SLinus Torvalds lea (-2,%a0,%d0.l),%a0 661da177e4SLinus Torvalds1: printf PDECODE,"%x",1,%a0 671da177e4SLinus Torvalds move.l %d2,%d0 681da177e4SLinus Torvalds swap %d0 691da177e4SLinus Torvalds jsr fp_compute_cond 701da177e4SLinus Torvalds tst.l %d0 711da177e4SLinus Torvalds jeq 1f 721da177e4SLinus Torvalds fp_put_pc %a0,1 731da177e4SLinus Torvalds1: printf PDECODE,"\n" 741da177e4SLinus Torvalds jra fp_end 751da177e4SLinus Torvalds 761da177e4SLinus Torvaldsfp_fdbcc: 771da177e4SLinus Torvalds printf PDECODE,"fdbcc " 781da177e4SLinus Torvalds fp_get_pc %a1 | calculate new pc 791da177e4SLinus Torvalds fp_get_instr_word %d0,fp_err_ua1 801da177e4SLinus Torvalds add.w %d0,%a1 811da177e4SLinus Torvalds fp_decode_addr_reg 821da177e4SLinus Torvalds printf PDECODE,"d%d,%x\n",2,%d0,%a1 831da177e4SLinus Torvalds swap %d1 | test condition in %d1 841da177e4SLinus Torvalds tst.w %d1 851da177e4SLinus Torvalds jne 2f 861da177e4SLinus Torvalds move.l %d0,%d1 871da177e4SLinus Torvalds jsr fp_get_data_reg 881da177e4SLinus Torvalds subq.w #1,%d0 891da177e4SLinus Torvalds jcs 1f 901da177e4SLinus Torvalds fp_put_pc %a1,1 911da177e4SLinus Torvalds1: jsr fp_put_data_reg 921da177e4SLinus Torvalds2: jra fp_end 931da177e4SLinus Torvalds 941da177e4SLinus Torvalds| set flags for decode macros for fs<cc> 951da177e4SLinus Torvaldsdo_fscc=1 961da177e4SLinus Torvaldsdo_no_pc_mode=1 971da177e4SLinus Torvalds 981da177e4SLinus Torvaldsfp_fscc: 991da177e4SLinus Torvalds printf PDECODE,"fscc " 1001da177e4SLinus Torvalds move.l %d2,%d0 1011da177e4SLinus Torvalds jsr fp_compute_cond 1021da177e4SLinus Torvalds move.w %d0,%d1 1031da177e4SLinus Torvalds swap %d1 1041da177e4SLinus Torvalds 1051da177e4SLinus Torvalds | decode addressing mode 1061da177e4SLinus Torvalds fp_decode_addr_mode 1071da177e4SLinus Torvalds 1081da177e4SLinus Torvalds .long fp_data, fp_fdbcc 1091da177e4SLinus Torvalds .long fp_indirect, fp_postinc 1101da177e4SLinus Torvalds .long fp_predecr, fp_disp16 1111da177e4SLinus Torvalds .long fp_extmode0, fp_extmode1 1121da177e4SLinus Torvalds 1131da177e4SLinus Torvalds | addressing mode: data register direct 1141da177e4SLinus Torvaldsfp_data: 1151da177e4SLinus Torvalds fp_mode_data_direct 1161da177e4SLinus Torvalds move.w %d0,%d1 | save register nr 1171da177e4SLinus Torvalds jsr fp_get_data_reg 1181da177e4SLinus Torvalds swap %d1 1191da177e4SLinus Torvalds move.b %d1,%d0 1201da177e4SLinus Torvalds swap %d1 1211da177e4SLinus Torvalds jsr fp_put_data_reg 1221da177e4SLinus Torvalds printf PDECODE,"\n" 1231da177e4SLinus Torvalds jra fp_end 1241da177e4SLinus Torvalds 1251da177e4SLinus Torvaldsfp_indirect: 1261da177e4SLinus Torvalds fp_mode_addr_indirect 1271da177e4SLinus Torvalds jra fp_do_scc 1281da177e4SLinus Torvalds 1291da177e4SLinus Torvaldsfp_postinc: 1301da177e4SLinus Torvalds fp_mode_addr_indirect_postinc 1311da177e4SLinus Torvalds jra fp_do_scc 1321da177e4SLinus Torvalds 1331da177e4SLinus Torvaldsfp_predecr: 1341da177e4SLinus Torvalds fp_mode_addr_indirect_predec 1351da177e4SLinus Torvalds jra fp_do_scc 1361da177e4SLinus Torvalds 1371da177e4SLinus Torvaldsfp_disp16: 1381da177e4SLinus Torvalds fp_mode_addr_indirect_disp16 1391da177e4SLinus Torvalds jra fp_do_scc 1401da177e4SLinus Torvalds 1411da177e4SLinus Torvaldsfp_extmode0: 1421da177e4SLinus Torvalds fp_mode_addr_indirect_extmode0 1431da177e4SLinus Torvalds jra fp_do_scc 1441da177e4SLinus Torvalds 1451da177e4SLinus Torvaldsfp_extmode1: 1461da177e4SLinus Torvalds bfextu %d2{#13,#3},%d0 1471da177e4SLinus Torvalds jmp ([0f:w,%pc,%d0*4]) 1481da177e4SLinus Torvalds 1491da177e4SLinus Torvalds .align 4 1501da177e4SLinus Torvalds0: 1511da177e4SLinus Torvalds .long fp_absolute_short, fp_absolute_long 1521da177e4SLinus Torvalds .long fp_ill, fp_ill | NOTE: jump here to ftrap.x 1531da177e4SLinus Torvalds .long fp_ill, fp_ill 1541da177e4SLinus Torvalds .long fp_ill, fp_ill 1551da177e4SLinus Torvalds 1561da177e4SLinus Torvaldsfp_absolute_short: 1571da177e4SLinus Torvalds fp_mode_abs_short 1581da177e4SLinus Torvalds jra fp_do_scc 1591da177e4SLinus Torvalds 1601da177e4SLinus Torvaldsfp_absolute_long: 1611da177e4SLinus Torvalds fp_mode_abs_long 1621da177e4SLinus Torvalds| jra fp_do_scc 1631da177e4SLinus Torvalds 1641da177e4SLinus Torvaldsfp_do_scc: 1651da177e4SLinus Torvalds swap %d1 1661da177e4SLinus Torvalds putuser.b %d1,(%a0),fp_err_ua1,%a0 1671da177e4SLinus Torvalds printf PDECODE,"\n" 1681da177e4SLinus Torvalds jra fp_end 1691da177e4SLinus Torvalds 1701da177e4SLinus Torvalds 1711da177e4SLinus Torvalds#define tst_NAN btst #24,%d1 1721da177e4SLinus Torvalds#define tst_Z btst #26,%d1 1731da177e4SLinus Torvalds#define tst_N btst #27,%d1 1741da177e4SLinus Torvalds 1751da177e4SLinus Torvaldsfp_compute_cond: 1761da177e4SLinus Torvalds move.l (FPD_FPSR,FPDATA),%d1 1771da177e4SLinus Torvalds btst #4,%d0 1781da177e4SLinus Torvalds jeq 1f 1791da177e4SLinus Torvalds tst_NAN 1801da177e4SLinus Torvalds jeq 1f 1811da177e4SLinus Torvalds bset #15,%d1 1821da177e4SLinus Torvalds bset #7,%d1 1831da177e4SLinus Torvalds move.l %d1,(FPD_FPSR,FPDATA) 1841da177e4SLinus Torvalds1: and.w #0xf,%d0 1851da177e4SLinus Torvalds jmp ([0f:w,%pc,%d0.w*4]) 1861da177e4SLinus Torvalds 1871da177e4SLinus Torvalds .align 4 1881da177e4SLinus Torvalds0: 1891da177e4SLinus Torvalds .long fp_f , fp_eq , fp_ogt, fp_oge 1901da177e4SLinus Torvalds .long fp_olt, fp_ole, fp_ogl, fp_or 1911da177e4SLinus Torvalds .long fp_un , fp_ueq, fp_ugt, fp_uge 1921da177e4SLinus Torvalds .long fp_ult, fp_ule, fp_ne , fp_t 1931da177e4SLinus Torvalds 1941da177e4SLinus Torvaldsfp_f: 1951da177e4SLinus Torvalds moveq #0,%d0 1961da177e4SLinus Torvalds rts 1971da177e4SLinus Torvalds 1981da177e4SLinus Torvaldsfp_eq: 1991da177e4SLinus Torvalds moveq #0,%d0 2001da177e4SLinus Torvalds tst_Z 2011da177e4SLinus Torvalds jeq 1f 2021da177e4SLinus Torvalds moveq #-1,%d0 2031da177e4SLinus Torvalds1: rts 2041da177e4SLinus Torvalds 2051da177e4SLinus Torvaldsfp_ogt: 2061da177e4SLinus Torvalds moveq #0,%d0 2071da177e4SLinus Torvalds tst_NAN 2081da177e4SLinus Torvalds jne 1f 2091da177e4SLinus Torvalds tst_Z 2101da177e4SLinus Torvalds jne 1f 2111da177e4SLinus Torvalds tst_N 2121da177e4SLinus Torvalds jne 1f 2131da177e4SLinus Torvalds moveq #-1,%d0 2141da177e4SLinus Torvalds1: rts 2151da177e4SLinus Torvalds 2161da177e4SLinus Torvaldsfp_oge: 2171da177e4SLinus Torvalds moveq #-1,%d0 2181da177e4SLinus Torvalds tst_Z 2191da177e4SLinus Torvalds jne 2f 2201da177e4SLinus Torvalds tst_NAN 2211da177e4SLinus Torvalds jne 1f 2221da177e4SLinus Torvalds tst_N 2231da177e4SLinus Torvalds jeq 2f 2241da177e4SLinus Torvalds1: moveq #0,%d0 2251da177e4SLinus Torvalds2: rts 2261da177e4SLinus Torvalds 2271da177e4SLinus Torvaldsfp_olt: 2281da177e4SLinus Torvalds moveq #0,%d0 2291da177e4SLinus Torvalds tst_NAN 2301da177e4SLinus Torvalds jne 1f 2311da177e4SLinus Torvalds tst_Z 2321da177e4SLinus Torvalds jne 1f 2331da177e4SLinus Torvalds tst_N 2341da177e4SLinus Torvalds jeq 1f 2351da177e4SLinus Torvalds moveq #-1,%d0 2361da177e4SLinus Torvalds1: rts 2371da177e4SLinus Torvalds 2381da177e4SLinus Torvaldsfp_ole: 2391da177e4SLinus Torvalds moveq #-1,%d0 2401da177e4SLinus Torvalds tst_Z 2411da177e4SLinus Torvalds jne 2f 2421da177e4SLinus Torvalds tst_NAN 2431da177e4SLinus Torvalds jne 1f 2441da177e4SLinus Torvalds tst_N 2451da177e4SLinus Torvalds jne 2f 2461da177e4SLinus Torvalds1: moveq #0,%d0 2471da177e4SLinus Torvalds2: rts 2481da177e4SLinus Torvalds 2491da177e4SLinus Torvaldsfp_ogl: 2501da177e4SLinus Torvalds moveq #0,%d0 2511da177e4SLinus Torvalds tst_NAN 2521da177e4SLinus Torvalds jne 1f 2531da177e4SLinus Torvalds tst_Z 2541da177e4SLinus Torvalds jne 1f 2551da177e4SLinus Torvalds moveq #-1,%d0 2561da177e4SLinus Torvalds1: rts 2571da177e4SLinus Torvalds 2581da177e4SLinus Torvaldsfp_or: 2591da177e4SLinus Torvalds moveq #0,%d0 2601da177e4SLinus Torvalds tst_NAN 2611da177e4SLinus Torvalds jne 1f 2621da177e4SLinus Torvalds moveq #-1,%d0 2631da177e4SLinus Torvalds1: rts 2641da177e4SLinus Torvalds 2651da177e4SLinus Torvaldsfp_un: 2661da177e4SLinus Torvalds moveq #0,%d0 2671da177e4SLinus Torvalds tst_NAN 2681da177e4SLinus Torvalds jeq 1f 2691da177e4SLinus Torvalds moveq #-1,%d0 2701da177e4SLinus Torvalds rts 2711da177e4SLinus Torvalds 2721da177e4SLinus Torvaldsfp_ueq: 2731da177e4SLinus Torvalds moveq #-1,%d0 2741da177e4SLinus Torvalds tst_NAN 2751da177e4SLinus Torvalds jne 1f 2761da177e4SLinus Torvalds tst_Z 2771da177e4SLinus Torvalds jne 1f 2781da177e4SLinus Torvalds moveq #0,%d0 2791da177e4SLinus Torvalds1: rts 2801da177e4SLinus Torvalds 2811da177e4SLinus Torvaldsfp_ugt: 2821da177e4SLinus Torvalds moveq #-1,%d0 2831da177e4SLinus Torvalds tst_NAN 2841da177e4SLinus Torvalds jne 2f 2851da177e4SLinus Torvalds tst_N 2861da177e4SLinus Torvalds jne 1f 2871da177e4SLinus Torvalds tst_Z 2881da177e4SLinus Torvalds jeq 2f 2891da177e4SLinus Torvalds1: moveq #0,%d0 2901da177e4SLinus Torvalds2: rts 2911da177e4SLinus Torvalds 2921da177e4SLinus Torvaldsfp_uge: 2931da177e4SLinus Torvalds moveq #-1,%d0 2941da177e4SLinus Torvalds tst_NAN 2951da177e4SLinus Torvalds jne 1f 2961da177e4SLinus Torvalds tst_Z 2971da177e4SLinus Torvalds jne 1f 2981da177e4SLinus Torvalds tst_N 2991da177e4SLinus Torvalds jeq 1f 3001da177e4SLinus Torvalds moveq #0,%d0 3011da177e4SLinus Torvalds1: rts 3021da177e4SLinus Torvalds 3031da177e4SLinus Torvaldsfp_ult: 3041da177e4SLinus Torvalds moveq #-1,%d0 3051da177e4SLinus Torvalds tst_NAN 3061da177e4SLinus Torvalds jne 2f 3071da177e4SLinus Torvalds tst_Z 3081da177e4SLinus Torvalds jne 1f 3091da177e4SLinus Torvalds tst_N 3101da177e4SLinus Torvalds jne 2f 3111da177e4SLinus Torvalds1: moveq #0,%d0 3121da177e4SLinus Torvalds2: rts 3131da177e4SLinus Torvalds 3141da177e4SLinus Torvaldsfp_ule: 3151da177e4SLinus Torvalds moveq #-1,%d0 3161da177e4SLinus Torvalds tst_NAN 3171da177e4SLinus Torvalds jne 1f 3181da177e4SLinus Torvalds tst_Z 3191da177e4SLinus Torvalds jne 1f 3201da177e4SLinus Torvalds tst_N 3211da177e4SLinus Torvalds jne 1f 3221da177e4SLinus Torvalds moveq #0,%d0 3231da177e4SLinus Torvalds1: rts 3241da177e4SLinus Torvalds 3251da177e4SLinus Torvaldsfp_ne: 3261da177e4SLinus Torvalds moveq #0,%d0 3271da177e4SLinus Torvalds tst_Z 3281da177e4SLinus Torvalds jne 1f 3291da177e4SLinus Torvalds moveq #-1,%d0 3301da177e4SLinus Torvalds1: rts 3311da177e4SLinus Torvalds 3321da177e4SLinus Torvaldsfp_t: 3331da177e4SLinus Torvalds moveq #-1,%d0 3341da177e4SLinus Torvalds rts 335