xref: /netbsd/sys/arch/m68k/fpsp/smovecr.sa (revision bf9ec67e)
1*	$NetBSD: smovecr.sa,v 1.2 1994/10/26 07:49:57 cgd Exp $
2
3*	MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
4*	M68000 Hi-Performance Microprocessor Division
5*	M68040 Software Package
6*
7*	M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
8*	All rights reserved.
9*
10*	THE SOFTWARE is provided on an "AS IS" basis and without warranty.
11*	To the maximum extent permitted by applicable law,
12*	MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
13*	INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
14*	PARTICULAR PURPOSE and any warranty against infringement with
15*	regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
16*	and any accompanying written materials.
17*
18*	To the maximum extent permitted by applicable law,
19*	IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
20*	(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
21*	PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
22*	OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
23*	SOFTWARE.  Motorola assumes no responsibility for the maintenance
24*	and support of the SOFTWARE.
25*
26*	You are hereby granted a copyright license to use, modify, and
27*	distribute the SOFTWARE so long as this entire notice is retained
28*	without alteration in any modified and/or redistributed versions,
29*	and that such modified versions are clearly identified as such.
30*	No licenses are granted by implication, estoppel or otherwise
31*	under any patents or trademarks of Motorola, Inc.
32
33*
34*	smovecr.sa 3.1 12/10/90
35*
36*	The entry point sMOVECR returns the constant at the
37*	offset given in the instruction field.
38*
39*	Input: An offset in the instruction word.
40*
41*	Output:	The constant rounded to the user's rounding
42*		mode unchecked for overflow.
43*
44*	Modified: fp0.
45*
46
47SMOVECR	IDNT	2,1 Motorola 040 Floating Point Software Package
48
49	section 8
50
51	include fpsp.h
52
53	xref	nrm_set
54	xref	round
55	xref	PIRN
56	xref	PIRZRM
57	xref	PIRP
58	xref	SMALRN
59	xref	SMALRZRM
60	xref	SMALRP
61	xref	BIGRN
62	xref	BIGRZRM
63	xref	BIGRP
64
65FZERO	dc.l	00000000
66*
67*	FMOVECR
68*
69	xdef	smovcr
70smovcr:
71	bfextu	CMDREG1B(a6){9:7},d0 ;get offset
72	bfextu	USER_FPCR(a6){26:2},d1 ;get rmode
73*
74* check range of offset
75*
76	tst.b	d0		;if zero, offset is to pi
77	beq.b	PI_TBL		;it is pi
78	cmpi.b	#$0a,d0		;check range $01 - $0a
79	ble.b	Z_VAL		;if in this range, return zero
80	cmpi.b	#$0e,d0		;check range $0b - $0e
81	ble.b	SM_TBL		;valid constants in this range
82	cmpi.b	#$2f,d0		;check range $10 - $2f
83	ble.b	Z_VAL		;if in this range, return zero
84	cmpi.b	#$3f,d0		;check range $30 - $3f
85	ble  	BG_TBL		;valid constants in this range
86Z_VAL:
87	fmove.s	FZERO,fp0
88	rts
89PI_TBL:
90	tst.b	d1		;offset is zero, check for rmode
91	beq.b	PI_RN		;if zero, rn mode
92	cmpi.b	#$3,d1		;check for rp
93	beq.b	PI_RP		;if 3, rp mode
94PI_RZRM:
95	lea.l	PIRZRM,a0	;rmode is rz or rm, load PIRZRM in a0
96	bra	set_finx
97PI_RN:
98	lea.l	PIRN,a0		;rmode is rn, load PIRN in a0
99	bra	set_finx
100PI_RP:
101	lea.l	PIRP,a0		;rmode is rp, load PIRP in a0
102	bra	set_finx
103SM_TBL:
104	subi.l	#$b,d0		;make offset in 0 - 4 range
105	tst.b	d1		;check for rmode
106	beq.b	SM_RN		;if zero, rn mode
107	cmpi.b	#$3,d1		;check for rp
108	beq.b	SM_RP		;if 3, rp mode
109SM_RZRM:
110	lea.l	SMALRZRM,a0	;rmode is rz or rm, load SMRZRM in a0
111	cmpi.b	#$2,d0		;check if result is inex
112	ble	set_finx	;if 0 - 2, it is inexact
113	bra	no_finx		;if 3, it is exact
114SM_RN:
115	lea.l	SMALRN,a0	;rmode is rn, load SMRN in a0
116	cmpi.b	#$2,d0		;check if result is inex
117	ble	set_finx	;if 0 - 2, it is inexact
118	bra	no_finx		;if 3, it is exact
119SM_RP:
120	lea.l	SMALRP,a0	;rmode is rp, load SMRP in a0
121	cmpi.b	#$2,d0		;check if result is inex
122	ble	set_finx	;if 0 - 2, it is inexact
123	bra	no_finx		;if 3, it is exact
124BG_TBL:
125	subi.l	#$30,d0		;make offset in 0 - f range
126	tst.b	d1		;check for rmode
127	beq.b	BG_RN		;if zero, rn mode
128	cmpi.b	#$3,d1		;check for rp
129	beq.b	BG_RP		;if 3, rp mode
130BG_RZRM:
131	lea.l	BIGRZRM,a0	;rmode is rz or rm, load BGRZRM in a0
132	cmpi.b	#$1,d0		;check if result is inex
133	ble	set_finx	;if 0 - 1, it is inexact
134	cmpi.b	#$7,d0		;second check
135	ble	no_finx		;if 0 - 7, it is exact
136	bra	set_finx	;if 8 - f, it is inexact
137BG_RN:
138	lea.l	BIGRN,a0	;rmode is rn, load BGRN in a0
139	cmpi.b	#$1,d0		;check if result is inex
140	ble	set_finx	;if 0 - 1, it is inexact
141	cmpi.b	#$7,d0		;second check
142	ble	no_finx		;if 0 - 7, it is exact
143	bra	set_finx	;if 8 - f, it is inexact
144BG_RP:
145	lea.l	BIGRP,a0	;rmode is rp, load SMRP in a0
146	cmpi.b	#$1,d0		;check if result is inex
147	ble	set_finx	;if 0 - 1, it is inexact
148	cmpi.b	#$7,d0		;second check
149	ble	no_finx		;if 0 - 7, it is exact
150*	bra	set_finx	;if 8 - f, it is inexact
151set_finx:
152	or.l	#inx2a_mask,USER_FPSR(a6) ;set inex2/ainex
153no_finx:
154	mulu.l	#12,d0			;use offset to point into tables
155	move.l	d1,L_SCR1(a6)		;load mode for round call
156	bfextu	USER_FPCR(a6){24:2},d1	;get precision
157	tst.l	d1			;check if extended precision
158*
159* Precision is extended
160*
161	bne.b	not_ext			;if extended, do not call round
162	fmovem.x (a0,d0),fp0		;return result in fp0
163	rts
164*
165* Precision is single or double
166*
167not_ext:
168	swap	d1			;rnd prec in upper word of d1
169	add.l	L_SCR1(a6),d1		;merge rmode in low word of d1
170	move.l	(a0,d0),FP_SCR1(a6)	;load first word to temp storage
171	move.l	4(a0,d0),FP_SCR1+4(a6)	;load second word
172	move.l	8(a0,d0),FP_SCR1+8(a6)	;load third word
173	clr.l	d0			;clear g,r,s
174	lea	FP_SCR1(a6),a0
175	btst.b	#sign_bit,LOCAL_EX(a0)
176	sne	LOCAL_SGN(a0)		;convert to internal ext. format
177
178	bsr	round			;go round the mantissa
179
180	bfclr	LOCAL_SGN(a0){0:8}	;convert back to IEEE ext format
181	beq.b	fin_fcr
182	bset.b	#sign_bit,LOCAL_EX(a0)
183fin_fcr:
184	fmovem.x (a0),fp0
185	rts
186
187	end
188