revert between 56095 -> 55830 in arch
[AROS.git] / arch / m68k-all / m680x0 / fpsp / x_ovfl.sa
blob5bd5aef09f5724642df0fde5c44deb2fd29dfee5
1 *       $NetBSD: x_ovfl.sa,v 1.3 2001/09/16 16:34:32 wiz Exp $
3 *       MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
4 *       M68000 Hi-Performance Microprocessor Division
5 *       M68040 Software Package 
7 *       M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
8 *       All rights reserved.
10 *       THE SOFTWARE is provided on an "AS IS" basis and without warranty.
11 *       To the maximum extent permitted by applicable law,
12 *       MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
13 *       INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
14 *       PARTICULAR PURPOSE and any warranty against infringement with
15 *       regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
16 *       and any accompanying written materials. 
18 *       To the maximum extent permitted by applicable law,
19 *       IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
20 *       (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
21 *       PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
22 *       OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
23 *       SOFTWARE.  Motorola assumes no responsibility for the maintenance
24 *       and support of the SOFTWARE.  
26 *       You are hereby granted a copyright license to use, modify, and
27 *       distribute the SOFTWARE so long as this entire notice is retained
28 *       without alteration in any modified and/or redistributed versions,
29 *       and that such modified versions are clearly identified as such.
30 *       No licenses are granted by implication, estoppel or otherwise
31 *       under any patents or trademarks of Motorola, Inc.
34 *       x_ovfl.sa 3.5 7/1/91
36 *       fpsp_ovfl --- FPSP handler for overflow exception
38 *       Overflow occurs when a floating-point intermediate result is
39 *       too large to be represented in a floating-point data register,
40 *       or when storing to memory, the contents of a floating-point
41 *       data register are too large to be represented in the
42 *       destination format.
43 *               
44 * Trap disabled results
46 * If the instruction is move_out, then garbage is stored in the
47 * destination.  If the instruction is not move_out, then the
48 * destination is not affected.  For 68881 compatibility, the
49 * following values should be stored at the destination, based
50 * on the current rounding mode:
52 *  RN   Infinity with the sign of the intermediate result.
53 *  RZ   Largest magnitude number, with the sign of the
54 *       intermediate result.
55 *  RM   For pos overflow, the largest pos number. For neg overflow,
56 *       -infinity
57 *  RP   For pos overflow, +infinity. For neg overflow, the largest
58 *       neg number
60 * Trap enabled results
61 * All trap disabled code applies.  In addition the exceptional
62 * operand needs to be made available to the users exception handler
63 * with a bias of $6000 subtracted from the exponent.
66 X_OVFL  IDNT    2,1 Motorola 040 Floating Point Software Package
68         section 8
70         include fpsp.h
72         xref    ovf_r_x2
73         xref    ovf_r_x3
74         xref    store
75         xref    real_ovfl
76         xref    real_inex
77         xref    fpsp_done
78         xref    g_opcls
79         xref    b1238_fix
81         xdef    fpsp_ovfl
82 fpsp_ovfl:
83         link            a6,#-LOCAL_SIZE
84         fsave           -(a7)
85         movem.l         d0-d1/a0-a1,USER_DA(a6)
86         fmovem.x        fp0-fp3,USER_FP0(a6)
87         fmovem.l        fpcr/fpsr/fpiar,USER_FPCR(a6)
90 *       The 040 doesn't set the AINEX bit in the FPSR, the following
91 *       line temporarily rectifies this error.
93         bset.b  #ainex_bit,FPSR_AEXCEPT(a6)
95         bsr.l   ovf_adj         ;denormalize, round & store interm op
97 *       if overflow traps not enabled check for inexact exception
99         btst.b  #ovfl_bit,FPCR_ENABLE(a6)
100         beq.b   ck_inex 
102         btst.b          #E3,E_BYTE(a6)
103         beq.b           no_e3_1
104         bfextu          CMDREG3B(a6){6:3},d0    ;get dest reg no
105         bclr.b          d0,FPR_DIRTY_BITS(a6)   ;clr dest dirty bit
106         bsr.l           b1238_fix
107         move.l          USER_FPSR(a6),FPSR_SHADOW(a6)
108         or.l            #sx_mask,E_BYTE(a6)
109 no_e3_1:
110         movem.l         USER_DA(a6),d0-d1/a0-a1
111         fmovem.x        USER_FP0(a6),fp0-fp3
112         fmovem.l        USER_FPCR(a6),fpcr/fpsr/fpiar
113         frestore        (a7)+
114         unlk            a6
115         bra.l           real_ovfl
117 * It is possible to have either inex2 or inex1 exceptions with the
118 * ovfl.  If the inex enable bit is set in the FPCR, and either
119 * inex2 or inex1 occurred, we must clean up and branch to the
120 * real inex handler.
122 ck_inex:
123 *       move.b          FPCR_ENABLE(a6),d0
124 *       and.b           FPSR_EXCEPT(a6),d0
125 *       andi.b          #$3,d0
126         btst.b          #inex2_bit,FPCR_ENABLE(a6)
127         beq.b           ovfl_exit
129 * Inexact enabled and reported, and we must take an inexact exception.
131 take_inex:
132         btst.b          #E3,E_BYTE(a6)
133         beq.b           no_e3_2
134         bfextu          CMDREG3B(a6){6:3},d0    ;get dest reg no
135         bclr.b          d0,FPR_DIRTY_BITS(a6)   ;clr dest dirty bit
136         bsr.l           b1238_fix
137         move.l          USER_FPSR(a6),FPSR_SHADOW(a6)
138         or.l            #sx_mask,E_BYTE(a6)
139 no_e3_2:
140         move.b          #INEX_VEC,EXC_VEC+1(a6)
141         movem.l         USER_DA(a6),d0-d1/a0-a1
142         fmovem.x        USER_FP0(a6),fp0-fp3
143         fmovem.l        USER_FPCR(a6),fpcr/fpsr/fpiar
144         frestore        (a7)+
145         unlk            a6
146         bra.l           real_inex
147         
148 ovfl_exit:
149         bclr.b  #E3,E_BYTE(a6)  ;test and clear E3 bit
150         beq.b   e1_set
152 * Clear dirty bit on dest resister in the frame before branching
153 * to b1238_fix.
155         bfextu          CMDREG3B(a6){6:3},d0    ;get dest reg no
156         bclr.b          d0,FPR_DIRTY_BITS(a6)   ;clr dest dirty bit
157         bsr.l           b1238_fix               ;test for bug1238 case
159         move.l          USER_FPSR(a6),FPSR_SHADOW(a6)
160         or.l            #sx_mask,E_BYTE(a6)
161         movem.l         USER_DA(a6),d0-d1/a0-a1
162         fmovem.x        USER_FP0(a6),fp0-fp3
163         fmovem.l        USER_FPCR(a6),fpcr/fpsr/fpiar
164         frestore        (a7)+
165         unlk            a6
166         bra.l           fpsp_done
167 e1_set:
168         movem.l         USER_DA(a6),d0-d1/a0-a1
169         fmovem.x        USER_FP0(a6),fp0-fp3
170         fmovem.l        USER_FPCR(a6),fpcr/fpsr/fpiar
171         unlk            a6
172         bra.l           fpsp_done
175 *       ovf_adj
177 ovf_adj:
179 * Have a0 point to the correct operand. 
181         btst.b  #E3,E_BYTE(a6)  ;test E3 bit
182         beq.b   ovf_e1
184         lea     WBTEMP(a6),a0
185         bra.b   ovf_com
186 ovf_e1:
187         lea     ETEMP(a6),a0
189 ovf_com:
190         bclr.b  #sign_bit,LOCAL_EX(a0)
191         sne     LOCAL_SGN(a0)
193         bsr.l   g_opcls         ;returns opclass in d0
194         cmpi.w  #3,d0           ;check for opclass3
195         bne.b   not_opc011
198 * FPSR_CC is saved and restored because ovf_r_x3 affects it. The
199 * CCs are defined to be 'not affected' for the opclass3 instruction.
201         move.b  FPSR_CC(a6),L_SCR1(a6)
202         bsr.l   ovf_r_x3        ;returns a0 pointing to result
203         move.b  L_SCR1(a6),FPSR_CC(a6)
204         bra.l   store           ;stores to memory or register
205         
206 not_opc011:
207         bsr.l   ovf_r_x2        ;returns a0 pointing to result
208         bra.l   store           ;stores to memory or register
210         end