Blame view

arch/m68k/fpsp040/x_unsupp.S 2.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  |
  |	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
  |
e00d82d07   Matt Waddel   [PATCH] Add wordi...
26
27
  |       For details on the license for this file, please see the
  |       file, README, in this same directory.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  
  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