xref: /linux/arch/m68k/math-emu/fp_move.S (revision e5451c8f8330e03ad3cfa16048b4daf961af434f)
1*1da177e4SLinus Torvalds/*
2*1da177e4SLinus Torvalds * fp_move.S
3*1da177e4SLinus Torvalds *
4*1da177e4SLinus Torvalds * Copyright Roman Zippel, 1997.  All rights reserved.
5*1da177e4SLinus Torvalds *
6*1da177e4SLinus Torvalds * Redistribution and use in source and binary forms, with or without
7*1da177e4SLinus Torvalds * modification, are permitted provided that the following conditions
8*1da177e4SLinus Torvalds * are met:
9*1da177e4SLinus Torvalds * 1. Redistributions of source code must retain the above copyright
10*1da177e4SLinus Torvalds *    notice, and the entire permission notice in its entirety,
11*1da177e4SLinus Torvalds *    including the disclaimer of warranties.
12*1da177e4SLinus Torvalds * 2. Redistributions in binary form must reproduce the above copyright
13*1da177e4SLinus Torvalds *    notice, this list of conditions and the following disclaimer in the
14*1da177e4SLinus Torvalds *    documentation and/or other materials provided with the distribution.
15*1da177e4SLinus Torvalds * 3. The name of the author may not be used to endorse or promote
16*1da177e4SLinus Torvalds *    products derived from this software without specific prior
17*1da177e4SLinus Torvalds *    written permission.
18*1da177e4SLinus Torvalds *
19*1da177e4SLinus Torvalds * ALTERNATIVELY, this product may be distributed under the terms of
20*1da177e4SLinus Torvalds * the GNU General Public License, in which case the provisions of the GPL are
21*1da177e4SLinus Torvalds * required INSTEAD OF the above restrictions.  (This clause is
22*1da177e4SLinus Torvalds * necessary due to a potential bad interaction between the GPL and
23*1da177e4SLinus Torvalds * the restrictions contained in a BSD-style copyright.)
24*1da177e4SLinus Torvalds *
25*1da177e4SLinus Torvalds * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
26*1da177e4SLinus Torvalds * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27*1da177e4SLinus Torvalds * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28*1da177e4SLinus Torvalds * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
29*1da177e4SLinus Torvalds * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30*1da177e4SLinus Torvalds * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31*1da177e4SLinus Torvalds * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32*1da177e4SLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33*1da177e4SLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34*1da177e4SLinus Torvalds * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
35*1da177e4SLinus Torvalds * OF THE POSSIBILITY OF SUCH DAMAGE.
36*1da177e4SLinus Torvalds */
37*1da177e4SLinus Torvalds
38*1da177e4SLinus Torvalds#include "fp_emu.h"
39*1da177e4SLinus Torvalds#include "fp_decode.h"
40*1da177e4SLinus Torvalds
41*1da177e4SLinus Torvaldsdo_no_pc_mode=1
42*1da177e4SLinus Torvalds
43*1da177e4SLinus Torvalds	.globl	fp_fmove_fp2mem
44*1da177e4SLinus Torvalds
45*1da177e4SLinus Torvaldsfp_fmove_fp2mem:
46*1da177e4SLinus Torvalds	clr.b	(2+FPD_FPSR,FPDATA)
47*1da177e4SLinus Torvalds	fp_decode_dest_format
48*1da177e4SLinus Torvalds	move.w	%d0,%d1			| store data size twice in %d1
49*1da177e4SLinus Torvalds	swap	%d1			| one can be trashed below
50*1da177e4SLinus Torvalds	move.w	%d0,%d1
51*1da177e4SLinus Torvalds#ifdef FPU_EMU_DEBUG
52*1da177e4SLinus Torvalds	lea	0f,%a0
53*1da177e4SLinus Torvalds	clr.l	%d0
54*1da177e4SLinus Torvalds	move.b	(%a0,%d1.w),%d0
55*1da177e4SLinus Torvalds	printf	PDECODE,"fmove.%c ",1,%d0
56*1da177e4SLinus Torvalds	fp_decode_src_reg
57*1da177e4SLinus Torvalds	printf	PDECODE,"fp%d,",1,%d0
58*1da177e4SLinus Torvalds
59*1da177e4SLinus Torvalds	.data
60*1da177e4SLinus Torvalds0:	.byte	'l','s','x','p','w','d','b','p'
61*1da177e4SLinus Torvalds	.previous
62*1da177e4SLinus Torvalds#endif
63*1da177e4SLinus Torvalds
64*1da177e4SLinus Torvalds	| encode addressing mode for dest
65*1da177e4SLinus Torvalds	fp_decode_addr_mode
66*1da177e4SLinus Torvalds
67*1da177e4SLinus Torvalds	.long	fp_data, fp_ill
68*1da177e4SLinus Torvalds	.long	fp_indirect, fp_postinc
69*1da177e4SLinus Torvalds	.long	fp_predecr, fp_disp16
70*1da177e4SLinus Torvalds	.long	fp_extmode0, fp_extmode1
71*1da177e4SLinus Torvalds
72*1da177e4SLinus Torvalds	| addressing mode: data register direct
73*1da177e4SLinus Torvaldsfp_data:
74*1da177e4SLinus Torvalds	fp_mode_data_direct
75*1da177e4SLinus Torvalds	move.w	%d0,%d1
76*1da177e4SLinus Torvalds	fp_decode_src_reg
77*1da177e4SLinus Torvalds	fp_get_fp_reg
78*1da177e4SLinus Torvalds	lea	(FPD_TEMPFP1,FPDATA),%a1
79*1da177e4SLinus Torvalds	move.l	(%a0)+,(%a1)+
80*1da177e4SLinus Torvalds	move.l	(%a0)+,(%a1)+
81*1da177e4SLinus Torvalds	move.l	(%a0),(%a1)
82*1da177e4SLinus Torvalds	lea	(-8,%a1),%a0
83*1da177e4SLinus Torvalds	swap	%d1
84*1da177e4SLinus Torvalds	move.l	%d1,%d2
85*1da177e4SLinus Torvalds	printf	PDECODE,"\n"
86*1da177e4SLinus Torvalds	jmp	([0f:w,%pc,%d1.w*4])
87*1da177e4SLinus Torvalds
88*1da177e4SLinus Torvalds	.align	4
89*1da177e4SLinus Torvalds0:
90*1da177e4SLinus Torvalds	.long	fp_data_long, fp_data_single
91*1da177e4SLinus Torvalds	.long	fp_ill, fp_ill
92*1da177e4SLinus Torvalds	.long	fp_data_word, fp_ill
93*1da177e4SLinus Torvalds	.long	fp_data_byte, fp_ill
94*1da177e4SLinus Torvalds
95*1da177e4SLinus Torvaldsfp_data_byte:
96*1da177e4SLinus Torvalds	jsr	fp_normalize_ext
97*1da177e4SLinus Torvalds	jsr	fp_conv_ext2byte
98*1da177e4SLinus Torvalds	move.l	%d0,%d1
99*1da177e4SLinus Torvalds	swap	%d2
100*1da177e4SLinus Torvalds	move.w	%d2,%d0
101*1da177e4SLinus Torvalds	jsr	fp_get_data_reg
102*1da177e4SLinus Torvalds	move.b	%d1,%d0
103*1da177e4SLinus Torvalds	move.w	%d2,%d1
104*1da177e4SLinus Torvalds	jsr	fp_put_data_reg
105*1da177e4SLinus Torvalds	jra	fp_final
106*1da177e4SLinus Torvalds
107*1da177e4SLinus Torvaldsfp_data_word:
108*1da177e4SLinus Torvalds	jsr	fp_normalize_ext
109*1da177e4SLinus Torvalds	jsr	fp_conv_ext2short
110*1da177e4SLinus Torvalds	move.l	%d0,%d1
111*1da177e4SLinus Torvalds	swap	%d2
112*1da177e4SLinus Torvalds	move.w	%d2,%d0
113*1da177e4SLinus Torvalds	jsr	fp_get_data_reg
114*1da177e4SLinus Torvalds	move.w	%d1,%d0
115*1da177e4SLinus Torvalds	move.l	%d2,%d1
116*1da177e4SLinus Torvalds	jsr	fp_put_data_reg
117*1da177e4SLinus Torvalds	jra	fp_final
118*1da177e4SLinus Torvalds
119*1da177e4SLinus Torvaldsfp_data_long:
120*1da177e4SLinus Torvalds	jsr	fp_normalize_ext
121*1da177e4SLinus Torvalds	jsr	fp_conv_ext2long
122*1da177e4SLinus Torvalds	swap	%d2
123*1da177e4SLinus Torvalds	move.w	%d2,%d1
124*1da177e4SLinus Torvalds	jsr	fp_put_data_reg
125*1da177e4SLinus Torvalds	jra	fp_final
126*1da177e4SLinus Torvalds
127*1da177e4SLinus Torvaldsfp_data_single:
128*1da177e4SLinus Torvalds	jsr	fp_normalize_ext
129*1da177e4SLinus Torvalds	jsr	fp_conv_ext2single
130*1da177e4SLinus Torvalds	swap	%d2
131*1da177e4SLinus Torvalds	move.w	%d2,%d1
132*1da177e4SLinus Torvalds	jsr	fp_put_data_reg
133*1da177e4SLinus Torvalds	jra	fp_final
134*1da177e4SLinus Torvalds
135*1da177e4SLinus Torvalds	| addressing mode: address register indirect
136*1da177e4SLinus Torvaldsfp_indirect:
137*1da177e4SLinus Torvalds	fp_mode_addr_indirect
138*1da177e4SLinus Torvalds	jra	fp_putdest
139*1da177e4SLinus Torvalds
140*1da177e4SLinus Torvalds	| addressing mode: address register indirect with postincrement
141*1da177e4SLinus Torvaldsfp_postinc:
142*1da177e4SLinus Torvalds	fp_mode_addr_indirect_postinc
143*1da177e4SLinus Torvalds	jra	fp_putdest
144*1da177e4SLinus Torvalds
145*1da177e4SLinus Torvalds	| addressing mode: address register indirect with predecrement
146*1da177e4SLinus Torvaldsfp_predecr:
147*1da177e4SLinus Torvalds	fp_mode_addr_indirect_predec
148*1da177e4SLinus Torvalds	jra	fp_putdest
149*1da177e4SLinus Torvalds
150*1da177e4SLinus Torvalds	| addressing mode: address register indirect with 16bit displacement
151*1da177e4SLinus Torvaldsfp_disp16:
152*1da177e4SLinus Torvalds	fp_mode_addr_indirect_disp16
153*1da177e4SLinus Torvalds	jra     fp_putdest
154*1da177e4SLinus Torvalds
155*1da177e4SLinus Torvaldsfp_extmode0:
156*1da177e4SLinus Torvalds	fp_mode_addr_indirect_extmode0
157*1da177e4SLinus Torvalds	jra	fp_putdest
158*1da177e4SLinus Torvalds
159*1da177e4SLinus Torvaldsfp_extmode1:
160*1da177e4SLinus Torvalds	fp_decode_addr_reg
161*1da177e4SLinus Torvalds	jmp	([0f:w,%pc,%d0*4])
162*1da177e4SLinus Torvalds
163*1da177e4SLinus Torvalds	.align	4
164*1da177e4SLinus Torvalds0:
165*1da177e4SLinus Torvalds	.long	fp_abs_short, fp_abs_long
166*1da177e4SLinus Torvalds	.long	fp_ill, fp_ill
167*1da177e4SLinus Torvalds	.long	fp_ill, fp_ill
168*1da177e4SLinus Torvalds	.long	fp_ill, fp_ill
169*1da177e4SLinus Torvalds
170*1da177e4SLinus Torvaldsfp_abs_short:
171*1da177e4SLinus Torvalds	fp_mode_abs_short
172*1da177e4SLinus Torvalds	jra	fp_putdest
173*1da177e4SLinus Torvalds
174*1da177e4SLinus Torvaldsfp_abs_long:
175*1da177e4SLinus Torvalds	fp_mode_abs_long
176*1da177e4SLinus Torvalds	jra	fp_putdest
177*1da177e4SLinus Torvalds
178*1da177e4SLinus Torvaldsfp_putdest:
179*1da177e4SLinus Torvalds	move.l	%a0,%a1
180*1da177e4SLinus Torvalds	fp_decode_src_reg
181*1da177e4SLinus Torvalds	move.l	%d1,%d2			| save size
182*1da177e4SLinus Torvalds	fp_get_fp_reg
183*1da177e4SLinus Torvalds	printf	PDECODE,"\n"
184*1da177e4SLinus Torvalds	addq.l	#8,%a0
185*1da177e4SLinus Torvalds	move.l	(%a0),-(%sp)
186*1da177e4SLinus Torvalds	move.l	-(%a0),-(%sp)
187*1da177e4SLinus Torvalds	move.l	-(%a0),-(%sp)
188*1da177e4SLinus Torvalds	move.l	%sp,%a0
189*1da177e4SLinus Torvalds	jsr	fp_normalize_ext
190*1da177e4SLinus Torvalds
191*1da177e4SLinus Torvalds	swap	%d2
192*1da177e4SLinus Torvalds	jmp	([0f:w,%pc,%d2.w*4])
193*1da177e4SLinus Torvalds
194*1da177e4SLinus Torvalds	.align	4
195*1da177e4SLinus Torvalds0:
196*1da177e4SLinus Torvalds	.long	fp_format_long, fp_format_single
197*1da177e4SLinus Torvalds	.long	fp_format_extended, fp_format_packed
198*1da177e4SLinus Torvalds	.long	fp_format_word, fp_format_double
199*1da177e4SLinus Torvalds	.long	fp_format_byte, fp_format_packed
200*1da177e4SLinus Torvalds
201*1da177e4SLinus Torvaldsfp_format_long:
202*1da177e4SLinus Torvalds	jsr	fp_conv_ext2long
203*1da177e4SLinus Torvalds	putuser.l %d0,(%a1),fp_err_ua1,%a1
204*1da177e4SLinus Torvalds	jra	fp_finish_move
205*1da177e4SLinus Torvalds
206*1da177e4SLinus Torvaldsfp_format_single:
207*1da177e4SLinus Torvalds	jsr	fp_conv_ext2single
208*1da177e4SLinus Torvalds	putuser.l %d0,(%a1),fp_err_ua1,%a1
209*1da177e4SLinus Torvalds	jra	fp_finish_move
210*1da177e4SLinus Torvalds
211*1da177e4SLinus Torvaldsfp_format_extended:
212*1da177e4SLinus Torvalds	move.l	(%a0)+,%d0
213*1da177e4SLinus Torvalds	lsl.w	#1,%d0
214*1da177e4SLinus Torvalds	lsl.l	#7,%d0
215*1da177e4SLinus Torvalds	lsl.l	#8,%d0
216*1da177e4SLinus Torvalds	putuser.l %d0,(%a1)+,fp_err_ua1,%a1
217*1da177e4SLinus Torvalds	move.l	(%a0)+,%d0
218*1da177e4SLinus Torvalds	putuser.l %d0,(%a1)+,fp_err_ua1,%a1
219*1da177e4SLinus Torvalds	move.l	(%a0),%d0
220*1da177e4SLinus Torvalds	putuser.l %d0,(%a1),fp_err_ua1,%a1
221*1da177e4SLinus Torvalds	jra	fp_finish_move
222*1da177e4SLinus Torvalds
223*1da177e4SLinus Torvaldsfp_format_packed:
224*1da177e4SLinus Torvalds	/* not supported yet */
225*1da177e4SLinus Torvalds	lea	(12,%sp),%sp
226*1da177e4SLinus Torvalds	jra	fp_ill
227*1da177e4SLinus Torvalds
228*1da177e4SLinus Torvaldsfp_format_word:
229*1da177e4SLinus Torvalds	jsr	fp_conv_ext2short
230*1da177e4SLinus Torvalds	putuser.w %d0,(%a1),fp_err_ua1,%a1
231*1da177e4SLinus Torvalds	jra	fp_finish_move
232*1da177e4SLinus Torvalds
233*1da177e4SLinus Torvaldsfp_format_double:
234*1da177e4SLinus Torvalds	jsr	fp_conv_ext2double
235*1da177e4SLinus Torvalds	jra	fp_finish_move
236*1da177e4SLinus Torvalds
237*1da177e4SLinus Torvaldsfp_format_byte:
238*1da177e4SLinus Torvalds	jsr	fp_conv_ext2byte
239*1da177e4SLinus Torvalds	putuser.b %d0,(%a1),fp_err_ua1,%a1
240*1da177e4SLinus Torvalds|	jra	fp_finish_move
241*1da177e4SLinus Torvalds
242*1da177e4SLinus Torvaldsfp_finish_move:
243*1da177e4SLinus Torvalds	lea	(12,%sp),%sp
244*1da177e4SLinus Torvalds	jra	fp_final
245