1/* 2 * fp_move.S 3 * 4 * Copyright Roman Zippel, 1997. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, and the entire permission notice in its entirety, 11 * including the disclaimer of warranties. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote 16 * products derived from this software without specific prior 17 * written permission. 18 * 19 * ALTERNATIVELY, this product may be distributed under the terms of 20 * the GNU General Public License, in which case the provisions of the GPL are 21 * required INSTEAD OF the above restrictions. (This clause is 22 * necessary due to a potential bad interaction between the GPL and 23 * the restrictions contained in a BSD-style copyright.) 24 * 25 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 26 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 27 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 28 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 29 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 35 * OF THE POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38#include "fp_emu.h" 39#include "fp_decode.h" 40 41do_no_pc_mode=1 42 43 .globl fp_fmove_fp2mem 44 45fp_fmove_fp2mem: 46 clr.b (2+FPD_FPSR,FPDATA) 47 fp_decode_dest_format 48 move.w %d0,%d1 | store data size twice in %d1 49 swap %d1 | one can be trashed below 50 move.w %d0,%d1 51#ifdef FPU_EMU_DEBUG 52 lea 0f,%a0 53 clr.l %d0 54 move.b (%a0,%d1.w),%d0 55 printf PDECODE,"fmove.%c ",1,%d0 56 fp_decode_src_reg 57 printf PDECODE,"fp%d,",1,%d0 58 59 .data 600: .byte 'l','s','x','p','w','d','b','p' 61 .previous 62#endif 63 64 | encode addressing mode for dest 65 fp_decode_addr_mode 66 67 .long fp_data, fp_ill 68 .long fp_indirect, fp_postinc 69 .long fp_predecr, fp_disp16 70 .long fp_extmode0, fp_extmode1 71 72 | addressing mode: data register direct 73fp_data: 74 fp_mode_data_direct 75 move.w %d0,%d1 76 fp_decode_src_reg 77 fp_get_fp_reg 78 lea (FPD_TEMPFP1,FPDATA),%a1 79 move.l (%a0)+,(%a1)+ 80 move.l (%a0)+,(%a1)+ 81 move.l (%a0),(%a1) 82 lea (-8,%a1),%a0 83 swap %d1 84 move.l %d1,%d2 85 printf PDECODE,"\n" 86 jmp ([0f:w,%pc,%d1.w*4]) 87 88 .align 4 890: 90 .long fp_data_long, fp_data_single 91 .long fp_ill, fp_ill 92 .long fp_data_word, fp_ill 93 .long fp_data_byte, fp_ill 94 95fp_data_byte: 96 jsr fp_normalize_ext 97 jsr fp_conv_ext2byte 98 move.l %d0,%d1 99 swap %d2 100 move.w %d2,%d0 101 jsr fp_get_data_reg 102 move.b %d1,%d0 103 move.w %d2,%d1 104 jsr fp_put_data_reg 105 jra fp_final 106 107fp_data_word: 108 jsr fp_normalize_ext 109 jsr fp_conv_ext2short 110 move.l %d0,%d1 111 swap %d2 112 move.w %d2,%d0 113 jsr fp_get_data_reg 114 move.w %d1,%d0 115 move.l %d2,%d1 116 jsr fp_put_data_reg 117 jra fp_final 118 119fp_data_long: 120 jsr fp_normalize_ext 121 jsr fp_conv_ext2long 122 swap %d2 123 move.w %d2,%d1 124 jsr fp_put_data_reg 125 jra fp_final 126 127fp_data_single: 128 jsr fp_normalize_ext 129 jsr fp_conv_ext2single 130 swap %d2 131 move.w %d2,%d1 132 jsr fp_put_data_reg 133 jra fp_final 134 135 | addressing mode: address register indirect 136fp_indirect: 137 fp_mode_addr_indirect 138 jra fp_putdest 139 140 | addressing mode: address register indirect with postincrement 141fp_postinc: 142 fp_mode_addr_indirect_postinc 143 jra fp_putdest 144 145 | addressing mode: address register indirect with predecrement 146fp_predecr: 147 fp_mode_addr_indirect_predec 148 jra fp_putdest 149 150 | addressing mode: address register indirect with 16bit displacement 151fp_disp16: 152 fp_mode_addr_indirect_disp16 153 jra fp_putdest 154 155fp_extmode0: 156 fp_mode_addr_indirect_extmode0 157 jra fp_putdest 158 159fp_extmode1: 160 fp_decode_addr_reg 161 jmp ([0f:w,%pc,%d0*4]) 162 163 .align 4 1640: 165 .long fp_abs_short, fp_abs_long 166 .long fp_ill, fp_ill 167 .long fp_ill, fp_ill 168 .long fp_ill, fp_ill 169 170fp_abs_short: 171 fp_mode_abs_short 172 jra fp_putdest 173 174fp_abs_long: 175 fp_mode_abs_long 176 jra fp_putdest 177 178fp_putdest: 179 move.l %a0,%a1 180 fp_decode_src_reg 181 move.l %d1,%d2 | save size 182 fp_get_fp_reg 183 printf PDECODE,"\n" 184 addq.l #8,%a0 185 move.l (%a0),-(%sp) 186 move.l -(%a0),-(%sp) 187 move.l -(%a0),-(%sp) 188 move.l %sp,%a0 189 jsr fp_normalize_ext 190 191 swap %d2 192 jmp ([0f:w,%pc,%d2.w*4]) 193 194 .align 4 1950: 196 .long fp_format_long, fp_format_single 197 .long fp_format_extended, fp_format_packed 198 .long fp_format_word, fp_format_double 199 .long fp_format_byte, fp_format_packed 200 201fp_format_long: 202 jsr fp_conv_ext2long 203 putuser.l %d0,(%a1),fp_err_ua1,%a1 204 jra fp_finish_move 205 206fp_format_single: 207 jsr fp_conv_ext2single 208 putuser.l %d0,(%a1),fp_err_ua1,%a1 209 jra fp_finish_move 210 211fp_format_extended: 212 move.l (%a0)+,%d0 213 lsl.w #1,%d0 214 lsl.l #7,%d0 215 lsl.l #8,%d0 216 putuser.l %d0,(%a1)+,fp_err_ua1,%a1 217 move.l (%a0)+,%d0 218 putuser.l %d0,(%a1)+,fp_err_ua1,%a1 219 move.l (%a0),%d0 220 putuser.l %d0,(%a1),fp_err_ua1,%a1 221 jra fp_finish_move 222 223fp_format_packed: 224 /* not supported yet */ 225 lea (12,%sp),%sp 226 jra fp_ill 227 228fp_format_word: 229 jsr fp_conv_ext2short 230 putuser.w %d0,(%a1),fp_err_ua1,%a1 231 jra fp_finish_move 232 233fp_format_double: 234 jsr fp_conv_ext2double 235 jra fp_finish_move 236 237fp_format_byte: 238 jsr fp_conv_ext2byte 239 putuser.b %d0,(%a1),fp_err_ua1,%a1 240| jra fp_finish_move 241 242fp_finish_move: 243 lea (12,%sp),%sp 244 jra fp_final 245