18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * fp_move.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_cido_no_pc_mode=1 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci .globl fp_fmove_fp2mem 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cifp_fmove_fp2mem: 468c2ecf20Sopenharmony_ci clr.b (2+FPD_FPSR,FPDATA) 478c2ecf20Sopenharmony_ci fp_decode_dest_format 488c2ecf20Sopenharmony_ci move.w %d0,%d1 | store data size twice in %d1 498c2ecf20Sopenharmony_ci swap %d1 | one can be trashed below 508c2ecf20Sopenharmony_ci move.w %d0,%d1 518c2ecf20Sopenharmony_ci#ifdef FPU_EMU_DEBUG 528c2ecf20Sopenharmony_ci lea 0f,%a0 538c2ecf20Sopenharmony_ci clr.l %d0 548c2ecf20Sopenharmony_ci move.b (%a0,%d1.w),%d0 558c2ecf20Sopenharmony_ci printf PDECODE,"fmove.%c ",1,%d0 568c2ecf20Sopenharmony_ci fp_decode_src_reg 578c2ecf20Sopenharmony_ci printf PDECODE,"fp%d,",1,%d0 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci .data 608c2ecf20Sopenharmony_ci0: .byte 'l','s','x','p','w','d','b','p' 618c2ecf20Sopenharmony_ci .previous 628c2ecf20Sopenharmony_ci#endif 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci | encode addressing mode for dest 658c2ecf20Sopenharmony_ci fp_decode_addr_mode 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci .long fp_data, fp_ill 688c2ecf20Sopenharmony_ci .long fp_indirect, fp_postinc 698c2ecf20Sopenharmony_ci .long fp_predecr, fp_disp16 708c2ecf20Sopenharmony_ci .long fp_extmode0, fp_extmode1 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci | addressing mode: data register direct 738c2ecf20Sopenharmony_cifp_data: 748c2ecf20Sopenharmony_ci fp_mode_data_direct 758c2ecf20Sopenharmony_ci move.w %d0,%d1 768c2ecf20Sopenharmony_ci fp_decode_src_reg 778c2ecf20Sopenharmony_ci fp_get_fp_reg 788c2ecf20Sopenharmony_ci lea (FPD_TEMPFP1,FPDATA),%a1 798c2ecf20Sopenharmony_ci move.l (%a0)+,(%a1)+ 808c2ecf20Sopenharmony_ci move.l (%a0)+,(%a1)+ 818c2ecf20Sopenharmony_ci move.l (%a0),(%a1) 828c2ecf20Sopenharmony_ci lea (-8,%a1),%a0 838c2ecf20Sopenharmony_ci swap %d1 848c2ecf20Sopenharmony_ci move.l %d1,%d2 858c2ecf20Sopenharmony_ci printf PDECODE,"\n" 868c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d1.w*4]) 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci .align 4 898c2ecf20Sopenharmony_ci0: 908c2ecf20Sopenharmony_ci .long fp_data_long, fp_data_single 918c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 928c2ecf20Sopenharmony_ci .long fp_data_word, fp_ill 938c2ecf20Sopenharmony_ci .long fp_data_byte, fp_ill 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_cifp_data_byte: 968c2ecf20Sopenharmony_ci jsr fp_normalize_ext 978c2ecf20Sopenharmony_ci jsr fp_conv_ext2byte 988c2ecf20Sopenharmony_ci move.l %d0,%d1 998c2ecf20Sopenharmony_ci swap %d2 1008c2ecf20Sopenharmony_ci move.w %d2,%d0 1018c2ecf20Sopenharmony_ci jsr fp_get_data_reg 1028c2ecf20Sopenharmony_ci move.b %d1,%d0 1038c2ecf20Sopenharmony_ci move.w %d2,%d1 1048c2ecf20Sopenharmony_ci jsr fp_put_data_reg 1058c2ecf20Sopenharmony_ci jra fp_final 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_cifp_data_word: 1088c2ecf20Sopenharmony_ci jsr fp_normalize_ext 1098c2ecf20Sopenharmony_ci jsr fp_conv_ext2short 1108c2ecf20Sopenharmony_ci move.l %d0,%d1 1118c2ecf20Sopenharmony_ci swap %d2 1128c2ecf20Sopenharmony_ci move.w %d2,%d0 1138c2ecf20Sopenharmony_ci jsr fp_get_data_reg 1148c2ecf20Sopenharmony_ci move.w %d1,%d0 1158c2ecf20Sopenharmony_ci move.l %d2,%d1 1168c2ecf20Sopenharmony_ci jsr fp_put_data_reg 1178c2ecf20Sopenharmony_ci jra fp_final 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cifp_data_long: 1208c2ecf20Sopenharmony_ci jsr fp_normalize_ext 1218c2ecf20Sopenharmony_ci jsr fp_conv_ext2long 1228c2ecf20Sopenharmony_ci swap %d2 1238c2ecf20Sopenharmony_ci move.w %d2,%d1 1248c2ecf20Sopenharmony_ci jsr fp_put_data_reg 1258c2ecf20Sopenharmony_ci jra fp_final 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_cifp_data_single: 1288c2ecf20Sopenharmony_ci jsr fp_normalize_ext 1298c2ecf20Sopenharmony_ci jsr fp_conv_ext2single 1308c2ecf20Sopenharmony_ci swap %d2 1318c2ecf20Sopenharmony_ci move.w %d2,%d1 1328c2ecf20Sopenharmony_ci jsr fp_put_data_reg 1338c2ecf20Sopenharmony_ci jra fp_final 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci | addressing mode: address register indirect 1368c2ecf20Sopenharmony_cifp_indirect: 1378c2ecf20Sopenharmony_ci fp_mode_addr_indirect 1388c2ecf20Sopenharmony_ci jra fp_putdest 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci | addressing mode: address register indirect with postincrement 1418c2ecf20Sopenharmony_cifp_postinc: 1428c2ecf20Sopenharmony_ci fp_mode_addr_indirect_postinc 1438c2ecf20Sopenharmony_ci jra fp_putdest 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci | addressing mode: address register indirect with predecrement 1468c2ecf20Sopenharmony_cifp_predecr: 1478c2ecf20Sopenharmony_ci fp_mode_addr_indirect_predec 1488c2ecf20Sopenharmony_ci jra fp_putdest 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci | addressing mode: address register indirect with 16bit displacement 1518c2ecf20Sopenharmony_cifp_disp16: 1528c2ecf20Sopenharmony_ci fp_mode_addr_indirect_disp16 1538c2ecf20Sopenharmony_ci jra fp_putdest 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_cifp_extmode0: 1568c2ecf20Sopenharmony_ci fp_mode_addr_indirect_extmode0 1578c2ecf20Sopenharmony_ci jra fp_putdest 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_cifp_extmode1: 1608c2ecf20Sopenharmony_ci fp_decode_addr_reg 1618c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci .align 4 1648c2ecf20Sopenharmony_ci0: 1658c2ecf20Sopenharmony_ci .long fp_abs_short, fp_abs_long 1668c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 1678c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 1688c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_cifp_abs_short: 1718c2ecf20Sopenharmony_ci fp_mode_abs_short 1728c2ecf20Sopenharmony_ci jra fp_putdest 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_cifp_abs_long: 1758c2ecf20Sopenharmony_ci fp_mode_abs_long 1768c2ecf20Sopenharmony_ci jra fp_putdest 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_cifp_putdest: 1798c2ecf20Sopenharmony_ci move.l %a0,%a1 1808c2ecf20Sopenharmony_ci fp_decode_src_reg 1818c2ecf20Sopenharmony_ci move.l %d1,%d2 | save size 1828c2ecf20Sopenharmony_ci fp_get_fp_reg 1838c2ecf20Sopenharmony_ci printf PDECODE,"\n" 1848c2ecf20Sopenharmony_ci addq.l #8,%a0 1858c2ecf20Sopenharmony_ci move.l (%a0),-(%sp) 1868c2ecf20Sopenharmony_ci move.l -(%a0),-(%sp) 1878c2ecf20Sopenharmony_ci move.l -(%a0),-(%sp) 1888c2ecf20Sopenharmony_ci move.l %sp,%a0 1898c2ecf20Sopenharmony_ci jsr fp_normalize_ext 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci swap %d2 1928c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d2.w*4]) 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci .align 4 1958c2ecf20Sopenharmony_ci0: 1968c2ecf20Sopenharmony_ci .long fp_format_long, fp_format_single 1978c2ecf20Sopenharmony_ci .long fp_format_extended, fp_format_packed 1988c2ecf20Sopenharmony_ci .long fp_format_word, fp_format_double 1998c2ecf20Sopenharmony_ci .long fp_format_byte, fp_format_packed 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_cifp_format_long: 2028c2ecf20Sopenharmony_ci jsr fp_conv_ext2long 2038c2ecf20Sopenharmony_ci putuser.l %d0,(%a1),fp_err_ua1,%a1 2048c2ecf20Sopenharmony_ci jra fp_finish_move 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_cifp_format_single: 2078c2ecf20Sopenharmony_ci jsr fp_conv_ext2single 2088c2ecf20Sopenharmony_ci putuser.l %d0,(%a1),fp_err_ua1,%a1 2098c2ecf20Sopenharmony_ci jra fp_finish_move 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_cifp_format_extended: 2128c2ecf20Sopenharmony_ci move.l (%a0)+,%d0 2138c2ecf20Sopenharmony_ci lsl.w #1,%d0 2148c2ecf20Sopenharmony_ci lsl.l #7,%d0 2158c2ecf20Sopenharmony_ci lsl.l #8,%d0 2168c2ecf20Sopenharmony_ci putuser.l %d0,(%a1)+,fp_err_ua1,%a1 2178c2ecf20Sopenharmony_ci move.l (%a0)+,%d0 2188c2ecf20Sopenharmony_ci putuser.l %d0,(%a1)+,fp_err_ua1,%a1 2198c2ecf20Sopenharmony_ci move.l (%a0),%d0 2208c2ecf20Sopenharmony_ci putuser.l %d0,(%a1),fp_err_ua1,%a1 2218c2ecf20Sopenharmony_ci jra fp_finish_move 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_cifp_format_packed: 2248c2ecf20Sopenharmony_ci /* not supported yet */ 2258c2ecf20Sopenharmony_ci lea (12,%sp),%sp 2268c2ecf20Sopenharmony_ci jra fp_ill 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cifp_format_word: 2298c2ecf20Sopenharmony_ci jsr fp_conv_ext2short 2308c2ecf20Sopenharmony_ci putuser.w %d0,(%a1),fp_err_ua1,%a1 2318c2ecf20Sopenharmony_ci jra fp_finish_move 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_cifp_format_double: 2348c2ecf20Sopenharmony_ci jsr fp_conv_ext2double 2358c2ecf20Sopenharmony_ci jra fp_finish_move 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_cifp_format_byte: 2388c2ecf20Sopenharmony_ci jsr fp_conv_ext2byte 2398c2ecf20Sopenharmony_ci putuser.b %d0,(%a1),fp_err_ua1,%a1 2408c2ecf20Sopenharmony_ci| jra fp_finish_move 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_cifp_finish_move: 2438c2ecf20Sopenharmony_ci lea (12,%sp),%sp 2448c2ecf20Sopenharmony_ci jra fp_final 245