162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * fp_move.S 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright Roman Zippel, 1997. All rights reserved. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 762306a36Sopenharmony_ci * modification, are permitted provided that the following conditions 862306a36Sopenharmony_ci * are met: 962306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 1062306a36Sopenharmony_ci * notice, and the entire permission notice in its entirety, 1162306a36Sopenharmony_ci * including the disclaimer of warranties. 1262306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 1362306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 1462306a36Sopenharmony_ci * documentation and/or other materials provided with the distribution. 1562306a36Sopenharmony_ci * 3. The name of the author may not be used to endorse or promote 1662306a36Sopenharmony_ci * products derived from this software without specific prior 1762306a36Sopenharmony_ci * written permission. 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * ALTERNATIVELY, this product may be distributed under the terms of 2062306a36Sopenharmony_ci * the GNU General Public License, in which case the provisions of the GPL are 2162306a36Sopenharmony_ci * required INSTEAD OF the above restrictions. (This clause is 2262306a36Sopenharmony_ci * necessary due to a potential bad interaction between the GPL and 2362306a36Sopenharmony_ci * the restrictions contained in a BSD-style copyright.) 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 2662306a36Sopenharmony_ci * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2762306a36Sopenharmony_ci * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2862306a36Sopenharmony_ci * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 2962306a36Sopenharmony_ci * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 3062306a36Sopenharmony_ci * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 3162306a36Sopenharmony_ci * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3262306a36Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3362306a36Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3462306a36Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 3562306a36Sopenharmony_ci * OF THE POSSIBILITY OF SUCH DAMAGE. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#include "fp_emu.h" 3962306a36Sopenharmony_ci#include "fp_decode.h" 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cido_no_pc_mode=1 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci .globl fp_fmove_fp2mem 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cifp_fmove_fp2mem: 4662306a36Sopenharmony_ci clr.b (2+FPD_FPSR,FPDATA) 4762306a36Sopenharmony_ci fp_decode_dest_format 4862306a36Sopenharmony_ci move.w %d0,%d1 | store data size twice in %d1 4962306a36Sopenharmony_ci swap %d1 | one can be trashed below 5062306a36Sopenharmony_ci move.w %d0,%d1 5162306a36Sopenharmony_ci#ifdef FPU_EMU_DEBUG 5262306a36Sopenharmony_ci lea 0f,%a0 5362306a36Sopenharmony_ci clr.l %d0 5462306a36Sopenharmony_ci move.b (%a0,%d1.w),%d0 5562306a36Sopenharmony_ci printf PDECODE,"fmove.%c ",1,%d0 5662306a36Sopenharmony_ci fp_decode_src_reg 5762306a36Sopenharmony_ci printf PDECODE,"fp%d,",1,%d0 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci .data 6062306a36Sopenharmony_ci0: .byte 'l','s','x','p','w','d','b','p' 6162306a36Sopenharmony_ci .previous 6262306a36Sopenharmony_ci#endif 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci | encode addressing mode for dest 6562306a36Sopenharmony_ci fp_decode_addr_mode 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci .long fp_data, fp_ill 6862306a36Sopenharmony_ci .long fp_indirect, fp_postinc 6962306a36Sopenharmony_ci .long fp_predecr, fp_disp16 7062306a36Sopenharmony_ci .long fp_extmode0, fp_extmode1 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci | addressing mode: data register direct 7362306a36Sopenharmony_cifp_data: 7462306a36Sopenharmony_ci fp_mode_data_direct 7562306a36Sopenharmony_ci move.w %d0,%d1 7662306a36Sopenharmony_ci fp_decode_src_reg 7762306a36Sopenharmony_ci fp_get_fp_reg 7862306a36Sopenharmony_ci lea (FPD_TEMPFP1,FPDATA),%a1 7962306a36Sopenharmony_ci move.l (%a0)+,(%a1)+ 8062306a36Sopenharmony_ci move.l (%a0)+,(%a1)+ 8162306a36Sopenharmony_ci move.l (%a0),(%a1) 8262306a36Sopenharmony_ci lea (-8,%a1),%a0 8362306a36Sopenharmony_ci swap %d1 8462306a36Sopenharmony_ci move.l %d1,%d2 8562306a36Sopenharmony_ci printf PDECODE,"\n" 8662306a36Sopenharmony_ci jmp ([0f:w,%pc,%d1.w*4]) 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci .align 4 8962306a36Sopenharmony_ci0: 9062306a36Sopenharmony_ci .long fp_data_long, fp_data_single 9162306a36Sopenharmony_ci .long fp_ill, fp_ill 9262306a36Sopenharmony_ci .long fp_data_word, fp_ill 9362306a36Sopenharmony_ci .long fp_data_byte, fp_ill 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cifp_data_byte: 9662306a36Sopenharmony_ci jsr fp_normalize_ext 9762306a36Sopenharmony_ci jsr fp_conv_ext2byte 9862306a36Sopenharmony_ci move.l %d0,%d1 9962306a36Sopenharmony_ci swap %d2 10062306a36Sopenharmony_ci move.w %d2,%d0 10162306a36Sopenharmony_ci jsr fp_get_data_reg 10262306a36Sopenharmony_ci move.b %d1,%d0 10362306a36Sopenharmony_ci move.w %d2,%d1 10462306a36Sopenharmony_ci jsr fp_put_data_reg 10562306a36Sopenharmony_ci jra fp_final 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cifp_data_word: 10862306a36Sopenharmony_ci jsr fp_normalize_ext 10962306a36Sopenharmony_ci jsr fp_conv_ext2short 11062306a36Sopenharmony_ci move.l %d0,%d1 11162306a36Sopenharmony_ci swap %d2 11262306a36Sopenharmony_ci move.w %d2,%d0 11362306a36Sopenharmony_ci jsr fp_get_data_reg 11462306a36Sopenharmony_ci move.w %d1,%d0 11562306a36Sopenharmony_ci move.l %d2,%d1 11662306a36Sopenharmony_ci jsr fp_put_data_reg 11762306a36Sopenharmony_ci jra fp_final 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cifp_data_long: 12062306a36Sopenharmony_ci jsr fp_normalize_ext 12162306a36Sopenharmony_ci jsr fp_conv_ext2long 12262306a36Sopenharmony_ci swap %d2 12362306a36Sopenharmony_ci move.w %d2,%d1 12462306a36Sopenharmony_ci jsr fp_put_data_reg 12562306a36Sopenharmony_ci jra fp_final 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cifp_data_single: 12862306a36Sopenharmony_ci jsr fp_normalize_ext 12962306a36Sopenharmony_ci jsr fp_conv_ext2single 13062306a36Sopenharmony_ci swap %d2 13162306a36Sopenharmony_ci move.w %d2,%d1 13262306a36Sopenharmony_ci jsr fp_put_data_reg 13362306a36Sopenharmony_ci jra fp_final 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci | addressing mode: address register indirect 13662306a36Sopenharmony_cifp_indirect: 13762306a36Sopenharmony_ci fp_mode_addr_indirect 13862306a36Sopenharmony_ci jra fp_putdest 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci | addressing mode: address register indirect with postincrement 14162306a36Sopenharmony_cifp_postinc: 14262306a36Sopenharmony_ci fp_mode_addr_indirect_postinc 14362306a36Sopenharmony_ci jra fp_putdest 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci | addressing mode: address register indirect with predecrement 14662306a36Sopenharmony_cifp_predecr: 14762306a36Sopenharmony_ci fp_mode_addr_indirect_predec 14862306a36Sopenharmony_ci jra fp_putdest 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci | addressing mode: address register indirect with 16bit displacement 15162306a36Sopenharmony_cifp_disp16: 15262306a36Sopenharmony_ci fp_mode_addr_indirect_disp16 15362306a36Sopenharmony_ci jra fp_putdest 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cifp_extmode0: 15662306a36Sopenharmony_ci fp_mode_addr_indirect_extmode0 15762306a36Sopenharmony_ci jra fp_putdest 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cifp_extmode1: 16062306a36Sopenharmony_ci fp_decode_addr_reg 16162306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci .align 4 16462306a36Sopenharmony_ci0: 16562306a36Sopenharmony_ci .long fp_abs_short, fp_abs_long 16662306a36Sopenharmony_ci .long fp_ill, fp_ill 16762306a36Sopenharmony_ci .long fp_ill, fp_ill 16862306a36Sopenharmony_ci .long fp_ill, fp_ill 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cifp_abs_short: 17162306a36Sopenharmony_ci fp_mode_abs_short 17262306a36Sopenharmony_ci jra fp_putdest 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cifp_abs_long: 17562306a36Sopenharmony_ci fp_mode_abs_long 17662306a36Sopenharmony_ci jra fp_putdest 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_cifp_putdest: 17962306a36Sopenharmony_ci move.l %a0,%a1 18062306a36Sopenharmony_ci fp_decode_src_reg 18162306a36Sopenharmony_ci move.l %d1,%d2 | save size 18262306a36Sopenharmony_ci fp_get_fp_reg 18362306a36Sopenharmony_ci printf PDECODE,"\n" 18462306a36Sopenharmony_ci addq.l #8,%a0 18562306a36Sopenharmony_ci move.l (%a0),-(%sp) 18662306a36Sopenharmony_ci move.l -(%a0),-(%sp) 18762306a36Sopenharmony_ci move.l -(%a0),-(%sp) 18862306a36Sopenharmony_ci move.l %sp,%a0 18962306a36Sopenharmony_ci jsr fp_normalize_ext 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci swap %d2 19262306a36Sopenharmony_ci jmp ([0f:w,%pc,%d2.w*4]) 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci .align 4 19562306a36Sopenharmony_ci0: 19662306a36Sopenharmony_ci .long fp_format_long, fp_format_single 19762306a36Sopenharmony_ci .long fp_format_extended, fp_format_packed 19862306a36Sopenharmony_ci .long fp_format_word, fp_format_double 19962306a36Sopenharmony_ci .long fp_format_byte, fp_format_packed 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cifp_format_long: 20262306a36Sopenharmony_ci jsr fp_conv_ext2long 20362306a36Sopenharmony_ci putuser.l %d0,(%a1),fp_err_ua1,%a1 20462306a36Sopenharmony_ci jra fp_finish_move 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cifp_format_single: 20762306a36Sopenharmony_ci jsr fp_conv_ext2single 20862306a36Sopenharmony_ci putuser.l %d0,(%a1),fp_err_ua1,%a1 20962306a36Sopenharmony_ci jra fp_finish_move 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cifp_format_extended: 21262306a36Sopenharmony_ci move.l (%a0)+,%d0 21362306a36Sopenharmony_ci lsl.w #1,%d0 21462306a36Sopenharmony_ci lsl.l #7,%d0 21562306a36Sopenharmony_ci lsl.l #8,%d0 21662306a36Sopenharmony_ci putuser.l %d0,(%a1)+,fp_err_ua1,%a1 21762306a36Sopenharmony_ci move.l (%a0)+,%d0 21862306a36Sopenharmony_ci putuser.l %d0,(%a1)+,fp_err_ua1,%a1 21962306a36Sopenharmony_ci move.l (%a0),%d0 22062306a36Sopenharmony_ci putuser.l %d0,(%a1),fp_err_ua1,%a1 22162306a36Sopenharmony_ci jra fp_finish_move 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cifp_format_packed: 22462306a36Sopenharmony_ci /* not supported yet */ 22562306a36Sopenharmony_ci lea (12,%sp),%sp 22662306a36Sopenharmony_ci jra fp_ill 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cifp_format_word: 22962306a36Sopenharmony_ci jsr fp_conv_ext2short 23062306a36Sopenharmony_ci putuser.w %d0,(%a1),fp_err_ua1,%a1 23162306a36Sopenharmony_ci jra fp_finish_move 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cifp_format_double: 23462306a36Sopenharmony_ci jsr fp_conv_ext2double 23562306a36Sopenharmony_ci jra fp_finish_move 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_cifp_format_byte: 23862306a36Sopenharmony_ci jsr fp_conv_ext2byte 23962306a36Sopenharmony_ci putuser.b %d0,(%a1),fp_err_ua1,%a1 24062306a36Sopenharmony_ci| jra fp_finish_move 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cifp_finish_move: 24362306a36Sopenharmony_ci lea (12,%sp),%sp 24462306a36Sopenharmony_ci jra fp_final 245