xref: /OK3568_Linux_fs/kernel/arch/m68k/math-emu/fp_cond.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * fp_cond.S
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright Roman Zippel, 1997.  All rights reserved.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without
7*4882a593Smuzhiyun * modification, are permitted provided that the following conditions
8*4882a593Smuzhiyun * are met:
9*4882a593Smuzhiyun * 1. Redistributions of source code must retain the above copyright
10*4882a593Smuzhiyun *    notice, and the entire permission notice in its entirety,
11*4882a593Smuzhiyun *    including the disclaimer of warranties.
12*4882a593Smuzhiyun * 2. Redistributions in binary form must reproduce the above copyright
13*4882a593Smuzhiyun *    notice, this list of conditions and the following disclaimer in the
14*4882a593Smuzhiyun *    documentation and/or other materials provided with the distribution.
15*4882a593Smuzhiyun * 3. The name of the author may not be used to endorse or promote
16*4882a593Smuzhiyun *    products derived from this software without specific prior
17*4882a593Smuzhiyun *    written permission.
18*4882a593Smuzhiyun *
19*4882a593Smuzhiyun * ALTERNATIVELY, this product may be distributed under the terms of
20*4882a593Smuzhiyun * the GNU General Public License, in which case the provisions of the GPL are
21*4882a593Smuzhiyun * required INSTEAD OF the above restrictions.  (This clause is
22*4882a593Smuzhiyun * necessary due to a potential bad interaction between the GPL and
23*4882a593Smuzhiyun * the restrictions contained in a BSD-style copyright.)
24*4882a593Smuzhiyun *
25*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
26*4882a593Smuzhiyun * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27*4882a593Smuzhiyun * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28*4882a593Smuzhiyun * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
29*4882a593Smuzhiyun * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30*4882a593Smuzhiyun * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31*4882a593Smuzhiyun * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32*4882a593Smuzhiyun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33*4882a593Smuzhiyun * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34*4882a593Smuzhiyun * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
35*4882a593Smuzhiyun * OF THE POSSIBILITY OF SUCH DAMAGE.
36*4882a593Smuzhiyun */
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun#include "fp_emu.h"
39*4882a593Smuzhiyun#include "fp_decode.h"
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun	.globl	fp_fscc, fp_fbccw, fp_fbccl
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun#ifdef FPU_EMU_DEBUG
44*4882a593Smuzhiyunfp_fnop:
45*4882a593Smuzhiyun	printf	PDECODE,"fnop\n"
46*4882a593Smuzhiyun	jra	fp_end
47*4882a593Smuzhiyun#else
48*4882a593Smuzhiyun#define fp_fnop fp_end
49*4882a593Smuzhiyun#endif
50*4882a593Smuzhiyun
51*4882a593Smuzhiyunfp_fbccw:
52*4882a593Smuzhiyun	tst.w	%d2
53*4882a593Smuzhiyun	jeq	fp_fnop
54*4882a593Smuzhiyun	printf	PDECODE,"fbccw "
55*4882a593Smuzhiyun	fp_get_pc %a0
56*4882a593Smuzhiyun	lea	(-2,%a0,%d2.w),%a0
57*4882a593Smuzhiyun	jra	1f
58*4882a593Smuzhiyun
59*4882a593Smuzhiyunfp_fbccl:
60*4882a593Smuzhiyun	printf	PDECODE,"fbccl "
61*4882a593Smuzhiyun	fp_get_pc %a0
62*4882a593Smuzhiyun	move.l	%d2,%d0
63*4882a593Smuzhiyun	swap	%d0
64*4882a593Smuzhiyun	fp_get_instr_word %d0,fp_err_ua1
65*4882a593Smuzhiyun	lea	(-2,%a0,%d0.l),%a0
66*4882a593Smuzhiyun1:	printf	PDECODE,"%x",1,%a0
67*4882a593Smuzhiyun	move.l	%d2,%d0
68*4882a593Smuzhiyun	swap	%d0
69*4882a593Smuzhiyun	jsr	fp_compute_cond
70*4882a593Smuzhiyun	tst.l	%d0
71*4882a593Smuzhiyun	jeq	1f
72*4882a593Smuzhiyun	fp_put_pc %a0,1
73*4882a593Smuzhiyun1:	printf	PDECODE,"\n"
74*4882a593Smuzhiyun	jra	fp_end
75*4882a593Smuzhiyun
76*4882a593Smuzhiyunfp_fdbcc:
77*4882a593Smuzhiyun	printf	PDECODE,"fdbcc "
78*4882a593Smuzhiyun	fp_get_pc %a1				| calculate new pc
79*4882a593Smuzhiyun	fp_get_instr_word %d0,fp_err_ua1
80*4882a593Smuzhiyun	add.w	%d0,%a1
81*4882a593Smuzhiyun	fp_decode_addr_reg
82*4882a593Smuzhiyun	printf	PDECODE,"d%d,%x\n",2,%d0,%a1
83*4882a593Smuzhiyun	swap	%d1				| test condition in %d1
84*4882a593Smuzhiyun	tst.w	%d1
85*4882a593Smuzhiyun	jne	2f
86*4882a593Smuzhiyun	move.l	%d0,%d1
87*4882a593Smuzhiyun	jsr	fp_get_data_reg
88*4882a593Smuzhiyun	subq.w	#1,%d0
89*4882a593Smuzhiyun	jcs	1f
90*4882a593Smuzhiyun	fp_put_pc %a1,1
91*4882a593Smuzhiyun1:	jsr	fp_put_data_reg
92*4882a593Smuzhiyun2:	jra	fp_end
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun| set flags for decode macros for fs<cc>
95*4882a593Smuzhiyundo_fscc=1
96*4882a593Smuzhiyundo_no_pc_mode=1
97*4882a593Smuzhiyun
98*4882a593Smuzhiyunfp_fscc:
99*4882a593Smuzhiyun	printf	PDECODE,"fscc "
100*4882a593Smuzhiyun	move.l	%d2,%d0
101*4882a593Smuzhiyun	jsr	fp_compute_cond
102*4882a593Smuzhiyun	move.w	%d0,%d1
103*4882a593Smuzhiyun	swap	%d1
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun	| decode addressing mode
106*4882a593Smuzhiyun	fp_decode_addr_mode
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun	.long	fp_data, fp_fdbcc
109*4882a593Smuzhiyun	.long	fp_indirect, fp_postinc
110*4882a593Smuzhiyun	.long	fp_predecr, fp_disp16
111*4882a593Smuzhiyun	.long	fp_extmode0, fp_extmode1
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun	| addressing mode: data register direct
114*4882a593Smuzhiyunfp_data:
115*4882a593Smuzhiyun	fp_mode_data_direct
116*4882a593Smuzhiyun	move.w	%d0,%d1			| save register nr
117*4882a593Smuzhiyun	jsr	fp_get_data_reg
118*4882a593Smuzhiyun	swap	%d1
119*4882a593Smuzhiyun	move.b	%d1,%d0
120*4882a593Smuzhiyun	swap	%d1
121*4882a593Smuzhiyun	jsr	fp_put_data_reg
122*4882a593Smuzhiyun	printf	PDECODE,"\n"
123*4882a593Smuzhiyun	jra	fp_end
124*4882a593Smuzhiyun
125*4882a593Smuzhiyunfp_indirect:
126*4882a593Smuzhiyun	fp_mode_addr_indirect
127*4882a593Smuzhiyun	jra	fp_do_scc
128*4882a593Smuzhiyun
129*4882a593Smuzhiyunfp_postinc:
130*4882a593Smuzhiyun	fp_mode_addr_indirect_postinc
131*4882a593Smuzhiyun	jra	fp_do_scc
132*4882a593Smuzhiyun
133*4882a593Smuzhiyunfp_predecr:
134*4882a593Smuzhiyun	fp_mode_addr_indirect_predec
135*4882a593Smuzhiyun	jra	fp_do_scc
136*4882a593Smuzhiyun
137*4882a593Smuzhiyunfp_disp16:
138*4882a593Smuzhiyun	fp_mode_addr_indirect_disp16
139*4882a593Smuzhiyun	jra	fp_do_scc
140*4882a593Smuzhiyun
141*4882a593Smuzhiyunfp_extmode0:
142*4882a593Smuzhiyun	fp_mode_addr_indirect_extmode0
143*4882a593Smuzhiyun	jra	fp_do_scc
144*4882a593Smuzhiyun
145*4882a593Smuzhiyunfp_extmode1:
146*4882a593Smuzhiyun	bfextu	%d2{#13,#3},%d0
147*4882a593Smuzhiyun	jmp	([0f:w,%pc,%d0*4])
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun	.align	4
150*4882a593Smuzhiyun0:
151*4882a593Smuzhiyun	.long	fp_absolute_short, fp_absolute_long
152*4882a593Smuzhiyun	.long	fp_ill, fp_ill		| NOTE: jump here to ftrap.x
153*4882a593Smuzhiyun	.long	fp_ill, fp_ill
154*4882a593Smuzhiyun	.long	fp_ill, fp_ill
155*4882a593Smuzhiyun
156*4882a593Smuzhiyunfp_absolute_short:
157*4882a593Smuzhiyun	fp_mode_abs_short
158*4882a593Smuzhiyun	jra	fp_do_scc
159*4882a593Smuzhiyun
160*4882a593Smuzhiyunfp_absolute_long:
161*4882a593Smuzhiyun	fp_mode_abs_long
162*4882a593Smuzhiyun|	jra	fp_do_scc
163*4882a593Smuzhiyun
164*4882a593Smuzhiyunfp_do_scc:
165*4882a593Smuzhiyun	swap	%d1
166*4882a593Smuzhiyun	putuser.b %d1,(%a0),fp_err_ua1,%a0
167*4882a593Smuzhiyun	printf	PDECODE,"\n"
168*4882a593Smuzhiyun	jra	fp_end
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun#define tst_NAN	btst #24,%d1
172*4882a593Smuzhiyun#define tst_Z	btst #26,%d1
173*4882a593Smuzhiyun#define tst_N	btst #27,%d1
174*4882a593Smuzhiyun
175*4882a593Smuzhiyunfp_compute_cond:
176*4882a593Smuzhiyun	move.l	(FPD_FPSR,FPDATA),%d1
177*4882a593Smuzhiyun	btst	#4,%d0
178*4882a593Smuzhiyun	jeq	1f
179*4882a593Smuzhiyun	tst_NAN
180*4882a593Smuzhiyun	jeq	1f
181*4882a593Smuzhiyun	bset	#15,%d1
182*4882a593Smuzhiyun	bset	#7,%d1
183*4882a593Smuzhiyun	move.l	%d1,(FPD_FPSR,FPDATA)
184*4882a593Smuzhiyun1:	and.w	#0xf,%d0
185*4882a593Smuzhiyun	jmp	([0f:w,%pc,%d0.w*4])
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun	.align	4
188*4882a593Smuzhiyun0:
189*4882a593Smuzhiyun	.long	fp_f  , fp_eq , fp_ogt, fp_oge
190*4882a593Smuzhiyun	.long	fp_olt, fp_ole, fp_ogl, fp_or
191*4882a593Smuzhiyun	.long	fp_un , fp_ueq, fp_ugt, fp_uge
192*4882a593Smuzhiyun	.long	fp_ult, fp_ule, fp_ne , fp_t
193*4882a593Smuzhiyun
194*4882a593Smuzhiyunfp_f:
195*4882a593Smuzhiyun	moveq	#0,%d0
196*4882a593Smuzhiyun	rts
197*4882a593Smuzhiyun
198*4882a593Smuzhiyunfp_eq:
199*4882a593Smuzhiyun	moveq	#0,%d0
200*4882a593Smuzhiyun	tst_Z
201*4882a593Smuzhiyun	jeq	1f
202*4882a593Smuzhiyun	moveq	#-1,%d0
203*4882a593Smuzhiyun1:	rts
204*4882a593Smuzhiyun
205*4882a593Smuzhiyunfp_ogt:
206*4882a593Smuzhiyun	moveq	#0,%d0
207*4882a593Smuzhiyun	tst_NAN
208*4882a593Smuzhiyun	jne	1f
209*4882a593Smuzhiyun	tst_Z
210*4882a593Smuzhiyun	jne	1f
211*4882a593Smuzhiyun	tst_N
212*4882a593Smuzhiyun	jne	1f
213*4882a593Smuzhiyun	moveq	#-1,%d0
214*4882a593Smuzhiyun1:	rts
215*4882a593Smuzhiyun
216*4882a593Smuzhiyunfp_oge:
217*4882a593Smuzhiyun	moveq	#-1,%d0
218*4882a593Smuzhiyun	tst_Z
219*4882a593Smuzhiyun	jne	2f
220*4882a593Smuzhiyun	tst_NAN
221*4882a593Smuzhiyun	jne	1f
222*4882a593Smuzhiyun	tst_N
223*4882a593Smuzhiyun	jeq	2f
224*4882a593Smuzhiyun1:	moveq	#0,%d0
225*4882a593Smuzhiyun2:	rts
226*4882a593Smuzhiyun
227*4882a593Smuzhiyunfp_olt:
228*4882a593Smuzhiyun	moveq	#0,%d0
229*4882a593Smuzhiyun	tst_NAN
230*4882a593Smuzhiyun	jne	1f
231*4882a593Smuzhiyun	tst_Z
232*4882a593Smuzhiyun	jne	1f
233*4882a593Smuzhiyun	tst_N
234*4882a593Smuzhiyun	jeq	1f
235*4882a593Smuzhiyun	moveq	#-1,%d0
236*4882a593Smuzhiyun1:	rts
237*4882a593Smuzhiyun
238*4882a593Smuzhiyunfp_ole:
239*4882a593Smuzhiyun	moveq	#-1,%d0
240*4882a593Smuzhiyun	tst_Z
241*4882a593Smuzhiyun	jne	2f
242*4882a593Smuzhiyun	tst_NAN
243*4882a593Smuzhiyun	jne	1f
244*4882a593Smuzhiyun	tst_N
245*4882a593Smuzhiyun	jne	2f
246*4882a593Smuzhiyun1:	moveq	#0,%d0
247*4882a593Smuzhiyun2:	rts
248*4882a593Smuzhiyun
249*4882a593Smuzhiyunfp_ogl:
250*4882a593Smuzhiyun	moveq	#0,%d0
251*4882a593Smuzhiyun	tst_NAN
252*4882a593Smuzhiyun	jne	1f
253*4882a593Smuzhiyun	tst_Z
254*4882a593Smuzhiyun	jne	1f
255*4882a593Smuzhiyun	moveq	#-1,%d0
256*4882a593Smuzhiyun1:	rts
257*4882a593Smuzhiyun
258*4882a593Smuzhiyunfp_or:
259*4882a593Smuzhiyun	moveq	#0,%d0
260*4882a593Smuzhiyun	tst_NAN
261*4882a593Smuzhiyun	jne	1f
262*4882a593Smuzhiyun	moveq	#-1,%d0
263*4882a593Smuzhiyun1:	rts
264*4882a593Smuzhiyun
265*4882a593Smuzhiyunfp_un:
266*4882a593Smuzhiyun	moveq	#0,%d0
267*4882a593Smuzhiyun	tst_NAN
268*4882a593Smuzhiyun	jeq	1f
269*4882a593Smuzhiyun	moveq	#-1,%d0
270*4882a593Smuzhiyun	rts
271*4882a593Smuzhiyun
272*4882a593Smuzhiyunfp_ueq:
273*4882a593Smuzhiyun	moveq	#-1,%d0
274*4882a593Smuzhiyun	tst_NAN
275*4882a593Smuzhiyun	jne	1f
276*4882a593Smuzhiyun	tst_Z
277*4882a593Smuzhiyun	jne	1f
278*4882a593Smuzhiyun	moveq	#0,%d0
279*4882a593Smuzhiyun1:	rts
280*4882a593Smuzhiyun
281*4882a593Smuzhiyunfp_ugt:
282*4882a593Smuzhiyun	moveq	#-1,%d0
283*4882a593Smuzhiyun	tst_NAN
284*4882a593Smuzhiyun	jne	2f
285*4882a593Smuzhiyun	tst_N
286*4882a593Smuzhiyun	jne	1f
287*4882a593Smuzhiyun	tst_Z
288*4882a593Smuzhiyun	jeq	2f
289*4882a593Smuzhiyun1:	moveq	#0,%d0
290*4882a593Smuzhiyun2:	rts
291*4882a593Smuzhiyun
292*4882a593Smuzhiyunfp_uge:
293*4882a593Smuzhiyun	moveq	#-1,%d0
294*4882a593Smuzhiyun	tst_NAN
295*4882a593Smuzhiyun	jne	1f
296*4882a593Smuzhiyun	tst_Z
297*4882a593Smuzhiyun	jne	1f
298*4882a593Smuzhiyun	tst_N
299*4882a593Smuzhiyun	jeq	1f
300*4882a593Smuzhiyun	moveq	#0,%d0
301*4882a593Smuzhiyun1:	rts
302*4882a593Smuzhiyun
303*4882a593Smuzhiyunfp_ult:
304*4882a593Smuzhiyun	moveq	#-1,%d0
305*4882a593Smuzhiyun	tst_NAN
306*4882a593Smuzhiyun	jne	2f
307*4882a593Smuzhiyun	tst_Z
308*4882a593Smuzhiyun	jne	1f
309*4882a593Smuzhiyun	tst_N
310*4882a593Smuzhiyun	jne	2f
311*4882a593Smuzhiyun1:	moveq	#0,%d0
312*4882a593Smuzhiyun2:	rts
313*4882a593Smuzhiyun
314*4882a593Smuzhiyunfp_ule:
315*4882a593Smuzhiyun	moveq	#-1,%d0
316*4882a593Smuzhiyun	tst_NAN
317*4882a593Smuzhiyun	jne	1f
318*4882a593Smuzhiyun	tst_Z
319*4882a593Smuzhiyun	jne	1f
320*4882a593Smuzhiyun	tst_N
321*4882a593Smuzhiyun	jne	1f
322*4882a593Smuzhiyun	moveq	#0,%d0
323*4882a593Smuzhiyun1:	rts
324*4882a593Smuzhiyun
325*4882a593Smuzhiyunfp_ne:
326*4882a593Smuzhiyun	moveq	#0,%d0
327*4882a593Smuzhiyun	tst_Z
328*4882a593Smuzhiyun	jne	1f
329*4882a593Smuzhiyun	moveq	#-1,%d0
330*4882a593Smuzhiyun1:	rts
331*4882a593Smuzhiyun
332*4882a593Smuzhiyunfp_t:
333*4882a593Smuzhiyun	moveq	#-1,%d0
334*4882a593Smuzhiyun	rts
335