1~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
3M68000 Hi-Performance Microprocessor Division
4M68060 Software Package
5Production Release P1.00 -- October 10, 1994
6
7M68060 Software Package Copyright © 1993, 1994 Motorola Inc. All rights reserved.
8
9THE SOFTWARE is provided on an "AS IS" basis and without warranty.
10To the maximum extent permitted by applicable law,
11MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
12INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
13and any warranty against infringement with regard to the SOFTWARE
14(INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials.
15
16To the maximum extent permitted by applicable law,
17IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
18(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
19BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS)
20ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
21Motorola assumes no responsibility for the maintenance and support of the SOFTWARE.
22
23You are hereby granted a copyright license to use, modify, and distribute the SOFTWARE
24so long as this entire notice is retained without alteration in any modified and/or
25redistributed versions, and that such modified versions are clearly identified as such.
26No licenses are granted by implication, estoppel or otherwise under any patents
27or trademarks of Motorola, Inc.
28~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
29
30
31
32
33
34
35
36
37
38
39
40
41
42set _off_bsun, 0x00
43set _off_snan, 0x04
44set _off_operr, 0x08
45set _off_ovfl, 0x0c
46set _off_unfl, 0x10
47set _off_dz, 0x14
48set _off_inex, 0x18
49set _off_fline, 0x1c
50set _off_fpu_dis, 0x20
51set _off_trap, 0x24
52set _off_trace, 0x28
53set _off_access, 0x2c
54set _off_done, 0x30
55
56set _off_imr, 0x40
57set _off_dmr, 0x44
58set _off_dmw, 0x48
59set _off_irw, 0x4c
60set _off_irl, 0x50
61set _off_drb, 0x54
62set _off_drw, 0x58
63set _off_drl, 0x5c
64set _off_dwb, 0x60
65set _off_dww, 0x64
66set _off_dwl, 0x68
67
68_060FPSP_TABLE:
69
70
71
72
73 bra.l _fpsp_snan
74 short 0x0000
75 bra.l _fpsp_operr
76 short 0x0000
77 bra.l _fpsp_ovfl
78 short 0x0000
79 bra.l _fpsp_unfl
80 short 0x0000
81 bra.l _fpsp_dz
82 short 0x0000
83 bra.l _fpsp_inex
84 short 0x0000
85 bra.l _fpsp_fline
86 short 0x0000
87 bra.l _fpsp_unsupp
88 short 0x0000
89 bra.l _fpsp_effadd
90 short 0x0000
91
92 space 56
93
94
95 global _fpsp_done
96_fpsp_done:
97 mov.l %d0,-(%sp)
98 mov.l (_060FPSP_TABLE-0x80+_off_done,%pc),%d0
99 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
100 mov.l 0x4(%sp),%d0
101 rtd &0x4
102
103 global _real_ovfl
104_real_ovfl:
105 mov.l %d0,-(%sp)
106 mov.l (_060FPSP_TABLE-0x80+_off_ovfl,%pc),%d0
107 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
108 mov.l 0x4(%sp),%d0
109 rtd &0x4
110
111 global _real_unfl
112_real_unfl:
113 mov.l %d0,-(%sp)
114 mov.l (_060FPSP_TABLE-0x80+_off_unfl,%pc),%d0
115 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
116 mov.l 0x4(%sp),%d0
117 rtd &0x4
118
119 global _real_inex
120_real_inex:
121 mov.l %d0,-(%sp)
122 mov.l (_060FPSP_TABLE-0x80+_off_inex,%pc),%d0
123 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
124 mov.l 0x4(%sp),%d0
125 rtd &0x4
126
127 global _real_bsun
128_real_bsun:
129 mov.l %d0,-(%sp)
130 mov.l (_060FPSP_TABLE-0x80+_off_bsun,%pc),%d0
131 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
132 mov.l 0x4(%sp),%d0
133 rtd &0x4
134
135 global _real_operr
136_real_operr:
137 mov.l %d0,-(%sp)
138 mov.l (_060FPSP_TABLE-0x80+_off_operr,%pc),%d0
139 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
140 mov.l 0x4(%sp),%d0
141 rtd &0x4
142
143 global _real_snan
144_real_snan:
145 mov.l %d0,-(%sp)
146 mov.l (_060FPSP_TABLE-0x80+_off_snan,%pc),%d0
147 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
148 mov.l 0x4(%sp),%d0
149 rtd &0x4
150
151 global _real_dz
152_real_dz:
153 mov.l %d0,-(%sp)
154 mov.l (_060FPSP_TABLE-0x80+_off_dz,%pc),%d0
155 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
156 mov.l 0x4(%sp),%d0
157 rtd &0x4
158
159 global _real_fline
160_real_fline:
161 mov.l %d0,-(%sp)
162 mov.l (_060FPSP_TABLE-0x80+_off_fline,%pc),%d0
163 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
164 mov.l 0x4(%sp),%d0
165 rtd &0x4
166
167 global _real_fpu_disabled
168_real_fpu_disabled:
169 mov.l %d0,-(%sp)
170 mov.l (_060FPSP_TABLE-0x80+_off_fpu_dis,%pc),%d0
171 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
172 mov.l 0x4(%sp),%d0
173 rtd &0x4
174
175 global _real_trap
176_real_trap:
177 mov.l %d0,-(%sp)
178 mov.l (_060FPSP_TABLE-0x80+_off_trap,%pc),%d0
179 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
180 mov.l 0x4(%sp),%d0
181 rtd &0x4
182
183 global _real_trace
184_real_trace:
185 mov.l %d0,-(%sp)
186 mov.l (_060FPSP_TABLE-0x80+_off_trace,%pc),%d0
187 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
188 mov.l 0x4(%sp),%d0
189 rtd &0x4
190
191 global _real_access
192_real_access:
193 mov.l %d0,-(%sp)
194 mov.l (_060FPSP_TABLE-0x80+_off_access,%pc),%d0
195 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
196 mov.l 0x4(%sp),%d0
197 rtd &0x4
198
199
200
201 global _imem_read
202_imem_read:
203 mov.l %d0,-(%sp)
204 mov.l (_060FPSP_TABLE-0x80+_off_imr,%pc),%d0
205 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
206 mov.l 0x4(%sp),%d0
207 rtd &0x4
208
209 global _dmem_read
210_dmem_read:
211 mov.l %d0,-(%sp)
212 mov.l (_060FPSP_TABLE-0x80+_off_dmr,%pc),%d0
213 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
214 mov.l 0x4(%sp),%d0
215 rtd &0x4
216
217 global _dmem_write
218_dmem_write:
219 mov.l %d0,-(%sp)
220 mov.l (_060FPSP_TABLE-0x80+_off_dmw,%pc),%d0
221 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
222 mov.l 0x4(%sp),%d0
223 rtd &0x4
224
225 global _imem_read_word
226_imem_read_word:
227 mov.l %d0,-(%sp)
228 mov.l (_060FPSP_TABLE-0x80+_off_irw,%pc),%d0
229 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
230 mov.l 0x4(%sp),%d0
231 rtd &0x4
232
233 global _imem_read_long
234_imem_read_long:
235 mov.l %d0,-(%sp)
236 mov.l (_060FPSP_TABLE-0x80+_off_irl,%pc),%d0
237 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
238 mov.l 0x4(%sp),%d0
239 rtd &0x4
240
241 global _dmem_read_byte
242_dmem_read_byte:
243 mov.l %d0,-(%sp)
244 mov.l (_060FPSP_TABLE-0x80+_off_drb,%pc),%d0
245 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
246 mov.l 0x4(%sp),%d0
247 rtd &0x4
248
249 global _dmem_read_word
250_dmem_read_word:
251 mov.l %d0,-(%sp)
252 mov.l (_060FPSP_TABLE-0x80+_off_drw,%pc),%d0
253 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
254 mov.l 0x4(%sp),%d0
255 rtd &0x4
256
257 global _dmem_read_long
258_dmem_read_long:
259 mov.l %d0,-(%sp)
260 mov.l (_060FPSP_TABLE-0x80+_off_drl,%pc),%d0
261 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
262 mov.l 0x4(%sp),%d0
263 rtd &0x4
264
265 global _dmem_write_byte
266_dmem_write_byte:
267 mov.l %d0,-(%sp)
268 mov.l (_060FPSP_TABLE-0x80+_off_dwb,%pc),%d0
269 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
270 mov.l 0x4(%sp),%d0
271 rtd &0x4
272
273 global _dmem_write_word
274_dmem_write_word:
275 mov.l %d0,-(%sp)
276 mov.l (_060FPSP_TABLE-0x80+_off_dww,%pc),%d0
277 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
278 mov.l 0x4(%sp),%d0
279 rtd &0x4
280
281 global _dmem_write_long
282_dmem_write_long:
283 mov.l %d0,-(%sp)
284 mov.l (_060FPSP_TABLE-0x80+_off_dwl,%pc),%d0
285 pea.l (_060FPSP_TABLE-0x80,%pc,%d0)
286 mov.l 0x4(%sp),%d0
287 rtd &0x4
288
289
290
291
292
293
294set LOCAL_SIZE, 192
295set LV, -LOCAL_SIZE
296
297set EXC_SR, 0x4
298set EXC_PC, 0x6
299set EXC_VOFF, 0xa
300set EXC_EA, 0xc
301
302set EXC_FP, 0x0
303
304set EXC_AREGS, -68
305set EXC_DREGS, -100
306set EXC_FPREGS, -36
307
308set EXC_A7, EXC_AREGS+(7*4)
309set OLD_A7, EXC_AREGS+(6*4)
310set EXC_A6, EXC_AREGS+(6*4)
311set EXC_A5, EXC_AREGS+(5*4)
312set EXC_A4, EXC_AREGS+(4*4)
313set EXC_A3, EXC_AREGS+(3*4)
314set EXC_A2, EXC_AREGS+(2*4)
315set EXC_A1, EXC_AREGS+(1*4)
316set EXC_A0, EXC_AREGS+(0*4)
317set EXC_D7, EXC_DREGS+(7*4)
318set EXC_D6, EXC_DREGS+(6*4)
319set EXC_D5, EXC_DREGS+(5*4)
320set EXC_D4, EXC_DREGS+(4*4)
321set EXC_D3, EXC_DREGS+(3*4)
322set EXC_D2, EXC_DREGS+(2*4)
323set EXC_D1, EXC_DREGS+(1*4)
324set EXC_D0, EXC_DREGS+(0*4)
325
326set EXC_FP0, EXC_FPREGS+(0*12)
327set EXC_FP1, EXC_FPREGS+(1*12)
328set EXC_FP2, EXC_FPREGS+(2*12)
329
330set FP_SCR1, LV+80
331set FP_SCR1_EX, FP_SCR1+0
332set FP_SCR1_SGN, FP_SCR1+2
333set FP_SCR1_HI, FP_SCR1+4
334set FP_SCR1_LO, FP_SCR1+8
335
336set FP_SCR0, LV+68
337set FP_SCR0_EX, FP_SCR0+0
338set FP_SCR0_SGN, FP_SCR0+2
339set FP_SCR0_HI, FP_SCR0+4
340set FP_SCR0_LO, FP_SCR0+8
341
342set FP_DST, LV+56
343set FP_DST_EX, FP_DST+0
344set FP_DST_SGN, FP_DST+2
345set FP_DST_HI, FP_DST+4
346set FP_DST_LO, FP_DST+8
347
348set FP_SRC, LV+44
349set FP_SRC_EX, FP_SRC+0
350set FP_SRC_SGN, FP_SRC+2
351set FP_SRC_HI, FP_SRC+4
352set FP_SRC_LO, FP_SRC+8
353
354set USER_FPIAR, LV+40
355
356set USER_FPSR, LV+36
357set FPSR_CC, USER_FPSR+0
358set FPSR_QBYTE, USER_FPSR+1
359set FPSR_EXCEPT, USER_FPSR+2
360set FPSR_AEXCEPT, USER_FPSR+3
361
362set USER_FPCR, LV+32
363set FPCR_ENABLE, USER_FPCR+2
364set FPCR_MODE, USER_FPCR+3
365
366set L_SCR3, LV+28
367set L_SCR2, LV+24
368set L_SCR1, LV+20
369
370set STORE_FLG, LV+19
371
372set EXC_TEMP2, LV+24
373set EXC_TEMP, LV+16
374
375set DTAG, LV+15
376set STAG, LV+14
377
378set SPCOND_FLG, LV+10
379
380set EXC_CC, LV+8
381set EXC_EXTWPTR, LV+4
382set EXC_EXTWORD, LV+2
383set EXC_CMDREG, LV+2
384set EXC_OPWORD, LV+0
385
386
387
388
389
390set FTEMP, 0
391set FTEMP_EX, 0
392set FTEMP_SGN, 2
393set FTEMP_HI, 4
394set FTEMP_LO, 8
395set FTEMP_GRS, 12
396
397set LOCAL, 0
398set LOCAL_EX, 0
399set LOCAL_SGN, 2
400set LOCAL_HI, 4
401set LOCAL_LO, 8
402set LOCAL_GRS, 12
403
404set DST, 0
405set DST_EX, 0
406set DST_HI, 4
407set DST_LO, 8
408
409set SRC, 0
410set SRC_EX, 0
411set SRC_HI, 4
412set SRC_LO, 8
413
414set SGL_LO, 0x3f81
415set SGL_HI, 0x407e
416set DBL_LO, 0x3c01
417set DBL_HI, 0x43fe
418set EXT_LO, 0x0
419set EXT_HI, 0x7ffe
420
421set EXT_BIAS, 0x3fff
422set SGL_BIAS, 0x007f
423set DBL_BIAS, 0x03ff
424
425set NORM, 0x00
426set ZERO, 0x01
427set INF, 0x02
428set QNAN, 0x03
429set DENORM, 0x04
430set SNAN, 0x05
431set UNNORM, 0x06
432
433
434
435
436set neg_bit, 0x3
437set z_bit, 0x2
438set inf_bit, 0x1
439set nan_bit, 0x0
440
441set q_sn_bit, 0x7
442
443set bsun_bit, 7
444set snan_bit, 6
445set operr_bit, 5
446set ovfl_bit, 4
447set unfl_bit, 3
448set dz_bit, 2
449set inex2_bit, 1
450set inex1_bit, 0
451
452set aiop_bit, 7
453set aovfl_bit, 6
454set aunfl_bit, 5
455set adz_bit, 4
456set ainex_bit, 3
457
458
459
460
461set neg_mask, 0x08000000
462set inf_mask, 0x02000000
463set z_mask, 0x04000000
464set nan_mask, 0x01000000
465
466set neg_bmask, 0x08
467set inf_bmask, 0x02
468set z_bmask, 0x04
469set nan_bmask, 0x01
470
471set bsun_mask, 0x00008000
472set snan_mask, 0x00004000
473set operr_mask, 0x00002000
474set ovfl_mask, 0x00001000
475set unfl_mask, 0x00000800
476set dz_mask, 0x00000400
477set inex2_mask, 0x00000200
478set inex1_mask, 0x00000100
479
480set aiop_mask, 0x00000080
481set aovfl_mask, 0x00000040
482set aunfl_mask, 0x00000020
483set adz_mask, 0x00000010
484set ainex_mask, 0x00000008
485
486
487
488
489set dzinf_mask, inf_mask+dz_mask+adz_mask
490set opnan_mask, nan_mask+operr_mask+aiop_mask
491set nzi_mask, 0x01ffffff
492set unfinx_mask, unfl_mask+inex2_mask+aunfl_mask+ainex_mask
493set unf2inx_mask, unfl_mask+inex2_mask+ainex_mask
494set ovfinx_mask, ovfl_mask+inex2_mask+aovfl_mask+ainex_mask
495set inx1a_mask, inex1_mask+ainex_mask
496set inx2a_mask, inex2_mask+ainex_mask
497set snaniop_mask, nan_mask+snan_mask+aiop_mask
498set snaniop2_mask, snan_mask+aiop_mask
499set naniop_mask, nan_mask+aiop_mask
500set neginf_mask, neg_mask+inf_mask
501set infaiop_mask, inf_mask+aiop_mask
502set negz_mask, neg_mask+z_mask
503set opaop_mask, operr_mask+aiop_mask
504set unfl_inx_mask, unfl_mask+aunfl_mask+ainex_mask
505set ovfl_inx_mask, ovfl_mask+aovfl_mask+ainex_mask
506
507
508
509
510set rnd_stky_bit, 29
511
512set sign_bit, 0x7
513set signan_bit, 0x6
514
515set sgl_thresh, 0x3f81
516set dbl_thresh, 0x3c01
517
518set x_mode, 0x0
519set s_mode, 0x4
520set d_mode, 0x8
521
522set rn_mode, 0x0
523set rz_mode, 0x1
524set rm_mode, 0x2
525set rp_mode, 0x3
526
527set mantissalen, 64
528
529set BYTE, 1
530set WORD, 2
531set LONG, 4
532
533set BSUN_VEC, 0xc0
534set INEX_VEC, 0xc4
535set DZ_VEC, 0xc8
536set UNFL_VEC, 0xcc
537set OPERR_VEC, 0xd0
538set OVFL_VEC, 0xd4
539set SNAN_VEC, 0xd8
540
541
542
543
544set ftrapcc_flg, 0x01
545set fbsun_flg, 0x02
546set mia7_flg, 0x04
547set mda7_flg, 0x08
548set fmovm_flg, 0x40
549set immed_flg, 0x80
550
551set ftrapcc_bit, 0x0
552set fbsun_bit, 0x1
553set mia7_bit, 0x2
554set mda7_bit, 0x3
555set immed_bit, 0x7
556
557
558
559
560set FMUL_OP, 0x0
561set FDIV_OP, 0x1
562set FADD_OP, 0x2
563set FMOV_OP, 0x3
564
565
566
567
568T1: long 0x40C62D38,0xD3D64634
569T2: long 0x3D6F90AE,0xB1E75CC7
570
571PI: long 0x40000000,0xC90FDAA2,0x2168C235,0x00000000
572PIBY2: long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
573
574TWOBYPI:
575 long 0x3FE45F30,0x6DC9C883
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635 global _fpsp_ovfl
636_fpsp_ovfl:
637
638
639
640 link.w %a6,&-LOCAL_SIZE
641
642 fsave FP_SRC(%a6)
643
644 movm.l &0x0303,EXC_DREGS(%a6)
645 fmovm.l %fpcr,%fpsr,%fpiar,USER_FPCR(%a6)
646 fmovm.x &0xc0,EXC_FPREGS(%a6)
647
648
649 mov.l USER_FPIAR(%a6),EXC_EXTWPTR(%a6)
650 mov.l EXC_EXTWPTR(%a6),%a0
651 addq.l &0x4,EXC_EXTWPTR(%a6)
652 bsr.l _imem_read_long
653 mov.l %d0,EXC_OPWORD(%a6)
654
655
656
657 btst &0x5,EXC_CMDREG(%a6)
658 bne.w fovfl_out
659
660
661 lea FP_SRC(%a6),%a0
662 bsr.l fix_skewed_ops
663
664
665
666 lea FP_SRC(%a6),%a0
667 bsr.l set_tag_x
668 mov.b %d0,STAG(%a6)
669
670
671
672
673 btst &0x5,1+EXC_CMDREG(%a6)
674 beq.b fovfl_extract
675
676 bfextu EXC_CMDREG(%a6){&6:&3},%d0
677 bsr.l load_fpn2
678
679 lea FP_DST(%a6),%a0
680 bsr.l set_tag_x
681 cmpi.b %d0,&UNNORM
682 bne.b fovfl_op2_done
683 bsr.l unnorm_fix
684fovfl_op2_done:
685 mov.b %d0,DTAG(%a6)
686
687fovfl_extract:
688
689
690
691
692
693
694
695
696 clr.l %d0
697 mov.b FPCR_MODE(%a6),%d0
698
699 mov.b 1+EXC_CMDREG(%a6),%d1
700 andi.w &0x007f,%d1
701
702 andi.l &0x00ff01ff,USER_FPSR(%a6)
703
704 fmov.l &0x0,%fpcr
705 fmov.l &0x0,%fpsr
706
707 lea FP_SRC(%a6),%a0
708 lea FP_DST(%a6),%a1
709
710
711 mov.l (tbl_unsupp.l,%pc,%d1.w*4),%d1
712 jsr (tbl_unsupp.l,%pc,%d1.l*1)
713
714
715
716
717
718 bfextu EXC_CMDREG(%a6){&6:&3},%d0
719 bsr.l store_fpreg
720
721
722
723
724 btst &ovfl_bit,FPCR_ENABLE(%a6)
725 bne.b fovfl_ovfl_on
726
727 btst &inex2_bit,FPCR_ENABLE(%a6)
728 bne.b fovfl_inex_on
729
730 fmovm.x EXC_FPREGS(%a6),&0xc0
731 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
732 movm.l EXC_DREGS(%a6),&0x0303
733
734 unlk %a6
735
736 bra.l _fpsp_done
737
738
739
740fovfl_ovfl_on:
741 fmovm.x &0x40,FP_SRC(%a6)
742
743 mov.w &0xe005,2+FP_SRC(%a6)
744
745 fmovm.x EXC_FPREGS(%a6),&0xc0
746 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
747 movm.l EXC_DREGS(%a6),&0x0303
748
749 frestore FP_SRC(%a6)
750
751 unlk %a6
752
753 bra.l _real_ovfl
754
755
756
757fovfl_inex_on:
758
759 fmovm.x &0x40,FP_SRC(%a6)
760
761 mov.b &0xc4,1+EXC_VOFF(%a6)
762 mov.w &0xe001,2+FP_SRC(%a6)
763
764 fmovm.x EXC_FPREGS(%a6),&0xc0
765 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
766 movm.l EXC_DREGS(%a6),&0x0303
767
768 frestore FP_SRC(%a6)
769
770 unlk %a6
771
772 bra.l _real_inex
773
774
775fovfl_out:
776
777
778
779
780
781
782
783 mov.b &NORM,STAG(%a6)
784
785 clr.l %d0
786 mov.b FPCR_MODE(%a6),%d0
787
788 and.l &0xffff00ff,USER_FPSR(%a6)
789
790 fmov.l &0x0,%fpcr
791 fmov.l &0x0,%fpsr
792
793 lea FP_SRC(%a6),%a0
794
795 bsr.l fout
796
797 btst &ovfl_bit,FPCR_ENABLE(%a6)
798 bne.w fovfl_ovfl_on
799
800 btst &inex2_bit,FPCR_ENABLE(%a6)
801 bne.w fovfl_inex_on
802
803 fmovm.x EXC_FPREGS(%a6),&0xc0
804 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
805 movm.l EXC_DREGS(%a6),&0x0303
806
807 unlk %a6
808
809
810 btst &0x7,(%sp)
811 beq.l _fpsp_done
812
813 fmov.l %fpiar,0x8(%sp)
814 mov.w &0x2024,0x6(%sp)
815 bra.l _real_trace
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875 global _fpsp_unfl
876_fpsp_unfl:
877
878
879
880 link.w %a6,&-LOCAL_SIZE
881
882 fsave FP_SRC(%a6)
883
884 movm.l &0x0303,EXC_DREGS(%a6)
885 fmovm.l %fpcr,%fpsr,%fpiar,USER_FPCR(%a6)
886 fmovm.x &0xc0,EXC_FPREGS(%a6)
887
888
889 mov.l USER_FPIAR(%a6),EXC_EXTWPTR(%a6)
890 mov.l EXC_EXTWPTR(%a6),%a0
891 addq.l &0x4,EXC_EXTWPTR(%a6)
892 bsr.l _imem_read_long
893 mov.l %d0,EXC_OPWORD(%a6)
894
895
896
897 btst &0x5,EXC_CMDREG(%a6)
898 bne.w funfl_out
899
900
901 lea FP_SRC(%a6),%a0
902 bsr.l fix_skewed_ops
903
904 lea FP_SRC(%a6),%a0
905 bsr.l set_tag_x
906 mov.b %d0,STAG(%a6)
907
908
909
910
911 btst &0x5,1+EXC_CMDREG(%a6)
912 beq.b funfl_extract
913
914
915
916 btst &0x4,1+EXC_CMDREG(%a6)
917 bne.b funfl_extract
918
919 bfextu EXC_CMDREG(%a6){&6:&3},%d0
920 bsr.l load_fpn2
921
922 lea FP_DST(%a6),%a0
923 bsr.l set_tag_x
924 cmpi.b %d0,&UNNORM
925 bne.b funfl_op2_done
926 bsr.l unnorm_fix
927funfl_op2_done:
928 mov.b %d0,DTAG(%a6)
929
930funfl_extract:
931
932
933
934
935
936
937
938
939 clr.l %d0
940 mov.b FPCR_MODE(%a6),%d0
941
942 mov.b 1+EXC_CMDREG(%a6),%d1
943 andi.w &0x007f,%d1
944
945 andi.l &0x00ff01ff,USER_FPSR(%a6)
946
947 fmov.l &0x0,%fpcr
948 fmov.l &0x0,%fpsr
949
950 lea FP_SRC(%a6),%a0
951 lea FP_DST(%a6),%a1
952
953
954 mov.l (tbl_unsupp.l,%pc,%d1.w*4),%d1
955 jsr (tbl_unsupp.l,%pc,%d1.l*1)
956
957 bfextu EXC_CMDREG(%a6){&6:&3},%d0
958 bsr.l store_fpreg
959
960
961
962
963
964
965
966
967
968
969
970
971
972 btst &unfl_bit,FPCR_ENABLE(%a6)
973 bne.b funfl_unfl_on
974
975funfl_chkinex:
976 btst &inex2_bit,FPCR_ENABLE(%a6)
977 bne.b funfl_inex_on
978
979funfl_exit:
980 fmovm.x EXC_FPREGS(%a6),&0xc0
981 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
982 movm.l EXC_DREGS(%a6),&0x0303
983
984 unlk %a6
985
986 bra.l _fpsp_done
987
988
989
990
991funfl_unfl_on:
992
993
994
995
996
997
998
999 btst &unfl_bit,FPSR_EXCEPT(%a6)
1000 beq.w funfl_chkinex
1001
1002funfl_unfl_on2:
1003 fmovm.x &0x40,FP_SRC(%a6)
1004
1005 mov.w &0xe003,2+FP_SRC(%a6)
1006
1007 fmovm.x EXC_FPREGS(%a6),&0xc0
1008 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1009 movm.l EXC_DREGS(%a6),&0x0303
1010
1011 frestore FP_SRC(%a6)
1012
1013 unlk %a6
1014
1015 bra.l _real_unfl
1016
1017# undeflow occurred but is disabled. meanwhile, inexact is enabled. therefore,
1018
1019funfl_inex_on:
1020
1021
1022
1023
1024
1025
1026
1027
1028 btst &inex2_bit,FPSR_EXCEPT(%a6)
1029 beq.w funfl_exit
1030
1031funfl_inex_on2:
1032
1033 fmovm.x &0x40,FP_SRC(%a6)
1034
1035 mov.b &0xc4,1+EXC_VOFF(%a6)
1036 mov.w &0xe001,2+FP_SRC(%a6)
1037
1038 fmovm.x EXC_FPREGS(%a6),&0xc0
1039 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1040 movm.l EXC_DREGS(%a6),&0x0303
1041
1042 frestore FP_SRC(%a6)
1043
1044 unlk %a6
1045
1046 bra.l _real_inex
1047
1048
1049funfl_out:
1050
1051
1052
1053
1054
1055
1056
1057 mov.b &NORM,STAG(%a6)
1058
1059 clr.l %d0
1060 mov.b FPCR_MODE(%a6),%d0
1061
1062 and.l &0xffff00ff,USER_FPSR(%a6)
1063
1064 fmov.l &0x0,%fpcr
1065 fmov.l &0x0,%fpsr
1066
1067 lea FP_SRC(%a6),%a0
1068
1069 bsr.l fout
1070
1071 btst &unfl_bit,FPCR_ENABLE(%a6)
1072 bne.w funfl_unfl_on2
1073
1074 btst &inex2_bit,FPCR_ENABLE(%a6)
1075 bne.w funfl_inex_on2
1076
1077 fmovm.x EXC_FPREGS(%a6),&0xc0
1078 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1079 movm.l EXC_DREGS(%a6),&0x0303
1080
1081 unlk %a6
1082
1083
1084 btst &0x7,(%sp)
1085 beq.l _fpsp_done
1086
1087 fmov.l %fpiar,0x8(%sp)
1088 mov.w &0x2024,0x6(%sp)
1089 bra.l _real_trace
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202 global _fpsp_unsupp
1203_fpsp_unsupp:
1204
1205 link.w %a6,&-LOCAL_SIZE
1206
1207 fsave FP_SRC(%a6)
1208
1209 movm.l &0x0303,EXC_DREGS(%a6)
1210 fmovm.l %fpcr,%fpsr,%fpiar,USER_FPCR(%a6)
1211 fmovm.x &0xc0,EXC_FPREGS(%a6)
1212
1213 btst &0x5,EXC_SR(%a6)
1214 bne.b fu_s
1215fu_u:
1216 mov.l %usp,%a0
1217 mov.l %a0,EXC_A7(%a6)
1218 bra.b fu_cont
1219
1220
1221
1222fu_s:
1223 lea 0x4+EXC_EA(%a6),%a0
1224 mov.l %a0,EXC_A7(%a6)
1225
1226fu_cont:
1227
1228
1229
1230
1231 mov.l USER_FPIAR(%a6),EXC_EXTWPTR(%a6)
1232 mov.l EXC_EXTWPTR(%a6),%a0
1233 addq.l &0x4,EXC_EXTWPTR(%a6)
1234 bsr.l _imem_read_long
1235 mov.l %d0,EXC_OPWORD(%a6)
1236
1237
1238
1239 clr.b SPCOND_FLG(%a6)
1240
1241
1242
1243 btst &0x5,EXC_CMDREG(%a6)
1244 bne.w fu_out
1245
1246
1247 bfextu EXC_CMDREG(%a6){&0:&6},%d0
1248 cmpi.b %d0,&0x13
1249 beq.w fu_in_pack
1250
1251
1252
1253
1254 andi.l &0x00ff00ff,USER_FPSR(%a6)
1255
1256 fmov.l &0x0,%fpcr
1257 fmov.l &0x0,%fpsr
1258
1259
1260
1261
1262 lea FP_SRC(%a6),%a0
1263 bsr.l fix_skewed_ops
1264
1265
1266
1267
1268 lea FP_SRC(%a6),%a0
1269 bsr.l set_tag_x
1270 cmpi.b %d0,&UNNORM
1271 bne.b fu_op2
1272 bsr.l unnorm_fix
1273
1274fu_op2:
1275 mov.b %d0,STAG(%a6)
1276
1277 bfextu EXC_CMDREG(%a6){&6:&3},%d0
1278
1279
1280
1281 btst &0x5,1+EXC_CMDREG(%a6)
1282 beq.b fu_extract
1283 cmpi.b 1+EXC_CMDREG(%a6),&0x3a
1284 beq.b fu_extract
1285
1286 bsr.l load_fpn2
1287
1288 lea FP_DST(%a6),%a0
1289 bsr.l set_tag_x
1290 cmpi.b %d0,&UNNORM
1291 bne.b fu_op2_done
1292 bsr.l unnorm_fix
1293fu_op2_done:
1294 mov.b %d0,DTAG(%a6)
1295
1296fu_extract:
1297 clr.l %d0
1298 mov.b FPCR_MODE(%a6),%d0
1299
1300 bfextu 1+EXC_CMDREG(%a6){&1:&7},%d1
1301
1302 lea FP_SRC(%a6),%a0
1303 lea FP_DST(%a6),%a1
1304
1305 mov.l (tbl_unsupp.l,%pc,%d1.l*4),%d1
1306 jsr (tbl_unsupp.l,%pc,%d1.l*1)
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322 mov.b FPCR_ENABLE(%a6),%d0
1323 bne.b fu_in_ena
1324
1325fu_in_cont:
1326
1327 mov.b 1+EXC_CMDREG(%a6),%d0
1328 andi.b &0x38,%d0
1329 cmpi.b %d0,&0x38
1330 beq.b fu_in_exit
1331
1332 bfextu EXC_CMDREG(%a6){&6:&3},%d0
1333 bsr.l store_fpreg
1334
1335fu_in_exit:
1336
1337 fmovm.x EXC_FPREGS(%a6),&0xc0
1338 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1339 movm.l EXC_DREGS(%a6),&0x0303
1340
1341 unlk %a6
1342
1343 bra.l _fpsp_done
1344
1345fu_in_ena:
1346 and.b FPSR_EXCEPT(%a6),%d0
1347 bfffo %d0{&24:&8},%d0
1348 bne.b fu_in_exc
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360 btst &ovfl_bit,FPSR_EXCEPT(%a6)
1361 beq.b fu_in_cont
1362
1363fu_in_ovflchk:
1364 btst &inex2_bit,FPCR_ENABLE(%a6)
1365 beq.b fu_in_cont
1366 bra.w fu_in_exc_ovfl
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383fu_in_exc:
1384 subi.l &24,%d0
1385 cmpi.b %d0,&0x6
1386 bne.b fu_in_exc_exit
1387
1388
1389 btst &unfl_bit,FPSR_EXCEPT(%a6)
1390 bne.w fu_in_exc_unfl
1391 btst &ovfl_bit,FPSR_EXCEPT(%a6)
1392 bne.w fu_in_exc_ovfl
1393
1394
1395
1396
1397fu_in_exc_exit:
1398 mov.l %d0,-(%sp)
1399 bsr.l funimp_skew
1400 mov.l (%sp)+,%d0
1401
1402 mov.w (tbl_except.b,%pc,%d0.w*2),2+FP_SRC(%a6)
1403
1404 fmovm.x EXC_FPREGS(%a6),&0xc0
1405 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1406 movm.l EXC_DREGS(%a6),&0x0303
1407
1408 frestore FP_SRC(%a6)
1409
1410 unlk %a6
1411
1412 bra.l _fpsp_done
1413
1414tbl_except:
1415 short 0xe000,0xe006,0xe004,0xe005
1416 short 0xe003,0xe002,0xe001,0xe001
1417
1418fu_in_exc_unfl:
1419 mov.w &0x4,%d0
1420 bra.b fu_in_exc_exit
1421fu_in_exc_ovfl:
1422 mov.w &0x03,%d0
1423 bra.b fu_in_exc_exit
1424
1425
1426
1427
1428
1429 global fix_skewed_ops
1430fix_skewed_ops:
1431 bfextu EXC_CMDREG(%a6){&0:&6},%d0
1432 cmpi.b %d0,&0x11
1433 beq.b fso_sgl
1434 cmpi.b %d0,&0x15
1435 beq.b fso_dbl
1436 rts
1437
1438fso_sgl:
1439 mov.w LOCAL_EX(%a0),%d0
1440 andi.w &0x7fff,%d0
1441 cmpi.w %d0,&0x3f80
1442 beq.b fso_sgl_dnrm_zero
1443 cmpi.w %d0,&0x407f
1444 beq.b fso_infnan
1445 rts
1446
1447fso_sgl_dnrm_zero:
1448 andi.l &0x7fffffff,LOCAL_HI(%a0)
1449 beq.b fso_zero
1450fso_sgl_dnrm:
1451
1452 bsr.l norm
1453 neg.w %d0
1454 addi.w &0x3f81,%d0
1455 andi.w &0x8000,LOCAL_EX(%a0)
1456 or.w %d0,LOCAL_EX(%a0)
1457 rts
1458
1459fso_zero:
1460 andi.w &0x8000,LOCAL_EX(%a0)
1461 rts
1462
1463fso_infnan:
1464 andi.b &0x7f,LOCAL_HI(%a0)
1465 ori.w &0x7fff,LOCAL_EX(%a0)
1466 rts
1467
1468fso_dbl:
1469 mov.w LOCAL_EX(%a0),%d0
1470 andi.w &0x7fff,%d0
1471 cmpi.w %d0,&0x3c00
1472 beq.b fso_dbl_dnrm_zero
1473 cmpi.w %d0,&0x43ff
1474 beq.b fso_infnan
1475 rts
1476
1477fso_dbl_dnrm_zero:
1478 andi.l &0x7fffffff,LOCAL_HI(%a0)
1479 bne.b fso_dbl_dnrm
1480 tst.l LOCAL_LO(%a0)
1481 beq.b fso_zero
1482fso_dbl_dnrm:
1483
1484 bsr.l norm
1485 neg.w %d0
1486 addi.w &0x3c01,%d0
1487 andi.w &0x8000,LOCAL_EX(%a0)
1488 or.w %d0,LOCAL_EX(%a0)
1489 rts
1490
1491
1492
1493
1494
1495
1496fu_out:
1497
1498
1499 bfextu EXC_CMDREG(%a6){&3:&3},%d0
1500 cmpi.b %d0,&0x3
1501 beq.w fu_out_pack
1502 cmpi.b %d0,&0x7
1503 beq.w fu_out_pack
1504
1505
1506
1507
1508
1509 and.l &0xffff00ff,USER_FPSR(%a6)
1510
1511 fmov.l &0x0,%fpcr
1512 fmov.l &0x0,%fpsr
1513
1514
1515
1516 mov.w FP_SRC_EX(%a6),%d0
1517 andi.w &0x7fff,%d0
1518 beq.b fu_out_denorm
1519
1520 lea FP_SRC(%a6),%a0
1521 bsr.l unnorm_fix
1522
1523 mov.b %d0,STAG(%a6)
1524
1525 bra.b fu_out_cont
1526fu_out_denorm:
1527 mov.b &DENORM,STAG(%a6)
1528fu_out_cont:
1529
1530 clr.l %d0
1531 mov.b FPCR_MODE(%a6),%d0
1532
1533 lea FP_SRC(%a6),%a0
1534
1535 mov.l (%a6),EXC_A6(%a6)
1536 bsr.l fout
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550 mov.b FPCR_ENABLE(%a6),%d0
1551 bne.w fu_out_ena
1552
1553fu_out_done:
1554
1555 mov.l EXC_A6(%a6),(%a6)
1556
1557
1558
1559
1560
1561
1562 btst &0x5,EXC_SR(%a6)
1563 bne.b fu_out_done_s
1564
1565 mov.l EXC_A7(%a6),%a0
1566 mov.l %a0,%usp
1567
1568fu_out_done_cont:
1569 fmovm.x EXC_FPREGS(%a6),&0xc0
1570 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1571 movm.l EXC_DREGS(%a6),&0x0303
1572
1573 unlk %a6
1574
1575 btst &0x7,(%sp)
1576 bne.b fu_out_trace
1577
1578 bra.l _fpsp_done
1579
1580
1581
1582fu_out_done_s:
1583 cmpi.b SPCOND_FLG(%a6),&mda7_flg
1584 bne.b fu_out_done_cont
1585
1586
1587
1588
1589
1590
1591 fmovm.x &0x80,FP_SRC(%a6)
1592
1593 fmovm.x EXC_FPREGS(%a6),&0xc0
1594 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1595 movm.l EXC_DREGS(%a6),&0x0303
1596
1597 mov.l (%a6),%a6
1598
1599 mov.l LOCAL_SIZE+EXC_SR(%sp),LOCAL_SIZE+EXC_SR-0xc(%sp)
1600 mov.l LOCAL_SIZE+2+EXC_PC(%sp),LOCAL_SIZE+2+EXC_PC-0xc(%sp)
1601
1602
1603 mov.l LOCAL_SIZE+FP_SRC_EX(%sp),LOCAL_SIZE+EXC_SR+0x0(%sp)
1604 mov.l LOCAL_SIZE+FP_SRC_HI(%sp),LOCAL_SIZE+EXC_SR+0x4(%sp)
1605 mov.l LOCAL_SIZE+FP_SRC_LO(%sp),LOCAL_SIZE+EXC_SR+0x8(%sp)
1606
1607 add.l &LOCAL_SIZE-0x8,%sp
1608
1609 btst &0x7,(%sp)
1610 bne.b fu_out_trace
1611
1612 bra.l _fpsp_done
1613
1614fu_out_ena:
1615 and.b FPSR_EXCEPT(%a6),%d0
1616 bfffo %d0{&24:&8},%d0
1617 bne.b fu_out_exc
1618
1619
1620
1621
1622 btst &ovfl_bit,FPSR_EXCEPT(%a6)
1623 beq.w fu_out_done
1624
1625fu_out_ovflchk:
1626 btst &inex2_bit,FPCR_ENABLE(%a6)
1627 beq.w fu_out_done
1628 bra.w fu_inex
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648fu_out_trace:
1649 mov.w &0x2024,0x6(%sp)
1650 fmov.l %fpiar,0x8(%sp)
1651 bra.l _real_trace
1652
1653
1654fu_out_exc:
1655 subi.l &24,%d0
1656
1657
1658
1659 mov.w (tbl_fu_out.b,%pc,%d0.w*2),%d0
1660 jmp (tbl_fu_out.b,%pc,%d0.w*1)
1661
1662 swbeg &0x8
1663tbl_fu_out:
1664 short tbl_fu_out - tbl_fu_out
1665 short tbl_fu_out - tbl_fu_out
1666 short fu_operr - tbl_fu_out
1667 short fu_ovfl - tbl_fu_out
1668 short fu_unfl - tbl_fu_out
1669 short tbl_fu_out - tbl_fu_out
1670 short fu_inex - tbl_fu_out
1671 short tbl_fu_out - tbl_fu_out
1672
1673
1674
1675fu_snan:
1676 fmovm.x EXC_FPREGS(%a6),&0xc0
1677 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1678 movm.l EXC_DREGS(%a6),&0x0303
1679
1680 mov.w &0x30d8,EXC_VOFF(%a6)
1681 mov.w &0xe006,2+FP_SRC(%a6)
1682
1683 frestore FP_SRC(%a6)
1684
1685 unlk %a6
1686
1687
1688 bra.l _real_snan
1689
1690fu_operr:
1691 fmovm.x EXC_FPREGS(%a6),&0xc0
1692 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1693 movm.l EXC_DREGS(%a6),&0x0303
1694
1695 mov.w &0x30d0,EXC_VOFF(%a6)
1696 mov.w &0xe004,2+FP_SRC(%a6)
1697
1698 frestore FP_SRC(%a6)
1699
1700 unlk %a6
1701
1702
1703 bra.l _real_operr
1704
1705fu_ovfl:
1706 fmovm.x &0x40,FP_SRC(%a6)
1707
1708 fmovm.x EXC_FPREGS(%a6),&0xc0
1709 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1710 movm.l EXC_DREGS(%a6),&0x0303
1711
1712 mov.w &0x30d4,EXC_VOFF(%a6)
1713 mov.w &0xe005,2+FP_SRC(%a6)
1714
1715 frestore FP_SRC(%a6)
1716
1717 unlk %a6
1718
1719 bra.l _real_ovfl
1720
1721
1722
1723
1724
1725fu_unfl:
1726 mov.l EXC_A6(%a6),(%a6)
1727
1728 btst &0x5,EXC_SR(%a6)
1729 bne.w fu_unfl_s
1730
1731 mov.l EXC_A7(%a6),%a0
1732 mov.l %a0,%usp
1733
1734fu_unfl_cont:
1735 fmovm.x &0x40,FP_SRC(%a6)
1736
1737 fmovm.x EXC_FPREGS(%a6),&0xc0
1738 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1739 movm.l EXC_DREGS(%a6),&0x0303
1740
1741 mov.w &0x30cc,EXC_VOFF(%a6)
1742 mov.w &0xe003,2+FP_SRC(%a6)
1743
1744 frestore FP_SRC(%a6)
1745
1746 unlk %a6
1747
1748 bra.l _real_unfl
1749
1750fu_unfl_s:
1751 cmpi.b SPCOND_FLG(%a6),&mda7_flg
1752 bne.b fu_unfl_cont
1753
1754
1755
1756
1757
1758 fmovm.x &0x80,FP_SRC(%a6)
1759 fmovm.x &0x40,FP_DST(%a6)
1760
1761 fmovm.x EXC_FPREGS(%a6),&0xc0
1762 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1763 movm.l EXC_DREGS(%a6),&0x0303
1764
1765 mov.w &0x30cc,EXC_VOFF(%a6)
1766 mov.w &0xe003,2+FP_DST(%a6)
1767
1768 frestore FP_DST(%a6)
1769
1770 mov.l (%a6),%a6
1771
1772 mov.l LOCAL_SIZE+EXC_SR(%sp),LOCAL_SIZE+EXC_SR-0xc(%sp)
1773 mov.l LOCAL_SIZE+2+EXC_PC(%sp),LOCAL_SIZE+2+EXC_PC-0xc(%sp)
1774 mov.l LOCAL_SIZE+EXC_EA(%sp),LOCAL_SIZE+EXC_EA-0xc(%sp)
1775
1776
1777 mov.l LOCAL_SIZE+FP_SRC_EX(%sp),LOCAL_SIZE+EXC_SR+0x0(%sp)
1778 mov.l LOCAL_SIZE+FP_SRC_HI(%sp),LOCAL_SIZE+EXC_SR+0x4(%sp)
1779 mov.l LOCAL_SIZE+FP_SRC_LO(%sp),LOCAL_SIZE+EXC_SR+0x8(%sp)
1780
1781 add.l &LOCAL_SIZE-0x8,%sp
1782
1783 bra.l _real_unfl
1784
1785
1786fu_inex:
1787 fmovm.x &0x40,FP_SRC(%a6)
1788
1789 fmovm.x EXC_FPREGS(%a6),&0xc0
1790 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1791 movm.l EXC_DREGS(%a6),&0x0303
1792
1793 mov.w &0x30c4,EXC_VOFF(%a6)
1794 mov.w &0xe001,2+FP_SRC(%a6)
1795
1796 frestore FP_SRC(%a6)
1797
1798 unlk %a6
1799
1800
1801 bra.l _real_inex
1802
1803
1804
1805fu_in_pack:
1806
1807
1808
1809
1810 andi.l &0x0ff00ff,USER_FPSR(%a6)
1811
1812 fmov.l &0x0,%fpcr
1813 fmov.l &0x0,%fpsr
1814
1815 bsr.l get_packed
1816
1817 lea FP_SRC(%a6),%a0
1818 bsr.l set_tag_x
1819
1820 mov.b %d0,STAG(%a6)
1821
1822 bfextu EXC_CMDREG(%a6){&6:&3},%d0
1823
1824
1825
1826 btst &0x5,1+EXC_CMDREG(%a6)
1827 beq.b fu_extract_p
1828 cmpi.b 1+EXC_CMDREG(%a6),&0x3a
1829 beq.b fu_extract_p
1830
1831 bsr.l load_fpn2
1832
1833 lea FP_DST(%a6),%a0
1834 bsr.l set_tag_x
1835 cmpi.b %d0,&UNNORM
1836 bne.b fu_op2_done_p
1837 bsr.l unnorm_fix
1838fu_op2_done_p:
1839 mov.b %d0,DTAG(%a6)
1840
1841fu_extract_p:
1842 clr.l %d0
1843 mov.b FPCR_MODE(%a6),%d0
1844
1845 bfextu 1+EXC_CMDREG(%a6){&1:&7},%d1
1846
1847 lea FP_SRC(%a6),%a0
1848 lea FP_DST(%a6),%a1
1849
1850 mov.l (tbl_unsupp.l,%pc,%d1.l*4),%d1
1851 jsr (tbl_unsupp.l,%pc,%d1.l*1)
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867 mov.b FPCR_ENABLE(%a6),%d0
1868 bne.w fu_in_ena_p
1869
1870fu_in_cont_p:
1871
1872 mov.b 1+EXC_CMDREG(%a6),%d0
1873 andi.b &0x38,%d0
1874 cmpi.b %d0,&0x38
1875 beq.b fu_in_exit_p
1876
1877 bfextu EXC_CMDREG(%a6){&6:&3},%d0
1878 bsr.l store_fpreg
1879
1880fu_in_exit_p:
1881
1882 btst &0x5,EXC_SR(%a6)
1883 bne.w fu_in_exit_s_p
1884
1885 mov.l EXC_A7(%a6),%a0
1886 mov.l %a0,%usp
1887
1888fu_in_exit_cont_p:
1889 fmovm.x EXC_FPREGS(%a6),&0xc0
1890 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1891 movm.l EXC_DREGS(%a6),&0x0303
1892
1893 unlk %a6
1894
1895 btst &0x7,(%sp)
1896 bne.w fu_trace_p
1897
1898 bra.l _fpsp_done
1899
1900
1901
1902
1903fu_in_exit_s_p:
1904 btst &mia7_bit,SPCOND_FLG(%a6)
1905 beq.b fu_in_exit_cont_p
1906
1907 fmovm.x EXC_FPREGS(%a6),&0xc0
1908 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1909 movm.l EXC_DREGS(%a6),&0x0303
1910
1911 unlk %a6
1912
1913
1914 mov.l 0x4(%sp),0x10(%sp)
1915 mov.l 0x0(%sp),0xc(%sp)
1916 add.l &0xc,%sp
1917
1918 btst &0x7,(%sp)
1919 bne.w fu_trace_p
1920
1921 bra.l _fpsp_done
1922
1923fu_in_ena_p:
1924 and.b FPSR_EXCEPT(%a6),%d0
1925 bfffo %d0{&24:&8},%d0
1926 bne.b fu_in_exc_p
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938 btst &ovfl_bit,FPSR_EXCEPT(%a6)
1939 beq.w fu_in_cont_p
1940
1941fu_in_ovflchk_p:
1942 btst &inex2_bit,FPCR_ENABLE(%a6)
1943 beq.w fu_in_cont_p
1944 bra.w fu_in_exc_ovfl_p
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961fu_in_exc_p:
1962 subi.l &24,%d0
1963 cmpi.b %d0,&0x6
1964 blt.b fu_in_exc_exit_p
1965
1966
1967 btst &unfl_bit,FPSR_EXCEPT(%a6)
1968 bne.w fu_in_exc_unfl_p
1969 btst &ovfl_bit,FPSR_EXCEPT(%a6)
1970 bne.w fu_in_exc_ovfl_p
1971
1972
1973
1974
1975
1976
1977
1978fu_in_exc_exit_p:
1979 btst &0x5,EXC_SR(%a6)
1980 bne.w fu_in_exc_exit_s_p
1981
1982 mov.l EXC_A7(%a6),%a0
1983 mov.l %a0,%usp
1984
1985fu_in_exc_exit_cont_p:
1986 mov.w (tbl_except_p.b,%pc,%d0.w*2),2+FP_SRC(%a6)
1987
1988 fmovm.x EXC_FPREGS(%a6),&0xc0
1989 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
1990 movm.l EXC_DREGS(%a6),&0x0303
1991
1992 frestore FP_SRC(%a6)
1993
1994 unlk %a6
1995
1996 btst &0x7,(%sp)
1997 bne.w fu_trace_p
1998
1999 bra.l _fpsp_done
2000
2001tbl_except_p:
2002 short 0xe000,0xe006,0xe004,0xe005
2003 short 0xe003,0xe002,0xe001,0xe001
2004
2005fu_in_exc_ovfl_p:
2006 mov.w &0x3,%d0
2007 bra.w fu_in_exc_exit_p
2008
2009fu_in_exc_unfl_p:
2010 mov.w &0x4,%d0
2011 bra.w fu_in_exc_exit_p
2012
2013fu_in_exc_exit_s_p:
2014 btst &mia7_bit,SPCOND_FLG(%a6)
2015 beq.b fu_in_exc_exit_cont_p
2016
2017 mov.w (tbl_except_p.b,%pc,%d0.w*2),2+FP_SRC(%a6)
2018
2019 fmovm.x EXC_FPREGS(%a6),&0xc0
2020 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2021 movm.l EXC_DREGS(%a6),&0x0303
2022
2023 frestore FP_SRC(%a6)
2024
2025 unlk %a6
2026
2027
2028 mov.l 0x4(%sp),0x10(%sp)
2029 mov.l 0x0(%sp),0xc(%sp)
2030 add.l &0xc,%sp
2031
2032 btst &0x7,(%sp)
2033 bne.b fu_trace_p
2034
2035 bra.l _fpsp_done
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054fu_trace_p:
2055 mov.w &0x2024,0x6(%sp)
2056 fmov.l %fpiar,0x8(%sp)
2057
2058 bra.l _real_trace
2059
2060
2061
2062fu_out_pack:
2063
2064
2065
2066
2067
2068 and.l &0xffff00ff,USER_FPSR(%a6)
2069
2070 fmov.l &0x0,%fpcr
2071 fmov.l &0x0,%fpsr
2072
2073 bfextu EXC_CMDREG(%a6){&6:&3},%d0
2074 bsr.l load_fpn1
2075
2076
2077
2078 lea FP_SRC(%a6),%a0
2079 bsr.l set_tag_x
2080 cmpi.b %d0,&UNNORM
2081 bne.b fu_op2_p
2082 bsr.l unnorm_fix
2083
2084fu_op2_p:
2085 mov.b %d0,STAG(%a6)
2086
2087 clr.l %d0
2088 mov.b FPCR_MODE(%a6),%d0
2089
2090 lea FP_SRC(%a6),%a0
2091
2092 mov.l (%a6),EXC_A6(%a6)
2093 bsr.l fout
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107 mov.b FPCR_ENABLE(%a6),%d0
2108 bne.w fu_out_ena_p
2109
2110fu_out_exit_p:
2111 mov.l EXC_A6(%a6),(%a6)
2112
2113 btst &0x5,EXC_SR(%a6)
2114 bne.b fu_out_exit_s_p
2115
2116 mov.l EXC_A7(%a6),%a0
2117 mov.l %a0,%usp
2118
2119fu_out_exit_cont_p:
2120 fmovm.x EXC_FPREGS(%a6),&0xc0
2121 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2122 movm.l EXC_DREGS(%a6),&0x0303
2123
2124 unlk %a6
2125
2126 btst &0x7,(%sp)
2127 bne.w fu_trace_p
2128
2129 bra.l _fpsp_done
2130
2131
2132
2133
2134fu_out_exit_s_p:
2135 btst &mda7_bit,SPCOND_FLG(%a6)
2136 beq.b fu_out_exit_cont_p
2137
2138 fmovm.x EXC_FPREGS(%a6),&0xc0
2139 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2140 movm.l EXC_DREGS(%a6),&0x0303
2141
2142 mov.l (%a6),%a6
2143
2144 mov.l LOCAL_SIZE+EXC_SR(%sp),LOCAL_SIZE+EXC_SR-0xc(%sp)
2145 mov.l LOCAL_SIZE+2+EXC_PC(%sp),LOCAL_SIZE+2+EXC_PC-0xc(%sp)
2146
2147
2148 mov.l LOCAL_SIZE+FP_DST_EX(%sp),LOCAL_SIZE+EXC_SR+0x0(%sp)
2149 mov.l LOCAL_SIZE+FP_DST_HI(%sp),LOCAL_SIZE+EXC_SR+0x4(%sp)
2150 mov.l LOCAL_SIZE+FP_DST_LO(%sp),LOCAL_SIZE+EXC_SR+0x8(%sp)
2151
2152 add.l &LOCAL_SIZE-0x8,%sp
2153
2154 btst &0x7,(%sp)
2155 bne.w fu_trace_p
2156
2157 bra.l _fpsp_done
2158
2159fu_out_ena_p:
2160 and.b FPSR_EXCEPT(%a6),%d0
2161 bfffo %d0{&24:&8},%d0
2162 beq.w fu_out_exit_p
2163
2164 mov.l EXC_A6(%a6),(%a6)
2165
2166
2167
2168fu_out_exc_p:
2169 cmpi.b %d0,&0x1a
2170 bgt.w fu_inex_p2
2171 beq.w fu_operr_p
2172
2173fu_snan_p:
2174 btst &0x5,EXC_SR(%a6)
2175 bne.b fu_snan_s_p
2176
2177 mov.l EXC_A7(%a6),%a0
2178 mov.l %a0,%usp
2179 bra.w fu_snan
2180
2181fu_snan_s_p:
2182 cmpi.b SPCOND_FLG(%a6),&mda7_flg
2183 bne.w fu_snan
2184
2185
2186
2187
2188 fmovm.x EXC_FPREGS(%a6),&0xc0
2189 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2190 movm.l EXC_DREGS(%a6),&0x0303
2191
2192 mov.w &0x30d8,EXC_VOFF(%a6)
2193 mov.w &0xe006,2+FP_SRC(%a6)
2194
2195 frestore FP_SRC(%a6)
2196
2197 mov.l (%a6),%a6
2198
2199 mov.l LOCAL_SIZE+EXC_SR(%sp),LOCAL_SIZE+EXC_SR-0xc(%sp)
2200 mov.l LOCAL_SIZE+2+EXC_PC(%sp),LOCAL_SIZE+2+EXC_PC-0xc(%sp)
2201 mov.l LOCAL_SIZE+EXC_EA(%sp),LOCAL_SIZE+EXC_EA-0xc(%sp)
2202
2203
2204 mov.l LOCAL_SIZE+FP_DST_EX(%sp),LOCAL_SIZE+0x4(%sp)
2205 mov.l LOCAL_SIZE+FP_DST_HI(%sp),LOCAL_SIZE+0x8(%sp)
2206 mov.l LOCAL_SIZE+FP_DST_LO(%sp),LOCAL_SIZE+0xc(%sp)
2207
2208 add.l &LOCAL_SIZE-0x8,%sp
2209
2210
2211 bra.l _real_snan
2212
2213fu_operr_p:
2214 btst &0x5,EXC_SR(%a6)
2215 bne.w fu_operr_p_s
2216
2217 mov.l EXC_A7(%a6),%a0
2218 mov.l %a0,%usp
2219 bra.w fu_operr
2220
2221fu_operr_p_s:
2222 cmpi.b SPCOND_FLG(%a6),&mda7_flg
2223 bne.w fu_operr
2224
2225
2226
2227
2228 fmovm.x EXC_FPREGS(%a6),&0xc0
2229 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2230 movm.l EXC_DREGS(%a6),&0x0303
2231
2232 mov.w &0x30d0,EXC_VOFF(%a6)
2233 mov.w &0xe004,2+FP_SRC(%a6)
2234
2235 frestore FP_SRC(%a6)
2236
2237 mov.l (%a6),%a6
2238
2239 mov.l LOCAL_SIZE+EXC_SR(%sp),LOCAL_SIZE+EXC_SR-0xc(%sp)
2240 mov.l LOCAL_SIZE+2+EXC_PC(%sp),LOCAL_SIZE+2+EXC_PC-0xc(%sp)
2241 mov.l LOCAL_SIZE+EXC_EA(%sp),LOCAL_SIZE+EXC_EA-0xc(%sp)
2242
2243
2244 mov.l LOCAL_SIZE+FP_DST_EX(%sp),LOCAL_SIZE+0x4(%sp)
2245 mov.l LOCAL_SIZE+FP_DST_HI(%sp),LOCAL_SIZE+0x8(%sp)
2246 mov.l LOCAL_SIZE+FP_DST_LO(%sp),LOCAL_SIZE+0xc(%sp)
2247
2248 add.l &LOCAL_SIZE-0x8,%sp
2249
2250
2251 bra.l _real_operr
2252
2253fu_inex_p2:
2254 btst &0x5,EXC_SR(%a6)
2255 bne.w fu_inex_s_p2
2256
2257 mov.l EXC_A7(%a6),%a0
2258 mov.l %a0,%usp
2259 bra.w fu_inex
2260
2261fu_inex_s_p2:
2262 cmpi.b SPCOND_FLG(%a6),&mda7_flg
2263 bne.w fu_inex
2264
2265
2266
2267
2268 fmovm.x EXC_FPREGS(%a6),&0xc0
2269 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2270 movm.l EXC_DREGS(%a6),&0x0303
2271
2272 mov.w &0x30c4,EXC_VOFF(%a6)
2273 mov.w &0xe001,2+FP_SRC(%a6)
2274
2275 frestore FP_SRC(%a6)
2276
2277 mov.l (%a6),%a6
2278
2279 mov.l LOCAL_SIZE+EXC_SR(%sp),LOCAL_SIZE+EXC_SR-0xc(%sp)
2280 mov.l LOCAL_SIZE+2+EXC_PC(%sp),LOCAL_SIZE+2+EXC_PC-0xc(%sp)
2281 mov.l LOCAL_SIZE+EXC_EA(%sp),LOCAL_SIZE+EXC_EA-0xc(%sp)
2282
2283
2284 mov.l LOCAL_SIZE+FP_DST_EX(%sp),LOCAL_SIZE+0x4(%sp)
2285 mov.l LOCAL_SIZE+FP_DST_HI(%sp),LOCAL_SIZE+0x8(%sp)
2286 mov.l LOCAL_SIZE+FP_DST_LO(%sp),LOCAL_SIZE+0xc(%sp)
2287
2288 add.l &LOCAL_SIZE-0x8,%sp
2289
2290
2291 bra.l _real_inex
2292
2293
2294
2295
2296
2297
2298
2299
2300 global funimp_skew
2301funimp_skew:
2302 bfextu EXC_EXTWORD(%a6){&3:&3},%d0
2303 cmpi.b %d0,&0x1
2304 beq.b funimp_skew_sgl
2305 cmpi.b %d0,&0x5
2306 beq.b funimp_skew_dbl
2307 rts
2308
2309funimp_skew_sgl:
2310 mov.w FP_SRC_EX(%a6),%d0
2311 andi.w &0x7fff,%d0
2312 beq.b funimp_skew_sgl_not
2313 cmpi.w %d0,&0x3f80
2314 bgt.b funimp_skew_sgl_not
2315 neg.w %d0
2316 addi.w &0x3f81,%d0
2317 mov.l FP_SRC_HI(%a6),%d1
2318 lsr.l %d0,%d1
2319 bset &31,%d1
2320 mov.l %d1,FP_SRC_HI(%a6)
2321 andi.w &0x8000,FP_SRC_EX(%a6)
2322 ori.w &0x3f80,FP_SRC_EX(%a6)
2323funimp_skew_sgl_not:
2324 rts
2325
2326funimp_skew_dbl:
2327 mov.w FP_SRC_EX(%a6),%d0
2328 andi.w &0x7fff,%d0
2329 beq.b funimp_skew_dbl_not
2330 cmpi.w %d0,&0x3c00
2331 bgt.b funimp_skew_dbl_not
2332
2333 tst.b FP_SRC_EX(%a6)
2334 smi.b 0x2+FP_SRC(%a6)
2335 mov.w %d0,FP_SRC_EX(%a6)
2336 clr.l %d0
2337 lea FP_SRC(%a6),%a0
2338 mov.w &0x3c01,%d1
2339 bsr.l dnrm_lp
2340 mov.w &0x3c00,%d0
2341 tst.b 0x2+FP_SRC(%a6)
2342 beq.b fss_dbl_denorm_done
2343 bset &15,%d0
2344fss_dbl_denorm_done:
2345 bset &0x7,FP_SRC_HI(%a6)
2346 mov.w %d0,FP_SRC_EX(%a6)
2347funimp_skew_dbl_not:
2348 rts
2349
2350
2351 global _mem_write2
2352_mem_write2:
2353 btst &0x5,EXC_SR(%a6)
2354 beq.l _dmem_write
2355 mov.l 0x0(%a0),FP_DST_EX(%a6)
2356 mov.l 0x4(%a0),FP_DST_HI(%a6)
2357 mov.l 0x8(%a0),FP_DST_LO(%a6)
2358 clr.l %d1
2359 rts
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451 global _fpsp_effadd
2452_fpsp_effadd:
2453
2454
2455
2456
2457 mov.l %d0,-(%sp)
2458 movc %pcr,%d0
2459 btst &0x1,%d0
2460 bne.w iea_disabled
2461 mov.l (%sp)+,%d0
2462
2463 link %a6,&-LOCAL_SIZE
2464
2465 movm.l &0x0303,EXC_DREGS(%a6)
2466 fmovm.l %fpcr,%fpsr,%fpiar,USER_FPCR(%a6)
2467 fmovm.x &0xc0,EXC_FPREGS(%a6)
2468
2469
2470 mov.l EXC_PC(%a6),EXC_EXTWPTR(%a6)
2471
2472 mov.l EXC_EXTWPTR(%a6),%a0
2473 addq.l &0x4,EXC_EXTWPTR(%a6)
2474 bsr.l _imem_read_long
2475 mov.l %d0,EXC_OPWORD(%a6)
2476
2477
2478
2479 tst.w %d0
2480 bmi.w iea_fmovm
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501iea_op:
2502 andi.l &0x00ff00ff,USER_FPSR(%a6)
2503
2504 btst &0xa,%d0
2505 bne.b iea_op_pack
2506
2507
2508 mov.l EXC_EXTWPTR(%a6),%a0
2509 lea FP_SRC(%a6),%a1
2510 mov.l &0xc,%d0
2511 bsr.l _imem_read
2512
2513 tst.l %d1
2514 bne.w iea_iacc
2515
2516 bra.b iea_op_setsrc
2517
2518iea_op_pack:
2519
2520 mov.l EXC_EXTWPTR(%a6),%a0
2521 lea FP_SRC(%a6),%a1
2522 mov.l &0xc,%d0
2523 bsr.l _imem_read
2524
2525 tst.l %d1
2526 bne.w iea_iacc
2527
2528
2529 bfextu FP_SRC(%a6){&1:&15},%d0
2530 cmpi.w %d0,&0x7fff
2531 beq.b iea_op_setsrc
2532
2533
2534
2535 mov.b 3+FP_SRC(%a6),%d0
2536 andi.b &0x0f,%d0
2537 bne.b iea_op_gp_not_spec
2538 tst.l FP_SRC_HI(%a6)
2539 bne.b iea_op_gp_not_spec
2540 tst.l FP_SRC_LO(%a6)
2541 beq.b iea_op_setsrc
2542iea_op_gp_not_spec:
2543 lea FP_SRC(%a6),%a0
2544 bsr.l decbin
2545 fmovm.x &0x80,FP_SRC(%a6)
2546
2547iea_op_setsrc:
2548 addi.l &0xc,EXC_EXTWPTR(%a6)
2549
2550
2551 lea FP_SRC(%a6),%a0
2552 bsr.l set_tag_x
2553 mov.b %d0,STAG(%a6)
2554 cmpi.b %d0,&UNNORM
2555 bne.b iea_op_getdst
2556 bsr.l unnorm_fix
2557 mov.b %d0,STAG(%a6)
2558iea_op_getdst:
2559 clr.b STORE_FLG(%a6)
2560
2561 btst &0x5,1+EXC_CMDREG(%a6)
2562 beq.b iea_op_extract
2563 btst &0x4,1+EXC_CMDREG(%a6)
2564 bne.b iea_op_spec
2565
2566iea_op_loaddst:
2567 bfextu EXC_CMDREG(%a6){&6:&3},%d0
2568 bsr.l load_fpn2
2569
2570 lea FP_DST(%a6),%a0
2571 bsr.l set_tag_x
2572 mov.b %d0,DTAG(%a6)
2573 cmpi.b %d0,&UNNORM
2574 bne.b iea_op_extract
2575 bsr.l unnorm_fix
2576 mov.b %d0,DTAG(%a6)
2577 bra.b iea_op_extract
2578
2579
2580iea_op_spec:
2581 btst &0x3,1+EXC_CMDREG(%a6)
2582 beq.b iea_op_extract
2583
2584
2585 st STORE_FLG(%a6)
2586 btst &0x1,1+EXC_CMDREG(%a6)
2587 beq.b iea_op_loaddst
2588
2589iea_op_extract:
2590 clr.l %d0
2591 mov.b FPCR_MODE(%a6),%d0
2592
2593 mov.b 1+EXC_CMDREG(%a6),%d1
2594 andi.w &0x007f,%d1
2595
2596 fmov.l &0x0,%fpcr
2597 fmov.l &0x0,%fpsr
2598
2599 lea FP_SRC(%a6),%a0
2600 lea FP_DST(%a6),%a1
2601
2602 mov.l (tbl_unsupp.l,%pc,%d1.w*4),%d1
2603 jsr (tbl_unsupp.l,%pc,%d1.l*1)
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619 mov.b FPCR_ENABLE(%a6),%d0
2620 bne.b iea_op_ena
2621
2622
2623
2624iea_op_save:
2625 tst.b STORE_FLG(%a6)
2626 bne.b iea_op_exit1
2627
2628iea_op_store:
2629 bfextu EXC_CMDREG(%a6){&6:&3},%d0
2630 bsr.l store_fpreg
2631
2632iea_op_exit1:
2633 mov.l EXC_PC(%a6),USER_FPIAR(%a6)
2634 mov.l EXC_EXTWPTR(%a6),EXC_PC(%a6)
2635
2636 fmovm.x EXC_FPREGS(%a6),&0xc0
2637 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2638 movm.l EXC_DREGS(%a6),&0x0303
2639
2640 unlk %a6
2641
2642 btst &0x7,(%sp)
2643 bne.w iea_op_trace
2644
2645 bra.l _fpsp_done
2646
2647iea_op_ena:
2648 and.b FPSR_EXCEPT(%a6),%d0
2649 bfffo %d0{&24:&8},%d0
2650 bne.b iea_op_exc
2651
2652
2653
2654 btst &ovfl_bit,FPSR_EXCEPT(%a6)
2655 beq.b iea_op_save
2656
2657iea_op_ovfl:
2658 btst &inex2_bit,FPCR_ENABLE(%a6)
2659 beq.b iea_op_store
2660 bra.b iea_op_exc_ovfl
2661
2662
2663
2664iea_op_exc:
2665 subi.l &24,%d0
2666 cmpi.b %d0,&0x6
2667 bne.b iea_op_exc_force
2668
2669
2670
2671
2672 btst &ovfl_bit,FPSR_EXCEPT(%a6)
2673 bne.b iea_op_exc_ovfl
2674 btst &unfl_bit,FPSR_EXCEPT(%a6)
2675 bne.b iea_op_exc_unfl
2676
2677iea_op_exc_force:
2678 mov.w (tbl_iea_except.b,%pc,%d0.w*2),2+FP_SRC(%a6)
2679 bra.b iea_op_exit2
2680
2681tbl_iea_except:
2682 short 0xe002, 0xe006, 0xe004, 0xe005
2683 short 0xe003, 0xe002, 0xe001, 0xe001
2684
2685iea_op_exc_ovfl:
2686 mov.w &0xe005,2+FP_SRC(%a6)
2687 bra.b iea_op_exit2
2688
2689iea_op_exc_unfl:
2690 mov.w &0xe003,2+FP_SRC(%a6)
2691
2692iea_op_exit2:
2693 mov.l EXC_PC(%a6),USER_FPIAR(%a6)
2694 mov.l EXC_EXTWPTR(%a6),EXC_PC(%a6)
2695
2696 fmovm.x EXC_FPREGS(%a6),&0xc0
2697 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2698 movm.l EXC_DREGS(%a6),&0x0303
2699
2700 frestore FP_SRC(%a6)
2701
2702 unlk %a6
2703
2704 btst &0x7,(%sp)
2705 bne.b iea_op_trace
2706
2707 bra.l _fpsp_done
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726iea_op_trace:
2727 mov.l (%sp),-(%sp)
2728 mov.w 0x8(%sp),0x4(%sp)
2729 mov.w &0x2024,0x6(%sp)
2730 fmov.l %fpiar,0x8(%sp)
2731
2732 bra.l _real_trace
2733
2734
2735iea_fmovm:
2736 btst &14,%d0
2737 beq.w iea_fmovm_ctrl
2738
2739iea_fmovm_data:
2740
2741 btst &0x5,EXC_SR(%a6)
2742 bne.b iea_fmovm_data_s
2743
2744iea_fmovm_data_u:
2745 mov.l %usp,%a0
2746 mov.l %a0,EXC_A7(%a6)
2747 bsr.l fmovm_dynamic
2748 mov.l EXC_A7(%a6),%a0
2749 mov.l %a0,%usp
2750 bra.w iea_fmovm_exit
2751
2752iea_fmovm_data_s:
2753 clr.b SPCOND_FLG(%a6)
2754 lea 0x2+EXC_VOFF(%a6),%a0
2755 mov.l %a0,EXC_A7(%a6)
2756 bsr.l fmovm_dynamic
2757
2758 cmpi.b SPCOND_FLG(%a6),&mda7_flg
2759 beq.w iea_fmovm_data_predec
2760 cmpi.b SPCOND_FLG(%a6),&mia7_flg
2761 bne.w iea_fmovm_exit
2762
2763
2764
2765
2766
2767iea_fmovm_data_postinc:
2768 btst &0x7,EXC_SR(%a6)
2769 bne.b iea_fmovm_data_pi_trace
2770
2771 mov.w EXC_SR(%a6),(EXC_SR,%a6,%d0)
2772 mov.l EXC_EXTWPTR(%a6),(EXC_PC,%a6,%d0)
2773 mov.w &0x00f0,(EXC_VOFF,%a6,%d0)
2774
2775 lea (EXC_SR,%a6,%d0),%a0
2776 mov.l %a0,EXC_SR(%a6)
2777
2778 fmovm.x EXC_FP0(%a6),&0xc0
2779 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2780 movm.l EXC_DREGS(%a6),&0x0303
2781
2782 unlk %a6
2783 mov.l (%sp)+,%sp
2784 bra.l _fpsp_done
2785
2786iea_fmovm_data_pi_trace:
2787 mov.w EXC_SR(%a6),(EXC_SR-0x4,%a6,%d0)
2788 mov.l EXC_EXTWPTR(%a6),(EXC_PC-0x4,%a6,%d0)
2789 mov.w &0x2024,(EXC_VOFF-0x4,%a6,%d0)
2790 mov.l EXC_PC(%a6),(EXC_VOFF+0x2-0x4,%a6,%d0)
2791
2792 lea (EXC_SR-0x4,%a6,%d0),%a0
2793 mov.l %a0,EXC_SR(%a6)
2794
2795 fmovm.x EXC_FP0(%a6),&0xc0
2796 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2797 movm.l EXC_DREGS(%a6),&0x0303
2798
2799 unlk %a6
2800 mov.l (%sp)+,%sp
2801 bra.l _real_trace
2802
2803
2804iea_fmovm_data_predec:
2805 mov.b %d1,EXC_VOFF(%a6)
2806 mov.b %d0,0x1+EXC_VOFF(%a6)
2807
2808 fmovm.x EXC_FP0(%a6),&0xc0
2809 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2810 movm.l EXC_DREGS(%a6),&0x0303
2811
2812 mov.l (%a6),-(%sp)
2813 mov.l %d0,-(%sp)
2814 mov.l %d1,-(%sp)
2815 mov.l EXC_EXTWPTR(%a6),-(%sp)
2816
2817 clr.l %d0
2818 mov.b 0x1+EXC_VOFF(%a6),%d0
2819 neg.l %d0
2820
2821 btst &0x7,EXC_SR(%a6)
2822 beq.b iea_fmovm_data_p2
2823
2824 mov.w EXC_SR(%a6),(EXC_SR-0x4,%a6,%d0)
2825 mov.l EXC_PC(%a6),(EXC_VOFF-0x2,%a6,%d0)
2826 mov.l (%sp)+,(EXC_PC-0x4,%a6,%d0)
2827 mov.w &0x2024,(EXC_VOFF-0x4,%a6,%d0)
2828
2829 pea (%a6,%d0)
2830 bra.b iea_fmovm_data_p3
2831
2832iea_fmovm_data_p2:
2833 mov.w EXC_SR(%a6),(EXC_SR,%a6,%d0)
2834 mov.l (%sp)+,(EXC_PC,%a6,%d0)
2835 mov.w &0x00f0,(EXC_VOFF,%a6,%d0)
2836
2837 pea (0x4,%a6,%d0)
2838
2839iea_fmovm_data_p3:
2840 clr.l %d1
2841 mov.b EXC_VOFF(%a6),%d1
2842
2843 tst.b %d1
2844 bpl.b fm_1
2845 fmovm.x &0x80,(0x4+0x8,%a6,%d0)
2846 addi.l &0xc,%d0
2847fm_1:
2848 lsl.b &0x1,%d1
2849 bpl.b fm_2
2850 fmovm.x &0x40,(0x4+0x8,%a6,%d0)
2851 addi.l &0xc,%d0
2852fm_2:
2853 lsl.b &0x1,%d1
2854 bpl.b fm_3
2855 fmovm.x &0x20,(0x4+0x8,%a6,%d0)
2856 addi.l &0xc,%d0
2857fm_3:
2858 lsl.b &0x1,%d1
2859 bpl.b fm_4
2860 fmovm.x &0x10,(0x4+0x8,%a6,%d0)
2861 addi.l &0xc,%d0
2862fm_4:
2863 lsl.b &0x1,%d1
2864 bpl.b fm_5
2865 fmovm.x &0x08,(0x4+0x8,%a6,%d0)
2866 addi.l &0xc,%d0
2867fm_5:
2868 lsl.b &0x1,%d1
2869 bpl.b fm_6
2870 fmovm.x &0x04,(0x4+0x8,%a6,%d0)
2871 addi.l &0xc,%d0
2872fm_6:
2873 lsl.b &0x1,%d1
2874 bpl.b fm_7
2875 fmovm.x &0x02,(0x4+0x8,%a6,%d0)
2876 addi.l &0xc,%d0
2877fm_7:
2878 lsl.b &0x1,%d1
2879 bpl.b fm_end
2880 fmovm.x &0x01,(0x4+0x8,%a6,%d0)
2881fm_end:
2882 mov.l 0x4(%sp),%d1
2883 mov.l 0x8(%sp),%d0
2884 mov.l 0xc(%sp),%a6
2885 mov.l (%sp)+,%sp
2886
2887 btst &0x7,(%sp)
2888 beq.l _fpsp_done
2889 bra.l _real_trace
2890
2891
2892iea_fmovm_ctrl:
2893
2894 bsr.l fmovm_ctrl
2895
2896iea_fmovm_exit:
2897 fmovm.x EXC_FPREGS(%a6),&0xc0
2898 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
2899 movm.l EXC_DREGS(%a6),&0x0303
2900
2901 btst &0x7,EXC_SR(%a6)
2902 bne.b iea_fmovm_trace
2903
2904 mov.l EXC_EXTWPTR(%a6),EXC_PC(%a6)
2905
2906 unlk %a6
2907
2908 bra.l _fpsp_done
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932iea_fmovm_trace:
2933 mov.l (%a6),%a6
2934 mov.w EXC_SR+LOCAL_SIZE(%sp),0x0+LOCAL_SIZE(%sp)
2935 mov.l EXC_PC+LOCAL_SIZE(%sp),0x8+LOCAL_SIZE(%sp)
2936 mov.l EXC_EXTWPTR+LOCAL_SIZE(%sp),0x2+LOCAL_SIZE(%sp)
2937 mov.w &0x2024,0x6+LOCAL_SIZE(%sp)
2938 add.l &LOCAL_SIZE,%sp
2939
2940 bra.l _real_trace
2941
2942
2943
2944
2945
2946
2947
2948
2949iea_disabled:
2950 mov.l (%sp)+,%d0
2951
2952 link %a6,&-LOCAL_SIZE
2953
2954 movm.l &0x0303,EXC_DREGS(%a6)
2955
2956
2957 mov.l EXC_PC(%a6),EXC_EXTWPTR(%a6)
2958 mov.l EXC_EXTWPTR(%a6),%a0
2959 addq.l &0x4,EXC_EXTWPTR(%a6)
2960 bsr.l _imem_read_long
2961 mov.l %d0,EXC_OPWORD(%a6)
2962
2963 tst.w %d0
2964 bmi.b iea_dis_fmovm
2965
2966
2967iea_dis_immed:
2968 mov.l &0x10,%d0
2969 bra.b iea_dis_cont
2970iea_dis_fmovm:
2971 btst &0xe,%d0
2972 bne.b iea_dis_fmovm_data
2973
2974 bfextu %d0{&19:&3},%d1
2975 mov.l &0xc,%d0
2976 cmpi.b %d1,&0x7
2977 bne.b iea_dis_cont
2978 addq.l &0x4,%d0
2979 bra.b iea_dis_cont
2980
2981
2982
2983
2984iea_dis_fmovm_data:
2985 clr.l %d0
2986 bsr.l fmovm_calc_ea
2987 mov.l EXC_EXTWPTR(%a6),%d0
2988 sub.l EXC_PC(%a6),%d0
2989iea_dis_cont:
2990 mov.w %d0,EXC_VOFF(%a6)
2991
2992 movm.l EXC_DREGS(%a6),&0x0303
2993
2994 unlk %a6
2995
2996
2997
2998
2999 subq.l &0x8,%sp
3000 mov.l %d0,-(%sp)
3001 mov.w 0xc(%sp),0x4(%sp)
3002 mov.l 0xe(%sp),0x6(%sp)
3003 clr.l %d0
3004 mov.w 0x12(%sp),%d0
3005 mov.l 0x6(%sp),0x10(%sp)
3006 add.l %d0,0x6(%sp)
3007 mov.w &0x402c,0xa(%sp)
3008 mov.l (%sp)+,%d0
3009
3010 bra.l _real_fpu_disabled
3011
3012
3013
3014iea_iacc:
3015 movc %pcr,%d0
3016 btst &0x1,%d0
3017 bne.b iea_iacc_cont
3018 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
3019 fmovm.x EXC_FPREGS(%a6),&0xc0
3020iea_iacc_cont:
3021 movm.l EXC_DREGS(%a6),&0x0303
3022
3023 unlk %a6
3024
3025 subq.w &0x8,%sp
3026 mov.l 0x8(%sp),(%sp)
3027 mov.w 0xc(%sp),0x4(%sp)
3028 mov.w &0x4008,0x6(%sp)
3029 mov.l 0x2(%sp),0x8(%sp)
3030 mov.l &0x09428001,0xc(%sp)
3031
3032iea_acc_done:
3033 btst &0x5,(%sp)
3034 beq.b iea_acc_done2
3035 bset &0x2,0xd(%sp)
3036
3037iea_acc_done2:
3038 bra.l _real_access
3039
3040iea_dacc:
3041 lea -LOCAL_SIZE(%a6),%sp
3042
3043 movc %pcr,%d1
3044 btst &0x1,%d1
3045 bne.b iea_dacc_cont
3046 fmovm.x EXC_FPREGS(%a6),&0xc0
3047 fmovm.l LOCAL_SIZE+USER_FPCR(%sp),%fpcr,%fpsr,%fpiar
3048iea_dacc_cont:
3049 mov.l (%a6),%a6
3050
3051 mov.l 0x4+LOCAL_SIZE(%sp),-0x8+0x4+LOCAL_SIZE(%sp)
3052 mov.w 0x8+LOCAL_SIZE(%sp),-0x8+0x8+LOCAL_SIZE(%sp)
3053 mov.w &0x4008,-0x8+0xa+LOCAL_SIZE(%sp)
3054 mov.l %a0,-0x8+0xc+LOCAL_SIZE(%sp)
3055 mov.w %d0,-0x8+0x10+LOCAL_SIZE(%sp)
3056 mov.w &0x0001,-0x8+0x12+LOCAL_SIZE(%sp)
3057
3058 movm.l LOCAL_SIZE+EXC_DREGS(%sp),&0x0303
3059 add.w &LOCAL_SIZE-0x4,%sp
3060
3061 bra.b iea_acc_done
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105 global _fpsp_operr
3106_fpsp_operr:
3107
3108 link.w %a6,&-LOCAL_SIZE
3109
3110 fsave FP_SRC(%a6)
3111
3112 movm.l &0x0303,EXC_DREGS(%a6)
3113 fmovm.l %fpcr,%fpsr,%fpiar,USER_FPCR(%a6)
3114 fmovm.x &0xc0,EXC_FPREGS(%a6)
3115
3116
3117 mov.l USER_FPIAR(%a6),EXC_EXTWPTR(%a6)
3118
3119 mov.l EXC_EXTWPTR(%a6),%a0
3120 addq.l &0x4,EXC_EXTWPTR(%a6)
3121 bsr.l _imem_read_long
3122 mov.l %d0,EXC_OPWORD(%a6)
3123
3124
3125
3126 btst &13,%d0
3127 bne.b foperr_out
3128
3129
3130
3131
3132
3133
3134 lea FP_SRC(%a6),%a0
3135 bsr.l fix_skewed_ops
3136
3137foperr_exit:
3138 fmovm.x EXC_FPREGS(%a6),&0xc0
3139 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
3140 movm.l EXC_DREGS(%a6),&0x0303
3141
3142 frestore FP_SRC(%a6)
3143
3144 unlk %a6
3145 bra.l _real_operr
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164foperr_out:
3165
3166 mov.w FP_SRC_EX(%a6),%d1
3167 andi.w &0x7fff,%d1
3168 cmpi.w %d1,&0x7fff
3169 bne.b foperr_out_not_qnan
3170
3171 tst.l FP_SRC_LO(%a6)
3172 bne.b foperr_out_qnan
3173 mov.l FP_SRC_HI(%a6),%d1
3174 andi.l &0x7fffffff,%d1
3175 beq.b foperr_out_not_qnan
3176foperr_out_qnan:
3177 mov.l FP_SRC_HI(%a6),L_SCR1(%a6)
3178 bra.b foperr_out_jmp
3179
3180foperr_out_not_qnan:
3181 mov.l &0x7fffffff,%d1
3182 tst.b FP_SRC_EX(%a6)
3183 bpl.b foperr_out_not_qnan2
3184 addq.l &0x1,%d1
3185foperr_out_not_qnan2:
3186 mov.l %d1,L_SCR1(%a6)
3187
3188foperr_out_jmp:
3189 bfextu %d0{&19:&3},%d0
3190 mov.b 1+EXC_OPWORD(%a6),%d1
3191 mov.w (tbl_operr.b,%pc,%d0.w*2),%a0
3192 jmp (tbl_operr.b,%pc,%a0)
3193
3194tbl_operr:
3195 short foperr_out_l - tbl_operr
3196 short tbl_operr - tbl_operr
3197 short tbl_operr - tbl_operr
3198 short foperr_exit - tbl_operr
3199 short foperr_out_w - tbl_operr
3200 short tbl_operr - tbl_operr
3201 short foperr_out_b - tbl_operr
3202 short tbl_operr - tbl_operr
3203
3204foperr_out_b:
3205 mov.b L_SCR1(%a6),%d0
3206 cmpi.b %d1,&0x7
3207 ble.b foperr_out_b_save_dn
3208 mov.l EXC_EA(%a6),%a0
3209 bsr.l _dmem_write_byte
3210
3211 tst.l %d1
3212 bne.l facc_out_b
3213
3214 bra.w foperr_exit
3215foperr_out_b_save_dn:
3216 andi.w &0x0007,%d1
3217 bsr.l store_dreg_b
3218 bra.w foperr_exit
3219
3220foperr_out_w:
3221 mov.w L_SCR1(%a6),%d0
3222 cmpi.b %d1,&0x7
3223 ble.b foperr_out_w_save_dn
3224 mov.l EXC_EA(%a6),%a0
3225 bsr.l _dmem_write_word
3226
3227 tst.l %d1
3228 bne.l facc_out_w
3229
3230 bra.w foperr_exit
3231foperr_out_w_save_dn:
3232 andi.w &0x0007,%d1
3233 bsr.l store_dreg_w
3234 bra.w foperr_exit
3235
3236foperr_out_l:
3237 mov.l L_SCR1(%a6),%d0
3238 cmpi.b %d1,&0x7
3239 ble.b foperr_out_l_save_dn
3240 mov.l EXC_EA(%a6),%a0
3241 bsr.l _dmem_write_long
3242
3243 tst.l %d1
3244 bne.l facc_out_l
3245
3246 bra.w foperr_exit
3247foperr_out_l_save_dn:
3248 andi.w &0x0007,%d1
3249 bsr.l store_dreg_l
3250 bra.w foperr_exit
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301 global _fpsp_snan
3302_fpsp_snan:
3303
3304 link.w %a6,&-LOCAL_SIZE
3305
3306 fsave FP_SRC(%a6)
3307
3308 movm.l &0x0303,EXC_DREGS(%a6)
3309 fmovm.l %fpcr,%fpsr,%fpiar,USER_FPCR(%a6)
3310 fmovm.x &0xc0,EXC_FPREGS(%a6)
3311
3312
3313 mov.l USER_FPIAR(%a6),EXC_EXTWPTR(%a6)
3314
3315 mov.l EXC_EXTWPTR(%a6),%a0
3316 addq.l &0x4,EXC_EXTWPTR(%a6)
3317 bsr.l _imem_read_long
3318 mov.l %d0,EXC_OPWORD(%a6)
3319
3320
3321
3322 btst &13,%d0
3323 bne.w fsnan_out
3324
3325
3326
3327
3328
3329
3330 lea FP_SRC(%a6),%a0
3331 bsr.l fix_skewed_ops
3332
3333fsnan_exit:
3334 fmovm.x EXC_FPREGS(%a6),&0xc0
3335 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
3336 movm.l EXC_DREGS(%a6),&0x0303
3337
3338 frestore FP_SRC(%a6)
3339
3340 unlk %a6
3341 bra.l _real_snan
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357fsnan_out:
3358
3359 bfextu %d0{&19:&3},%d0
3360 mov.b 1+EXC_OPWORD(%a6),%d1
3361 mov.w (tbl_snan.b,%pc,%d0.w*2),%a0
3362 jmp (tbl_snan.b,%pc,%a0)
3363
3364tbl_snan:
3365 short fsnan_out_l - tbl_snan
3366 short fsnan_out_s - tbl_snan
3367 short fsnan_out_x - tbl_snan
3368 short tbl_snan - tbl_snan
3369 short fsnan_out_w - tbl_snan
3370 short fsnan_out_d - tbl_snan
3371 short fsnan_out_b - tbl_snan
3372 short tbl_snan - tbl_snan
3373
3374fsnan_out_b:
3375 mov.b FP_SRC_HI(%a6),%d0
3376 bset &6,%d0
3377 cmpi.b %d1,&0x7
3378 ble.b fsnan_out_b_dn
3379 mov.l EXC_EA(%a6),%a0
3380 bsr.l _dmem_write_byte
3381
3382 tst.l %d1
3383 bne.l facc_out_b
3384
3385 bra.w fsnan_exit
3386fsnan_out_b_dn:
3387 andi.w &0x0007,%d1
3388 bsr.l store_dreg_b
3389 bra.w fsnan_exit
3390
3391fsnan_out_w:
3392 mov.w FP_SRC_HI(%a6),%d0
3393 bset &14,%d0
3394 cmpi.b %d1,&0x7
3395 ble.b fsnan_out_w_dn
3396 mov.l EXC_EA(%a6),%a0
3397 bsr.l _dmem_write_word
3398
3399 tst.l %d1
3400 bne.l facc_out_w
3401
3402 bra.w fsnan_exit
3403fsnan_out_w_dn:
3404 andi.w &0x0007,%d1
3405 bsr.l store_dreg_w
3406 bra.w fsnan_exit
3407
3408fsnan_out_l:
3409 mov.l FP_SRC_HI(%a6),%d0
3410 bset &30,%d0
3411 cmpi.b %d1,&0x7
3412 ble.b fsnan_out_l_dn
3413 mov.l EXC_EA(%a6),%a0
3414 bsr.l _dmem_write_long
3415
3416 tst.l %d1
3417 bne.l facc_out_l
3418
3419 bra.w fsnan_exit
3420fsnan_out_l_dn:
3421 andi.w &0x0007,%d1
3422 bsr.l store_dreg_l
3423 bra.w fsnan_exit
3424
3425fsnan_out_s:
3426 cmpi.b %d1,&0x7
3427 ble.b fsnan_out_d_dn
3428 mov.l FP_SRC_EX(%a6),%d0
3429 andi.l &0x80000000,%d0
3430 ori.l &0x7fc00000,%d0
3431 mov.l FP_SRC_HI(%a6),%d1
3432 lsr.l &0x8,%d1
3433 or.l %d1,%d0
3434 mov.l EXC_EA(%a6),%a0
3435 bsr.l _dmem_write_long
3436
3437 tst.l %d1
3438 bne.l facc_out_l
3439
3440 bra.w fsnan_exit
3441fsnan_out_d_dn:
3442 mov.l FP_SRC_EX(%a6),%d0
3443 andi.l &0x80000000,%d0
3444 ori.l &0x7fc00000,%d0
3445 mov.l %d1,-(%sp)
3446 mov.l FP_SRC_HI(%a6),%d1
3447 lsr.l &0x8,%d1
3448 or.l %d1,%d0
3449 mov.l (%sp)+,%d1
3450 andi.w &0x0007,%d1
3451 bsr.l store_dreg_l
3452 bra.w fsnan_exit
3453
3454fsnan_out_d:
3455 mov.l FP_SRC_EX(%a6),%d0
3456 andi.l &0x80000000,%d0
3457 ori.l &0x7ff80000,%d0
3458 mov.l FP_SRC_HI(%a6),%d1
3459 mov.l %d0,FP_SCR0_EX(%a6)
3460 mov.l &11,%d0
3461 lsr.l %d0,%d1
3462 or.l %d1,FP_SCR0_EX(%a6)
3463 mov.l FP_SRC_HI(%a6),%d1
3464 andi.l &0x000007ff,%d1
3465 ror.l %d0,%d1
3466 mov.l %d1,FP_SCR0_HI(%a6)
3467 mov.l FP_SRC_LO(%a6),%d1
3468 lsr.l %d0,%d1
3469 or.l %d1,FP_SCR0_HI(%a6)
3470 lea FP_SCR0(%a6),%a0
3471 mov.l EXC_EA(%a6),%a1
3472 movq.l &0x8,%d0
3473 bsr.l _dmem_write
3474
3475 tst.l %d1
3476 bne.l facc_out_d
3477
3478 bra.w fsnan_exit
3479
3480
3481
3482
3483fsnan_out_x:
3484 clr.b SPCOND_FLG(%a6)
3485
3486 mov.w FP_SRC_EX(%a6),FP_SCR0_EX(%a6)
3487 clr.w 2+FP_SCR0(%a6)
3488 mov.l FP_SRC_HI(%a6),%d0
3489 bset &30,%d0
3490 mov.l %d0,FP_SCR0_HI(%a6)
3491 mov.l FP_SRC_LO(%a6),FP_SCR0_LO(%a6)
3492
3493 btst &0x5,EXC_SR(%a6)
3494 bne.b fsnan_out_x_s
3495
3496 mov.l %usp,%a0
3497 mov.l %a0,EXC_A7(%a6)
3498 mov.l (%a6),EXC_A6(%a6)
3499
3500 bsr.l _calc_ea_fout
3501 mov.l %a0,%a1
3502 mov.l %a0,EXC_EA(%a6)
3503
3504 mov.l EXC_A7(%a6),%a0
3505 mov.l %a0,%usp
3506 mov.l EXC_A6(%a6),(%a6)
3507
3508fsnan_out_x_save:
3509 lea FP_SCR0(%a6),%a0
3510 movq.l &0xc,%d0
3511 bsr.l _dmem_write
3512
3513 tst.l %d1
3514 bne.l facc_out_x
3515
3516 bra.w fsnan_exit
3517
3518fsnan_out_x_s:
3519 mov.l (%a6),EXC_A6(%a6)
3520
3521 bsr.l _calc_ea_fout
3522 mov.l %a0,%a1
3523 mov.l %a0,EXC_EA(%a6)
3524
3525 mov.l EXC_A6(%a6),(%a6)
3526
3527 cmpi.b SPCOND_FLG(%a6),&mda7_flg
3528 bne.b fsnan_out_x_save
3529
3530
3531 fmovm.x EXC_FPREGS(%a6),&0xc0
3532 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
3533 movm.l EXC_DREGS(%a6),&0x0303
3534
3535 frestore FP_SRC(%a6)
3536
3537 mov.l EXC_A6(%a6),%a6
3538
3539 mov.l LOCAL_SIZE+EXC_SR(%sp),LOCAL_SIZE+EXC_SR-0xc(%sp)
3540 mov.l LOCAL_SIZE+EXC_PC+0x2(%sp),LOCAL_SIZE+EXC_PC+0x2-0xc(%sp)
3541 mov.l LOCAL_SIZE+EXC_EA(%sp),LOCAL_SIZE+EXC_EA-0xc(%sp)
3542
3543 mov.l LOCAL_SIZE+FP_SCR0_EX(%sp),LOCAL_SIZE+EXC_SR(%sp)
3544 mov.l LOCAL_SIZE+FP_SCR0_HI(%sp),LOCAL_SIZE+EXC_PC+0x2(%sp)
3545 mov.l LOCAL_SIZE+FP_SCR0_LO(%sp),LOCAL_SIZE+EXC_EA(%sp)
3546
3547 add.l &LOCAL_SIZE-0x8,%sp
3548
3549 bra.l _real_snan
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593 global _fpsp_inex
3594_fpsp_inex:
3595
3596 link.w %a6,&-LOCAL_SIZE
3597
3598 fsave FP_SRC(%a6)
3599
3600 movm.l &0x0303,EXC_DREGS(%a6)
3601 fmovm.l %fpcr,%fpsr,%fpiar,USER_FPCR(%a6)
3602 fmovm.x &0xc0,EXC_FPREGS(%a6)
3603
3604
3605 mov.l USER_FPIAR(%a6),EXC_EXTWPTR(%a6)
3606
3607 mov.l EXC_EXTWPTR(%a6),%a0
3608 addq.l &0x4,EXC_EXTWPTR(%a6)
3609 bsr.l _imem_read_long
3610 mov.l %d0,EXC_OPWORD(%a6)
3611
3612
3613
3614 btst &13,%d0
3615 bne.w finex_out
3616
3617
3618
3619
3620
3621 bfextu %d0{&19:&3},%d0
3622 bne.b finex_cont
3623 cmpi.w FP_SRC_EX(%a6),&0x401e
3624 bne.b finex_cont
3625 fmov.l &0x0,%fpcr
3626 fmov.l FP_SRC_HI(%a6),%fp0
3627 fmov.x %fp0,FP_SRC(%a6)
3628 mov.w &0xe001,0x2+FP_SRC(%a6)
3629
3630finex_cont:
3631 lea FP_SRC(%a6),%a0
3632 bsr.l fix_skewed_ops
3633
3634
3635
3636
3637
3638
3639 andi.l &0x00ff01ff,USER_FPSR(%a6)
3640
3641 fmov.l &0x0,%fpcr
3642 fmov.l &0x0,%fpsr
3643
3644 bfextu EXC_EXTWORD(%a6){&0:&6},%d1
3645 cmpi.b %d1,&0x17
3646 beq.w finex_fmovcr
3647
3648 lea FP_SRC(%a6),%a0
3649 bsr.l set_tag_x
3650 mov.b %d0,STAG(%a6)
3651
3652
3653
3654
3655 btst &0x5,1+EXC_CMDREG(%a6)
3656 beq.b finex_extract
3657
3658 btst &0x4,1+EXC_CMDREG(%a6)
3659 bne.b finex_extract
3660
3661 bfextu EXC_CMDREG(%a6){&6:&3},%d0
3662 bsr.l load_fpn2
3663
3664 lea FP_DST(%a6),%a0
3665 bsr.l set_tag_x
3666 cmpi.b %d0,&UNNORM
3667 bne.b finex_op2_done
3668 bsr.l unnorm_fix
3669finex_op2_done:
3670 mov.b %d0,DTAG(%a6)
3671
3672finex_extract:
3673 clr.l %d0
3674 mov.b FPCR_MODE(%a6),%d0
3675
3676 mov.b 1+EXC_CMDREG(%a6),%d1
3677 andi.w &0x007f,%d1
3678
3679 lea FP_SRC(%a6),%a0
3680 lea FP_DST(%a6),%a1
3681
3682 mov.l (tbl_unsupp.l,%pc,%d1.w*4),%d1
3683 jsr (tbl_unsupp.l,%pc,%d1.l*1)
3684
3685
3686finex_save:
3687 bfextu EXC_CMDREG(%a6){&6:&3},%d0
3688 bsr.l store_fpreg
3689
3690finex_exit:
3691 fmovm.x EXC_FPREGS(%a6),&0xc0
3692 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
3693 movm.l EXC_DREGS(%a6),&0x0303
3694
3695 frestore FP_SRC(%a6)
3696
3697 unlk %a6
3698 bra.l _real_inex
3699
3700finex_fmovcr:
3701 clr.l %d0
3702 mov.b FPCR_MODE(%a6),%d0
3703 mov.b 1+EXC_CMDREG(%a6),%d1
3704 andi.l &0x0000007f,%d1
3705 bsr.l smovcr
3706 bra.b finex_save
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722finex_out:
3723
3724 mov.b &NORM,STAG(%a6)
3725
3726 clr.l %d0
3727 mov.b FPCR_MODE(%a6),%d0
3728
3729 andi.l &0xffff00ff,USER_FPSR(%a6)
3730
3731 lea FP_SRC(%a6),%a0
3732
3733 bsr.l fout
3734
3735 bra.b finex_exit
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767 global _fpsp_dz
3768_fpsp_dz:
3769
3770 link.w %a6,&-LOCAL_SIZE
3771
3772 fsave FP_SRC(%a6)
3773
3774 movm.l &0x0303,EXC_DREGS(%a6)
3775 fmovm.l %fpcr,%fpsr,%fpiar,USER_FPCR(%a6)
3776 fmovm.x &0xc0,EXC_FPREGS(%a6)
3777
3778
3779 mov.l USER_FPIAR(%a6),EXC_EXTWPTR(%a6)
3780
3781 mov.l EXC_EXTWPTR(%a6),%a0
3782 addq.l &0x4,EXC_EXTWPTR(%a6)
3783 bsr.l _imem_read_long
3784 mov.l %d0,EXC_OPWORD(%a6)
3785
3786
3787
3788
3789
3790
3791
3792 lea FP_SRC(%a6),%a0
3793 bsr.l fix_skewed_ops
3794
3795fdz_exit:
3796 fmovm.x EXC_FPREGS(%a6),&0xc0
3797 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr,%fpiar
3798 movm.l EXC_DREGS(%a6),&0x0303
3799
3800 frestore FP_SRC(%a6)
3801
3802 unlk %a6
3803 bra.l _real_dz
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836 global _fpsp_fline
3837_fpsp_fline:
3838
3839
3840
3841 cmpi.w 0x6(%sp),&0x402c
3842 beq.l _real_fpu_disabled
3843
3844 bra.l _real_fline
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875 global _dcalc_ea
3876_dcalc_ea:
3877 mov.l %d0, %a0
3878
3879 mov.b 1+EXC_OPWORD(%a6), %d0
3880 mov.l %d0, %d1
3881
3882 andi.w &0x38, %d0
3883 andi.l &0x7, %d1
3884
3885 cmpi.b %d0,&0x18
3886 beq.b dcea_pi
3887
3888 cmpi.b %d0,&0x20
3889 beq.b dcea_pd
3890
3891 or.w %d1,%d0
3892 cmpi.b %d0,&0x3c
3893
3894 beq.b dcea_imm
3895
3896 mov.l EXC_EA(%a6),%a0
3897 rts
3898
3899
3900
3901dcea_imm:
3902 mov.b &immed_flg,SPCOND_FLG(%a6)
3903 lea ([USER_FPIAR,%a6],0x4),%a0
3904 rts
3905
3906
3907
3908dcea_pi:
3909 mov.l %a0,%d0
3910 bsr.l inc_areg
3911
3912 mov.l EXC_EA(%a6),%a0
3913 rts
3914
3915
3916
3917
3918
3919dcea_pd:
3920 mov.l %a0,%d0
3921 bsr.l dec_areg
3922
3923 mov.l EXC_EA(%a6),%a0
3924
3925 cmpi.b %d0,&0xc
3926 beq.b dcea_pd2
3927 rts
3928dcea_pd2:
3929 sub.l &0x8,%a0
3930 mov.l %a0,EXC_EA(%a6)
3931 rts
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960 global _calc_ea_fout
3961_calc_ea_fout:
3962 mov.b 1+EXC_OPWORD(%a6),%d0
3963 mov.l %d0,%d1
3964
3965 andi.w &0x38,%d0
3966 andi.l &0x7,%d1
3967
3968 cmpi.b %d0,&0x18
3969 beq.b ceaf_pi
3970
3971 cmpi.b %d0,&0x20
3972 beq.w ceaf_pd
3973
3974 mov.l EXC_EA(%a6),%a0
3975 rts
3976
3977
3978
3979
3980ceaf_pi:
3981 mov.w (tbl_ceaf_pi.b,%pc,%d1.w*2),%d1
3982 mov.l EXC_EA(%a6),%a0
3983 jmp (tbl_ceaf_pi.b,%pc,%d1.w*1)
3984
3985 swbeg &0x8
3986tbl_ceaf_pi:
3987 short ceaf_pi0 - tbl_ceaf_pi
3988 short ceaf_pi1 - tbl_ceaf_pi
3989 short ceaf_pi2 - tbl_ceaf_pi
3990 short ceaf_pi3 - tbl_ceaf_pi
3991 short ceaf_pi4 - tbl_ceaf_pi
3992 short ceaf_pi5 - tbl_ceaf_pi
3993 short ceaf_pi6 - tbl_ceaf_pi
3994 short ceaf_pi7 - tbl_ceaf_pi
3995
3996ceaf_pi0:
3997 addi.l &0xc,EXC_DREGS+0x8(%a6)
3998 rts
3999ceaf_pi1:
4000 addi.l &0xc,EXC_DREGS+0xc(%a6)
4001 rts
4002ceaf_pi2:
4003 add.l &0xc,%a2
4004 rts
4005ceaf_pi3:
4006 add.l &0xc,%a3
4007 rts
4008ceaf_pi4:
4009 add.l &0xc,%a4
4010 rts
4011ceaf_pi5:
4012 add.l &0xc,%a5
4013 rts
4014ceaf_pi6:
4015 addi.l &0xc,EXC_A6(%a6)
4016 rts
4017ceaf_pi7:
4018 mov.b &mia7_flg,SPCOND_FLG(%a6)
4019 addi.l &0xc,EXC_A7(%a6)
4020 rts
4021
4022
4023
4024
4025ceaf_pd:
4026 mov.w (tbl_ceaf_pd.b,%pc,%d1.w*2),%d1
4027 mov.l EXC_EA(%a6),%a0
4028 sub.l &0x8,%a0
4029 sub.l &0x8,EXC_EA(%a6)
4030 jmp (tbl_ceaf_pd.b,%pc,%d1.w*1)
4031
4032 swbeg &0x8
4033tbl_ceaf_pd:
4034 short ceaf_pd0 - tbl_ceaf_pd
4035 short ceaf_pd1 - tbl_ceaf_pd
4036 short ceaf_pd2 - tbl_ceaf_pd
4037 short ceaf_pd3 - tbl_ceaf_pd
4038 short ceaf_pd4 - tbl_ceaf_pd
4039 short ceaf_pd5 - tbl_ceaf_pd
4040 short ceaf_pd6 - tbl_ceaf_pd
4041 short ceaf_pd7 - tbl_ceaf_pd
4042
4043ceaf_pd0:
4044 mov.l %a0,EXC_DREGS+0x8(%a6)
4045 rts
4046ceaf_pd1:
4047 mov.l %a0,EXC_DREGS+0xc(%a6)
4048 rts
4049ceaf_pd2:
4050 mov.l %a0,%a2
4051 rts
4052ceaf_pd3:
4053 mov.l %a0,%a3
4054 rts
4055ceaf_pd4:
4056 mov.l %a0,%a4
4057 rts
4058ceaf_pd5:
4059 mov.l %a0,%a5
4060 rts
4061ceaf_pd6:
4062 mov.l %a0,EXC_A6(%a6)
4063 rts
4064ceaf_pd7:
4065 mov.l %a0,EXC_A7(%a6)
4066 mov.b &mda7_flg,SPCOND_FLG(%a6)
4067 rts
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078 swbeg &109
4079tbl_unsupp:
4080 long fin - tbl_unsupp
4081 long fint - tbl_unsupp
4082 long tbl_unsupp - tbl_unsupp
4083 long fintrz - tbl_unsupp
4084 long fsqrt - tbl_unsupp
4085 long tbl_unsupp - tbl_unsupp
4086 long tbl_unsupp - tbl_unsupp
4087 long tbl_unsupp - tbl_unsupp
4088 long tbl_unsupp - tbl_unsupp
4089 long tbl_unsupp - tbl_unsupp
4090 long tbl_unsupp - tbl_unsupp
4091 long tbl_unsupp - tbl_unsupp
4092 long tbl_unsupp - tbl_unsupp
4093 long tbl_unsupp - tbl_unsupp
4094 long tbl_unsupp - tbl_unsupp
4095 long tbl_unsupp - tbl_unsupp
4096 long tbl_unsupp - tbl_unsupp
4097 long tbl_unsupp - tbl_unsupp
4098 long tbl_unsupp - tbl_unsupp
4099 long tbl_unsupp - tbl_unsupp
4100 long tbl_unsupp - tbl_unsupp
4101 long tbl_unsupp - tbl_unsupp
4102 long tbl_unsupp - tbl_unsupp
4103 long tbl_unsupp - tbl_unsupp
4104 long fabs - tbl_unsupp
4105 long tbl_unsupp - tbl_unsupp
4106 long fneg - tbl_unsupp
4107 long tbl_unsupp - tbl_unsupp
4108 long tbl_unsupp - tbl_unsupp
4109 long tbl_unsupp - tbl_unsupp
4110 long tbl_unsupp - tbl_unsupp
4111 long tbl_unsupp - tbl_unsupp
4112 long fdiv - tbl_unsupp
4113 long tbl_unsupp - tbl_unsupp
4114 long fadd - tbl_unsupp
4115 long fmul - tbl_unsupp
4116 long fsgldiv - tbl_unsupp
4117 long tbl_unsupp - tbl_unsupp
4118 long tbl_unsupp - tbl_unsupp
4119 long fsglmul - tbl_unsupp
4120 long fsub - tbl_unsupp
4121 long tbl_unsupp - tbl_unsupp
4122 long tbl_unsupp - tbl_unsupp
4123 long tbl_unsupp - tbl_unsupp
4124 long tbl_unsupp - tbl_unsupp
4125 long tbl_unsupp - tbl_unsupp
4126 long tbl_unsupp - tbl_unsupp
4127 long tbl_unsupp - tbl_unsupp
4128 long tbl_unsupp - tbl_unsupp
4129 long tbl_unsupp - tbl_unsupp
4130 long tbl_unsupp - tbl_unsupp
4131 long tbl_unsupp - tbl_unsupp
4132 long tbl_unsupp - tbl_unsupp
4133 long tbl_unsupp - tbl_unsupp
4134 long tbl_unsupp - tbl_unsupp
4135 long tbl_unsupp - tbl_unsupp
4136 long fcmp - tbl_unsupp
4137 long tbl_unsupp - tbl_unsupp
4138 long ftst - tbl_unsupp
4139 long tbl_unsupp - tbl_unsupp
4140 long tbl_unsupp - tbl_unsupp
4141 long tbl_unsupp - tbl_unsupp
4142 long tbl_unsupp - tbl_unsupp
4143 long tbl_unsupp - tbl_unsupp
4144 long fsin - tbl_unsupp
4145 long fssqrt - tbl_unsupp
4146 long tbl_unsupp - tbl_unsupp
4147 long tbl_unsupp - tbl_unsupp
4148 long fdin - tbl_unsupp
4149 long fdsqrt - tbl_unsupp
4150 long tbl_unsupp - tbl_unsupp
4151 long tbl_unsupp - tbl_unsupp
4152 long tbl_unsupp - tbl_unsupp
4153 long tbl_unsupp - tbl_unsupp
4154 long tbl_unsupp - tbl_unsupp
4155 long tbl_unsupp - tbl_unsupp
4156 long tbl_unsupp - tbl_unsupp
4157 long tbl_unsupp - tbl_unsupp
4158 long tbl_unsupp - tbl_unsupp
4159 long tbl_unsupp - tbl_unsupp
4160 long tbl_unsupp - tbl_unsupp
4161 long tbl_unsupp - tbl_unsupp
4162 long tbl_unsupp - tbl_unsupp
4163 long tbl_unsupp - tbl_unsupp
4164 long tbl_unsupp - tbl_unsupp
4165 long tbl_unsupp - tbl_unsupp
4166 long tbl_unsupp - tbl_unsupp
4167 long tbl_unsupp - tbl_unsupp
4168 long fsabs - tbl_unsupp
4169 long tbl_unsupp - tbl_unsupp
4170 long fsneg - tbl_unsupp
4171 long tbl_unsupp - tbl_unsupp
4172 long fdabs - tbl_unsupp
4173 long tbl_unsupp - tbl_unsupp
4174 long fdneg - tbl_unsupp
4175 long tbl_unsupp - tbl_unsupp
4176 long fsdiv - tbl_unsupp
4177 long tbl_unsupp - tbl_unsupp
4178 long fsadd - tbl_unsupp
4179 long fsmul - tbl_unsupp
4180 long fddiv - tbl_unsupp
4181 long tbl_unsupp - tbl_unsupp
4182 long fdadd - tbl_unsupp
4183 long fdmul - tbl_unsupp
4184 long fssub - tbl_unsupp
4185 long tbl_unsupp - tbl_unsupp
4186 long tbl_unsupp - tbl_unsupp
4187 long tbl_unsupp - tbl_unsupp
4188 long fdsub - tbl_unsupp
4189
4190
4191
4192
4193 global smovcr
4194smovcr:
4195 bra.b smovcr
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264 global fmovm_dynamic
4265fmovm_dynamic:
4266
4267
4268 mov.b 1+EXC_EXTWORD(%a6),%d1
4269 andi.w &0x70,%d1
4270 lsr.b &0x4,%d1
4271
4272
4273 bsr.l fetch_dreg
4274
4275 andi.l &0x000000ff,%d0
4276
4277 mov.l %d0,-(%sp)
4278 mov.b (tbl_fmovm_size.w,%pc,%d0),%d0
4279 mov.l %d0,-(%sp)
4280 bsr.l fmovm_calc_ea
4281 mov.l (%sp)+,%d0
4282 mov.l (%sp)+,%d1
4283
4284
4285
4286 beq.w fmovm_data_done
4287
4288
4289 btst &0x5,EXC_EXTWORD(%a6)
4290 beq.w fmovm_data_in
4291
4292
4293
4294
4295fmovm_data_out:
4296 btst &0x4,EXC_EXTWORD(%a6)
4297 bne.w fmovm_out_ctrl
4298
4299
4300fmovm_out_predec:
4301
4302
4303
4304 mov.b (tbl_fmovm_convert.w,%pc,%d1.w*1),%d1
4305
4306 btst &0x5,EXC_SR(%a6)
4307 beq.b fmovm_out_ctrl
4308
4309fmovm_out_predec_s:
4310 cmpi.b SPCOND_FLG(%a6),&mda7_flg
4311 bne.b fmovm_out_ctrl
4312
4313
4314
4315
4316 rts
4317
4318
4319fmovm_out_ctrl:
4320 mov.l %a0,%a1
4321
4322 sub.l %d0,%sp
4323 lea (%sp),%a0
4324
4325 tst.b %d1
4326 bpl.b fmovm_out_ctrl_fp1
4327
4328 mov.l 0x0+EXC_FP0(%a6),(%a0)+
4329 mov.l 0x4+EXC_FP0(%a6),(%a0)+
4330 mov.l 0x8+EXC_FP0(%a6),(%a0)+
4331
4332fmovm_out_ctrl_fp1:
4333 lsl.b &0x1,%d1
4334 bpl.b fmovm_out_ctrl_fp2
4335
4336 mov.l 0x0+EXC_FP1(%a6),(%a0)+
4337 mov.l 0x4+EXC_FP1(%a6),(%a0)+
4338 mov.l 0x8+EXC_FP1(%a6),(%a0)+
4339
4340fmovm_out_ctrl_fp2:
4341 lsl.b &0x1,%d1
4342 bpl.b fmovm_out_ctrl_fp3
4343
4344 fmovm.x &0x20,(%a0)
4345 add.l &0xc,%a0
4346
4347fmovm_out_ctrl_fp3:
4348 lsl.b &0x1,%d1
4349 bpl.b fmovm_out_ctrl_fp4
4350
4351 fmovm.x &0x10,(%a0)
4352 add.l &0xc,%a0
4353
4354fmovm_out_ctrl_fp4:
4355 lsl.b &0x1,%d1
4356 bpl.b fmovm_out_ctrl_fp5
4357
4358 fmovm.x &0x08,(%a0)
4359 add.l &0xc,%a0
4360
4361fmovm_out_ctrl_fp5:
4362 lsl.b &0x1,%d1
4363 bpl.b fmovm_out_ctrl_fp6
4364
4365 fmovm.x &0x04,(%a0)
4366 add.l &0xc,%a0
4367
4368fmovm_out_ctrl_fp6:
4369 lsl.b &0x1,%d1
4370 bpl.b fmovm_out_ctrl_fp7
4371
4372 fmovm.x &0x02,(%a0)
4373 add.l &0xc,%a0
4374
4375fmovm_out_ctrl_fp7:
4376 lsl.b &0x1,%d1
4377 bpl.b fmovm_out_ctrl_done
4378
4379 fmovm.x &0x01,(%a0)
4380 add.l &0xc,%a0
4381
4382fmovm_out_ctrl_done:
4383 mov.l %a1,L_SCR1(%a6)
4384
4385 lea (%sp),%a0
4386 mov.l %d0,-(%sp)
4387 bsr.l _dmem_write
4388
4389 mov.l (%sp)+,%d0
4390 add.l %d0,%sp
4391
4392 tst.l %d1
4393 bne.w fmovm_out_err
4394
4395 rts
4396
4397
4398
4399
4400fmovm_data_in:
4401 mov.l %a0,L_SCR1(%a6)
4402
4403 sub.l %d0,%sp
4404 lea (%sp),%a1
4405
4406 mov.l %d1,-(%sp)
4407 mov.l %d0,-(%sp)
4408
4409 bsr.l _dmem_read
4410
4411 mov.l (%sp)+,%d0
4412
4413 tst.l %d1
4414 bne.w fmovm_in_err
4415
4416 mov.l (%sp)+,%d1
4417
4418 lea (%sp),%a0
4419
4420 tst.b %d1
4421 bpl.b fmovm_data_in_fp1
4422
4423 mov.l (%a0)+,0x0+EXC_FP0(%a6)
4424 mov.l (%a0)+,0x4+EXC_FP0(%a6)
4425 mov.l (%a0)+,0x8+EXC_FP0(%a6)
4426
4427fmovm_data_in_fp1:
4428 lsl.b &0x1,%d1
4429 bpl.b fmovm_data_in_fp2
4430
4431 mov.l (%a0)+,0x0+EXC_FP1(%a6)
4432 mov.l (%a0)+,0x4+EXC_FP1(%a6)
4433 mov.l (%a0)+,0x8+EXC_FP1(%a6)
4434
4435fmovm_data_in_fp2:
4436 lsl.b &0x1,%d1
4437 bpl.b fmovm_data_in_fp3
4438
4439 fmovm.x (%a0)+,&0x20
4440
4441fmovm_data_in_fp3:
4442 lsl.b &0x1,%d1
4443 bpl.b fmovm_data_in_fp4
4444
4445 fmovm.x (%a0)+,&0x10
4446
4447fmovm_data_in_fp4:
4448 lsl.b &0x1,%d1
4449 bpl.b fmovm_data_in_fp5
4450
4451 fmovm.x (%a0)+,&0x08
4452
4453fmovm_data_in_fp5:
4454 lsl.b &0x1,%d1
4455 bpl.b fmovm_data_in_fp6
4456
4457 fmovm.x (%a0)+,&0x04
4458
4459fmovm_data_in_fp6:
4460 lsl.b &0x1,%d1
4461 bpl.b fmovm_data_in_fp7
4462
4463 fmovm.x (%a0)+,&0x02
4464
4465fmovm_data_in_fp7:
4466 lsl.b &0x1,%d1
4467 bpl.b fmovm_data_in_done
4468
4469 fmovm.x (%a0)+,&0x01
4470
4471fmovm_data_in_done:
4472 add.l %d0,%sp
4473 rts
4474
4475
4476
4477fmovm_data_done:
4478 rts
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488tbl_fmovm_size:
4489 byte 0x00,0x0c,0x0c,0x18,0x0c,0x18,0x18,0x24
4490 byte 0x0c,0x18,0x18,0x24,0x18,0x24,0x24,0x30
4491 byte 0x0c,0x18,0x18,0x24,0x18,0x24,0x24,0x30
4492 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4493 byte 0x0c,0x18,0x18,0x24,0x18,0x24,0x24,0x30
4494 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4495 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4496 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4497 byte 0x0c,0x18,0x18,0x24,0x18,0x24,0x24,0x30
4498 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4499 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4500 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4501 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4502 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4503 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4504 byte 0x30,0x3c,0x3c,0x48,0x3c,0x48,0x48,0x54
4505 byte 0x0c,0x18,0x18,0x24,0x18,0x24,0x24,0x30
4506 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4507 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4508 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4509 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4510 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4511 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4512 byte 0x30,0x3c,0x3c,0x48,0x3c,0x48,0x48,0x54
4513 byte 0x18,0x24,0x24,0x30,0x24,0x30,0x30,0x3c
4514 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4515 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4516 byte 0x30,0x3c,0x3c,0x48,0x3c,0x48,0x48,0x54
4517 byte 0x24,0x30,0x30,0x3c,0x30,0x3c,0x3c,0x48
4518 byte 0x30,0x3c,0x3c,0x48,0x3c,0x48,0x48,0x54
4519 byte 0x30,0x3c,0x3c,0x48,0x3c,0x48,0x48,0x54
4520 byte 0x3c,0x48,0x48,0x54,0x48,0x54,0x54,0x60
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534tbl_fmovm_convert:
4535 byte 0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0
4536 byte 0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0
4537 byte 0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8
4538 byte 0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8
4539 byte 0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4
4540 byte 0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4
4541 byte 0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec
4542 byte 0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc
4543 byte 0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2
4544 byte 0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2
4545 byte 0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea
4546 byte 0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa
4547 byte 0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6
4548 byte 0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6
4549 byte 0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee
4550 byte 0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe
4551 byte 0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1
4552 byte 0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1
4553 byte 0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9
4554 byte 0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9
4555 byte 0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5
4556 byte 0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5
4557 byte 0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed
4558 byte 0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd
4559 byte 0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3
4560 byte 0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3
4561 byte 0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb
4562 byte 0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb
4563 byte 0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7
4564 byte 0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7
4565 byte 0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef
4566 byte 0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff
4567
4568 global fmovm_calc_ea
4569
4570
4571
4572fmovm_calc_ea:
4573 mov.l %d0,%a0
4574
4575
4576
4577 mov.w EXC_OPWORD(%a6),%d0
4578 mov.w %d0,%d1
4579
4580 andi.w &0x3f,%d0
4581 andi.l &0x7,%d1
4582
4583
4584 mov.w (tbl_fea_mode.b,%pc,%d0.w*2),%d0
4585 jmp (tbl_fea_mode.b,%pc,%d0.w*1)
4586
4587 swbeg &64
4588tbl_fea_mode:
4589 short tbl_fea_mode - tbl_fea_mode
4590 short tbl_fea_mode - tbl_fea_mode
4591 short tbl_fea_mode - tbl_fea_mode
4592 short tbl_fea_mode - tbl_fea_mode
4593 short tbl_fea_mode - tbl_fea_mode
4594 short tbl_fea_mode - tbl_fea_mode
4595 short tbl_fea_mode - tbl_fea_mode
4596 short tbl_fea_mode - tbl_fea_mode
4597
4598 short tbl_fea_mode - tbl_fea_mode
4599 short tbl_fea_mode - tbl_fea_mode
4600 short tbl_fea_mode - tbl_fea_mode
4601 short tbl_fea_mode - tbl_fea_mode
4602 short tbl_fea_mode - tbl_fea_mode
4603 short tbl_fea_mode - tbl_fea_mode
4604 short tbl_fea_mode - tbl_fea_mode
4605 short tbl_fea_mode - tbl_fea_mode
4606
4607 short faddr_ind_a0 - tbl_fea_mode
4608 short faddr_ind_a1 - tbl_fea_mode
4609 short faddr_ind_a2 - tbl_fea_mode
4610 short faddr_ind_a3 - tbl_fea_mode
4611 short faddr_ind_a4 - tbl_fea_mode
4612 short faddr_ind_a5 - tbl_fea_mode
4613 short faddr_ind_a6 - tbl_fea_mode
4614 short faddr_ind_a7 - tbl_fea_mode
4615
4616 short faddr_ind_p_a0 - tbl_fea_mode
4617 short faddr_ind_p_a1 - tbl_fea_mode
4618 short faddr_ind_p_a2 - tbl_fea_mode
4619 short faddr_ind_p_a3 - tbl_fea_mode
4620 short faddr_ind_p_a4 - tbl_fea_mode
4621 short faddr_ind_p_a5 - tbl_fea_mode
4622 short faddr_ind_p_a6 - tbl_fea_mode
4623 short faddr_ind_p_a7 - tbl_fea_mode
4624
4625 short faddr_ind_m_a0 - tbl_fea_mode
4626 short faddr_ind_m_a1 - tbl_fea_mode
4627 short faddr_ind_m_a2 - tbl_fea_mode
4628 short faddr_ind_m_a3 - tbl_fea_mode
4629 short faddr_ind_m_a4 - tbl_fea_mode
4630 short faddr_ind_m_a5 - tbl_fea_mode
4631 short faddr_ind_m_a6 - tbl_fea_mode
4632 short faddr_ind_m_a7 - tbl_fea_mode
4633
4634 short faddr_ind_disp_a0 - tbl_fea_mode
4635 short faddr_ind_disp_a1 - tbl_fea_mode
4636 short faddr_ind_disp_a2 - tbl_fea_mode
4637 short faddr_ind_disp_a3 - tbl_fea_mode
4638 short faddr_ind_disp_a4 - tbl_fea_mode
4639 short faddr_ind_disp_a5 - tbl_fea_mode
4640 short faddr_ind_disp_a6 - tbl_fea_mode
4641 short faddr_ind_disp_a7 - tbl_fea_mode
4642
4643 short faddr_ind_ext - tbl_fea_mode
4644 short faddr_ind_ext - tbl_fea_mode
4645 short faddr_ind_ext - tbl_fea_mode
4646 short faddr_ind_ext - tbl_fea_mode
4647 short faddr_ind_ext - tbl_fea_mode
4648 short faddr_ind_ext - tbl_fea_mode
4649 short faddr_ind_ext - tbl_fea_mode
4650 short faddr_ind_ext - tbl_fea_mode
4651
4652 short fabs_short - tbl_fea_mode
4653 short fabs_long - tbl_fea_mode
4654 short fpc_ind - tbl_fea_mode
4655 short fpc_ind_ext - tbl_fea_mode
4656 short tbl_fea_mode - tbl_fea_mode
4657 short tbl_fea_mode - tbl_fea_mode
4658 short tbl_fea_mode - tbl_fea_mode
4659 short tbl_fea_mode - tbl_fea_mode
4660
4661
4662
4663
4664faddr_ind_a0:
4665 mov.l EXC_DREGS+0x8(%a6),%a0
4666 rts
4667
4668faddr_ind_a1:
4669 mov.l EXC_DREGS+0xc(%a6),%a0
4670 rts
4671
4672faddr_ind_a2:
4673 mov.l %a2,%a0
4674 rts
4675
4676faddr_ind_a3:
4677 mov.l %a3,%a0
4678 rts
4679
4680faddr_ind_a4:
4681 mov.l %a4,%a0
4682 rts
4683
4684faddr_ind_a5:
4685 mov.l %a5,%a0
4686 rts
4687
4688faddr_ind_a6:
4689 mov.l (%a6),%a0
4690 rts
4691
4692faddr_ind_a7:
4693 mov.l EXC_A7(%a6),%a0
4694 rts
4695
4696
4697
4698
4699faddr_ind_p_a0:
4700 mov.l EXC_DREGS+0x8(%a6),%d0
4701 mov.l %d0,%d1
4702 add.l %a0,%d1
4703 mov.l %d1,EXC_DREGS+0x8(%a6)
4704 mov.l %d0,%a0
4705 rts
4706
4707faddr_ind_p_a1:
4708 mov.l EXC_DREGS+0xc(%a6),%d0
4709 mov.l %d0,%d1
4710 add.l %a0,%d1
4711 mov.l %d1,EXC_DREGS+0xc(%a6)
4712 mov.l %d0,%a0
4713 rts
4714
4715faddr_ind_p_a2:
4716 mov.l %a2,%d0
4717 mov.l %d0,%d1
4718 add.l %a0,%d1
4719 mov.l %d1,%a2
4720 mov.l %d0,%a0
4721 rts
4722
4723faddr_ind_p_a3:
4724 mov.l %a3,%d0
4725 mov.l %d0,%d1
4726 add.l %a0,%d1
4727 mov.l %d1,%a3
4728 mov.l %d0,%a0
4729 rts
4730
4731faddr_ind_p_a4:
4732 mov.l %a4,%d0
4733 mov.l %d0,%d1
4734 add.l %a0,%d1
4735 mov.l %d1,%a4
4736 mov.l %d0,%a0
4737 rts
4738
4739faddr_ind_p_a5:
4740 mov.l %a5,%d0
4741 mov.l %d0,%d1
4742 add.l %a0,%d1
4743 mov.l %d1,%a5
4744 mov.l %d0,%a0
4745 rts
4746
4747faddr_ind_p_a6:
4748 mov.l (%a6),%d0
4749 mov.l %d0,%d1
4750 add.l %a0,%d1
4751 mov.l %d1,(%a6)
4752 mov.l %d0,%a0
4753 rts
4754
4755faddr_ind_p_a7:
4756 mov.b &mia7_flg,SPCOND_FLG(%a6)
4757
4758 mov.l EXC_A7(%a6),%d0
4759 mov.l %d0,%d1
4760 add.l %a0,%d1
4761 mov.l %d1,EXC_A7(%a6)
4762 mov.l %d0,%a0
4763 rts
4764
4765
4766
4767
4768faddr_ind_m_a0:
4769 mov.l EXC_DREGS+0x8(%a6),%d0
4770 sub.l %a0,%d0
4771 mov.l %d0,EXC_DREGS+0x8(%a6)
4772 mov.l %d0,%a0
4773 rts
4774
4775faddr_ind_m_a1:
4776 mov.l EXC_DREGS+0xc(%a6),%d0
4777 sub.l %a0,%d0
4778 mov.l %d0,EXC_DREGS+0xc(%a6)
4779 mov.l %d0,%a0
4780 rts
4781
4782faddr_ind_m_a2:
4783 mov.l %a2,%d0
4784 sub.l %a0,%d0
4785 mov.l %d0,%a2
4786 mov.l %d0,%a0
4787 rts
4788
4789faddr_ind_m_a3:
4790 mov.l %a3,%d0
4791 sub.l %a0,%d0
4792 mov.l %d0,%a3
4793 mov.l %d0,%a0
4794 rts
4795
4796faddr_ind_m_a4:
4797 mov.l %a4,%d0
4798 sub.l %a0,%d0
4799 mov.l %d0,%a4
4800 mov.l %d0,%a0
4801 rts
4802
4803faddr_ind_m_a5:
4804 mov.l %a5,%d0
4805 sub.l %a0,%d0
4806 mov.l %d0,%a5
4807 mov.l %d0,%a0
4808 rts
4809
4810faddr_ind_m_a6:
4811 mov.l (%a6),%d0
4812 sub.l %a0,%d0
4813 mov.l %d0,(%a6)
4814 mov.l %d0,%a0
4815 rts
4816
4817faddr_ind_m_a7:
4818 mov.b &mda7_flg,SPCOND_FLG(%a6)
4819
4820 mov.l EXC_A7(%a6),%d0
4821 sub.l %a0,%d0
4822 mov.l %d0,EXC_A7(%a6)
4823 mov.l %d0,%a0
4824 rts
4825
4826
4827
4828
4829faddr_ind_disp_a0:
4830 mov.l EXC_EXTWPTR(%a6),%a0
4831 addq.l &0x2,EXC_EXTWPTR(%a6)
4832 bsr.l _imem_read_word
4833
4834 tst.l %d1
4835 bne.l iea_iacc
4836
4837 mov.w %d0,%a0
4838
4839 add.l EXC_DREGS+0x8(%a6),%a0
4840 rts
4841
4842faddr_ind_disp_a1:
4843 mov.l EXC_EXTWPTR(%a6),%a0
4844 addq.l &0x2,EXC_EXTWPTR(%a6)
4845 bsr.l _imem_read_word
4846
4847 tst.l %d1
4848 bne.l iea_iacc
4849
4850 mov.w %d0,%a0
4851
4852 add.l EXC_DREGS+0xc(%a6),%a0
4853 rts
4854
4855faddr_ind_disp_a2:
4856 mov.l EXC_EXTWPTR(%a6),%a0
4857 addq.l &0x2,EXC_EXTWPTR(%a6)
4858 bsr.l _imem_read_word
4859
4860 tst.l %d1
4861 bne.l iea_iacc
4862
4863 mov.w %d0,%a0
4864
4865 add.l %a2,%a0
4866 rts
4867
4868faddr_ind_disp_a3:
4869 mov.l EXC_EXTWPTR(%a6),%a0
4870 addq.l &0x2,EXC_EXTWPTR(%a6)
4871 bsr.l _imem_read_word
4872
4873 tst.l %d1
4874 bne.l iea_iacc
4875
4876 mov.w %d0,%a0
4877
4878 add.l %a3,%a0
4879 rts
4880
4881faddr_ind_disp_a4:
4882 mov.l EXC_EXTWPTR(%a6),%a0
4883 addq.l &0x2,EXC_EXTWPTR(%a6)
4884 bsr.l _imem_read_word
4885
4886 tst.l %d1
4887 bne.l iea_iacc
4888
4889 mov.w %d0,%a0
4890
4891 add.l %a4,%a0
4892 rts
4893
4894faddr_ind_disp_a5:
4895 mov.l EXC_EXTWPTR(%a6),%a0
4896 addq.l &0x2,EXC_EXTWPTR(%a6)
4897 bsr.l _imem_read_word
4898
4899 tst.l %d1
4900 bne.l iea_iacc
4901
4902 mov.w %d0,%a0
4903
4904 add.l %a5,%a0
4905 rts
4906
4907faddr_ind_disp_a6:
4908 mov.l EXC_EXTWPTR(%a6),%a0
4909 addq.l &0x2,EXC_EXTWPTR(%a6)
4910 bsr.l _imem_read_word
4911
4912 tst.l %d1
4913 bne.l iea_iacc
4914
4915 mov.w %d0,%a0
4916
4917 add.l (%a6),%a0
4918 rts
4919
4920faddr_ind_disp_a7:
4921 mov.l EXC_EXTWPTR(%a6),%a0
4922 addq.l &0x2,EXC_EXTWPTR(%a6)
4923 bsr.l _imem_read_word
4924
4925 tst.l %d1
4926 bne.l iea_iacc
4927
4928 mov.w %d0,%a0
4929
4930 add.l EXC_A7(%a6),%a0
4931 rts
4932
4933
4934
4935
4936
4937
4938
4939faddr_ind_ext:
4940 addq.l &0x8,%d1
4941 bsr.l fetch_dreg
4942 mov.l %d0,-(%sp)
4943
4944 mov.l EXC_EXTWPTR(%a6),%a0
4945 addq.l &0x2,EXC_EXTWPTR(%a6)
4946 bsr.l _imem_read_word
4947
4948 tst.l %d1
4949 bne.l iea_iacc
4950
4951 mov.l (%sp)+,%a0
4952
4953 btst &0x8,%d0
4954 bne.w fcalc_mem_ind
4955
4956 mov.l %d0,L_SCR1(%a6)
4957
4958 mov.l %d0,%d1
4959 rol.w &0x4,%d1
4960 andi.w &0xf,%d1
4961
4962
4963 bsr.l fetch_dreg
4964
4965 mov.l %d2,-(%sp)
4966 mov.l L_SCR1(%a6),%d2
4967
4968 btst &0xb,%d2
4969 bne.b faii8_long
4970 ext.l %d0
4971faii8_long:
4972 mov.l %d2,%d1
4973 rol.w &0x7,%d1
4974 andi.l &0x3,%d1
4975
4976 lsl.l %d1,%d0
4977
4978 extb.l %d2
4979 add.l %d2,%d0
4980 add.l %d0,%a0
4981
4982 mov.l (%sp)+,%d2
4983 rts
4984
4985
4986
4987
4988fabs_short:
4989 mov.l EXC_EXTWPTR(%a6),%a0
4990 addq.l &0x2,EXC_EXTWPTR(%a6)
4991 bsr.l _imem_read_word
4992
4993 tst.l %d1
4994 bne.l iea_iacc
4995
4996 mov.w %d0,%a0
4997 rts
4998
4999
5000
5001
5002fabs_long:
5003 mov.l EXC_EXTWPTR(%a6),%a0
5004 addq.l &0x4,EXC_EXTWPTR(%a6)
5005 bsr.l _imem_read_long
5006
5007 tst.l %d1
5008 bne.l iea_iacc
5009
5010 mov.l %d0,%a0
5011 rts
5012
5013
5014
5015
5016fpc_ind:
5017 mov.l EXC_EXTWPTR(%a6),%a0
5018 addq.l &0x2,EXC_EXTWPTR(%a6)
5019 bsr.l _imem_read_word
5020
5021 tst.l %d1
5022 bne.l iea_iacc
5023
5024 mov.w %d0,%a0
5025
5026 add.l EXC_EXTWPTR(%a6),%a0
5027
5028
5029 subq.l &0x2,%a0
5030 rts
5031
5032
5033
5034
5035
5036
5037
5038fpc_ind_ext:
5039 mov.l EXC_EXTWPTR(%a6),%a0
5040 addq.l &0x2,EXC_EXTWPTR(%a6)
5041 bsr.l _imem_read_word
5042
5043 tst.l %d1
5044 bne.l iea_iacc
5045
5046 mov.l EXC_EXTWPTR(%a6),%a0
5047 subq.l &0x2,%a0
5048
5049 btst &0x8,%d0
5050 bne.w fcalc_mem_ind
5051
5052 mov.l %d0,L_SCR1(%a6)
5053
5054 mov.l %d0,%d1
5055 rol.w &0x4,%d1
5056 andi.w &0xf,%d1
5057
5058
5059 bsr.l fetch_dreg
5060
5061 mov.l %d2,-(%sp)
5062 mov.l L_SCR1(%a6),%d2
5063
5064 btst &0xb,%d2
5065 bne.b fpii8_long
5066 ext.l %d0
5067fpii8_long:
5068 mov.l %d2,%d1
5069 rol.w &0x7,%d1
5070 andi.l &0x3,%d1
5071
5072 lsl.l %d1,%d0
5073
5074 extb.l %d2
5075 add.l %d2,%d0
5076 add.l %d0,%a0
5077
5078 mov.l (%sp)+,%d2
5079 rts
5080
5081
5082
5083
5084
5085fcalc_mem_ind:
5086 btst &0x6,%d0
5087 beq.b fcalc_index
5088
5089 movm.l &0x3c00,-(%sp)
5090
5091 mov.l %d0,%d5
5092 mov.l %a0,%d3
5093
5094 clr.l %d2
5095 bra.b fbase_supp_ck
5096
5097
5098fcalc_index:
5099 mov.l %d0,L_SCR1(%a6)
5100 bfextu %d0{&16:&4},%d1
5101 bsr.l fetch_dreg
5102
5103 movm.l &0x3c00,-(%sp)
5104 mov.l %d0,%d2
5105 mov.l L_SCR1(%a6),%d5
5106 mov.l %a0,%d3
5107
5108 btst &0xb,%d5
5109 bne.b fno_ext
5110 ext.l %d2
5111
5112fno_ext:
5113 bfextu %d5{&21:&2},%d0
5114 lsl.l %d0,%d2
5115
5116
5117
5118fbase_supp_ck:
5119 btst &0x7,%d5
5120 beq.b fno_base_sup
5121 clr.l %d3
5122
5123
5124fno_base_sup:
5125 bfextu %d5{&26:&2},%d0
5126
5127
5128 cmpi.b %d0,&0x2
5129 blt.b fno_bd
5130 beq.b fget_word_bd
5131
5132 mov.l EXC_EXTWPTR(%a6),%a0
5133 addq.l &0x4,EXC_EXTWPTR(%a6)
5134 bsr.l _imem_read_long
5135
5136 tst.l %d1
5137 bne.l fcea_iacc
5138
5139 bra.b fchk_ind
5140
5141fget_word_bd:
5142 mov.l EXC_EXTWPTR(%a6),%a0
5143 addq.l &0x2,EXC_EXTWPTR(%a6)
5144 bsr.l _imem_read_word
5145
5146 tst.l %d1
5147 bne.l fcea_iacc
5148
5149 ext.l %d0
5150
5151fchk_ind:
5152 add.l %d0,%d3
5153
5154
5155fno_bd:
5156 bfextu %d5{&30:&2},%d0
5157 beq.w faii_bd
5158
5159 cmpi.b %d0,&0x2
5160 blt.b fnull_od
5161 beq.b fword_od
5162
5163 mov.l EXC_EXTWPTR(%a6),%a0
5164 addq.l &0x4,EXC_EXTWPTR(%a6)
5165 bsr.l _imem_read_long
5166
5167 tst.l %d1
5168 bne.l fcea_iacc
5169
5170 bra.b fadd_them
5171
5172fword_od:
5173 mov.l EXC_EXTWPTR(%a6),%a0
5174 addq.l &0x2,EXC_EXTWPTR(%a6)
5175 bsr.l _imem_read_word
5176
5177 tst.l %d1
5178 bne.l fcea_iacc
5179
5180 ext.l %d0
5181 bra.b fadd_them
5182
5183fnull_od:
5184 clr.l %d0
5185
5186fadd_them:
5187 mov.l %d0,%d4
5188
5189 btst &0x2,%d5
5190 beq.b fpre_indexed
5191
5192 mov.l %d3,%a0
5193 bsr.l _dmem_read_long
5194
5195 tst.l %d1
5196 bne.w fcea_err
5197
5198 add.l %d2,%d0
5199 add.l %d4,%d0
5200 bra.b fdone_ea
5201
5202fpre_indexed:
5203 add.l %d2,%d3
5204 mov.l %d3,%a0
5205 bsr.l _dmem_read_long
5206
5207 tst.l %d1
5208 bne.w fcea_err
5209
5210 add.l %d4,%d0
5211 bra.b fdone_ea
5212
5213faii_bd:
5214 add.l %d2,%d3
5215 mov.l %d3,%d0
5216fdone_ea:
5217 mov.l %d0,%a0
5218
5219 movm.l (%sp)+,&0x003c
5220 rts
5221
5222
5223fcea_err:
5224 mov.l %d3,%a0
5225
5226 movm.l (%sp)+,&0x003c
5227 mov.w &0x0101,%d0
5228 bra.l iea_dacc
5229
5230fcea_iacc:
5231 movm.l (%sp)+,&0x003c
5232 bra.l iea_iacc
5233
5234fmovm_out_err:
5235 bsr.l restore
5236 mov.w &0x00e1,%d0
5237 bra.b fmovm_err
5238
5239fmovm_in_err:
5240 bsr.l restore
5241 mov.w &0x0161,%d0
5242
5243fmovm_err:
5244 mov.l L_SCR1(%a6),%a0
5245 bra.l iea_dacc
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284 global fmovm_ctrl
5285fmovm_ctrl:
5286 mov.b EXC_EXTWORD(%a6),%d0
5287 cmpi.b %d0,&0x9c
5288 beq.w fctrl_in_7
5289 cmpi.b %d0,&0x98
5290 beq.w fctrl_in_6
5291 cmpi.b %d0,&0x94
5292 beq.b fctrl_in_5
5293
5294
5295fctrl_in_3:
5296 mov.l EXC_EXTWPTR(%a6),%a0
5297 addq.l &0x4,EXC_EXTWPTR(%a6)
5298 bsr.l _imem_read_long
5299
5300 tst.l %d1
5301 bne.l iea_iacc
5302
5303 mov.l %d0,USER_FPSR(%a6)
5304 mov.l EXC_EXTWPTR(%a6),%a0
5305 addq.l &0x4,EXC_EXTWPTR(%a6)
5306 bsr.l _imem_read_long
5307
5308 tst.l %d1
5309 bne.l iea_iacc
5310
5311 mov.l %d0,USER_FPIAR(%a6)
5312 rts
5313
5314
5315fctrl_in_5:
5316 mov.l EXC_EXTWPTR(%a6),%a0
5317 addq.l &0x4,EXC_EXTWPTR(%a6)
5318 bsr.l _imem_read_long
5319
5320 tst.l %d1
5321 bne.l iea_iacc
5322
5323 mov.l %d0,USER_FPCR(%a6)
5324 mov.l EXC_EXTWPTR(%a6),%a0
5325 addq.l &0x4,EXC_EXTWPTR(%a6)
5326 bsr.l _imem_read_long
5327
5328 tst.l %d1
5329 bne.l iea_iacc
5330
5331 mov.l %d0,USER_FPIAR(%a6)
5332 rts
5333
5334
5335fctrl_in_6:
5336 mov.l EXC_EXTWPTR(%a6),%a0
5337 addq.l &0x4,EXC_EXTWPTR(%a6)
5338 bsr.l _imem_read_long
5339
5340 tst.l %d1
5341 bne.l iea_iacc
5342
5343 mov.l %d0,USER_FPCR(%a6)
5344 mov.l EXC_EXTWPTR(%a6),%a0
5345 addq.l &0x4,EXC_EXTWPTR(%a6)
5346 bsr.l _imem_read_long
5347
5348 tst.l %d1
5349 bne.l iea_iacc
5350
5351 mov.l %d0,USER_FPSR(%a6)
5352 rts
5353
5354
5355fctrl_in_7:
5356 mov.l EXC_EXTWPTR(%a6),%a0
5357 addq.l &0x4,EXC_EXTWPTR(%a6)
5358 bsr.l _imem_read_long
5359
5360 tst.l %d1
5361 bne.l iea_iacc
5362
5363 mov.l %d0,USER_FPCR(%a6)
5364 mov.l EXC_EXTWPTR(%a6),%a0
5365 addq.l &0x4,EXC_EXTWPTR(%a6)
5366 bsr.l _imem_read_long
5367
5368 tst.l %d1
5369 bne.l iea_iacc
5370
5371 mov.l %d0,USER_FPSR(%a6)
5372 mov.l EXC_EXTWPTR(%a6),%a0
5373 addq.l &0x4,EXC_EXTWPTR(%a6)
5374 bsr.l _imem_read_long
5375
5376 tst.l %d1
5377 bne.l iea_iacc
5378
5379 mov.l %d0,USER_FPIAR(%a6)
5380 rts
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412 global addsub_scaler2
5413addsub_scaler2:
5414 mov.l SRC_HI(%a0),FP_SCR0_HI(%a6)
5415 mov.l DST_HI(%a1),FP_SCR1_HI(%a6)
5416 mov.l SRC_LO(%a0),FP_SCR0_LO(%a6)
5417 mov.l DST_LO(%a1),FP_SCR1_LO(%a6)
5418 mov.w SRC_EX(%a0),%d0
5419 mov.w DST_EX(%a1),%d1
5420 mov.w %d0,FP_SCR0_EX(%a6)
5421 mov.w %d1,FP_SCR1_EX(%a6)
5422
5423 andi.w &0x7fff,%d0
5424 andi.w &0x7fff,%d1
5425 mov.w %d0,L_SCR1(%a6)
5426 mov.w %d1,2+L_SCR1(%a6)
5427
5428 cmp.w %d0, %d1
5429 bge.l src_exp_ge2
5430
5431
5432dst_exp_gt2:
5433 bsr.l scale_to_zero_dst
5434 mov.l %d0,-(%sp)
5435
5436 cmpi.b STAG(%a6),&DENORM
5437 bne.b cmpexp12
5438
5439 lea FP_SCR0(%a6),%a0
5440 bsr.l norm
5441 neg.w %d0
5442 mov.w %d0,L_SCR1(%a6)
5443
5444cmpexp12:
5445 mov.w 2+L_SCR1(%a6),%d0
5446 subi.w &mantissalen+2,%d0
5447
5448 cmp.w %d0,L_SCR1(%a6)
5449 bge.b quick_scale12
5450
5451 mov.w L_SCR1(%a6),%d0
5452 add.w 0x2(%sp),%d0
5453 mov.w FP_SCR0_EX(%a6),%d1