18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * fp_movem.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| set flags for decode macros for fmovem 428c2ecf20Sopenharmony_cido_fmovem=1 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci .globl fp_fmovem_fp, fp_fmovem_cr 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci| %d1 contains the mask and count of the register list 478c2ecf20Sopenharmony_ci| for other register usage see fp_decode.h 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cifp_fmovem_fp: 508c2ecf20Sopenharmony_ci printf PDECODE,"fmovem.x " 518c2ecf20Sopenharmony_ci | get register list and count them 528c2ecf20Sopenharmony_ci btst #11,%d2 538c2ecf20Sopenharmony_ci jne 1f 548c2ecf20Sopenharmony_ci bfextu %d2{#24,#8},%d0 | static register list 558c2ecf20Sopenharmony_ci jra 2f 568c2ecf20Sopenharmony_ci1: bfextu %d2{#25,#3},%d0 | dynamic register list 578c2ecf20Sopenharmony_ci jsr fp_get_data_reg 588c2ecf20Sopenharmony_ci2: move.l %d0,%d1 598c2ecf20Sopenharmony_ci swap %d1 608c2ecf20Sopenharmony_ci jra 2f 618c2ecf20Sopenharmony_ci1: addq.w #1,%d1 | count the # of registers in 628c2ecf20Sopenharmony_ci2: lsr.b #1,%d0 | register list and keep it in %d1 638c2ecf20Sopenharmony_ci jcs 1b 648c2ecf20Sopenharmony_ci jne 2b 658c2ecf20Sopenharmony_ci printf PDECODE,"#%08x",1,%d1 668c2ecf20Sopenharmony_ci#ifdef FPU_EMU_DEBUG 678c2ecf20Sopenharmony_ci btst #12,%d2 688c2ecf20Sopenharmony_ci jne 1f 698c2ecf20Sopenharmony_ci printf PDECODE,"-" | decremental move 708c2ecf20Sopenharmony_ci jra 2f 718c2ecf20Sopenharmony_ci1: printf PDECODE,"+" | incremental move 728c2ecf20Sopenharmony_ci2: btst #13,%d2 738c2ecf20Sopenharmony_ci jeq 1f 748c2ecf20Sopenharmony_ci printf PDECODE,"->" | fpu -> cpu 758c2ecf20Sopenharmony_ci jra 2f 768c2ecf20Sopenharmony_ci1: printf PDECODE,"<-" | fpu <- cpu 778c2ecf20Sopenharmony_ci2: 788c2ecf20Sopenharmony_ci#endif 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci | decode address mode 818c2ecf20Sopenharmony_ci fp_decode_addr_mode 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 848c2ecf20Sopenharmony_ci .long fpr_indirect, fpr_postinc 858c2ecf20Sopenharmony_ci .long fpr_predecr, fpr_disp16 868c2ecf20Sopenharmony_ci .long fpr_extmode0, fpr_extmode1 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci | addressing mode: address register indirect 898c2ecf20Sopenharmony_cifpr_indirect: 908c2ecf20Sopenharmony_ci fp_mode_addr_indirect 918c2ecf20Sopenharmony_ci jra fpr_do_movem 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci | addressing mode: address register indirect with postincrement 948c2ecf20Sopenharmony_cifpr_postinc: 958c2ecf20Sopenharmony_ci fp_mode_addr_indirect_postinc 968c2ecf20Sopenharmony_ci jra fpr_do_movem 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cifpr_predecr: 998c2ecf20Sopenharmony_ci fp_mode_addr_indirect_predec 1008c2ecf20Sopenharmony_ci jra fpr_do_movem 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci | addressing mode: address register/programm counter indirect 1038c2ecf20Sopenharmony_ci | with 16bit displacement 1048c2ecf20Sopenharmony_cifpr_disp16: 1058c2ecf20Sopenharmony_ci fp_mode_addr_indirect_disp16 1068c2ecf20Sopenharmony_ci jra fpr_do_movem 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cifpr_extmode0: 1098c2ecf20Sopenharmony_ci fp_mode_addr_indirect_extmode0 1108c2ecf20Sopenharmony_ci jra fpr_do_movem 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_cifpr_extmode1: 1138c2ecf20Sopenharmony_ci fp_decode_addr_reg 1148c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci .align 4 1178c2ecf20Sopenharmony_ci0: 1188c2ecf20Sopenharmony_ci .long fpr_absolute_short, fpr_absolute_long 1198c2ecf20Sopenharmony_ci .long fpr_disp16, fpr_extmode0 1208c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 1218c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_cifpr_absolute_short: 1248c2ecf20Sopenharmony_ci fp_mode_abs_short 1258c2ecf20Sopenharmony_ci jra fpr_do_movem 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_cifpr_absolute_long: 1288c2ecf20Sopenharmony_ci fp_mode_abs_long 1298c2ecf20Sopenharmony_ci| jra fpr_do_movem 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_cifpr_do_movem: 1328c2ecf20Sopenharmony_ci swap %d1 | get fpu register list 1338c2ecf20Sopenharmony_ci lea (FPD_FPREG,FPDATA),%a1 1348c2ecf20Sopenharmony_ci moveq #12,%d0 1358c2ecf20Sopenharmony_ci btst #12,%d2 1368c2ecf20Sopenharmony_ci jne 1f 1378c2ecf20Sopenharmony_ci lea (-12,%a1,%d0*8),%a1 1388c2ecf20Sopenharmony_ci neg.l %d0 1398c2ecf20Sopenharmony_ci1: btst #13,%d2 1408c2ecf20Sopenharmony_ci jne 4f 1418c2ecf20Sopenharmony_ci | move register from memory into fpu 1428c2ecf20Sopenharmony_ci jra 3f 1438c2ecf20Sopenharmony_ci1: printf PMOVEM,"(%p>%p)",2,%a0,%a1 1448c2ecf20Sopenharmony_ci getuser.l (%a0)+,%d2,fp_err_ua1,%a0 1458c2ecf20Sopenharmony_ci lsr.l #8,%d2 1468c2ecf20Sopenharmony_ci lsr.l #7,%d2 1478c2ecf20Sopenharmony_ci lsr.w #1,%d2 1488c2ecf20Sopenharmony_ci move.l %d2,(%a1)+ 1498c2ecf20Sopenharmony_ci getuser.l (%a0)+,%d2,fp_err_ua1,%a0 1508c2ecf20Sopenharmony_ci move.l %d2,(%a1)+ 1518c2ecf20Sopenharmony_ci getuser.l (%a0),%d2,fp_err_ua1,%a0 1528c2ecf20Sopenharmony_ci move.l %d2,(%a1) 1538c2ecf20Sopenharmony_ci subq.l #8,%a0 1548c2ecf20Sopenharmony_ci subq.l #8,%a1 1558c2ecf20Sopenharmony_ci add.l %d0,%a0 1568c2ecf20Sopenharmony_ci2: add.l %d0,%a1 1578c2ecf20Sopenharmony_ci3: lsl.b #1,%d1 1588c2ecf20Sopenharmony_ci jcs 1b 1598c2ecf20Sopenharmony_ci jne 2b 1608c2ecf20Sopenharmony_ci jra 5f 1618c2ecf20Sopenharmony_ci | move register from fpu into memory 1628c2ecf20Sopenharmony_ci1: printf PMOVEM,"(%p>%p)",2,%a1,%a0 1638c2ecf20Sopenharmony_ci move.l (%a1)+,%d2 1648c2ecf20Sopenharmony_ci lsl.w #1,%d2 1658c2ecf20Sopenharmony_ci lsl.l #7,%d2 1668c2ecf20Sopenharmony_ci lsl.l #8,%d2 1678c2ecf20Sopenharmony_ci putuser.l %d2,(%a0)+,fp_err_ua1,%a0 1688c2ecf20Sopenharmony_ci move.l (%a1)+,%d2 1698c2ecf20Sopenharmony_ci putuser.l %d2,(%a0)+,fp_err_ua1,%a0 1708c2ecf20Sopenharmony_ci move.l (%a1),%d2 1718c2ecf20Sopenharmony_ci putuser.l %d2,(%a0),fp_err_ua1,%a0 1728c2ecf20Sopenharmony_ci subq.l #8,%a1 1738c2ecf20Sopenharmony_ci subq.l #8,%a0 1748c2ecf20Sopenharmony_ci add.l %d0,%a0 1758c2ecf20Sopenharmony_ci2: add.l %d0,%a1 1768c2ecf20Sopenharmony_ci4: lsl.b #1,%d1 1778c2ecf20Sopenharmony_ci jcs 1b 1788c2ecf20Sopenharmony_ci jne 2b 1798c2ecf20Sopenharmony_ci5: 1808c2ecf20Sopenharmony_ci printf PDECODE,"\n" 1818c2ecf20Sopenharmony_ci#if 0 1828c2ecf20Sopenharmony_ci lea (FPD_FPREG,FPDATA),%a0 1838c2ecf20Sopenharmony_ci printf PMOVEM,"fp:" 1848c2ecf20Sopenharmony_ci printx PMOVEM,%a0@(0) 1858c2ecf20Sopenharmony_ci printx PMOVEM,%a0@(12) 1868c2ecf20Sopenharmony_ci printf PMOVEM,"\n " 1878c2ecf20Sopenharmony_ci printx PMOVEM,%a0@(24) 1888c2ecf20Sopenharmony_ci printx PMOVEM,%a0@(36) 1898c2ecf20Sopenharmony_ci printf PMOVEM,"\n " 1908c2ecf20Sopenharmony_ci printx PMOVEM,%a0@(48) 1918c2ecf20Sopenharmony_ci printx PMOVEM,%a0@(60) 1928c2ecf20Sopenharmony_ci printf PMOVEM,"\n " 1938c2ecf20Sopenharmony_ci printx PMOVEM,%a0@(72) 1948c2ecf20Sopenharmony_ci printx PMOVEM,%a0@(84) 1958c2ecf20Sopenharmony_ci printf PMOVEM,"\n" 1968c2ecf20Sopenharmony_ci#endif 1978c2ecf20Sopenharmony_ci jra fp_end 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci| set flags for decode macros for fmovem control register 2008c2ecf20Sopenharmony_cido_fmovem=1 2018c2ecf20Sopenharmony_cido_fmovem_cr=1 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_cifp_fmovem_cr: 2048c2ecf20Sopenharmony_ci printf PDECODE,"fmovem.cr " 2058c2ecf20Sopenharmony_ci | get register list and count them 2068c2ecf20Sopenharmony_ci bfextu %d2{#19,#3},%d0 2078c2ecf20Sopenharmony_ci move.l %d0,%d1 2088c2ecf20Sopenharmony_ci swap %d1 2098c2ecf20Sopenharmony_ci jra 2f 2108c2ecf20Sopenharmony_ci1: addq.w #1,%d1 2118c2ecf20Sopenharmony_ci2: lsr.l #1,%d0 2128c2ecf20Sopenharmony_ci jcs 1b 2138c2ecf20Sopenharmony_ci jne 2b 2148c2ecf20Sopenharmony_ci printf PDECODE,"#%08x",1,%d1 2158c2ecf20Sopenharmony_ci#ifdef FPU_EMU_DEBUG 2168c2ecf20Sopenharmony_ci btst #13,%d2 2178c2ecf20Sopenharmony_ci jeq 1f 2188c2ecf20Sopenharmony_ci printf PDECODE,"->" | fpu -> cpu 2198c2ecf20Sopenharmony_ci jra 2f 2208c2ecf20Sopenharmony_ci1: printf PDECODE,"<-" | fpu <- cpu 2218c2ecf20Sopenharmony_ci2: 2228c2ecf20Sopenharmony_ci#endif 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci | decode address mode 2258c2ecf20Sopenharmony_ci fp_decode_addr_mode 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci .long fpc_data, fpc_addr 2288c2ecf20Sopenharmony_ci .long fpc_indirect, fpc_postinc 2298c2ecf20Sopenharmony_ci .long fpc_predecr, fpc_disp16 2308c2ecf20Sopenharmony_ci .long fpc_extmode0, fpc_extmode1 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_cifpc_data: 2338c2ecf20Sopenharmony_ci fp_mode_data_direct 2348c2ecf20Sopenharmony_ci move.w %d0,%d1 2358c2ecf20Sopenharmony_ci bfffo %d2{#19,#3},%d0 2368c2ecf20Sopenharmony_ci sub.w #19,%d0 2378c2ecf20Sopenharmony_ci lea (FPD_FPCR,FPDATA,%d0.w*4),%a1 2388c2ecf20Sopenharmony_ci btst #13,%d2 2398c2ecf20Sopenharmony_ci jne 1f 2408c2ecf20Sopenharmony_ci move.w %d1,%d0 2418c2ecf20Sopenharmony_ci jsr fp_get_data_reg 2428c2ecf20Sopenharmony_ci move.l %d0,(%a1) 2438c2ecf20Sopenharmony_ci jra fpc_movem_fin 2448c2ecf20Sopenharmony_ci1: move.l (%a1),%d0 2458c2ecf20Sopenharmony_ci jsr fp_put_data_reg 2468c2ecf20Sopenharmony_ci jra fpc_movem_fin 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_cifpc_addr: 2498c2ecf20Sopenharmony_ci fp_decode_addr_reg 2508c2ecf20Sopenharmony_ci printf PDECODE,"a%d",1,%d0 2518c2ecf20Sopenharmony_ci btst #13,%d2 2528c2ecf20Sopenharmony_ci jne 1f 2538c2ecf20Sopenharmony_ci jsr fp_get_addr_reg 2548c2ecf20Sopenharmony_ci move.l %a0,(FPD_FPIAR,FPDATA) 2558c2ecf20Sopenharmony_ci jra fpc_movem_fin 2568c2ecf20Sopenharmony_ci1: move.l (FPD_FPIAR,FPDATA),%a0 2578c2ecf20Sopenharmony_ci jsr fp_put_addr_reg 2588c2ecf20Sopenharmony_ci jra fpc_movem_fin 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_cifpc_indirect: 2618c2ecf20Sopenharmony_ci fp_mode_addr_indirect 2628c2ecf20Sopenharmony_ci jra fpc_do_movem 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_cifpc_postinc: 2658c2ecf20Sopenharmony_ci fp_mode_addr_indirect_postinc 2668c2ecf20Sopenharmony_ci jra fpc_do_movem 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_cifpc_predecr: 2698c2ecf20Sopenharmony_ci fp_mode_addr_indirect_predec 2708c2ecf20Sopenharmony_ci jra fpc_do_movem 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_cifpc_disp16: 2738c2ecf20Sopenharmony_ci fp_mode_addr_indirect_disp16 2748c2ecf20Sopenharmony_ci jra fpc_do_movem 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_cifpc_extmode0: 2778c2ecf20Sopenharmony_ci fp_mode_addr_indirect_extmode0 2788c2ecf20Sopenharmony_ci jra fpc_do_movem 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_cifpc_extmode1: 2818c2ecf20Sopenharmony_ci fp_decode_addr_reg 2828c2ecf20Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci .align 4 2858c2ecf20Sopenharmony_ci0: 2868c2ecf20Sopenharmony_ci .long fpc_absolute_short, fpc_absolute_long 2878c2ecf20Sopenharmony_ci .long fpc_disp16, fpc_extmode0 2888c2ecf20Sopenharmony_ci .long fpc_immediate, fp_ill 2898c2ecf20Sopenharmony_ci .long fp_ill, fp_ill 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_cifpc_absolute_short: 2928c2ecf20Sopenharmony_ci fp_mode_abs_short 2938c2ecf20Sopenharmony_ci jra fpc_do_movem 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_cifpc_absolute_long: 2968c2ecf20Sopenharmony_ci fp_mode_abs_long 2978c2ecf20Sopenharmony_ci jra fpc_do_movem 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_cifpc_immediate: 3008c2ecf20Sopenharmony_ci fp_get_pc %a0 3018c2ecf20Sopenharmony_ci lea (%a0,%d1.w*4),%a1 3028c2ecf20Sopenharmony_ci fp_put_pc %a1 3038c2ecf20Sopenharmony_ci printf PDECODE,"#imm" 3048c2ecf20Sopenharmony_ci| jra fpc_do_movem 3058c2ecf20Sopenharmony_ci#if 0 3068c2ecf20Sopenharmony_ci swap %d1 3078c2ecf20Sopenharmony_ci lsl.l #5,%d1 3088c2ecf20Sopenharmony_ci lea (FPD_FPCR,FPDATA),%a0 3098c2ecf20Sopenharmony_ci jra 3f 3108c2ecf20Sopenharmony_ci1: move.l %d0,(%a0) 3118c2ecf20Sopenharmony_ci2: addq.l #4,%a0 3128c2ecf20Sopenharmony_ci3: lsl.b #1,%d1 3138c2ecf20Sopenharmony_ci jcs 1b 3148c2ecf20Sopenharmony_ci jne 2b 3158c2ecf20Sopenharmony_ci jra fpc_movem_fin 3168c2ecf20Sopenharmony_ci#endif 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_cifpc_do_movem: 3198c2ecf20Sopenharmony_ci swap %d1 | get fpu register list 3208c2ecf20Sopenharmony_ci lsl.l #5,%d1 3218c2ecf20Sopenharmony_ci lea (FPD_FPCR,FPDATA),%a1 3228c2ecf20Sopenharmony_ci1: btst #13,%d2 3238c2ecf20Sopenharmony_ci jne 4f 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci | move register from memory into fpu 3268c2ecf20Sopenharmony_ci jra 3f 3278c2ecf20Sopenharmony_ci1: printf PMOVEM,"(%p>%p)",2,%a0,%a1 3288c2ecf20Sopenharmony_ci getuser.l (%a0)+,%d0,fp_err_ua1,%a0 3298c2ecf20Sopenharmony_ci move.l %d0,(%a1) 3308c2ecf20Sopenharmony_ci2: addq.l #4,%a1 3318c2ecf20Sopenharmony_ci3: lsl.b #1,%d1 3328c2ecf20Sopenharmony_ci jcs 1b 3338c2ecf20Sopenharmony_ci jne 2b 3348c2ecf20Sopenharmony_ci jra fpc_movem_fin 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci | move register from fpu into memory 3378c2ecf20Sopenharmony_ci1: printf PMOVEM,"(%p>%p)",2,%a1,%a0 3388c2ecf20Sopenharmony_ci move.l (%a1),%d0 3398c2ecf20Sopenharmony_ci putuser.l %d0,(%a0)+,fp_err_ua1,%a0 3408c2ecf20Sopenharmony_ci2: addq.l #4,%a1 3418c2ecf20Sopenharmony_ci4: lsl.b #1,%d1 3428c2ecf20Sopenharmony_ci jcs 1b 3438c2ecf20Sopenharmony_ci jne 2b 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_cifpc_movem_fin: 3468c2ecf20Sopenharmony_ci and.l #0x0000fff0,(FPD_FPCR,FPDATA) 3478c2ecf20Sopenharmony_ci and.l #0x0ffffff8,(FPD_FPSR,FPDATA) 3488c2ecf20Sopenharmony_ci move.l (FPD_FPCR,FPDATA),%d0 3498c2ecf20Sopenharmony_ci lsr.l #4,%d0 3508c2ecf20Sopenharmony_ci moveq #3,%d1 3518c2ecf20Sopenharmony_ci and.l %d0,%d1 3528c2ecf20Sopenharmony_ci move.w %d1,(FPD_RND,FPDATA) 3538c2ecf20Sopenharmony_ci lsr.l #2,%d0 3548c2ecf20Sopenharmony_ci moveq #3,%d1 3558c2ecf20Sopenharmony_ci and.l %d0,%d1 3568c2ecf20Sopenharmony_ci move.w %d1,(FPD_PREC,FPDATA) 3578c2ecf20Sopenharmony_ci printf PDECODE,"\n" 3588c2ecf20Sopenharmony_ci#if 0 3598c2ecf20Sopenharmony_ci printf PMOVEM,"fpcr : %08x\n",1,FPDATA@(FPD_FPCR) 3608c2ecf20Sopenharmony_ci printf PMOVEM,"fpsr : %08x\n",1,FPDATA@(FPD_FPSR) 3618c2ecf20Sopenharmony_ci printf PMOVEM,"fpiar: %08x\n",1,FPDATA@(FPD_FPIAR) 3628c2ecf20Sopenharmony_ci clr.l %d0 3638c2ecf20Sopenharmony_ci move.w (FPD_PREC,FPDATA),%d0 3648c2ecf20Sopenharmony_ci printf PMOVEM,"prec : %04x\n",1,%d0 3658c2ecf20Sopenharmony_ci move.w (FPD_RND,FPDATA),%d0 3668c2ecf20Sopenharmony_ci printf PMOVEM,"rnd : %04x\n",1,%d0 3678c2ecf20Sopenharmony_ci#endif 3688c2ecf20Sopenharmony_ci jra fp_end 369