summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1997-04-16 17:33:04 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1997-04-16 17:33:04 +0000
commitf9b93da8b47ff7ea4d6573b75b6077f6efb8dbc6 (patch)
tree46e2747b2b8f04d36d530daad59481f4f79e3c00 /c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s
parentAdded --disable-tcpip option. (diff)
downloadrtems-f9b93da8b47ff7ea4d6573b75b6077f6efb8dbc6.tar.bz2
Added the MC68040 Floating Point Support Package. This was ported
to RTEMS by Eric Norum. It is freely distributable and was acquired from the Motorola WWW site. More info is in the FPSP README.
Diffstat (limited to '')
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s83
1 files changed, 83 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s
new file mode 100644
index 0000000000..b6e7e51b0a
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s
@@ -0,0 +1,83 @@
+//
+// 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
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_UNSUPP: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |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