18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * fp_cond.S 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright Roman Zippel, 1997. All rights reserved. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 78c2ecf20Sopenharmony_ci * modification, are permitted provided that the following conditions 88c2ecf20Sopenharmony_ci * are met: 98c2ecf20Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 108c2ecf20Sopenharmony_ci * notice, and the entire permission notice in its entirety, 118c2ecf20Sopenharmony_ci * including the disclaimer of warranties. 128c2ecf20Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 138c2ecf20Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 148c2ecf20Sopenharmony_ci * documentation and/or other materials provided with the distribution. 158c2ecf20Sopenharmony_ci * 3. The name of the author may not be used to endorse or promote 168c2ecf20Sopenharmony_ci * products derived from this software without specific prior 178c2ecf20Sopenharmony_ci * written permission. 188c2ecf20Sopenharmony_ci * 198c2ecf20Sopenharmony_ci * ALTERNATIVELY, this product may be distributed under the terms of 208c2ecf20Sopenharmony_ci * the GNU General Public License, in which case the provisions of the GPL are 218c2ecf20Sopenharmony_ci * required INSTEAD OF the above restrictions. (This clause is 228c2ecf20Sopenharmony_ci * necessary due to a potential bad interaction between the GPL and 238c2ecf20Sopenharmony_ci * the restrictions contained in a BSD-style copyright.) 248c2ecf20Sopenharmony_ci * 258c2ecf20Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 268c2ecf20Sopenharmony_ci * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 278c2ecf20Sopenharmony_ci * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 288c2ecf20Sopenharmony_ci * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 298c2ecf20Sopenharmony_ci * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 308c2ecf20Sopenharmony_ci * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 318c2ecf20Sopenharmony_ci * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 328c2ecf20Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 338c2ecf20Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 348c2ecf20Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 358c2ecf20Sopenharmony_ci * OF THE POSSIBILITY OF SUCH DAMAGE. 368c2ecf20Sopenharmony_ci */ 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#include "fp_emu.h" 398c2ecf20Sopenharmony_ci#include "fp_decode.h" 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci .globl fp_fscc, fp_fbccw, fp_fbccl 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci#ifdef FPU_EMU_DEBUG 448c2ecf20Sopenharmony_cifp_fnop: 458c2ecf20Sopenharmony_ci printf PDECODE,"fnop\n" 468c2ecf20Sopenharmony_ci jra fp_end 478c2ecf20Sopenharmony_ci#else 488c2ecf20Sopenharmony_ci#define fp_fnop fp_end 498c2ecf20Sopenharmony_ci#endif 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cifp_fbccw: 528c2ecf20Sopenharmony_ci tst.w %d2 538c2ecf20Sopenharmony_ci jeq fp_fnop 548c2ecf20Sopenharmony_ci printf PDECODE,"fbccw " 558c2ecf20Sopenharmony_ci fp_get_pc %a0 568c2ecf20Sopenharmony_ci lea (-2,%a0,%d2.w),%a0 578c2ecf20Sopenharmony_ci jra 1f 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cifp_fbccl: 608c2ecf20Sopenharmony_ci printf PDECODE,"fbccl " 618c2ecf20Sopenharmony_ci fp_get_pc %a0 628c2ecf20Sopenharmony_ci move.l %d2,%d0 638c2ecf20Sopenharmony_ci swap %d0 648c2ecf20Sopenharmony_ci fp_get_instr_word %d0,fp_err_ua1 658c2ecf20Sopenharmony_ci lea (-2,%a0,%d0.l),%a0 668c2ecf20Sopenharmony_ci1: printf PDECODE,"%x",1,%a0 678c2ecf20Sopenharmony_ci move.l %d2,%d0 688c2ecf20Sopenharmony_ci swap %d0 698c2ecf20Sopenharmony_ci jsr fp_compute_cond 708c2ecf20Sopenharmony_ci tst.l %d0 718c2ecf20Sopenharmony_ci jeq 1f 728c2ecf20Sopenharmony_ci fp_put_pc %a0,1 738c2ecf20Sopenharmony_ci1: printf PDECODE,"\n" 748c2ecf20Sopenharmony_ci jra fp_end 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cifp_fdbcc: 778c2ecf20Sopenharmony_ci printf PDECODE,"fdbcc " 788c2ecf20Sopenharmony_ci fp_get_pc %a1 | calculate new pc 798c2ecf20Sopenharmony_ci fp_get_instr_word %d0,fp_err_ua1 808c2ecf20Sopenharmony_ci add.w %d0,%a1 818c2ecf20Sopenharmony_ci fp_decode_addr_reg 828c2ecf20Sopenharmony_ci printf PDECODE,"d%d,%x\n",2,%d0,%a1 838c2ecf20Sopenharmony_ci swap %d1 | test condition in %d1 848c2ecf20Sopenharmony_ci tst.w %d1 858c2ecf20Sopenharmony_ci jne 2f 868c2ecf20Sopenharmony_ci move.l %d0,%d1 878c2ecf20Sopenharmony_ci jsr fp_get_data_reg 888c2ecf20Sopenharmony_ci subq.w #1,%d0 898c2ecf20Sopenharmony_ci jcs 1f 908c2ecf20Sopenharmony_ci fp_put_pc %a1,1 918c2ecf20Sopenharmony_ci1: jsr fp_put_data_reg 928c2ecf20Sopenharmony_ci2: jra fp_end 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci| set flags for decode macros for fs<cc> 958c2ecf20Sopenharmony_cido_fscc=1 968c2ecf20Sopenharmony_cido_no_pc_mode=1 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cifp_fscc: 998c2ecf20Sopenharmony_ci printf PDECODE,"fscc " 1008c2ecf20Sopenharmony_ci move.l %d2,%d0 1018c2ecf20Sopenharmony_ci jsr fp_compute_cond 1028c2ecf20Sopenharmony_ci move.w %d0,%d1 1038c2ecf20Sopenharmony_ci swap %d1 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci | decode addressing mode 1068c2ecf20Sopenharmony_ci fp_decode_addr_mode 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci .long fp_data, fp_fdbcc 1098c2ecf20Sopenharmony_ci .long fp_indirect, fp_postinc 1108c2ecf20Sopenharmony_ci .long fp_predecr, fp_disp16 1118c2ecf20Sopenharmony_ci .long fp_extmode0, fp_extmode1 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci | addressing mode: data register direct 1148c2ecf20Sopenharmony_cifp_data: 1158c2ecf20Sopenharmony_ci fp_mode_data_direct 1168c2ecf20Sopenharmony_ci move.w %d0,%d1 | save register nr 1178c2ecf20Sopenharmony_ci jsr fp_get_data_reg 1188c2ecf20Sopenharmony_ci swap %d1 1198c2ecf20Sopenharmony_ci move.b %d1,%d0 1208c2ecf20Sopenharmony_ci swap %d1 1218c2ecf20Sopenharmony_ci jsr fp_put_data_reg 1228c2ecf20Sopenharmony_ci printf PDECODE,"\n" 1238c2ecf20Sopenharmony_ci jra fp_end 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_cifp_indirect: 1268c2ecf20Sopenharmony_ci fp_mode_addr_indirect 1278c2ecf20Sopenharmony_ci jra fp_do_scc 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_cifp_postinc: 1308c2ecf20Sopenharmony_ci fp_mode_addr_indirect_postinc 1318c2ecf20Sopenharmony_ci jra fp_do_scc 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cifp_predecr: 1348c2ecf20Sopenharmony_ci fp_mode_addr_indirect_predec 1358c2ecf20Sopenharmony_ci jra fp_do_scc 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_cifp_disp16: 1388c2ecf20Sopenharmony_ci fp_mode_addr_indirect_disp16 1398c2ecf20Sopenharmony_ci jra fp_do_scc 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_cifp_extmode0: 1428c2ecf20Sopenharmony_ci fp_mode_addr_indirect_extmode0 1438c2ecf20Sopenharmony_ci jra fp_do_scc 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_cifp_extmode1: 1468c2ecf20Sopenharmony_ci bfextu %d2{#13,#3},%d0 1478c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci .align 4 1508c2ecf20Sopenharmony_ci0: 1518c2ecf20Sopenharmony_ci .long fp_absolute_short, fp_absolute_long 1528c2ecf20Sopenharmony_ci .long fp_ill, fp_ill | NOTE: jump here to ftrap.x 1538c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 1548c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_cifp_absolute_short: 1578c2ecf20Sopenharmony_ci fp_mode_abs_short 1588c2ecf20Sopenharmony_ci jra fp_do_scc 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_cifp_absolute_long: 1618c2ecf20Sopenharmony_ci fp_mode_abs_long 1628c2ecf20Sopenharmony_ci| jra fp_do_scc 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_cifp_do_scc: 1658c2ecf20Sopenharmony_ci swap %d1 1668c2ecf20Sopenharmony_ci putuser.b %d1,(%a0),fp_err_ua1,%a0 1678c2ecf20Sopenharmony_ci printf PDECODE,"\n" 1688c2ecf20Sopenharmony_ci jra fp_end 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci#define tst_NAN btst #24,%d1 1728c2ecf20Sopenharmony_ci#define tst_Z btst #26,%d1 1738c2ecf20Sopenharmony_ci#define tst_N btst #27,%d1 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_cifp_compute_cond: 1768c2ecf20Sopenharmony_ci move.l (FPD_FPSR,FPDATA),%d1 1778c2ecf20Sopenharmony_ci btst #4,%d0 1788c2ecf20Sopenharmony_ci jeq 1f 1798c2ecf20Sopenharmony_ci tst_NAN 1808c2ecf20Sopenharmony_ci jeq 1f 1818c2ecf20Sopenharmony_ci bset #15,%d1 1828c2ecf20Sopenharmony_ci bset #7,%d1 1838c2ecf20Sopenharmony_ci move.l %d1,(FPD_FPSR,FPDATA) 1848c2ecf20Sopenharmony_ci1: and.w #0xf,%d0 1858c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0.w*4]) 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci .align 4 1888c2ecf20Sopenharmony_ci0: 1898c2ecf20Sopenharmony_ci .long fp_f , fp_eq , fp_ogt, fp_oge 1908c2ecf20Sopenharmony_ci .long fp_olt, fp_ole, fp_ogl, fp_or 1918c2ecf20Sopenharmony_ci .long fp_un , fp_ueq, fp_ugt, fp_uge 1928c2ecf20Sopenharmony_ci .long fp_ult, fp_ule, fp_ne , fp_t 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_cifp_f: 1958c2ecf20Sopenharmony_ci moveq #0,%d0 1968c2ecf20Sopenharmony_ci rts 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_cifp_eq: 1998c2ecf20Sopenharmony_ci moveq #0,%d0 2008c2ecf20Sopenharmony_ci tst_Z 2018c2ecf20Sopenharmony_ci jeq 1f 2028c2ecf20Sopenharmony_ci moveq #-1,%d0 2038c2ecf20Sopenharmony_ci1: rts 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_cifp_ogt: 2068c2ecf20Sopenharmony_ci moveq #0,%d0 2078c2ecf20Sopenharmony_ci tst_NAN 2088c2ecf20Sopenharmony_ci jne 1f 2098c2ecf20Sopenharmony_ci tst_Z 2108c2ecf20Sopenharmony_ci jne 1f 2118c2ecf20Sopenharmony_ci tst_N 2128c2ecf20Sopenharmony_ci jne 1f 2138c2ecf20Sopenharmony_ci moveq #-1,%d0 2148c2ecf20Sopenharmony_ci1: rts 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_cifp_oge: 2178c2ecf20Sopenharmony_ci moveq #-1,%d0 2188c2ecf20Sopenharmony_ci tst_Z 2198c2ecf20Sopenharmony_ci jne 2f 2208c2ecf20Sopenharmony_ci tst_NAN 2218c2ecf20Sopenharmony_ci jne 1f 2228c2ecf20Sopenharmony_ci tst_N 2238c2ecf20Sopenharmony_ci jeq 2f 2248c2ecf20Sopenharmony_ci1: moveq #0,%d0 2258c2ecf20Sopenharmony_ci2: rts 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_cifp_olt: 2288c2ecf20Sopenharmony_ci moveq #0,%d0 2298c2ecf20Sopenharmony_ci tst_NAN 2308c2ecf20Sopenharmony_ci jne 1f 2318c2ecf20Sopenharmony_ci tst_Z 2328c2ecf20Sopenharmony_ci jne 1f 2338c2ecf20Sopenharmony_ci tst_N 2348c2ecf20Sopenharmony_ci jeq 1f 2358c2ecf20Sopenharmony_ci moveq #-1,%d0 2368c2ecf20Sopenharmony_ci1: rts 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_cifp_ole: 2398c2ecf20Sopenharmony_ci moveq #-1,%d0 2408c2ecf20Sopenharmony_ci tst_Z 2418c2ecf20Sopenharmony_ci jne 2f 2428c2ecf20Sopenharmony_ci tst_NAN 2438c2ecf20Sopenharmony_ci jne 1f 2448c2ecf20Sopenharmony_ci tst_N 2458c2ecf20Sopenharmony_ci jne 2f 2468c2ecf20Sopenharmony_ci1: moveq #0,%d0 2478c2ecf20Sopenharmony_ci2: rts 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_cifp_ogl: 2508c2ecf20Sopenharmony_ci moveq #0,%d0 2518c2ecf20Sopenharmony_ci tst_NAN 2528c2ecf20Sopenharmony_ci jne 1f 2538c2ecf20Sopenharmony_ci tst_Z 2548c2ecf20Sopenharmony_ci jne 1f 2558c2ecf20Sopenharmony_ci moveq #-1,%d0 2568c2ecf20Sopenharmony_ci1: rts 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_cifp_or: 2598c2ecf20Sopenharmony_ci moveq #0,%d0 2608c2ecf20Sopenharmony_ci tst_NAN 2618c2ecf20Sopenharmony_ci jne 1f 2628c2ecf20Sopenharmony_ci moveq #-1,%d0 2638c2ecf20Sopenharmony_ci1: rts 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_cifp_un: 2668c2ecf20Sopenharmony_ci moveq #0,%d0 2678c2ecf20Sopenharmony_ci tst_NAN 2688c2ecf20Sopenharmony_ci jeq 1f 2698c2ecf20Sopenharmony_ci moveq #-1,%d0 2708c2ecf20Sopenharmony_ci rts 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_cifp_ueq: 2738c2ecf20Sopenharmony_ci moveq #-1,%d0 2748c2ecf20Sopenharmony_ci tst_NAN 2758c2ecf20Sopenharmony_ci jne 1f 2768c2ecf20Sopenharmony_ci tst_Z 2778c2ecf20Sopenharmony_ci jne 1f 2788c2ecf20Sopenharmony_ci moveq #0,%d0 2798c2ecf20Sopenharmony_ci1: rts 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_cifp_ugt: 2828c2ecf20Sopenharmony_ci moveq #-1,%d0 2838c2ecf20Sopenharmony_ci tst_NAN 2848c2ecf20Sopenharmony_ci jne 2f 2858c2ecf20Sopenharmony_ci tst_N 2868c2ecf20Sopenharmony_ci jne 1f 2878c2ecf20Sopenharmony_ci tst_Z 2888c2ecf20Sopenharmony_ci jeq 2f 2898c2ecf20Sopenharmony_ci1: moveq #0,%d0 2908c2ecf20Sopenharmony_ci2: rts 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_cifp_uge: 2938c2ecf20Sopenharmony_ci moveq #-1,%d0 2948c2ecf20Sopenharmony_ci tst_NAN 2958c2ecf20Sopenharmony_ci jne 1f 2968c2ecf20Sopenharmony_ci tst_Z 2978c2ecf20Sopenharmony_ci jne 1f 2988c2ecf20Sopenharmony_ci tst_N 2998c2ecf20Sopenharmony_ci jeq 1f 3008c2ecf20Sopenharmony_ci moveq #0,%d0 3018c2ecf20Sopenharmony_ci1: rts 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_cifp_ult: 3048c2ecf20Sopenharmony_ci moveq #-1,%d0 3058c2ecf20Sopenharmony_ci tst_NAN 3068c2ecf20Sopenharmony_ci jne 2f 3078c2ecf20Sopenharmony_ci tst_Z 3088c2ecf20Sopenharmony_ci jne 1f 3098c2ecf20Sopenharmony_ci tst_N 3108c2ecf20Sopenharmony_ci jne 2f 3118c2ecf20Sopenharmony_ci1: moveq #0,%d0 3128c2ecf20Sopenharmony_ci2: rts 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_cifp_ule: 3158c2ecf20Sopenharmony_ci moveq #-1,%d0 3168c2ecf20Sopenharmony_ci tst_NAN 3178c2ecf20Sopenharmony_ci jne 1f 3188c2ecf20Sopenharmony_ci tst_Z 3198c2ecf20Sopenharmony_ci jne 1f 3208c2ecf20Sopenharmony_ci tst_N 3218c2ecf20Sopenharmony_ci jne 1f 3228c2ecf20Sopenharmony_ci moveq #0,%d0 3238c2ecf20Sopenharmony_ci1: rts 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_cifp_ne: 3268c2ecf20Sopenharmony_ci moveq #0,%d0 3278c2ecf20Sopenharmony_ci tst_Z 3288c2ecf20Sopenharmony_ci jne 1f 3298c2ecf20Sopenharmony_ci moveq #-1,%d0 3308c2ecf20Sopenharmony_ci1: rts 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_cifp_t: 3338c2ecf20Sopenharmony_ci moveq #-1,%d0 3348c2ecf20Sopenharmony_ci rts 335