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
44 fp_fnop:
45 	printf	PDECODE,"fnop\n"
46 	jra	fp_end
47 #else
48 #define fp_fnop fp_end
49 #endif
50 
51 fp_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 
59 fp_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
66 1:	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
73 1:	printf	PDECODE,"\n"
74 	jra	fp_end
75 
76 fp_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
91 1:	jsr	fp_put_data_reg
92 2:	jra	fp_end
93 
94 | set flags for decode macros for fs<cc>
95 do_fscc=1
96 do_no_pc_mode=1
97 
98 fp_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
114 fp_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 
125 fp_indirect:
126 	fp_mode_addr_indirect
127 	jra	fp_do_scc
128 
129 fp_postinc:
130 	fp_mode_addr_indirect_postinc
131 	jra	fp_do_scc
132 
133 fp_predecr:
134 	fp_mode_addr_indirect_predec
135 	jra	fp_do_scc
136 
137 fp_disp16:
138 	fp_mode_addr_indirect_disp16
139 	jra	fp_do_scc
140 
141 fp_extmode0:
142 	fp_mode_addr_indirect_extmode0
143 	jra	fp_do_scc
144 
145 fp_extmode1:
146 	bfextu	%d2{#13,#3},%d0
147 	jmp	([0f:w,%pc,%d0*4])
148 
149 	.align	4
150 0:
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 
156 fp_absolute_short:
157 	fp_mode_abs_short
158 	jra	fp_do_scc
159 
160 fp_absolute_long:
161 	fp_mode_abs_long
162 |	jra	fp_do_scc
163 
164 fp_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 
175 fp_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)
184 1:	and.w	#0xf,%d0
185 	jmp	([0f:w,%pc,%d0.w*4])
186 
187 	.align	4
188 0:
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 
194 fp_f:
195 	moveq	#0,%d0
196 	rts
197 
198 fp_eq:
199 	moveq	#0,%d0
200 	tst_Z
201 	jeq	1f
202 	moveq	#-1,%d0
203 1:	rts
204 
205 fp_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
214 1:	rts
215 
216 fp_oge:
217 	moveq	#-1,%d0
218 	tst_Z
219 	jne	2f
220 	tst_NAN
221 	jne	1f
222 	tst_N
223 	jeq	2f
224 1:	moveq	#0,%d0
225 2:	rts
226 
227 fp_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
236 1:	rts
237 
238 fp_ole:
239 	moveq	#-1,%d0
240 	tst_Z
241 	jne	2f
242 	tst_NAN
243 	jne	1f
244 	tst_N
245 	jne	2f
246 1:	moveq	#0,%d0
247 2:	rts
248 
249 fp_ogl:
250 	moveq	#0,%d0
251 	tst_NAN
252 	jne	1f
253 	tst_Z
254 	jne	1f
255 	moveq	#-1,%d0
256 1:	rts
257 
258 fp_or:
259 	moveq	#0,%d0
260 	tst_NAN
261 	jne	1f
262 	moveq	#-1,%d0
263 1:	rts
264 
265 fp_un:
266 	moveq	#0,%d0
267 	tst_NAN
268 	jeq	1f
269 	moveq	#-1,%d0
270 	rts
271 
272 fp_ueq:
273 	moveq	#-1,%d0
274 	tst_NAN
275 	jne	1f
276 	tst_Z
277 	jne	1f
278 	moveq	#0,%d0
279 1:	rts
280 
281 fp_ugt:
282 	moveq	#-1,%d0
283 	tst_NAN
284 	jne	2f
285 	tst_N
286 	jne	1f
287 	tst_Z
288 	jeq	2f
289 1:	moveq	#0,%d0
290 2:	rts
291 
292 fp_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
301 1:	rts
302 
303 fp_ult:
304 	moveq	#-1,%d0
305 	tst_NAN
306 	jne	2f
307 	tst_Z
308 	jne	1f
309 	tst_N
310 	jne	2f
311 1:	moveq	#0,%d0
312 2:	rts
313 
314 fp_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
323 1:	rts
324 
325 fp_ne:
326 	moveq	#0,%d0
327 	tst_Z
328 	jne	1f
329 	moveq	#-1,%d0
330 1:	rts
331 
332 fp_t:
333 	moveq	#-1,%d0
334 	rts
335