xref: /openbmc/linux/arch/m68k/fpsp040/x_unsupp.S (revision e00d82d0)
11da177e4SLinus Torvalds|
21da177e4SLinus Torvalds|	x_unsupp.sa 3.3 7/1/91
31da177e4SLinus Torvalds|
41da177e4SLinus Torvalds|	fpsp_unsupp --- FPSP handler for unsupported data type exception
51da177e4SLinus Torvalds|
61da177e4SLinus Torvalds| Trap vector #55	(See table 8-1 Mc68030 User's manual).
71da177e4SLinus Torvalds| Invoked when the user program encounters a data format (packed) that
81da177e4SLinus Torvalds| hardware does not support or a data type (denormalized numbers or un-
91da177e4SLinus Torvalds| normalized numbers).
101da177e4SLinus Torvalds| Normalizes denorms and unnorms, unpacks packed numbers then stores
111da177e4SLinus Torvalds| them back into the machine to let the 040 finish the operation.
121da177e4SLinus Torvalds|
131da177e4SLinus Torvalds| Unsupp calls two routines:
141da177e4SLinus Torvalds|	1. get_op -  gets the operand(s)
151da177e4SLinus Torvalds|	2. res_func - restore the function back into the 040 or
161da177e4SLinus Torvalds|			if fmove.p fpm,<ea> then pack source (fpm)
171da177e4SLinus Torvalds|			and store in users memory <ea>.
181da177e4SLinus Torvalds|
191da177e4SLinus Torvalds|  Input: Long fsave stack frame
201da177e4SLinus Torvalds|
211da177e4SLinus Torvalds|
221da177e4SLinus Torvalds
231da177e4SLinus Torvalds|		Copyright (C) Motorola, Inc. 1990
241da177e4SLinus Torvalds|			All Rights Reserved
251da177e4SLinus Torvalds|
26e00d82d0SMatt Waddel|       For details on the license for this file, please see the
27e00d82d0SMatt Waddel|       file, README, in this same directory.
281da177e4SLinus Torvalds
291da177e4SLinus TorvaldsX_UNSUPP:	|idnt    2,1 | Motorola 040 Floating Point Software Package
301da177e4SLinus Torvalds
311da177e4SLinus Torvalds	|section	8
321da177e4SLinus Torvalds
331da177e4SLinus Torvalds#include "fpsp.h"
341da177e4SLinus Torvalds
351da177e4SLinus Torvalds	|xref	get_op
361da177e4SLinus Torvalds	|xref	res_func
371da177e4SLinus Torvalds	|xref	gen_except
381da177e4SLinus Torvalds	|xref	fpsp_fmt_error
391da177e4SLinus Torvalds
401da177e4SLinus Torvalds	.global	fpsp_unsupp
411da177e4SLinus Torvaldsfpsp_unsupp:
421da177e4SLinus Torvalds|
431da177e4SLinus Torvalds	link		%a6,#-LOCAL_SIZE
441da177e4SLinus Torvalds	fsave		-(%a7)
451da177e4SLinus Torvalds	moveml		%d0-%d1/%a0-%a1,USER_DA(%a6)
461da177e4SLinus Torvalds	fmovemx	%fp0-%fp3,USER_FP0(%a6)
471da177e4SLinus Torvalds	fmoveml	%fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
481da177e4SLinus Torvalds
491da177e4SLinus Torvalds
501da177e4SLinus Torvalds	moveb		(%a7),VER_TMP(%a6) |save version number
511da177e4SLinus Torvalds	moveb		(%a7),%d0		|test for valid version num
521da177e4SLinus Torvalds	andib		#0xf0,%d0		|test for $4x
531da177e4SLinus Torvalds	cmpib		#VER_4,%d0	|must be $4x or exit
541da177e4SLinus Torvalds	bnel		fpsp_fmt_error
551da177e4SLinus Torvalds
561da177e4SLinus Torvalds	fmovel		#0,%FPSR		|clear all user status bits
571da177e4SLinus Torvalds	fmovel		#0,%FPCR		|clear all user control bits
581da177e4SLinus Torvalds|
591da177e4SLinus Torvalds|	The following lines are used to ensure that the FPSR
601da177e4SLinus Torvalds|	exception byte and condition codes are clear before proceeding,
611da177e4SLinus Torvalds|	except in the case of fmove, which leaves the cc's intact.
621da177e4SLinus Torvalds|
631da177e4SLinus Torvaldsunsupp_con:
641da177e4SLinus Torvalds	movel		USER_FPSR(%a6),%d1
651da177e4SLinus Torvalds	btst		#5,CMDREG1B(%a6)	|looking for fmove out
661da177e4SLinus Torvalds	bne		fmove_con
671da177e4SLinus Torvalds	andl		#0xFF00FF,%d1	|clear all but aexcs and qbyte
681da177e4SLinus Torvalds	bras		end_fix
691da177e4SLinus Torvaldsfmove_con:
701da177e4SLinus Torvalds	andl		#0x0FFF40FF,%d1	|clear all but cc's, snan bit, aexcs, and qbyte
711da177e4SLinus Torvaldsend_fix:
721da177e4SLinus Torvalds	movel		%d1,USER_FPSR(%a6)
731da177e4SLinus Torvalds
741da177e4SLinus Torvalds	st		UFLG_TMP(%a6)	|set flag for unsupp data
751da177e4SLinus Torvalds
761da177e4SLinus Torvalds	bsrl		get_op		|everything okay, go get operand(s)
771da177e4SLinus Torvalds	bsrl		res_func	|fix up stack frame so can restore it
781da177e4SLinus Torvalds	clrl		-(%a7)
791da177e4SLinus Torvalds	moveb		VER_TMP(%a6),(%a7) |move idle fmt word to top of stack
801da177e4SLinus Torvalds	bral		gen_except
811da177e4SLinus Torvalds|
821da177e4SLinus Torvalds	|end
83