12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- |
- | x_unsupp.sa 3.3 7/1/91
- |
- | fpsp_unsupp --- FPSP handler for unsupported data type exception
- |
- | Trap vector #55 (See table 8-1 Mc68030 User's manual).
- | Invoked when the user program encounters a data format (packed) that
- | hardware does not support or a data type (denormalized numbers or un-
- | normalized numbers).
- | Normalizes denorms and unnorms, unpacks packed numbers then stores
- | them back into the machine to let the 040 finish the operation.
- |
- | Unsupp calls two routines:
- | 1. get_op - gets the operand(s)
- | 2. res_func - restore the function back into the 040 or
- | if fmove.p fpm,<ea> then pack source (fpm)
- | and store in users memory <ea>.
- |
- | Input: Long fsave stack frame
- |
- |
- | Copyright (C) Motorola, Inc. 1990
- | All Rights Reserved
- |
- | For details on the license for this file, please see the
- | file, README, in this same directory.
- X_UNSUPP: |idnt 2,1 | Motorola 040 Floating Point Software Package
- |section 8
- #include "fpsp.h"
- |xref get_op
- |xref res_func
- |xref gen_except
- |xref fpsp_fmt_error
- .global fpsp_unsupp
- fpsp_unsupp:
- |
- link %a6,#-LOCAL_SIZE
- fsave -(%a7)
- moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
- fmovemx %fp0-%fp3,USER_FP0(%a6)
- fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
- moveb (%a7),VER_TMP(%a6) |save version number
- moveb (%a7),%d0 |test for valid version num
- andib #0xf0,%d0 |test for $4x
- cmpib #VER_4,%d0 |must be $4x or exit
- bnel fpsp_fmt_error
- fmovel #0,%FPSR |clear all user status bits
- fmovel #0,%FPCR |clear all user control bits
- |
- | The following lines are used to ensure that the FPSR
- | exception byte and condition codes are clear before proceeding,
- | except in the case of fmove, which leaves the cc's intact.
- |
- unsupp_con:
- movel USER_FPSR(%a6),%d1
- btst #5,CMDREG1B(%a6) |looking for fmove out
- bne fmove_con
- andl #0xFF00FF,%d1 |clear all but aexcs and qbyte
- bras end_fix
- fmove_con:
- andl #0x0FFF40FF,%d1 |clear all but cc's, snan bit, aexcs, and qbyte
- end_fix:
- movel %d1,USER_FPSR(%a6)
- st UFLG_TMP(%a6) |set flag for unsupp data
- bsrl get_op |everything okay, go get operand(s)
- bsrl res_func |fix up stack frame so can restore it
- clrl -(%a7)
- moveb VER_TMP(%a6),(%a7) |move idle fmt word to top of stack
- bral gen_except
- |
- |end
|