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