xref: /openbmc/linux/arch/m68k/math-emu/fp_cond.S (revision 1da177e4)
11da177e4SLinus Torvalds/*
21da177e4SLinus Torvalds * fp_cond.S
31da177e4SLinus Torvalds *
41da177e4SLinus Torvalds * Copyright Roman Zippel, 1997.  All rights reserved.
51da177e4SLinus Torvalds *
61da177e4SLinus Torvalds * Redistribution and use in source and binary forms, with or without
71da177e4SLinus Torvalds * modification, are permitted provided that the following conditions
81da177e4SLinus Torvalds * are met:
91da177e4SLinus Torvalds * 1. Redistributions of source code must retain the above copyright
101da177e4SLinus Torvalds *    notice, and the entire permission notice in its entirety,
111da177e4SLinus Torvalds *    including the disclaimer of warranties.
121da177e4SLinus Torvalds * 2. Redistributions in binary form must reproduce the above copyright
131da177e4SLinus Torvalds *    notice, this list of conditions and the following disclaimer in the
141da177e4SLinus Torvalds *    documentation and/or other materials provided with the distribution.
151da177e4SLinus Torvalds * 3. The name of the author may not be used to endorse or promote
161da177e4SLinus Torvalds *    products derived from this software without specific prior
171da177e4SLinus Torvalds *    written permission.
181da177e4SLinus Torvalds *
191da177e4SLinus Torvalds * ALTERNATIVELY, this product may be distributed under the terms of
201da177e4SLinus Torvalds * the GNU General Public License, in which case the provisions of the GPL are
211da177e4SLinus Torvalds * required INSTEAD OF the above restrictions.  (This clause is
221da177e4SLinus Torvalds * necessary due to a potential bad interaction between the GPL and
231da177e4SLinus Torvalds * the restrictions contained in a BSD-style copyright.)
241da177e4SLinus Torvalds *
251da177e4SLinus Torvalds * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
261da177e4SLinus Torvalds * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
271da177e4SLinus Torvalds * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
281da177e4SLinus Torvalds * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
291da177e4SLinus Torvalds * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
301da177e4SLinus Torvalds * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
311da177e4SLinus Torvalds * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
321da177e4SLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
331da177e4SLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
341da177e4SLinus Torvalds * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
351da177e4SLinus Torvalds * OF THE POSSIBILITY OF SUCH DAMAGE.
361da177e4SLinus Torvalds */
371da177e4SLinus Torvalds
381da177e4SLinus Torvalds#include "fp_emu.h"
391da177e4SLinus Torvalds#include "fp_decode.h"
401da177e4SLinus Torvalds
411da177e4SLinus Torvalds	.globl	fp_fscc, fp_fbccw, fp_fbccl
421da177e4SLinus Torvalds
431da177e4SLinus Torvalds#ifdef FPU_EMU_DEBUG
441da177e4SLinus Torvaldsfp_fnop:
451da177e4SLinus Torvalds	printf	PDECODE,"fnop\n"
461da177e4SLinus Torvalds	jra	fp_end
471da177e4SLinus Torvalds#else
481da177e4SLinus Torvalds#define fp_fnop fp_end
491da177e4SLinus Torvalds#endif
501da177e4SLinus Torvalds
511da177e4SLinus Torvaldsfp_fbccw:
521da177e4SLinus Torvalds	tst.w	%d2
531da177e4SLinus Torvalds	jeq	fp_fnop
541da177e4SLinus Torvalds	printf	PDECODE,"fbccw "
551da177e4SLinus Torvalds	fp_get_pc %a0
561da177e4SLinus Torvalds	lea	(-2,%a0,%d2.w),%a0
571da177e4SLinus Torvalds	jra	1f
581da177e4SLinus Torvalds
591da177e4SLinus Torvaldsfp_fbccl:
601da177e4SLinus Torvalds	printf	PDECODE,"fbccl "
611da177e4SLinus Torvalds	fp_get_pc %a0
621da177e4SLinus Torvalds	move.l	%d2,%d0
631da177e4SLinus Torvalds	swap	%d0
641da177e4SLinus Torvalds	fp_get_instr_word %d0,fp_err_ua1
651da177e4SLinus Torvalds	lea	(-2,%a0,%d0.l),%a0
661da177e4SLinus Torvalds1:	printf	PDECODE,"%x",1,%a0
671da177e4SLinus Torvalds	move.l	%d2,%d0
681da177e4SLinus Torvalds	swap	%d0
691da177e4SLinus Torvalds	jsr	fp_compute_cond
701da177e4SLinus Torvalds	tst.l	%d0
711da177e4SLinus Torvalds	jeq	1f
721da177e4SLinus Torvalds	fp_put_pc %a0,1
731da177e4SLinus Torvalds1:	printf	PDECODE,"\n"
741da177e4SLinus Torvalds	jra	fp_end
751da177e4SLinus Torvalds
761da177e4SLinus Torvaldsfp_fdbcc:
771da177e4SLinus Torvalds	printf	PDECODE,"fdbcc "
781da177e4SLinus Torvalds	fp_get_pc %a1				| calculate new pc
791da177e4SLinus Torvalds	fp_get_instr_word %d0,fp_err_ua1
801da177e4SLinus Torvalds	add.w	%d0,%a1
811da177e4SLinus Torvalds	fp_decode_addr_reg
821da177e4SLinus Torvalds	printf	PDECODE,"d%d,%x\n",2,%d0,%a1
831da177e4SLinus Torvalds	swap	%d1				| test condition in %d1
841da177e4SLinus Torvalds	tst.w	%d1
851da177e4SLinus Torvalds	jne	2f
861da177e4SLinus Torvalds	move.l	%d0,%d1
871da177e4SLinus Torvalds	jsr	fp_get_data_reg
881da177e4SLinus Torvalds	subq.w	#1,%d0
891da177e4SLinus Torvalds	jcs	1f
901da177e4SLinus Torvalds	fp_put_pc %a1,1
911da177e4SLinus Torvalds1:	jsr	fp_put_data_reg
921da177e4SLinus Torvalds2:	jra	fp_end
931da177e4SLinus Torvalds
941da177e4SLinus Torvalds| set flags for decode macros for fs<cc>
951da177e4SLinus Torvaldsdo_fscc=1
961da177e4SLinus Torvaldsdo_no_pc_mode=1
971da177e4SLinus Torvalds
981da177e4SLinus Torvaldsfp_fscc:
991da177e4SLinus Torvalds	printf	PDECODE,"fscc "
1001da177e4SLinus Torvalds	move.l	%d2,%d0
1011da177e4SLinus Torvalds	jsr	fp_compute_cond
1021da177e4SLinus Torvalds	move.w	%d0,%d1
1031da177e4SLinus Torvalds	swap	%d1
1041da177e4SLinus Torvalds
1051da177e4SLinus Torvalds	| decode addressing mode
1061da177e4SLinus Torvalds	fp_decode_addr_mode
1071da177e4SLinus Torvalds
1081da177e4SLinus Torvalds	.long	fp_data, fp_fdbcc
1091da177e4SLinus Torvalds	.long	fp_indirect, fp_postinc
1101da177e4SLinus Torvalds	.long	fp_predecr, fp_disp16
1111da177e4SLinus Torvalds	.long	fp_extmode0, fp_extmode1
1121da177e4SLinus Torvalds
1131da177e4SLinus Torvalds	| addressing mode: data register direct
1141da177e4SLinus Torvaldsfp_data:
1151da177e4SLinus Torvalds	fp_mode_data_direct
1161da177e4SLinus Torvalds	move.w	%d0,%d1			| save register nr
1171da177e4SLinus Torvalds	jsr	fp_get_data_reg
1181da177e4SLinus Torvalds	swap	%d1
1191da177e4SLinus Torvalds	move.b	%d1,%d0
1201da177e4SLinus Torvalds	swap	%d1
1211da177e4SLinus Torvalds	jsr	fp_put_data_reg
1221da177e4SLinus Torvalds	printf	PDECODE,"\n"
1231da177e4SLinus Torvalds	jra	fp_end
1241da177e4SLinus Torvalds
1251da177e4SLinus Torvaldsfp_indirect:
1261da177e4SLinus Torvalds	fp_mode_addr_indirect
1271da177e4SLinus Torvalds	jra	fp_do_scc
1281da177e4SLinus Torvalds
1291da177e4SLinus Torvaldsfp_postinc:
1301da177e4SLinus Torvalds	fp_mode_addr_indirect_postinc
1311da177e4SLinus Torvalds	jra	fp_do_scc
1321da177e4SLinus Torvalds
1331da177e4SLinus Torvaldsfp_predecr:
1341da177e4SLinus Torvalds	fp_mode_addr_indirect_predec
1351da177e4SLinus Torvalds	jra	fp_do_scc
1361da177e4SLinus Torvalds
1371da177e4SLinus Torvaldsfp_disp16:
1381da177e4SLinus Torvalds	fp_mode_addr_indirect_disp16
1391da177e4SLinus Torvalds	jra	fp_do_scc
1401da177e4SLinus Torvalds
1411da177e4SLinus Torvaldsfp_extmode0:
1421da177e4SLinus Torvalds	fp_mode_addr_indirect_extmode0
1431da177e4SLinus Torvalds	jra	fp_do_scc
1441da177e4SLinus Torvalds
1451da177e4SLinus Torvaldsfp_extmode1:
1461da177e4SLinus Torvalds	bfextu	%d2{#13,#3},%d0
1471da177e4SLinus Torvalds	jmp	([0f:w,%pc,%d0*4])
1481da177e4SLinus Torvalds
1491da177e4SLinus Torvalds	.align	4
1501da177e4SLinus Torvalds0:
1511da177e4SLinus Torvalds	.long	fp_absolute_short, fp_absolute_long
1521da177e4SLinus Torvalds	.long	fp_ill, fp_ill		| NOTE: jump here to ftrap.x
1531da177e4SLinus Torvalds	.long	fp_ill, fp_ill
1541da177e4SLinus Torvalds	.long	fp_ill, fp_ill
1551da177e4SLinus Torvalds
1561da177e4SLinus Torvaldsfp_absolute_short:
1571da177e4SLinus Torvalds	fp_mode_abs_short
1581da177e4SLinus Torvalds	jra	fp_do_scc
1591da177e4SLinus Torvalds
1601da177e4SLinus Torvaldsfp_absolute_long:
1611da177e4SLinus Torvalds	fp_mode_abs_long
1621da177e4SLinus Torvalds|	jra	fp_do_scc
1631da177e4SLinus Torvalds
1641da177e4SLinus Torvaldsfp_do_scc:
1651da177e4SLinus Torvalds	swap	%d1
1661da177e4SLinus Torvalds	putuser.b %d1,(%a0),fp_err_ua1,%a0
1671da177e4SLinus Torvalds	printf	PDECODE,"\n"
1681da177e4SLinus Torvalds	jra	fp_end
1691da177e4SLinus Torvalds
1701da177e4SLinus Torvalds
1711da177e4SLinus Torvalds#define tst_NAN	btst #24,%d1
1721da177e4SLinus Torvalds#define tst_Z	btst #26,%d1
1731da177e4SLinus Torvalds#define tst_N	btst #27,%d1
1741da177e4SLinus Torvalds
1751da177e4SLinus Torvaldsfp_compute_cond:
1761da177e4SLinus Torvalds	move.l	(FPD_FPSR,FPDATA),%d1
1771da177e4SLinus Torvalds	btst	#4,%d0
1781da177e4SLinus Torvalds	jeq	1f
1791da177e4SLinus Torvalds	tst_NAN
1801da177e4SLinus Torvalds	jeq	1f
1811da177e4SLinus Torvalds	bset	#15,%d1
1821da177e4SLinus Torvalds	bset	#7,%d1
1831da177e4SLinus Torvalds	move.l	%d1,(FPD_FPSR,FPDATA)
1841da177e4SLinus Torvalds1:	and.w	#0xf,%d0
1851da177e4SLinus Torvalds	jmp	([0f:w,%pc,%d0.w*4])
1861da177e4SLinus Torvalds
1871da177e4SLinus Torvalds	.align	4
1881da177e4SLinus Torvalds0:
1891da177e4SLinus Torvalds	.long	fp_f  , fp_eq , fp_ogt, fp_oge
1901da177e4SLinus Torvalds	.long	fp_olt, fp_ole, fp_ogl, fp_or
1911da177e4SLinus Torvalds	.long	fp_un , fp_ueq, fp_ugt, fp_uge
1921da177e4SLinus Torvalds	.long	fp_ult, fp_ule, fp_ne , fp_t
1931da177e4SLinus Torvalds
1941da177e4SLinus Torvaldsfp_f:
1951da177e4SLinus Torvalds	moveq	#0,%d0
1961da177e4SLinus Torvalds	rts
1971da177e4SLinus Torvalds
1981da177e4SLinus Torvaldsfp_eq:
1991da177e4SLinus Torvalds	moveq	#0,%d0
2001da177e4SLinus Torvalds	tst_Z
2011da177e4SLinus Torvalds	jeq	1f
2021da177e4SLinus Torvalds	moveq	#-1,%d0
2031da177e4SLinus Torvalds1:	rts
2041da177e4SLinus Torvalds
2051da177e4SLinus Torvaldsfp_ogt:
2061da177e4SLinus Torvalds	moveq	#0,%d0
2071da177e4SLinus Torvalds	tst_NAN
2081da177e4SLinus Torvalds	jne	1f
2091da177e4SLinus Torvalds	tst_Z
2101da177e4SLinus Torvalds	jne	1f
2111da177e4SLinus Torvalds	tst_N
2121da177e4SLinus Torvalds	jne	1f
2131da177e4SLinus Torvalds	moveq	#-1,%d0
2141da177e4SLinus Torvalds1:	rts
2151da177e4SLinus Torvalds
2161da177e4SLinus Torvaldsfp_oge:
2171da177e4SLinus Torvalds	moveq	#-1,%d0
2181da177e4SLinus Torvalds	tst_Z
2191da177e4SLinus Torvalds	jne	2f
2201da177e4SLinus Torvalds	tst_NAN
2211da177e4SLinus Torvalds	jne	1f
2221da177e4SLinus Torvalds	tst_N
2231da177e4SLinus Torvalds	jeq	2f
2241da177e4SLinus Torvalds1:	moveq	#0,%d0
2251da177e4SLinus Torvalds2:	rts
2261da177e4SLinus Torvalds
2271da177e4SLinus Torvaldsfp_olt:
2281da177e4SLinus Torvalds	moveq	#0,%d0
2291da177e4SLinus Torvalds	tst_NAN
2301da177e4SLinus Torvalds	jne	1f
2311da177e4SLinus Torvalds	tst_Z
2321da177e4SLinus Torvalds	jne	1f
2331da177e4SLinus Torvalds	tst_N
2341da177e4SLinus Torvalds	jeq	1f
2351da177e4SLinus Torvalds	moveq	#-1,%d0
2361da177e4SLinus Torvalds1:	rts
2371da177e4SLinus Torvalds
2381da177e4SLinus Torvaldsfp_ole:
2391da177e4SLinus Torvalds	moveq	#-1,%d0
2401da177e4SLinus Torvalds	tst_Z
2411da177e4SLinus Torvalds	jne	2f
2421da177e4SLinus Torvalds	tst_NAN
2431da177e4SLinus Torvalds	jne	1f
2441da177e4SLinus Torvalds	tst_N
2451da177e4SLinus Torvalds	jne	2f
2461da177e4SLinus Torvalds1:	moveq	#0,%d0
2471da177e4SLinus Torvalds2:	rts
2481da177e4SLinus Torvalds
2491da177e4SLinus Torvaldsfp_ogl:
2501da177e4SLinus Torvalds	moveq	#0,%d0
2511da177e4SLinus Torvalds	tst_NAN
2521da177e4SLinus Torvalds	jne	1f
2531da177e4SLinus Torvalds	tst_Z
2541da177e4SLinus Torvalds	jne	1f
2551da177e4SLinus Torvalds	moveq	#-1,%d0
2561da177e4SLinus Torvalds1:	rts
2571da177e4SLinus Torvalds
2581da177e4SLinus Torvaldsfp_or:
2591da177e4SLinus Torvalds	moveq	#0,%d0
2601da177e4SLinus Torvalds	tst_NAN
2611da177e4SLinus Torvalds	jne	1f
2621da177e4SLinus Torvalds	moveq	#-1,%d0
2631da177e4SLinus Torvalds1:	rts
2641da177e4SLinus Torvalds
2651da177e4SLinus Torvaldsfp_un:
2661da177e4SLinus Torvalds	moveq	#0,%d0
2671da177e4SLinus Torvalds	tst_NAN
2681da177e4SLinus Torvalds	jeq	1f
2691da177e4SLinus Torvalds	moveq	#-1,%d0
2701da177e4SLinus Torvalds	rts
2711da177e4SLinus Torvalds
2721da177e4SLinus Torvaldsfp_ueq:
2731da177e4SLinus Torvalds	moveq	#-1,%d0
2741da177e4SLinus Torvalds	tst_NAN
2751da177e4SLinus Torvalds	jne	1f
2761da177e4SLinus Torvalds	tst_Z
2771da177e4SLinus Torvalds	jne	1f
2781da177e4SLinus Torvalds	moveq	#0,%d0
2791da177e4SLinus Torvalds1:	rts
2801da177e4SLinus Torvalds
2811da177e4SLinus Torvaldsfp_ugt:
2821da177e4SLinus Torvalds	moveq	#-1,%d0
2831da177e4SLinus Torvalds	tst_NAN
2841da177e4SLinus Torvalds	jne	2f
2851da177e4SLinus Torvalds	tst_N
2861da177e4SLinus Torvalds	jne	1f
2871da177e4SLinus Torvalds	tst_Z
2881da177e4SLinus Torvalds	jeq	2f
2891da177e4SLinus Torvalds1:	moveq	#0,%d0
2901da177e4SLinus Torvalds2:	rts
2911da177e4SLinus Torvalds
2921da177e4SLinus Torvaldsfp_uge:
2931da177e4SLinus Torvalds	moveq	#-1,%d0
2941da177e4SLinus Torvalds	tst_NAN
2951da177e4SLinus Torvalds	jne	1f
2961da177e4SLinus Torvalds	tst_Z
2971da177e4SLinus Torvalds	jne	1f
2981da177e4SLinus Torvalds	tst_N
2991da177e4SLinus Torvalds	jeq	1f
3001da177e4SLinus Torvalds	moveq	#0,%d0
3011da177e4SLinus Torvalds1:	rts
3021da177e4SLinus Torvalds
3031da177e4SLinus Torvaldsfp_ult:
3041da177e4SLinus Torvalds	moveq	#-1,%d0
3051da177e4SLinus Torvalds	tst_NAN
3061da177e4SLinus Torvalds	jne	2f
3071da177e4SLinus Torvalds	tst_Z
3081da177e4SLinus Torvalds	jne	1f
3091da177e4SLinus Torvalds	tst_N
3101da177e4SLinus Torvalds	jne	2f
3111da177e4SLinus Torvalds1:	moveq	#0,%d0
3121da177e4SLinus Torvalds2:	rts
3131da177e4SLinus Torvalds
3141da177e4SLinus Torvaldsfp_ule:
3151da177e4SLinus Torvalds	moveq	#-1,%d0
3161da177e4SLinus Torvalds	tst_NAN
3171da177e4SLinus Torvalds	jne	1f
3181da177e4SLinus Torvalds	tst_Z
3191da177e4SLinus Torvalds	jne	1f
3201da177e4SLinus Torvalds	tst_N
3211da177e4SLinus Torvalds	jne	1f
3221da177e4SLinus Torvalds	moveq	#0,%d0
3231da177e4SLinus Torvalds1:	rts
3241da177e4SLinus Torvalds
3251da177e4SLinus Torvaldsfp_ne:
3261da177e4SLinus Torvalds	moveq	#0,%d0
3271da177e4SLinus Torvalds	tst_Z
3281da177e4SLinus Torvalds	jne	1f
3291da177e4SLinus Torvalds	moveq	#-1,%d0
3301da177e4SLinus Torvalds1:	rts
3311da177e4SLinus Torvalds
3321da177e4SLinus Torvaldsfp_t:
3331da177e4SLinus Torvalds	moveq	#-1,%d0
3341da177e4SLinus Torvalds	rts
335