18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * fp_movem.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| set flags for decode macros for fmovem
428c2ecf20Sopenharmony_cido_fmovem=1
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	.globl	fp_fmovem_fp, fp_fmovem_cr
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci| %d1 contains the mask and count of the register list
478c2ecf20Sopenharmony_ci| for other register usage see fp_decode.h
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_cifp_fmovem_fp:
508c2ecf20Sopenharmony_ci	printf	PDECODE,"fmovem.x "
518c2ecf20Sopenharmony_ci	| get register list and count them
528c2ecf20Sopenharmony_ci	btst	#11,%d2
538c2ecf20Sopenharmony_ci	jne	1f
548c2ecf20Sopenharmony_ci	bfextu	%d2{#24,#8},%d0		| static register list
558c2ecf20Sopenharmony_ci	jra	2f
568c2ecf20Sopenharmony_ci1:	bfextu	%d2{#25,#3},%d0		| dynamic register list
578c2ecf20Sopenharmony_ci	jsr	fp_get_data_reg
588c2ecf20Sopenharmony_ci2:	move.l	%d0,%d1
598c2ecf20Sopenharmony_ci	swap	%d1
608c2ecf20Sopenharmony_ci	jra	2f
618c2ecf20Sopenharmony_ci1:	addq.w	#1,%d1			| count the # of registers in
628c2ecf20Sopenharmony_ci2:	lsr.b	#1,%d0			| register list and keep it in %d1
638c2ecf20Sopenharmony_ci	jcs	1b
648c2ecf20Sopenharmony_ci	jne	2b
658c2ecf20Sopenharmony_ci	printf	PDECODE,"#%08x",1,%d1
668c2ecf20Sopenharmony_ci#ifdef FPU_EMU_DEBUG
678c2ecf20Sopenharmony_ci	btst	#12,%d2
688c2ecf20Sopenharmony_ci	jne	1f
698c2ecf20Sopenharmony_ci	printf	PDECODE,"-"		| decremental move
708c2ecf20Sopenharmony_ci	jra	2f
718c2ecf20Sopenharmony_ci1:	printf	PDECODE,"+"		| incremental move
728c2ecf20Sopenharmony_ci2:	btst	#13,%d2
738c2ecf20Sopenharmony_ci	jeq	1f
748c2ecf20Sopenharmony_ci	printf	PDECODE,"->"		| fpu -> cpu
758c2ecf20Sopenharmony_ci	jra	2f
768c2ecf20Sopenharmony_ci1:	printf	PDECODE,"<-"		| fpu <- cpu
778c2ecf20Sopenharmony_ci2:
788c2ecf20Sopenharmony_ci#endif
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	| decode address mode
818c2ecf20Sopenharmony_ci	fp_decode_addr_mode
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	.long	fp_ill, fp_ill
848c2ecf20Sopenharmony_ci	.long	fpr_indirect, fpr_postinc
858c2ecf20Sopenharmony_ci	.long	fpr_predecr, fpr_disp16
868c2ecf20Sopenharmony_ci	.long	fpr_extmode0, fpr_extmode1
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci	| addressing mode: address register indirect
898c2ecf20Sopenharmony_cifpr_indirect:
908c2ecf20Sopenharmony_ci	fp_mode_addr_indirect
918c2ecf20Sopenharmony_ci	jra	fpr_do_movem
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	| addressing mode: address register indirect with postincrement
948c2ecf20Sopenharmony_cifpr_postinc:
958c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_postinc
968c2ecf20Sopenharmony_ci	jra	fpr_do_movem
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cifpr_predecr:
998c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_predec
1008c2ecf20Sopenharmony_ci	jra	fpr_do_movem
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	| addressing mode: address register/programm counter indirect
1038c2ecf20Sopenharmony_ci	|		   with 16bit displacement
1048c2ecf20Sopenharmony_cifpr_disp16:
1058c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_disp16
1068c2ecf20Sopenharmony_ci	jra	fpr_do_movem
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_cifpr_extmode0:
1098c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_extmode0
1108c2ecf20Sopenharmony_ci	jra	fpr_do_movem
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_cifpr_extmode1:
1138c2ecf20Sopenharmony_ci	fp_decode_addr_reg
1148c2ecf20Sopenharmony_ci	jmp	([0f:w,%pc,%d0*4])
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci	.align	4
1178c2ecf20Sopenharmony_ci0:
1188c2ecf20Sopenharmony_ci	.long	fpr_absolute_short, fpr_absolute_long
1198c2ecf20Sopenharmony_ci	.long	fpr_disp16, fpr_extmode0
1208c2ecf20Sopenharmony_ci	.long	fp_ill, fp_ill
1218c2ecf20Sopenharmony_ci	.long	fp_ill, fp_ill
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_cifpr_absolute_short:
1248c2ecf20Sopenharmony_ci	fp_mode_abs_short
1258c2ecf20Sopenharmony_ci	jra	fpr_do_movem
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_cifpr_absolute_long:
1288c2ecf20Sopenharmony_ci	fp_mode_abs_long
1298c2ecf20Sopenharmony_ci|	jra	fpr_do_movem
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_cifpr_do_movem:
1328c2ecf20Sopenharmony_ci	swap	%d1			| get fpu register list
1338c2ecf20Sopenharmony_ci	lea	(FPD_FPREG,FPDATA),%a1
1348c2ecf20Sopenharmony_ci	moveq	#12,%d0
1358c2ecf20Sopenharmony_ci	btst	#12,%d2
1368c2ecf20Sopenharmony_ci	jne	1f
1378c2ecf20Sopenharmony_ci	lea	(-12,%a1,%d0*8),%a1
1388c2ecf20Sopenharmony_ci	neg.l	%d0
1398c2ecf20Sopenharmony_ci1:	btst	#13,%d2
1408c2ecf20Sopenharmony_ci	jne	4f
1418c2ecf20Sopenharmony_ci	| move register from memory into fpu
1428c2ecf20Sopenharmony_ci	jra	3f
1438c2ecf20Sopenharmony_ci1:	printf	PMOVEM,"(%p>%p)",2,%a0,%a1
1448c2ecf20Sopenharmony_ci	getuser.l (%a0)+,%d2,fp_err_ua1,%a0
1458c2ecf20Sopenharmony_ci	lsr.l	#8,%d2
1468c2ecf20Sopenharmony_ci	lsr.l	#7,%d2
1478c2ecf20Sopenharmony_ci	lsr.w	#1,%d2
1488c2ecf20Sopenharmony_ci	move.l	%d2,(%a1)+
1498c2ecf20Sopenharmony_ci	getuser.l (%a0)+,%d2,fp_err_ua1,%a0
1508c2ecf20Sopenharmony_ci	move.l	%d2,(%a1)+
1518c2ecf20Sopenharmony_ci	getuser.l (%a0),%d2,fp_err_ua1,%a0
1528c2ecf20Sopenharmony_ci	move.l	%d2,(%a1)
1538c2ecf20Sopenharmony_ci	subq.l	#8,%a0
1548c2ecf20Sopenharmony_ci	subq.l	#8,%a1
1558c2ecf20Sopenharmony_ci	add.l	%d0,%a0
1568c2ecf20Sopenharmony_ci2:	add.l	%d0,%a1
1578c2ecf20Sopenharmony_ci3:	lsl.b	#1,%d1
1588c2ecf20Sopenharmony_ci	jcs	1b
1598c2ecf20Sopenharmony_ci	jne	2b
1608c2ecf20Sopenharmony_ci	jra	5f
1618c2ecf20Sopenharmony_ci	| move register from fpu into memory
1628c2ecf20Sopenharmony_ci1:	printf	PMOVEM,"(%p>%p)",2,%a1,%a0
1638c2ecf20Sopenharmony_ci	move.l	(%a1)+,%d2
1648c2ecf20Sopenharmony_ci	lsl.w	#1,%d2
1658c2ecf20Sopenharmony_ci	lsl.l	#7,%d2
1668c2ecf20Sopenharmony_ci	lsl.l	#8,%d2
1678c2ecf20Sopenharmony_ci	putuser.l %d2,(%a0)+,fp_err_ua1,%a0
1688c2ecf20Sopenharmony_ci	move.l	(%a1)+,%d2
1698c2ecf20Sopenharmony_ci	putuser.l %d2,(%a0)+,fp_err_ua1,%a0
1708c2ecf20Sopenharmony_ci	move.l	(%a1),%d2
1718c2ecf20Sopenharmony_ci	putuser.l %d2,(%a0),fp_err_ua1,%a0
1728c2ecf20Sopenharmony_ci	subq.l	#8,%a1
1738c2ecf20Sopenharmony_ci	subq.l	#8,%a0
1748c2ecf20Sopenharmony_ci	add.l	%d0,%a0
1758c2ecf20Sopenharmony_ci2:	add.l	%d0,%a1
1768c2ecf20Sopenharmony_ci4:	lsl.b	#1,%d1
1778c2ecf20Sopenharmony_ci	jcs	1b
1788c2ecf20Sopenharmony_ci	jne	2b
1798c2ecf20Sopenharmony_ci5:
1808c2ecf20Sopenharmony_ci	printf	PDECODE,"\n"
1818c2ecf20Sopenharmony_ci#if 0
1828c2ecf20Sopenharmony_ci	lea	(FPD_FPREG,FPDATA),%a0
1838c2ecf20Sopenharmony_ci	printf	PMOVEM,"fp:"
1848c2ecf20Sopenharmony_ci	printx	PMOVEM,%a0@(0)
1858c2ecf20Sopenharmony_ci	printx	PMOVEM,%a0@(12)
1868c2ecf20Sopenharmony_ci	printf	PMOVEM,"\n   "
1878c2ecf20Sopenharmony_ci	printx	PMOVEM,%a0@(24)
1888c2ecf20Sopenharmony_ci	printx	PMOVEM,%a0@(36)
1898c2ecf20Sopenharmony_ci	printf	PMOVEM,"\n   "
1908c2ecf20Sopenharmony_ci	printx	PMOVEM,%a0@(48)
1918c2ecf20Sopenharmony_ci	printx	PMOVEM,%a0@(60)
1928c2ecf20Sopenharmony_ci	printf	PMOVEM,"\n   "
1938c2ecf20Sopenharmony_ci	printx	PMOVEM,%a0@(72)
1948c2ecf20Sopenharmony_ci	printx	PMOVEM,%a0@(84)
1958c2ecf20Sopenharmony_ci	printf	PMOVEM,"\n"
1968c2ecf20Sopenharmony_ci#endif
1978c2ecf20Sopenharmony_ci	jra	fp_end
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci| set flags for decode macros for fmovem control register
2008c2ecf20Sopenharmony_cido_fmovem=1
2018c2ecf20Sopenharmony_cido_fmovem_cr=1
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_cifp_fmovem_cr:
2048c2ecf20Sopenharmony_ci	printf	PDECODE,"fmovem.cr "
2058c2ecf20Sopenharmony_ci	| get register list and count them
2068c2ecf20Sopenharmony_ci	bfextu	%d2{#19,#3},%d0
2078c2ecf20Sopenharmony_ci	move.l	%d0,%d1
2088c2ecf20Sopenharmony_ci	swap	%d1
2098c2ecf20Sopenharmony_ci	jra	2f
2108c2ecf20Sopenharmony_ci1:	addq.w	#1,%d1
2118c2ecf20Sopenharmony_ci2:	lsr.l	#1,%d0
2128c2ecf20Sopenharmony_ci	jcs	1b
2138c2ecf20Sopenharmony_ci	jne	2b
2148c2ecf20Sopenharmony_ci	printf	PDECODE,"#%08x",1,%d1
2158c2ecf20Sopenharmony_ci#ifdef FPU_EMU_DEBUG
2168c2ecf20Sopenharmony_ci	btst	#13,%d2
2178c2ecf20Sopenharmony_ci	jeq	1f
2188c2ecf20Sopenharmony_ci	printf	PDECODE,"->"		| fpu -> cpu
2198c2ecf20Sopenharmony_ci	jra	2f
2208c2ecf20Sopenharmony_ci1:	printf	PDECODE,"<-"		| fpu <- cpu
2218c2ecf20Sopenharmony_ci2:
2228c2ecf20Sopenharmony_ci#endif
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci	| decode address mode
2258c2ecf20Sopenharmony_ci	fp_decode_addr_mode
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci	.long	fpc_data, fpc_addr
2288c2ecf20Sopenharmony_ci	.long	fpc_indirect, fpc_postinc
2298c2ecf20Sopenharmony_ci	.long	fpc_predecr, fpc_disp16
2308c2ecf20Sopenharmony_ci	.long	fpc_extmode0, fpc_extmode1
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_cifpc_data:
2338c2ecf20Sopenharmony_ci	fp_mode_data_direct
2348c2ecf20Sopenharmony_ci	move.w	%d0,%d1
2358c2ecf20Sopenharmony_ci	bfffo	%d2{#19,#3},%d0
2368c2ecf20Sopenharmony_ci	sub.w	#19,%d0
2378c2ecf20Sopenharmony_ci	lea	(FPD_FPCR,FPDATA,%d0.w*4),%a1
2388c2ecf20Sopenharmony_ci	btst	#13,%d2
2398c2ecf20Sopenharmony_ci	jne	1f
2408c2ecf20Sopenharmony_ci	move.w	%d1,%d0
2418c2ecf20Sopenharmony_ci	jsr	fp_get_data_reg
2428c2ecf20Sopenharmony_ci	move.l	%d0,(%a1)
2438c2ecf20Sopenharmony_ci	jra	fpc_movem_fin
2448c2ecf20Sopenharmony_ci1:	move.l	(%a1),%d0
2458c2ecf20Sopenharmony_ci	jsr	fp_put_data_reg
2468c2ecf20Sopenharmony_ci	jra	fpc_movem_fin
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_cifpc_addr:
2498c2ecf20Sopenharmony_ci	fp_decode_addr_reg
2508c2ecf20Sopenharmony_ci	printf	PDECODE,"a%d",1,%d0
2518c2ecf20Sopenharmony_ci	btst	#13,%d2
2528c2ecf20Sopenharmony_ci	jne	1f
2538c2ecf20Sopenharmony_ci	jsr	fp_get_addr_reg
2548c2ecf20Sopenharmony_ci	move.l	%a0,(FPD_FPIAR,FPDATA)
2558c2ecf20Sopenharmony_ci	jra	fpc_movem_fin
2568c2ecf20Sopenharmony_ci1:	move.l	(FPD_FPIAR,FPDATA),%a0
2578c2ecf20Sopenharmony_ci	jsr	fp_put_addr_reg
2588c2ecf20Sopenharmony_ci	jra	fpc_movem_fin
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_cifpc_indirect:
2618c2ecf20Sopenharmony_ci	fp_mode_addr_indirect
2628c2ecf20Sopenharmony_ci	jra	fpc_do_movem
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_cifpc_postinc:
2658c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_postinc
2668c2ecf20Sopenharmony_ci	jra	fpc_do_movem
2678c2ecf20Sopenharmony_ci
2688c2ecf20Sopenharmony_cifpc_predecr:
2698c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_predec
2708c2ecf20Sopenharmony_ci	jra	fpc_do_movem
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_cifpc_disp16:
2738c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_disp16
2748c2ecf20Sopenharmony_ci	jra	fpc_do_movem
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_cifpc_extmode0:
2778c2ecf20Sopenharmony_ci	fp_mode_addr_indirect_extmode0
2788c2ecf20Sopenharmony_ci	jra	fpc_do_movem
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_cifpc_extmode1:
2818c2ecf20Sopenharmony_ci	fp_decode_addr_reg
2828c2ecf20Sopenharmony_ci	jmp	([0f:w,%pc,%d0*4])
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_ci	.align	4
2858c2ecf20Sopenharmony_ci0:
2868c2ecf20Sopenharmony_ci	.long	fpc_absolute_short, fpc_absolute_long
2878c2ecf20Sopenharmony_ci	.long	fpc_disp16, fpc_extmode0
2888c2ecf20Sopenharmony_ci	.long	fpc_immediate, fp_ill
2898c2ecf20Sopenharmony_ci	.long	fp_ill, fp_ill
2908c2ecf20Sopenharmony_ci
2918c2ecf20Sopenharmony_cifpc_absolute_short:
2928c2ecf20Sopenharmony_ci	fp_mode_abs_short
2938c2ecf20Sopenharmony_ci	jra	fpc_do_movem
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_cifpc_absolute_long:
2968c2ecf20Sopenharmony_ci	fp_mode_abs_long
2978c2ecf20Sopenharmony_ci	jra	fpc_do_movem
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_cifpc_immediate:
3008c2ecf20Sopenharmony_ci	fp_get_pc %a0
3018c2ecf20Sopenharmony_ci	lea	(%a0,%d1.w*4),%a1
3028c2ecf20Sopenharmony_ci	fp_put_pc %a1
3038c2ecf20Sopenharmony_ci	printf	PDECODE,"#imm"
3048c2ecf20Sopenharmony_ci|	jra	fpc_do_movem
3058c2ecf20Sopenharmony_ci#if 0
3068c2ecf20Sopenharmony_ci	swap	%d1
3078c2ecf20Sopenharmony_ci	lsl.l	#5,%d1
3088c2ecf20Sopenharmony_ci	lea	(FPD_FPCR,FPDATA),%a0
3098c2ecf20Sopenharmony_ci	jra	3f
3108c2ecf20Sopenharmony_ci1:	move.l	%d0,(%a0)
3118c2ecf20Sopenharmony_ci2:	addq.l	#4,%a0
3128c2ecf20Sopenharmony_ci3:	lsl.b	#1,%d1
3138c2ecf20Sopenharmony_ci	jcs	1b
3148c2ecf20Sopenharmony_ci	jne	2b
3158c2ecf20Sopenharmony_ci	jra	fpc_movem_fin
3168c2ecf20Sopenharmony_ci#endif
3178c2ecf20Sopenharmony_ci
3188c2ecf20Sopenharmony_cifpc_do_movem:
3198c2ecf20Sopenharmony_ci	swap	%d1			| get fpu register list
3208c2ecf20Sopenharmony_ci	lsl.l	#5,%d1
3218c2ecf20Sopenharmony_ci	lea	(FPD_FPCR,FPDATA),%a1
3228c2ecf20Sopenharmony_ci1:	btst	#13,%d2
3238c2ecf20Sopenharmony_ci	jne	4f
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ci	| move register from memory into fpu
3268c2ecf20Sopenharmony_ci	jra	3f
3278c2ecf20Sopenharmony_ci1:	printf	PMOVEM,"(%p>%p)",2,%a0,%a1
3288c2ecf20Sopenharmony_ci	getuser.l (%a0)+,%d0,fp_err_ua1,%a0
3298c2ecf20Sopenharmony_ci	move.l	%d0,(%a1)
3308c2ecf20Sopenharmony_ci2:	addq.l	#4,%a1
3318c2ecf20Sopenharmony_ci3:	lsl.b	#1,%d1
3328c2ecf20Sopenharmony_ci	jcs	1b
3338c2ecf20Sopenharmony_ci	jne	2b
3348c2ecf20Sopenharmony_ci	jra	fpc_movem_fin
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_ci	| move register from fpu into memory
3378c2ecf20Sopenharmony_ci1:	printf	PMOVEM,"(%p>%p)",2,%a1,%a0
3388c2ecf20Sopenharmony_ci	move.l	(%a1),%d0
3398c2ecf20Sopenharmony_ci	putuser.l %d0,(%a0)+,fp_err_ua1,%a0
3408c2ecf20Sopenharmony_ci2:	addq.l	#4,%a1
3418c2ecf20Sopenharmony_ci4:	lsl.b	#1,%d1
3428c2ecf20Sopenharmony_ci	jcs	1b
3438c2ecf20Sopenharmony_ci	jne	2b
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_cifpc_movem_fin:
3468c2ecf20Sopenharmony_ci	and.l	#0x0000fff0,(FPD_FPCR,FPDATA)
3478c2ecf20Sopenharmony_ci	and.l	#0x0ffffff8,(FPD_FPSR,FPDATA)
3488c2ecf20Sopenharmony_ci	move.l	(FPD_FPCR,FPDATA),%d0
3498c2ecf20Sopenharmony_ci	lsr.l	#4,%d0
3508c2ecf20Sopenharmony_ci	moveq	#3,%d1
3518c2ecf20Sopenharmony_ci	and.l	%d0,%d1
3528c2ecf20Sopenharmony_ci	move.w	%d1,(FPD_RND,FPDATA)
3538c2ecf20Sopenharmony_ci	lsr.l	#2,%d0
3548c2ecf20Sopenharmony_ci	moveq	#3,%d1
3558c2ecf20Sopenharmony_ci	and.l	%d0,%d1
3568c2ecf20Sopenharmony_ci	move.w	%d1,(FPD_PREC,FPDATA)
3578c2ecf20Sopenharmony_ci	printf	PDECODE,"\n"
3588c2ecf20Sopenharmony_ci#if 0
3598c2ecf20Sopenharmony_ci	printf	PMOVEM,"fpcr : %08x\n",1,FPDATA@(FPD_FPCR)
3608c2ecf20Sopenharmony_ci	printf	PMOVEM,"fpsr : %08x\n",1,FPDATA@(FPD_FPSR)
3618c2ecf20Sopenharmony_ci	printf	PMOVEM,"fpiar: %08x\n",1,FPDATA@(FPD_FPIAR)
3628c2ecf20Sopenharmony_ci	clr.l	%d0
3638c2ecf20Sopenharmony_ci	move.w	(FPD_PREC,FPDATA),%d0
3648c2ecf20Sopenharmony_ci	printf	PMOVEM,"prec : %04x\n",1,%d0
3658c2ecf20Sopenharmony_ci	move.w	(FPD_RND,FPDATA),%d0
3668c2ecf20Sopenharmony_ci	printf	PMOVEM,"rnd  : %04x\n",1,%d0
3678c2ecf20Sopenharmony_ci#endif
3688c2ecf20Sopenharmony_ci	jra	fp_end
369