Linux Audio

Check our new training course

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