18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * fp_cond.S
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright Roman Zippel, 1997.  All rights reserved.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Redistribution and use in source and binary forms, with or without
78c2ecf20Sopenharmony_ci * modification, are permitted provided that the following conditions
88c2ecf20Sopenharmony_ci * are met:
98c2ecf20Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright
108c2ecf20Sopenharmony_ci *    notice, and the entire permission notice in its entirety,
118c2ecf20Sopenharmony_ci *    including the disclaimer of warranties.
128c2ecf20Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright
138c2ecf20Sopenharmony_ci *    notice, this list of conditions and the following disclaimer in the
148c2ecf20Sopenharmony_ci *    documentation and/or other materials provided with the distribution.
158c2ecf20Sopenharmony_ci * 3. The name of the author may not be used to endorse or promote
168c2ecf20Sopenharmony_ci *    products derived from this software without specific prior
178c2ecf20Sopenharmony_ci *    written permission.
188c2ecf20Sopenharmony_ci *
198c2ecf20Sopenharmony_ci * ALTERNATIVELY, this product may be distributed under the terms of
208c2ecf20Sopenharmony_ci * the GNU General Public License, in which case the provisions of the GPL are
218c2ecf20Sopenharmony_ci * required INSTEAD OF the above restrictions.  (This clause is
228c2ecf20Sopenharmony_ci * necessary due to a potential bad interaction between the GPL and
238c2ecf20Sopenharmony_ci * the restrictions contained in a BSD-style copyright.)
248c2ecf20Sopenharmony_ci *
258c2ecf20Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
268c2ecf20Sopenharmony_ci * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
278c2ecf20Sopenharmony_ci * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
288c2ecf20Sopenharmony_ci * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
298c2ecf20Sopenharmony_ci * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
308c2ecf20Sopenharmony_ci * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
318c2ecf20Sopenharmony_ci * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
328c2ecf20Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
338c2ecf20Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
348c2ecf20Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
358c2ecf20Sopenharmony_ci * OF THE POSSIBILITY OF SUCH DAMAGE.
368c2ecf20Sopenharmony_ci */
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci#include "fp_emu.h"
398c2ecf20Sopenharmony_ci#include "fp_decode.h"
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	.globl	fp_fscc, fp_fbccw, fp_fbccl
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci#ifdef FPU_EMU_DEBUG
448c2ecf20Sopenharmony_cifp_fnop:
458c2ecf20Sopenharmony_ci	printf	PDECODE,"fnop\n"
468c2ecf20Sopenharmony_ci	jra	fp_end
478c2ecf20Sopenharmony_ci#else
488c2ecf20Sopenharmony_ci#define fp_fnop fp_end
498c2ecf20Sopenharmony_ci#endif
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cifp_fbccw:
528c2ecf20Sopenharmony_ci	tst.w	%d2
538c2ecf20Sopenharmony_ci	jeq	fp_fnop
548c2ecf20Sopenharmony_ci	printf	PDECODE,"fbccw "
558c2ecf20Sopenharmony_ci	fp_get_pc %a0
568c2ecf20Sopenharmony_ci	lea	(-2,%a0,%d2.w),%a0
578c2ecf20Sopenharmony_ci	jra	1f
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_cifp_fbccl:
608c2ecf20Sopenharmony_ci	printf	PDECODE,"fbccl "
618c2ecf20Sopenharmony_ci	fp_get_pc %a0
628c2ecf20Sopenharmony_ci	move.l	%d2,%d0
638c2ecf20Sopenharmony_ci	swap	%d0
648c2ecf20Sopenharmony_ci	fp_get_instr_word %d0,fp_err_ua1
658c2ecf20Sopenharmony_ci	lea	(-2,%a0,%d0.l),%a0
668c2ecf20Sopenharmony_ci1:	printf	PDECODE,"%x",1,%a0
678c2ecf20Sopenharmony_ci	move.l	%d2,%d0
688c2ecf20Sopenharmony_ci	swap	%d0
698c2ecf20Sopenharmony_ci	jsr	fp_compute_cond
708c2ecf20Sopenharmony_ci	tst.l	%d0
718c2ecf20Sopenharmony_ci	jeq	1f
728c2ecf20Sopenharmony_ci	fp_put_pc %a0,1
738c2ecf20Sopenharmony_ci1:	printf	PDECODE,"\n"
748c2ecf20Sopenharmony_ci	jra	fp_end
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cifp_fdbcc:
778c2ecf20Sopenharmony_ci	printf	PDECODE,"fdbcc "
788c2ecf20Sopenharmony_ci	fp_get_pc %a1				| calculate new pc
798c2ecf20Sopenharmony_ci	fp_get_instr_word %d0,fp_err_ua1
808c2ecf20Sopenharmony_ci	add.w	%d0,%a1
818c2ecf20Sopenharmony_ci	fp_decode_addr_reg
828c2ecf20Sopenharmony_ci	printf	PDECODE,"d%d,%x\n",2,%d0,%a1
838c2ecf20Sopenharmony_ci	swap	%d1				| test condition in %d1
848c2ecf20Sopenharmony_ci	tst.w	%d1
858c2ecf20Sopenharmony_ci	jne	2f
868c2ecf20Sopenharmony_ci	move.l	%d0,%d1
878c2ecf20Sopenharmony_ci	jsr	fp_get_data_reg
888c2ecf20Sopenharmony_ci	subq.w	#1,%d0
898c2ecf20Sopenharmony_ci	jcs	1f
908c2ecf20Sopenharmony_ci	fp_put_pc %a1,1
918c2ecf20Sopenharmony_ci1:	jsr	fp_put_data_reg
928c2ecf20Sopenharmony_ci2:	jra	fp_end
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci| set flags for decode macros for fs<cc>
958c2ecf20Sopenharmony_cido_fscc=1
968c2ecf20Sopenharmony_cido_no_pc_mode=1
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cifp_fscc:
998c2ecf20Sopenharmony_ci	printf	PDECODE,"fscc "
1008c2ecf20Sopenharmony_ci	move.l	%d2,%d0
1018c2ecf20Sopenharmony_ci	jsr	fp_compute_cond
1028c2ecf20Sopenharmony_ci	move.w	%d0,%d1
1038c2ecf20Sopenharmony_ci	swap	%d1
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	| decode addressing mode
1068c2ecf20Sopenharmony_ci	fp_decode_addr_mode
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci	.long	fp_data, fp_fdbcc
1098c2ecf20Sopenharmony_ci	.long	fp_indirect, fp_postinc
1108c2ecf20Sopenharmony_ci	.long	fp_predecr, fp_disp16
1118c2ecf20Sopenharmony_ci	.long	fp_extmode0, fp_extmode1
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	| addressing mode: data register direct
1148c2ecf20Sopenharmony_cifp_data:
1158c2ecf20Sopenharmony_ci	fp_mode_data_direct
1168c2ecf20Sopenharmony_ci	move.w	%d0,%d1			| save register nr
1178c2ecf20Sopenharmony_ci	jsr	fp_get_data_reg
1188c2ecf20Sopenharmony_ci	swap	%d1
1198c2ecf20Sopenharmony_ci	move.b	%d1,%d0
1208c2ecf20Sopenharmony_ci	swap	%d1
1218c2ecf20Sopenharmony_ci	jsr	fp_put_data_reg
1228c2ecf20Sopenharmony_ci	printf	PDECODE,"\n"
1238c2ecf20Sopenharmony_ci	jra	fp_end
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_cifp_indirect:
1268c2ecf20Sopenharmony_ci	fp_mode_addr_indirect
1278c2ecf20Sopenharmony_ci	jra	fp_do_scc
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_cifp_postinc:
1308c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_postinc
1318c2ecf20Sopenharmony_ci	jra	fp_do_scc
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_cifp_predecr:
1348c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_predec
1358c2ecf20Sopenharmony_ci	jra	fp_do_scc
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_cifp_disp16:
1388c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_disp16
1398c2ecf20Sopenharmony_ci	jra	fp_do_scc
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_cifp_extmode0:
1428c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_extmode0
1438c2ecf20Sopenharmony_ci	jra	fp_do_scc
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_cifp_extmode1:
1468c2ecf20Sopenharmony_ci	bfextu	%d2{#13,#3},%d0
1478c2ecf20Sopenharmony_ci	jmp	([0f:w,%pc,%d0*4])
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci	.align	4
1508c2ecf20Sopenharmony_ci0:
1518c2ecf20Sopenharmony_ci	.long	fp_absolute_short, fp_absolute_long
1528c2ecf20Sopenharmony_ci	.long	fp_ill, fp_ill		| NOTE: jump here to ftrap.x
1538c2ecf20Sopenharmony_ci	.long	fp_ill, fp_ill
1548c2ecf20Sopenharmony_ci	.long	fp_ill, fp_ill
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_cifp_absolute_short:
1578c2ecf20Sopenharmony_ci	fp_mode_abs_short
1588c2ecf20Sopenharmony_ci	jra	fp_do_scc
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_cifp_absolute_long:
1618c2ecf20Sopenharmony_ci	fp_mode_abs_long
1628c2ecf20Sopenharmony_ci|	jra	fp_do_scc
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_cifp_do_scc:
1658c2ecf20Sopenharmony_ci	swap	%d1
1668c2ecf20Sopenharmony_ci	putuser.b %d1,(%a0),fp_err_ua1,%a0
1678c2ecf20Sopenharmony_ci	printf	PDECODE,"\n"
1688c2ecf20Sopenharmony_ci	jra	fp_end
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_ci#define tst_NAN	btst #24,%d1
1728c2ecf20Sopenharmony_ci#define tst_Z	btst #26,%d1
1738c2ecf20Sopenharmony_ci#define tst_N	btst #27,%d1
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_cifp_compute_cond:
1768c2ecf20Sopenharmony_ci	move.l	(FPD_FPSR,FPDATA),%d1
1778c2ecf20Sopenharmony_ci	btst	#4,%d0
1788c2ecf20Sopenharmony_ci	jeq	1f
1798c2ecf20Sopenharmony_ci	tst_NAN
1808c2ecf20Sopenharmony_ci	jeq	1f
1818c2ecf20Sopenharmony_ci	bset	#15,%d1
1828c2ecf20Sopenharmony_ci	bset	#7,%d1
1838c2ecf20Sopenharmony_ci	move.l	%d1,(FPD_FPSR,FPDATA)
1848c2ecf20Sopenharmony_ci1:	and.w	#0xf,%d0
1858c2ecf20Sopenharmony_ci	jmp	([0f:w,%pc,%d0.w*4])
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci	.align	4
1888c2ecf20Sopenharmony_ci0:
1898c2ecf20Sopenharmony_ci	.long	fp_f  , fp_eq , fp_ogt, fp_oge
1908c2ecf20Sopenharmony_ci	.long	fp_olt, fp_ole, fp_ogl, fp_or
1918c2ecf20Sopenharmony_ci	.long	fp_un , fp_ueq, fp_ugt, fp_uge
1928c2ecf20Sopenharmony_ci	.long	fp_ult, fp_ule, fp_ne , fp_t
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_cifp_f:
1958c2ecf20Sopenharmony_ci	moveq	#0,%d0
1968c2ecf20Sopenharmony_ci	rts
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_cifp_eq:
1998c2ecf20Sopenharmony_ci	moveq	#0,%d0
2008c2ecf20Sopenharmony_ci	tst_Z
2018c2ecf20Sopenharmony_ci	jeq	1f
2028c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2038c2ecf20Sopenharmony_ci1:	rts
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_cifp_ogt:
2068c2ecf20Sopenharmony_ci	moveq	#0,%d0
2078c2ecf20Sopenharmony_ci	tst_NAN
2088c2ecf20Sopenharmony_ci	jne	1f
2098c2ecf20Sopenharmony_ci	tst_Z
2108c2ecf20Sopenharmony_ci	jne	1f
2118c2ecf20Sopenharmony_ci	tst_N
2128c2ecf20Sopenharmony_ci	jne	1f
2138c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2148c2ecf20Sopenharmony_ci1:	rts
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_cifp_oge:
2178c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2188c2ecf20Sopenharmony_ci	tst_Z
2198c2ecf20Sopenharmony_ci	jne	2f
2208c2ecf20Sopenharmony_ci	tst_NAN
2218c2ecf20Sopenharmony_ci	jne	1f
2228c2ecf20Sopenharmony_ci	tst_N
2238c2ecf20Sopenharmony_ci	jeq	2f
2248c2ecf20Sopenharmony_ci1:	moveq	#0,%d0
2258c2ecf20Sopenharmony_ci2:	rts
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_cifp_olt:
2288c2ecf20Sopenharmony_ci	moveq	#0,%d0
2298c2ecf20Sopenharmony_ci	tst_NAN
2308c2ecf20Sopenharmony_ci	jne	1f
2318c2ecf20Sopenharmony_ci	tst_Z
2328c2ecf20Sopenharmony_ci	jne	1f
2338c2ecf20Sopenharmony_ci	tst_N
2348c2ecf20Sopenharmony_ci	jeq	1f
2358c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2368c2ecf20Sopenharmony_ci1:	rts
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_cifp_ole:
2398c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2408c2ecf20Sopenharmony_ci	tst_Z
2418c2ecf20Sopenharmony_ci	jne	2f
2428c2ecf20Sopenharmony_ci	tst_NAN
2438c2ecf20Sopenharmony_ci	jne	1f
2448c2ecf20Sopenharmony_ci	tst_N
2458c2ecf20Sopenharmony_ci	jne	2f
2468c2ecf20Sopenharmony_ci1:	moveq	#0,%d0
2478c2ecf20Sopenharmony_ci2:	rts
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_cifp_ogl:
2508c2ecf20Sopenharmony_ci	moveq	#0,%d0
2518c2ecf20Sopenharmony_ci	tst_NAN
2528c2ecf20Sopenharmony_ci	jne	1f
2538c2ecf20Sopenharmony_ci	tst_Z
2548c2ecf20Sopenharmony_ci	jne	1f
2558c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2568c2ecf20Sopenharmony_ci1:	rts
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_cifp_or:
2598c2ecf20Sopenharmony_ci	moveq	#0,%d0
2608c2ecf20Sopenharmony_ci	tst_NAN
2618c2ecf20Sopenharmony_ci	jne	1f
2628c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2638c2ecf20Sopenharmony_ci1:	rts
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_cifp_un:
2668c2ecf20Sopenharmony_ci	moveq	#0,%d0
2678c2ecf20Sopenharmony_ci	tst_NAN
2688c2ecf20Sopenharmony_ci	jeq	1f
2698c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2708c2ecf20Sopenharmony_ci	rts
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_cifp_ueq:
2738c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2748c2ecf20Sopenharmony_ci	tst_NAN
2758c2ecf20Sopenharmony_ci	jne	1f
2768c2ecf20Sopenharmony_ci	tst_Z
2778c2ecf20Sopenharmony_ci	jne	1f
2788c2ecf20Sopenharmony_ci	moveq	#0,%d0
2798c2ecf20Sopenharmony_ci1:	rts
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_cifp_ugt:
2828c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2838c2ecf20Sopenharmony_ci	tst_NAN
2848c2ecf20Sopenharmony_ci	jne	2f
2858c2ecf20Sopenharmony_ci	tst_N
2868c2ecf20Sopenharmony_ci	jne	1f
2878c2ecf20Sopenharmony_ci	tst_Z
2888c2ecf20Sopenharmony_ci	jeq	2f
2898c2ecf20Sopenharmony_ci1:	moveq	#0,%d0
2908c2ecf20Sopenharmony_ci2:	rts
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_cifp_uge:
2938c2ecf20Sopenharmony_ci	moveq	#-1,%d0
2948c2ecf20Sopenharmony_ci	tst_NAN
2958c2ecf20Sopenharmony_ci	jne	1f
2968c2ecf20Sopenharmony_ci	tst_Z
2978c2ecf20Sopenharmony_ci	jne	1f
2988c2ecf20Sopenharmony_ci	tst_N
2998c2ecf20Sopenharmony_ci	jeq	1f
3008c2ecf20Sopenharmony_ci	moveq	#0,%d0
3018c2ecf20Sopenharmony_ci1:	rts
3028c2ecf20Sopenharmony_ci
3038c2ecf20Sopenharmony_cifp_ult:
3048c2ecf20Sopenharmony_ci	moveq	#-1,%d0
3058c2ecf20Sopenharmony_ci	tst_NAN
3068c2ecf20Sopenharmony_ci	jne	2f
3078c2ecf20Sopenharmony_ci	tst_Z
3088c2ecf20Sopenharmony_ci	jne	1f
3098c2ecf20Sopenharmony_ci	tst_N
3108c2ecf20Sopenharmony_ci	jne	2f
3118c2ecf20Sopenharmony_ci1:	moveq	#0,%d0
3128c2ecf20Sopenharmony_ci2:	rts
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_cifp_ule:
3158c2ecf20Sopenharmony_ci	moveq	#-1,%d0
3168c2ecf20Sopenharmony_ci	tst_NAN
3178c2ecf20Sopenharmony_ci	jne	1f
3188c2ecf20Sopenharmony_ci	tst_Z
3198c2ecf20Sopenharmony_ci	jne	1f
3208c2ecf20Sopenharmony_ci	tst_N
3218c2ecf20Sopenharmony_ci	jne	1f
3228c2ecf20Sopenharmony_ci	moveq	#0,%d0
3238c2ecf20Sopenharmony_ci1:	rts
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_cifp_ne:
3268c2ecf20Sopenharmony_ci	moveq	#0,%d0
3278c2ecf20Sopenharmony_ci	tst_Z
3288c2ecf20Sopenharmony_ci	jne	1f
3298c2ecf20Sopenharmony_ci	moveq	#-1,%d0
3308c2ecf20Sopenharmony_ci1:	rts
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_cifp_t:
3338c2ecf20Sopenharmony_ci	moveq	#-1,%d0
3348c2ecf20Sopenharmony_ci	rts
335