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