xref: /openbmc/linux/arch/m68k/fpsp040/x_fline.S (revision e00d82d0)
11da177e4SLinus Torvalds|
21da177e4SLinus Torvalds|	x_fline.sa 3.3 1/10/91
31da177e4SLinus Torvalds|
41da177e4SLinus Torvalds|	fpsp_fline --- FPSP handler for fline exception
51da177e4SLinus Torvalds|
61da177e4SLinus Torvalds|	First determine if the exception is one of the unimplemented
71da177e4SLinus Torvalds|	floating point instructions.  If so, let fpsp_unimp handle it.
81da177e4SLinus Torvalds|	Next, determine if the instruction is an fmovecr with a non-zero
91da177e4SLinus Torvalds|	<ea> field.  If so, handle here and return.  Otherwise, it
101da177e4SLinus Torvalds|	must be a real F-line exception.
111da177e4SLinus Torvalds|
121da177e4SLinus Torvalds
131da177e4SLinus Torvalds|		Copyright (C) Motorola, Inc. 1990
141da177e4SLinus Torvalds|			All Rights Reserved
151da177e4SLinus Torvalds|
16e00d82d0SMatt Waddel|       For details on the license for this file, please see the
17e00d82d0SMatt Waddel|       file, README, in this same directory.
181da177e4SLinus Torvalds
191da177e4SLinus TorvaldsX_FLINE:	|idnt    2,1 | Motorola 040 Floating Point Software Package
201da177e4SLinus Torvalds
211da177e4SLinus Torvalds	|section	8
221da177e4SLinus Torvalds
231da177e4SLinus Torvalds#include "fpsp.h"
241da177e4SLinus Torvalds
251da177e4SLinus Torvalds	|xref	real_fline
261da177e4SLinus Torvalds	|xref	fpsp_unimp
271da177e4SLinus Torvalds	|xref	uni_2
281da177e4SLinus Torvalds	|xref	mem_read
291da177e4SLinus Torvalds	|xref	fpsp_fmt_error
301da177e4SLinus Torvalds
311da177e4SLinus Torvalds	.global	fpsp_fline
321da177e4SLinus Torvaldsfpsp_fline:
331da177e4SLinus Torvalds|
341da177e4SLinus Torvalds|	check for unimplemented vector first.  Use EXC_VEC-4 because
351da177e4SLinus Torvalds|	the equate is valid only after a 'link a6' has pushed one more
361da177e4SLinus Torvalds|	long onto the stack.
371da177e4SLinus Torvalds|
381da177e4SLinus Torvalds	cmpw	#UNIMP_VEC,EXC_VEC-4(%a7)
391da177e4SLinus Torvalds	beql	fpsp_unimp
401da177e4SLinus Torvalds
411da177e4SLinus Torvalds|
421da177e4SLinus Torvalds|	fmovecr with non-zero <ea> handling here
431da177e4SLinus Torvalds|
441da177e4SLinus Torvalds	subl	#4,%a7		|4 accounts for 2-word difference
451da177e4SLinus Torvalds|				;between six word frame (unimp) and
461da177e4SLinus Torvalds|				;four word frame
471da177e4SLinus Torvalds	link	%a6,#-LOCAL_SIZE
481da177e4SLinus Torvalds	fsave	-(%a7)
491da177e4SLinus Torvalds	moveml	%d0-%d1/%a0-%a1,USER_DA(%a6)
501da177e4SLinus Torvalds	moveal	EXC_PC+4(%a6),%a0	|get address of fline instruction
511da177e4SLinus Torvalds	leal	L_SCR1(%a6),%a1	|use L_SCR1 as scratch
521da177e4SLinus Torvalds	movel	#4,%d0
531da177e4SLinus Torvalds	addl	#4,%a6		|to offset the sub.l #4,a7 above so that
541da177e4SLinus Torvalds|				;a6 can point correctly to the stack frame
551da177e4SLinus Torvalds|				;before branching to mem_read
561da177e4SLinus Torvalds	bsrl	mem_read
571da177e4SLinus Torvalds	subl	#4,%a6
581da177e4SLinus Torvalds	movel	L_SCR1(%a6),%d0	|d0 contains the fline and command word
591da177e4SLinus Torvalds	bfextu	%d0{#4:#3},%d1	|extract coprocessor id
601da177e4SLinus Torvalds	cmpib	#1,%d1		|check if cpid=1
611da177e4SLinus Torvalds	bne	not_mvcr	|exit if not
621da177e4SLinus Torvalds	bfextu	%d0{#16:#6},%d1
631da177e4SLinus Torvalds	cmpib	#0x17,%d1		|check if it is an FMOVECR encoding
641da177e4SLinus Torvalds	bne	not_mvcr
651da177e4SLinus Torvalds|				;if an FMOVECR instruction, fix stack
661da177e4SLinus Torvalds|				;and go to FPSP_UNIMP
671da177e4SLinus Torvaldsfix_stack:
681da177e4SLinus Torvalds	cmpib	#VER_40,(%a7)	|test for orig unimp frame
691da177e4SLinus Torvalds	bnes	ck_rev
701da177e4SLinus Torvalds	subl	#UNIMP_40_SIZE-4,%a7 |emulate an orig fsave
711da177e4SLinus Torvalds	moveb	#VER_40,(%a7)
721da177e4SLinus Torvalds	moveb	#UNIMP_40_SIZE-4,1(%a7)
731da177e4SLinus Torvalds	clrw	2(%a7)
741da177e4SLinus Torvalds	bras	fix_con
751da177e4SLinus Torvaldsck_rev:
761da177e4SLinus Torvalds	cmpib	#VER_41,(%a7)	|test for rev unimp frame
771da177e4SLinus Torvalds	bnel	fpsp_fmt_error	|if not $40 or $41, exit with error
781da177e4SLinus Torvalds	subl	#UNIMP_41_SIZE-4,%a7 |emulate a rev fsave
791da177e4SLinus Torvalds	moveb	#VER_41,(%a7)
801da177e4SLinus Torvalds	moveb	#UNIMP_41_SIZE-4,1(%a7)
811da177e4SLinus Torvalds	clrw	2(%a7)
821da177e4SLinus Torvaldsfix_con:
831da177e4SLinus Torvalds	movew	EXC_SR+4(%a6),EXC_SR(%a6) |move stacked sr to new position
841da177e4SLinus Torvalds	movel	EXC_PC+4(%a6),EXC_PC(%a6) |move stacked pc to new position
851da177e4SLinus Torvalds	fmovel	EXC_PC(%a6),%FPIAR |point FPIAR to fline inst
861da177e4SLinus Torvalds	movel	#4,%d1
871da177e4SLinus Torvalds	addl	%d1,EXC_PC(%a6)	|increment stacked pc value to next inst
881da177e4SLinus Torvalds	movew	#0x202c,EXC_VEC(%a6) |reformat vector to unimp
891da177e4SLinus Torvalds	clrl	EXC_EA(%a6)	|clear the EXC_EA field
901da177e4SLinus Torvalds	movew	%d0,CMDREG1B(%a6) |move the lower word into CMDREG1B
911da177e4SLinus Torvalds	clrl	E_BYTE(%a6)
921da177e4SLinus Torvalds	bsetb	#UFLAG,T_BYTE(%a6)
931da177e4SLinus Torvalds	moveml	USER_DA(%a6),%d0-%d1/%a0-%a1 |restore data registers
941da177e4SLinus Torvalds	bral	uni_2
951da177e4SLinus Torvalds
961da177e4SLinus Torvaldsnot_mvcr:
971da177e4SLinus Torvalds	moveml	USER_DA(%a6),%d0-%d1/%a0-%a1 |restore data registers
981da177e4SLinus Torvalds	frestore (%a7)+
991da177e4SLinus Torvalds	unlk	%a6
1001da177e4SLinus Torvalds	addl	#4,%a7
1011da177e4SLinus Torvalds	bral	real_fline
1021da177e4SLinus Torvalds
1031da177e4SLinus Torvalds	|end
104