linux/arch/m68k/math-emu/fp_move.S
<<
>>
Prefs
   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