summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.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_unimp.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 'c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.s')
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.s77
1 files changed, 77 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.s
new file mode 100644
index 0000000000..e8aecfd985
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.s
@@ -0,0 +1,77 @@
+//
+// x_unimp.sa 3.3 7/1/91
+//
+// fpsp_unimp --- FPSP handler for unimplemented instruction
+// exception.
+//
+// Invoked when the user program encounters a floating-point
+// op-code that hardware does not support. Trap vector# 11
+// (See table 8-1 MC68030 User's Manual).
+//
+//
+// Note: An fsave for an unimplemented inst. will create a short
+// fsave stack.
+//
+// Input: 1. Six word stack frame for unimplemented inst, four word
+// for illegal
+// (See table 8-7 MC68030 User's Manual).
+// 2. Unimp (short) fsave state frame created here by fsave
+// instruction.
+//
+//
+// 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_UNIMP: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref get_op
+ |xref do_func
+ |xref sto_res
+ |xref gen_except
+ |xref fpsp_fmt_error
+
+ .global fpsp_unimp
+ .global uni_2
+fpsp_unimp:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%a7)
+uni_2:
+ moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
+ fmovemx %fp0-%fp3,USER_FP0(%a6)
+ fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
+ 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
+//
+// Temporary D25B Fix
+// The following lines are used to ensure that the FPSR
+// exception byte and condition codes are clear before proceeding
+//
+ movel USER_FPSR(%a6),%d0
+ andl #0xFF00FF,%d0 //clear all but accrued exceptions
+ movel %d0,USER_FPSR(%a6)
+ fmovel #0,%FPSR //clear all user bits
+ fmovel #0,%FPCR //clear all user exceptions for FPSP
+
+ clrb UFLG_TMP(%a6) //clr flag for unsupp data
+
+ bsrl get_op //go get operand(s)
+ clrb STORE_FLG(%a6)
+ bsrl do_func //do the function
+ fsave -(%a7) //capture possible exc state
+ tstb STORE_FLG(%a6)
+ bnes no_store //if STORE_FLG is set, no store
+ bsrl sto_res //store the result in user space
+no_store:
+ bral gen_except //post any exceptions and return
+
+ |end