~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/m68k/ifpsp060/src/fplsp.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/m68k/ifpsp060/src/fplsp.S (Architecture i386) and /arch/m68k/ifpsp060/src/fplsp.S (Architecture m68k)


  1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2 MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GR      2 MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
  3 M68000 Hi-Performance Microprocessor Division       3 M68000 Hi-Performance Microprocessor Division
  4 M68060 Software Package                             4 M68060 Software Package
  5 Production Release P1.00 -- October 10, 1994        5 Production Release P1.00 -- October 10, 1994
  6                                                     6 
  7 M68060 Software Package Copyright © 1993, 199      7 M68060 Software Package Copyright © 1993, 1994 Motorola Inc.  All rights reserved.
  8                                                     8 
  9 THE SOFTWARE is provided on an "AS IS" basis a      9 THE SOFTWARE is provided on an "AS IS" basis and without warranty.
 10 To the maximum extent permitted by applicable      10 To the maximum extent permitted by applicable law,
 11 MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPR     11 MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
 12 INCLUDING IMPLIED WARRANTIES OF MERCHANTABILIT     12 INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
 13 and any warranty against infringement with reg     13 and any warranty against infringement with regard to the SOFTWARE
 14 (INCLUDING ANY MODIFIED VERSIONS THEREOF) and      14 (INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials.
 15                                                    15 
 16 To the maximum extent permitted by applicable      16 To the maximum extent permitted by applicable law,
 17 IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY D     17 IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
 18 (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOS     18 (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
 19 BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORM     19 BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS)
 20 ARISING OF THE USE OR INABILITY TO USE THE SOF     20 ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
 21 Motorola assumes no responsibility for the mai     21 Motorola assumes no responsibility for the maintenance and support of the SOFTWARE.
 22                                                    22 
 23 You are hereby granted a copyright license to      23 You are hereby granted a copyright license to use, modify, and distribute the SOFTWARE
 24 so long as this entire notice is retained with     24 so long as this entire notice is retained without alteration in any modified and/or
 25 redistributed versions, and that such modified     25 redistributed versions, and that such modified versions are clearly identified as such.
 26 No licenses are granted by implication, estopp     26 No licenses are granted by implication, estoppel or otherwise under any patents
 27 or trademarks of Motorola, Inc.                    27 or trademarks of Motorola, Inc.
 28 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     28 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 29 #                                                  29 #
 30 # lfptop.s:                                        30 # lfptop.s:
 31 #       This file is appended to the top of th     31 #       This file is appended to the top of the 060ILSP package
 32 # and contains the entry points into the packa     32 # and contains the entry points into the package. The user, in
 33 # effect, branches to one of the branch table      33 # effect, branches to one of the branch table entries located here.
 34 #                                                  34 #
 35                                                    35 
 36         bra.l   _facoss_                           36         bra.l   _facoss_
 37         short   0x0000                             37         short   0x0000
 38         bra.l   _facosd_                           38         bra.l   _facosd_
 39         short   0x0000                             39         short   0x0000
 40         bra.l   _facosx_                           40         bra.l   _facosx_
 41         short   0x0000                             41         short   0x0000
 42                                                    42 
 43         bra.l   _fasins_                           43         bra.l   _fasins_
 44         short   0x0000                             44         short   0x0000
 45         bra.l   _fasind_                           45         bra.l   _fasind_
 46         short   0x0000                             46         short   0x0000
 47         bra.l   _fasinx_                           47         bra.l   _fasinx_
 48         short   0x0000                             48         short   0x0000
 49                                                    49 
 50         bra.l   _fatans_                           50         bra.l   _fatans_
 51         short   0x0000                             51         short   0x0000
 52         bra.l   _fatand_                           52         bra.l   _fatand_
 53         short   0x0000                             53         short   0x0000
 54         bra.l   _fatanx_                           54         bra.l   _fatanx_
 55         short   0x0000                             55         short   0x0000
 56                                                    56 
 57         bra.l   _fatanhs_                          57         bra.l   _fatanhs_
 58         short   0x0000                             58         short   0x0000
 59         bra.l   _fatanhd_                          59         bra.l   _fatanhd_
 60         short   0x0000                             60         short   0x0000
 61         bra.l   _fatanhx_                          61         bra.l   _fatanhx_
 62         short   0x0000                             62         short   0x0000
 63                                                    63 
 64         bra.l   _fcoss_                            64         bra.l   _fcoss_
 65         short   0x0000                             65         short   0x0000
 66         bra.l   _fcosd_                            66         bra.l   _fcosd_
 67         short   0x0000                             67         short   0x0000
 68         bra.l   _fcosx_                            68         bra.l   _fcosx_
 69         short   0x0000                             69         short   0x0000
 70                                                    70 
 71         bra.l   _fcoshs_                           71         bra.l   _fcoshs_
 72         short   0x0000                             72         short   0x0000
 73         bra.l   _fcoshd_                           73         bra.l   _fcoshd_
 74         short   0x0000                             74         short   0x0000
 75         bra.l   _fcoshx_                           75         bra.l   _fcoshx_
 76         short   0x0000                             76         short   0x0000
 77                                                    77 
 78         bra.l   _fetoxs_                           78         bra.l   _fetoxs_
 79         short   0x0000                             79         short   0x0000
 80         bra.l   _fetoxd_                           80         bra.l   _fetoxd_
 81         short   0x0000                             81         short   0x0000
 82         bra.l   _fetoxx_                           82         bra.l   _fetoxx_
 83         short   0x0000                             83         short   0x0000
 84                                                    84 
 85         bra.l   _fetoxm1s_                         85         bra.l   _fetoxm1s_
 86         short   0x0000                             86         short   0x0000
 87         bra.l   _fetoxm1d_                         87         bra.l   _fetoxm1d_
 88         short   0x0000                             88         short   0x0000
 89         bra.l   _fetoxm1x_                         89         bra.l   _fetoxm1x_
 90         short   0x0000                             90         short   0x0000
 91                                                    91 
 92         bra.l   _fgetexps_                         92         bra.l   _fgetexps_
 93         short   0x0000                             93         short   0x0000
 94         bra.l   _fgetexpd_                         94         bra.l   _fgetexpd_
 95         short   0x0000                             95         short   0x0000
 96         bra.l   _fgetexpx_                         96         bra.l   _fgetexpx_
 97         short   0x0000                             97         short   0x0000
 98                                                    98 
 99         bra.l   _fgetmans_                         99         bra.l   _fgetmans_
100         short   0x0000                            100         short   0x0000
101         bra.l   _fgetmand_                        101         bra.l   _fgetmand_
102         short   0x0000                            102         short   0x0000
103         bra.l   _fgetmanx_                        103         bra.l   _fgetmanx_
104         short   0x0000                            104         short   0x0000
105                                                   105 
106         bra.l   _flog10s_                         106         bra.l   _flog10s_
107         short   0x0000                            107         short   0x0000
108         bra.l   _flog10d_                         108         bra.l   _flog10d_
109         short   0x0000                            109         short   0x0000
110         bra.l   _flog10x_                         110         bra.l   _flog10x_
111         short   0x0000                            111         short   0x0000
112                                                   112 
113         bra.l   _flog2s_                          113         bra.l   _flog2s_
114         short   0x0000                            114         short   0x0000
115         bra.l   _flog2d_                          115         bra.l   _flog2d_
116         short   0x0000                            116         short   0x0000
117         bra.l   _flog2x_                          117         bra.l   _flog2x_
118         short   0x0000                            118         short   0x0000
119                                                   119 
120         bra.l   _flogns_                          120         bra.l   _flogns_
121         short   0x0000                            121         short   0x0000
122         bra.l   _flognd_                          122         bra.l   _flognd_
123         short   0x0000                            123         short   0x0000
124         bra.l   _flognx_                          124         bra.l   _flognx_
125         short   0x0000                            125         short   0x0000
126                                                   126 
127         bra.l   _flognp1s_                        127         bra.l   _flognp1s_
128         short   0x0000                            128         short   0x0000
129         bra.l   _flognp1d_                        129         bra.l   _flognp1d_
130         short   0x0000                            130         short   0x0000
131         bra.l   _flognp1x_                        131         bra.l   _flognp1x_
132         short   0x0000                            132         short   0x0000
133                                                   133 
134         bra.l   _fmods_                           134         bra.l   _fmods_
135         short   0x0000                            135         short   0x0000
136         bra.l   _fmodd_                           136         bra.l   _fmodd_
137         short   0x0000                            137         short   0x0000
138         bra.l   _fmodx_                           138         bra.l   _fmodx_
139         short   0x0000                            139         short   0x0000
140                                                   140 
141         bra.l   _frems_                           141         bra.l   _frems_
142         short   0x0000                            142         short   0x0000
143         bra.l   _fremd_                           143         bra.l   _fremd_
144         short   0x0000                            144         short   0x0000
145         bra.l   _fremx_                           145         bra.l   _fremx_
146         short   0x0000                            146         short   0x0000
147                                                   147 
148         bra.l   _fscales_                         148         bra.l   _fscales_
149         short   0x0000                            149         short   0x0000
150         bra.l   _fscaled_                         150         bra.l   _fscaled_
151         short   0x0000                            151         short   0x0000
152         bra.l   _fscalex_                         152         bra.l   _fscalex_
153         short   0x0000                            153         short   0x0000
154                                                   154 
155         bra.l   _fsins_                           155         bra.l   _fsins_
156         short   0x0000                            156         short   0x0000
157         bra.l   _fsind_                           157         bra.l   _fsind_
158         short   0x0000                            158         short   0x0000
159         bra.l   _fsinx_                           159         bra.l   _fsinx_
160         short   0x0000                            160         short   0x0000
161                                                   161 
162         bra.l   _fsincoss_                        162         bra.l   _fsincoss_
163         short   0x0000                            163         short   0x0000
164         bra.l   _fsincosd_                        164         bra.l   _fsincosd_
165         short   0x0000                            165         short   0x0000
166         bra.l   _fsincosx_                        166         bra.l   _fsincosx_
167         short   0x0000                            167         short   0x0000
168                                                   168 
169         bra.l   _fsinhs_                          169         bra.l   _fsinhs_
170         short   0x0000                            170         short   0x0000
171         bra.l   _fsinhd_                          171         bra.l   _fsinhd_
172         short   0x0000                            172         short   0x0000
173         bra.l   _fsinhx_                          173         bra.l   _fsinhx_
174         short   0x0000                            174         short   0x0000
175                                                   175 
176         bra.l   _ftans_                           176         bra.l   _ftans_
177         short   0x0000                            177         short   0x0000
178         bra.l   _ftand_                           178         bra.l   _ftand_
179         short   0x0000                            179         short   0x0000
180         bra.l   _ftanx_                           180         bra.l   _ftanx_
181         short   0x0000                            181         short   0x0000
182                                                   182 
183         bra.l   _ftanhs_                          183         bra.l   _ftanhs_
184         short   0x0000                            184         short   0x0000
185         bra.l   _ftanhd_                          185         bra.l   _ftanhd_
186         short   0x0000                            186         short   0x0000
187         bra.l   _ftanhx_                          187         bra.l   _ftanhx_
188         short   0x0000                            188         short   0x0000
189                                                   189 
190         bra.l   _ftentoxs_                        190         bra.l   _ftentoxs_
191         short   0x0000                            191         short   0x0000
192         bra.l   _ftentoxd_                        192         bra.l   _ftentoxd_
193         short   0x0000                            193         short   0x0000
194         bra.l   _ftentoxx_                        194         bra.l   _ftentoxx_
195         short   0x0000                            195         short   0x0000
196                                                   196 
197         bra.l   _ftwotoxs_                        197         bra.l   _ftwotoxs_
198         short   0x0000                            198         short   0x0000
199         bra.l   _ftwotoxd_                        199         bra.l   _ftwotoxd_
200         short   0x0000                            200         short   0x0000
201         bra.l   _ftwotoxx_                        201         bra.l   _ftwotoxx_
202         short   0x0000                            202         short   0x0000
203                                                   203 
204         bra.l   _fabss_                           204         bra.l   _fabss_
205         short   0x0000                            205         short   0x0000
206         bra.l   _fabsd_                           206         bra.l   _fabsd_
207         short   0x0000                            207         short   0x0000
208         bra.l   _fabsx_                           208         bra.l   _fabsx_
209         short   0x0000                            209         short   0x0000
210                                                   210 
211         bra.l   _fadds_                           211         bra.l   _fadds_
212         short   0x0000                            212         short   0x0000
213         bra.l   _faddd_                           213         bra.l   _faddd_
214         short   0x0000                            214         short   0x0000
215         bra.l   _faddx_                           215         bra.l   _faddx_
216         short   0x0000                            216         short   0x0000
217                                                   217 
218         bra.l   _fdivs_                           218         bra.l   _fdivs_
219         short   0x0000                            219         short   0x0000
220         bra.l   _fdivd_                           220         bra.l   _fdivd_
221         short   0x0000                            221         short   0x0000
222         bra.l   _fdivx_                           222         bra.l   _fdivx_
223         short   0x0000                            223         short   0x0000
224                                                   224 
225         bra.l   _fints_                           225         bra.l   _fints_
226         short   0x0000                            226         short   0x0000
227         bra.l   _fintd_                           227         bra.l   _fintd_
228         short   0x0000                            228         short   0x0000
229         bra.l   _fintx_                           229         bra.l   _fintx_
230         short   0x0000                            230         short   0x0000
231                                                   231 
232         bra.l   _fintrzs_                         232         bra.l   _fintrzs_
233         short   0x0000                            233         short   0x0000
234         bra.l   _fintrzd_                         234         bra.l   _fintrzd_
235         short   0x0000                            235         short   0x0000
236         bra.l   _fintrzx_                         236         bra.l   _fintrzx_
237         short   0x0000                            237         short   0x0000
238                                                   238 
239         bra.l   _fmuls_                           239         bra.l   _fmuls_
240         short   0x0000                            240         short   0x0000
241         bra.l   _fmuld_                           241         bra.l   _fmuld_
242         short   0x0000                            242         short   0x0000
243         bra.l   _fmulx_                           243         bra.l   _fmulx_
244         short   0x0000                            244         short   0x0000
245                                                   245 
246         bra.l   _fnegs_                           246         bra.l   _fnegs_
247         short   0x0000                            247         short   0x0000
248         bra.l   _fnegd_                           248         bra.l   _fnegd_
249         short   0x0000                            249         short   0x0000
250         bra.l   _fnegx_                           250         bra.l   _fnegx_
251         short   0x0000                            251         short   0x0000
252                                                   252 
253         bra.l   _fsqrts_                          253         bra.l   _fsqrts_
254         short   0x0000                            254         short   0x0000
255         bra.l   _fsqrtd_                          255         bra.l   _fsqrtd_
256         short   0x0000                            256         short   0x0000
257         bra.l   _fsqrtx_                          257         bra.l   _fsqrtx_
258         short   0x0000                            258         short   0x0000
259                                                   259 
260         bra.l   _fsubs_                           260         bra.l   _fsubs_
261         short   0x0000                            261         short   0x0000
262         bra.l   _fsubd_                           262         bra.l   _fsubd_
263         short   0x0000                            263         short   0x0000
264         bra.l   _fsubx_                           264         bra.l   _fsubx_
265         short   0x0000                            265         short   0x0000
266                                                   266 
267 # leave room for future possible additions        267 # leave room for future possible additions
268         align   0x400                             268         align   0x400
269                                                   269 
270 #                                                 270 #
271 # This file contains a set of define statement    271 # This file contains a set of define statements for constants
272 # in order to promote readability within the c    272 # in order to promote readability within the corecode itself.
273 #                                                 273 #
274                                                   274 
275 set LOCAL_SIZE,         192                       275 set LOCAL_SIZE,         192                     # stack frame size(bytes)
276 set LV,                 -LOCAL_SIZE               276 set LV,                 -LOCAL_SIZE             # stack offset
277                                                   277 
278 set EXC_SR,             0x4                       278 set EXC_SR,             0x4                     # stack status register
279 set EXC_PC,             0x6                       279 set EXC_PC,             0x6                     # stack pc
280 set EXC_VOFF,           0xa                       280 set EXC_VOFF,           0xa                     # stacked vector offset
281 set EXC_EA,             0xc                       281 set EXC_EA,             0xc                     # stacked <ea>
282                                                   282 
283 set EXC_FP,             0x0                       283 set EXC_FP,             0x0                     # frame pointer
284                                                   284 
285 set EXC_AREGS,          -68                       285 set EXC_AREGS,          -68                     # offset of all address regs
286 set EXC_DREGS,          -100                      286 set EXC_DREGS,          -100                    # offset of all data regs
287 set EXC_FPREGS,         -36                       287 set EXC_FPREGS,         -36                     # offset of all fp regs
288                                                   288 
289 set EXC_A7,             EXC_AREGS+(7*4)           289 set EXC_A7,             EXC_AREGS+(7*4)         # offset of saved a7
290 set OLD_A7,             EXC_AREGS+(6*4)           290 set OLD_A7,             EXC_AREGS+(6*4)         # extra copy of saved a7
291 set EXC_A6,             EXC_AREGS+(6*4)           291 set EXC_A6,             EXC_AREGS+(6*4)         # offset of saved a6
292 set EXC_A5,             EXC_AREGS+(5*4)           292 set EXC_A5,             EXC_AREGS+(5*4)
293 set EXC_A4,             EXC_AREGS+(4*4)           293 set EXC_A4,             EXC_AREGS+(4*4)
294 set EXC_A3,             EXC_AREGS+(3*4)           294 set EXC_A3,             EXC_AREGS+(3*4)
295 set EXC_A2,             EXC_AREGS+(2*4)           295 set EXC_A2,             EXC_AREGS+(2*4)
296 set EXC_A1,             EXC_AREGS+(1*4)           296 set EXC_A1,             EXC_AREGS+(1*4)
297 set EXC_A0,             EXC_AREGS+(0*4)           297 set EXC_A0,             EXC_AREGS+(0*4)
298 set EXC_D7,             EXC_DREGS+(7*4)           298 set EXC_D7,             EXC_DREGS+(7*4)
299 set EXC_D6,             EXC_DREGS+(6*4)           299 set EXC_D6,             EXC_DREGS+(6*4)
300 set EXC_D5,             EXC_DREGS+(5*4)           300 set EXC_D5,             EXC_DREGS+(5*4)
301 set EXC_D4,             EXC_DREGS+(4*4)           301 set EXC_D4,             EXC_DREGS+(4*4)
302 set EXC_D3,             EXC_DREGS+(3*4)           302 set EXC_D3,             EXC_DREGS+(3*4)
303 set EXC_D2,             EXC_DREGS+(2*4)           303 set EXC_D2,             EXC_DREGS+(2*4)
304 set EXC_D1,             EXC_DREGS+(1*4)           304 set EXC_D1,             EXC_DREGS+(1*4)
305 set EXC_D0,             EXC_DREGS+(0*4)           305 set EXC_D0,             EXC_DREGS+(0*4)
306                                                   306 
307 set EXC_FP0,            EXC_FPREGS+(0*12)         307 set EXC_FP0,            EXC_FPREGS+(0*12)       # offset of saved fp0
308 set EXC_FP1,            EXC_FPREGS+(1*12)         308 set EXC_FP1,            EXC_FPREGS+(1*12)       # offset of saved fp1
309 set EXC_FP2,            EXC_FPREGS+(2*12)         309 set EXC_FP2,            EXC_FPREGS+(2*12)       # offset of saved fp2 (not used)
310                                                   310 
311 set FP_SCR1,            LV+80                     311 set FP_SCR1,            LV+80                   # fp scratch 1
312 set FP_SCR1_EX,         FP_SCR1+0                 312 set FP_SCR1_EX,         FP_SCR1+0
313 set FP_SCR1_SGN,        FP_SCR1+2                 313 set FP_SCR1_SGN,        FP_SCR1+2
314 set FP_SCR1_HI,         FP_SCR1+4                 314 set FP_SCR1_HI,         FP_SCR1+4
315 set FP_SCR1_LO,         FP_SCR1+8                 315 set FP_SCR1_LO,         FP_SCR1+8
316                                                   316 
317 set FP_SCR0,            LV+68                     317 set FP_SCR0,            LV+68                   # fp scratch 0
318 set FP_SCR0_EX,         FP_SCR0+0                 318 set FP_SCR0_EX,         FP_SCR0+0
319 set FP_SCR0_SGN,        FP_SCR0+2                 319 set FP_SCR0_SGN,        FP_SCR0+2
320 set FP_SCR0_HI,         FP_SCR0+4                 320 set FP_SCR0_HI,         FP_SCR0+4
321 set FP_SCR0_LO,         FP_SCR0+8                 321 set FP_SCR0_LO,         FP_SCR0+8
322                                                   322 
323 set FP_DST,             LV+56                     323 set FP_DST,             LV+56                   # fp destination operand
324 set FP_DST_EX,          FP_DST+0                  324 set FP_DST_EX,          FP_DST+0
325 set FP_DST_SGN,         FP_DST+2                  325 set FP_DST_SGN,         FP_DST+2
326 set FP_DST_HI,          FP_DST+4                  326 set FP_DST_HI,          FP_DST+4
327 set FP_DST_LO,          FP_DST+8                  327 set FP_DST_LO,          FP_DST+8
328                                                   328 
329 set FP_SRC,             LV+44                     329 set FP_SRC,             LV+44                   # fp source operand
330 set FP_SRC_EX,          FP_SRC+0                  330 set FP_SRC_EX,          FP_SRC+0
331 set FP_SRC_SGN,         FP_SRC+2                  331 set FP_SRC_SGN,         FP_SRC+2
332 set FP_SRC_HI,          FP_SRC+4                  332 set FP_SRC_HI,          FP_SRC+4
333 set FP_SRC_LO,          FP_SRC+8                  333 set FP_SRC_LO,          FP_SRC+8
334                                                   334 
335 set USER_FPIAR,         LV+40                     335 set USER_FPIAR,         LV+40                   # FP instr address register
336                                                   336 
337 set USER_FPSR,          LV+36                     337 set USER_FPSR,          LV+36                   # FP status register
338 set FPSR_CC,            USER_FPSR+0               338 set FPSR_CC,            USER_FPSR+0             # FPSR condition codes
339 set FPSR_QBYTE,         USER_FPSR+1               339 set FPSR_QBYTE,         USER_FPSR+1             # FPSR qoutient byte
340 set FPSR_EXCEPT,        USER_FPSR+2               340 set FPSR_EXCEPT,        USER_FPSR+2             # FPSR exception status byte
341 set FPSR_AEXCEPT,       USER_FPSR+3               341 set FPSR_AEXCEPT,       USER_FPSR+3             # FPSR accrued exception byte
342                                                   342 
343 set USER_FPCR,          LV+32                     343 set USER_FPCR,          LV+32                   # FP control register
344 set FPCR_ENABLE,        USER_FPCR+2               344 set FPCR_ENABLE,        USER_FPCR+2             # FPCR exception enable
345 set FPCR_MODE,          USER_FPCR+3               345 set FPCR_MODE,          USER_FPCR+3             # FPCR rounding mode control
346                                                   346 
347 set L_SCR3,             LV+28                     347 set L_SCR3,             LV+28                   # integer scratch 3
348 set L_SCR2,             LV+24                     348 set L_SCR2,             LV+24                   # integer scratch 2
349 set L_SCR1,             LV+20                     349 set L_SCR1,             LV+20                   # integer scratch 1
350                                                   350 
351 set STORE_FLG,          LV+19                     351 set STORE_FLG,          LV+19                   # flag: operand store (ie. not fcmp/ftst)
352                                                   352 
353 set EXC_TEMP2,          LV+24                     353 set EXC_TEMP2,          LV+24                   # temporary space
354 set EXC_TEMP,           LV+16                     354 set EXC_TEMP,           LV+16                   # temporary space
355                                                   355 
356 set DTAG,               LV+15                     356 set DTAG,               LV+15                   # destination operand type
357 set STAG,               LV+14                     357 set STAG,               LV+14                   # source operand type
358                                                   358 
359 set SPCOND_FLG,         LV+10                     359 set SPCOND_FLG,         LV+10                   # flag: special case (see below)
360                                                   360 
361 set EXC_CC,             LV+8                      361 set EXC_CC,             LV+8                    # saved condition codes
362 set EXC_EXTWPTR,        LV+4                      362 set EXC_EXTWPTR,        LV+4                    # saved current PC (active)
363 set EXC_EXTWORD,        LV+2                      363 set EXC_EXTWORD,        LV+2                    # saved extension word
364 set EXC_CMDREG,         LV+2                      364 set EXC_CMDREG,         LV+2                    # saved extension word
365 set EXC_OPWORD,         LV+0                      365 set EXC_OPWORD,         LV+0                    # saved operation word
366                                                   366 
367 ################################                  367 ################################
368                                                   368 
369 # Helpful macros                                  369 # Helpful macros
370                                                   370 
371 set FTEMP,              0                         371 set FTEMP,              0                       # offsets within an
372 set FTEMP_EX,           0                         372 set FTEMP_EX,           0                       # extended precision
373 set FTEMP_SGN,          2                         373 set FTEMP_SGN,          2                       # value saved in memory.
374 set FTEMP_HI,           4                         374 set FTEMP_HI,           4
375 set FTEMP_LO,           8                         375 set FTEMP_LO,           8
376 set FTEMP_GRS,          12                        376 set FTEMP_GRS,          12
377                                                   377 
378 set LOCAL,              0                         378 set LOCAL,              0                       # offsets within an
379 set LOCAL_EX,           0                         379 set LOCAL_EX,           0                       # extended precision
380 set LOCAL_SGN,          2                         380 set LOCAL_SGN,          2                       # value saved in memory.
381 set LOCAL_HI,           4                         381 set LOCAL_HI,           4
382 set LOCAL_LO,           8                         382 set LOCAL_LO,           8
383 set LOCAL_GRS,          12                        383 set LOCAL_GRS,          12
384                                                   384 
385 set DST,                0                         385 set DST,                0                       # offsets within an
386 set DST_EX,             0                         386 set DST_EX,             0                       # extended precision
387 set DST_HI,             4                         387 set DST_HI,             4                       # value saved in memory.
388 set DST_LO,             8                         388 set DST_LO,             8
389                                                   389 
390 set SRC,                0                         390 set SRC,                0                       # offsets within an
391 set SRC_EX,             0                         391 set SRC_EX,             0                       # extended precision
392 set SRC_HI,             4                         392 set SRC_HI,             4                       # value saved in memory.
393 set SRC_LO,             8                         393 set SRC_LO,             8
394                                                   394 
395 set SGL_LO,             0x3f81                    395 set SGL_LO,             0x3f81                  # min sgl prec exponent
396 set SGL_HI,             0x407e                    396 set SGL_HI,             0x407e                  # max sgl prec exponent
397 set DBL_LO,             0x3c01                    397 set DBL_LO,             0x3c01                  # min dbl prec exponent
398 set DBL_HI,             0x43fe                    398 set DBL_HI,             0x43fe                  # max dbl prec exponent
399 set EXT_LO,             0x0                       399 set EXT_LO,             0x0                     # min ext prec exponent
400 set EXT_HI,             0x7ffe                    400 set EXT_HI,             0x7ffe                  # max ext prec exponent
401                                                   401 
402 set EXT_BIAS,           0x3fff                    402 set EXT_BIAS,           0x3fff                  # extended precision bias
403 set SGL_BIAS,           0x007f                    403 set SGL_BIAS,           0x007f                  # single precision bias
404 set DBL_BIAS,           0x03ff                    404 set DBL_BIAS,           0x03ff                  # double precision bias
405                                                   405 
406 set NORM,               0x00                      406 set NORM,               0x00                    # operand type for STAG/DTAG
407 set ZERO,               0x01                      407 set ZERO,               0x01                    # operand type for STAG/DTAG
408 set INF,                0x02                      408 set INF,                0x02                    # operand type for STAG/DTAG
409 set QNAN,               0x03                      409 set QNAN,               0x03                    # operand type for STAG/DTAG
410 set DENORM,             0x04                      410 set DENORM,             0x04                    # operand type for STAG/DTAG
411 set SNAN,               0x05                      411 set SNAN,               0x05                    # operand type for STAG/DTAG
412 set UNNORM,             0x06                      412 set UNNORM,             0x06                    # operand type for STAG/DTAG
413                                                   413 
414 ##################                                414 ##################
415 # FPSR/FPCR bits #                                415 # FPSR/FPCR bits #
416 ##################                                416 ##################
417 set neg_bit,            0x3                       417 set neg_bit,            0x3                     # negative result
418 set z_bit,              0x2                       418 set z_bit,              0x2                     # zero result
419 set inf_bit,            0x1                       419 set inf_bit,            0x1                     # infinite result
420 set nan_bit,            0x0                       420 set nan_bit,            0x0                     # NAN result
421                                                   421 
422 set q_sn_bit,           0x7                       422 set q_sn_bit,           0x7                     # sign bit of quotient byte
423                                                   423 
424 set bsun_bit,           7                         424 set bsun_bit,           7                       # branch on unordered
425 set snan_bit,           6                         425 set snan_bit,           6                       # signalling NAN
426 set operr_bit,          5                         426 set operr_bit,          5                       # operand error
427 set ovfl_bit,           4                         427 set ovfl_bit,           4                       # overflow
428 set unfl_bit,           3                         428 set unfl_bit,           3                       # underflow
429 set dz_bit,             2                         429 set dz_bit,             2                       # divide by zero
430 set inex2_bit,          1                         430 set inex2_bit,          1                       # inexact result 2
431 set inex1_bit,          0                         431 set inex1_bit,          0                       # inexact result 1
432                                                   432 
433 set aiop_bit,           7                         433 set aiop_bit,           7                       # accrued inexact operation bit
434 set aovfl_bit,          6                         434 set aovfl_bit,          6                       # accrued overflow bit
435 set aunfl_bit,          5                         435 set aunfl_bit,          5                       # accrued underflow bit
436 set adz_bit,            4                         436 set adz_bit,            4                       # accrued dz bit
437 set ainex_bit,          3                         437 set ainex_bit,          3                       # accrued inexact bit
438                                                   438 
439 #############################                     439 #############################
440 # FPSR individual bit masks #                     440 # FPSR individual bit masks #
441 #############################                     441 #############################
442 set neg_mask,           0x08000000                442 set neg_mask,           0x08000000              # negative bit mask (lw)
443 set inf_mask,           0x02000000                443 set inf_mask,           0x02000000              # infinity bit mask (lw)
444 set z_mask,             0x04000000                444 set z_mask,             0x04000000              # zero bit mask (lw)
445 set nan_mask,           0x01000000                445 set nan_mask,           0x01000000              # nan bit mask (lw)
446                                                   446 
447 set neg_bmask,          0x08                      447 set neg_bmask,          0x08                    # negative bit mask (byte)
448 set inf_bmask,          0x02                      448 set inf_bmask,          0x02                    # infinity bit mask (byte)
449 set z_bmask,            0x04                      449 set z_bmask,            0x04                    # zero bit mask (byte)
450 set nan_bmask,          0x01                      450 set nan_bmask,          0x01                    # nan bit mask (byte)
451                                                   451 
452 set bsun_mask,          0x00008000                452 set bsun_mask,          0x00008000              # bsun exception mask
453 set snan_mask,          0x00004000                453 set snan_mask,          0x00004000              # snan exception mask
454 set operr_mask,         0x00002000                454 set operr_mask,         0x00002000              # operr exception mask
455 set ovfl_mask,          0x00001000                455 set ovfl_mask,          0x00001000              # overflow exception mask
456 set unfl_mask,          0x00000800                456 set unfl_mask,          0x00000800              # underflow exception mask
457 set dz_mask,            0x00000400                457 set dz_mask,            0x00000400              # dz exception mask
458 set inex2_mask,         0x00000200                458 set inex2_mask,         0x00000200              # inex2 exception mask
459 set inex1_mask,         0x00000100                459 set inex1_mask,         0x00000100              # inex1 exception mask
460                                                   460 
461 set aiop_mask,          0x00000080                461 set aiop_mask,          0x00000080              # accrued illegal operation
462 set aovfl_mask,         0x00000040                462 set aovfl_mask,         0x00000040              # accrued overflow
463 set aunfl_mask,         0x00000020                463 set aunfl_mask,         0x00000020              # accrued underflow
464 set adz_mask,           0x00000010                464 set adz_mask,           0x00000010              # accrued divide by zero
465 set ainex_mask,         0x00000008                465 set ainex_mask,         0x00000008              # accrued inexact
466                                                   466 
467 ######################################            467 ######################################
468 # FPSR combinations used in the FPSP #            468 # FPSR combinations used in the FPSP #
469 ######################################            469 ######################################
470 set dzinf_mask,         inf_mask+dz_mask+adz_m    470 set dzinf_mask,         inf_mask+dz_mask+adz_mask
471 set opnan_mask,         nan_mask+operr_mask+ai    471 set opnan_mask,         nan_mask+operr_mask+aiop_mask
472 set nzi_mask,           0x01ffffff                472 set nzi_mask,           0x01ffffff              #clears N, Z, and I
473 set unfinx_mask,        unfl_mask+inex2_mask+a    473 set unfinx_mask,        unfl_mask+inex2_mask+aunfl_mask+ainex_mask
474 set unf2inx_mask,       unfl_mask+inex2_mask+a    474 set unf2inx_mask,       unfl_mask+inex2_mask+ainex_mask
475 set ovfinx_mask,        ovfl_mask+inex2_mask+a    475 set ovfinx_mask,        ovfl_mask+inex2_mask+aovfl_mask+ainex_mask
476 set inx1a_mask,         inex1_mask+ainex_mask     476 set inx1a_mask,         inex1_mask+ainex_mask
477 set inx2a_mask,         inex2_mask+ainex_mask     477 set inx2a_mask,         inex2_mask+ainex_mask
478 set snaniop_mask,       nan_mask+snan_mask+aio    478 set snaniop_mask,       nan_mask+snan_mask+aiop_mask
479 set snaniop2_mask,      snan_mask+aiop_mask       479 set snaniop2_mask,      snan_mask+aiop_mask
480 set naniop_mask,        nan_mask+aiop_mask        480 set naniop_mask,        nan_mask+aiop_mask
481 set neginf_mask,        neg_mask+inf_mask         481 set neginf_mask,        neg_mask+inf_mask
482 set infaiop_mask,       inf_mask+aiop_mask        482 set infaiop_mask,       inf_mask+aiop_mask
483 set negz_mask,          neg_mask+z_mask           483 set negz_mask,          neg_mask+z_mask
484 set opaop_mask,         operr_mask+aiop_mask      484 set opaop_mask,         operr_mask+aiop_mask
485 set unfl_inx_mask,      unfl_mask+aunfl_mask+a    485 set unfl_inx_mask,      unfl_mask+aunfl_mask+ainex_mask
486 set ovfl_inx_mask,      ovfl_mask+aovfl_mask+a    486 set ovfl_inx_mask,      ovfl_mask+aovfl_mask+ainex_mask
487                                                   487 
488 #########                                         488 #########
489 # misc. #                                         489 # misc. #
490 #########                                         490 #########
491 set rnd_stky_bit,       29                        491 set rnd_stky_bit,       29                      # stky bit pos in longword
492                                                   492 
493 set sign_bit,           0x7                       493 set sign_bit,           0x7                     # sign bit
494 set signan_bit,         0x6                       494 set signan_bit,         0x6                     # signalling nan bit
495                                                   495 
496 set sgl_thresh,         0x3f81                    496 set sgl_thresh,         0x3f81                  # minimum sgl exponent
497 set dbl_thresh,         0x3c01                    497 set dbl_thresh,         0x3c01                  # minimum dbl exponent
498                                                   498 
499 set x_mode,             0x0                       499 set x_mode,             0x0                     # extended precision
500 set s_mode,             0x4                       500 set s_mode,             0x4                     # single precision
501 set d_mode,             0x8                       501 set d_mode,             0x8                     # double precision
502                                                   502 
503 set rn_mode,            0x0                       503 set rn_mode,            0x0                     # round-to-nearest
504 set rz_mode,            0x1                       504 set rz_mode,            0x1                     # round-to-zero
505 set rm_mode,            0x2                       505 set rm_mode,            0x2                     # round-tp-minus-infinity
506 set rp_mode,            0x3                       506 set rp_mode,            0x3                     # round-to-plus-infinity
507                                                   507 
508 set mantissalen,        64                        508 set mantissalen,        64                      # length of mantissa in bits
509                                                   509 
510 set BYTE,               1                         510 set BYTE,               1                       # len(byte) == 1 byte
511 set WORD,               2                         511 set WORD,               2                       # len(word) == 2 bytes
512 set LONG,               4                         512 set LONG,               4                       # len(longword) == 2 bytes
513                                                   513 
514 set BSUN_VEC,           0xc0                      514 set BSUN_VEC,           0xc0                    # bsun    vector offset
515 set INEX_VEC,           0xc4                      515 set INEX_VEC,           0xc4                    # inexact vector offset
516 set DZ_VEC,             0xc8                      516 set DZ_VEC,             0xc8                    # dz      vector offset
517 set UNFL_VEC,           0xcc                      517 set UNFL_VEC,           0xcc                    # unfl    vector offset
518 set OPERR_VEC,          0xd0                      518 set OPERR_VEC,          0xd0                    # operr   vector offset
519 set OVFL_VEC,           0xd4                      519 set OVFL_VEC,           0xd4                    # ovfl    vector offset
520 set SNAN_VEC,           0xd8                      520 set SNAN_VEC,           0xd8                    # snan    vector offset
521                                                   521 
522 ###########################                       522 ###########################
523 # SPecial CONDition FLaGs #                       523 # SPecial CONDition FLaGs #
524 ###########################                       524 ###########################
525 set ftrapcc_flg,        0x01                      525 set ftrapcc_flg,        0x01                    # flag bit: ftrapcc exception
526 set fbsun_flg,          0x02                      526 set fbsun_flg,          0x02                    # flag bit: bsun exception
527 set mia7_flg,           0x04                      527 set mia7_flg,           0x04                    # flag bit: (a7)+ <ea>
528 set mda7_flg,           0x08                      528 set mda7_flg,           0x08                    # flag bit: -(a7) <ea>
529 set fmovm_flg,          0x40                      529 set fmovm_flg,          0x40                    # flag bit: fmovm instruction
530 set immed_flg,          0x80                      530 set immed_flg,          0x80                    # flag bit: &<data> <ea>
531                                                   531 
532 set ftrapcc_bit,        0x0                       532 set ftrapcc_bit,        0x0
533 set fbsun_bit,          0x1                       533 set fbsun_bit,          0x1
534 set mia7_bit,           0x2                       534 set mia7_bit,           0x2
535 set mda7_bit,           0x3                       535 set mda7_bit,           0x3
536 set immed_bit,          0x7                       536 set immed_bit,          0x7
537                                                   537 
538 ##################################                538 ##################################
539 # TRANSCENDENTAL "LAST-OP" FLAGS #                539 # TRANSCENDENTAL "LAST-OP" FLAGS #
540 ##################################                540 ##################################
541 set FMUL_OP,            0x0                       541 set FMUL_OP,            0x0                     # fmul instr performed last
542 set FDIV_OP,            0x1                       542 set FDIV_OP,            0x1                     # fdiv performed last
543 set FADD_OP,            0x2                       543 set FADD_OP,            0x2                     # fadd performed last
544 set FMOV_OP,            0x3                       544 set FMOV_OP,            0x3                     # fmov performed last
545                                                   545 
546 #############                                     546 #############
547 # CONSTANTS #                                     547 # CONSTANTS #
548 #############                                     548 #############
549 T1:     long            0x40C62D38,0xD3D64634     549 T1:     long            0x40C62D38,0xD3D64634   # 16381 LOG2 LEAD
550 T2:     long            0x3D6F90AE,0xB1E75CC7     550 T2:     long            0x3D6F90AE,0xB1E75CC7   # 16381 LOG2 TRAIL
551                                                   551 
552 PI:     long            0x40000000,0xC90FDAA2,    552 PI:     long            0x40000000,0xC90FDAA2,0x2168C235,0x00000000
553 PIBY2:  long            0x3FFF0000,0xC90FDAA2,    553 PIBY2:  long            0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
554                                                   554 
555 TWOBYPI:                                          555 TWOBYPI:
556         long            0x3FE45F30,0x6DC9C883     556         long            0x3FE45F30,0x6DC9C883
557                                                   557 
558 ##############################################    558 #########################################################################
559 # MONADIC TEMPLATE                                559 # MONADIC TEMPLATE                                                      #
560 ##############################################    560 #########################################################################
561         global          _fsins_                   561         global          _fsins_
562 _fsins_:                                          562 _fsins_:
563         link            %a6,&-LOCAL_SIZE          563         link            %a6,&-LOCAL_SIZE
564                                                   564 
565         movm.l          &0x0303,EXC_DREGS(%a6)    565         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
566         fmovm.l         %fpcr,%fpsr,USER_FPCR(    566         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
567         fmovm.x         &0xc0,EXC_FP0(%a6)        567         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
568                                                   568 
569         fmov.l          &0x0,%fpcr                569         fmov.l          &0x0,%fpcr              # zero FPCR
570                                                   570 
571 #                                                 571 #
572 #       copy, convert, and tag input argument     572 #       copy, convert, and tag input argument
573 #                                                 573 #
574         fmov.s          0x8(%a6),%fp0             574         fmov.s          0x8(%a6),%fp0           # load sgl input
575         fmov.x          %fp0,FP_SRC(%a6)          575         fmov.x          %fp0,FP_SRC(%a6)
576         lea             FP_SRC(%a6),%a0           576         lea             FP_SRC(%a6),%a0
577         bsr.l           tag                       577         bsr.l           tag                     # fetch operand type
578         mov.b           %d0,STAG(%a6)             578         mov.b           %d0,STAG(%a6)
579         mov.b           %d0,%d1                   579         mov.b           %d0,%d1
580                                                   580 
581         andi.l          &0x00ff00ff,USER_FPSR(    581         andi.l          &0x00ff00ff,USER_FPSR(%a6)
582                                                   582 
583         clr.l           %d0                       583         clr.l           %d0
584         mov.b           FPCR_MODE(%a6),%d0        584         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
585                                                   585 
586         tst.b           %d1                       586         tst.b           %d1
587         bne.b           _L0_2s                    587         bne.b           _L0_2s
588         bsr.l           ssin                      588         bsr.l           ssin                    # operand is a NORM
589         bra.b           _L0_6s                    589         bra.b           _L0_6s
590 _L0_2s:                                           590 _L0_2s:
591         cmpi.b          %d1,&ZERO                 591         cmpi.b          %d1,&ZERO               # is operand a ZERO?
592         bne.b           _L0_3s                    592         bne.b           _L0_3s                  # no
593         bsr.l           src_zero                  593         bsr.l           src_zero                        # yes
594         bra.b           _L0_6s                    594         bra.b           _L0_6s
595 _L0_3s:                                           595 _L0_3s:
596         cmpi.b          %d1,&INF                  596         cmpi.b          %d1,&INF                # is operand an INF?
597         bne.b           _L0_4s                    597         bne.b           _L0_4s                  # no
598         bsr.l           t_operr                   598         bsr.l           t_operr                 # yes
599         bra.b           _L0_6s                    599         bra.b           _L0_6s
600 _L0_4s:                                           600 _L0_4s:
601         cmpi.b          %d1,&QNAN                 601         cmpi.b          %d1,&QNAN               # is operand a QNAN?
602         bne.b           _L0_5s                    602         bne.b           _L0_5s                  # no
603         bsr.l           src_qnan                  603         bsr.l           src_qnan                        # yes
604         bra.b           _L0_6s                    604         bra.b           _L0_6s
605 _L0_5s:                                           605 _L0_5s:
606         bsr.l           ssind                     606         bsr.l           ssind                   # operand is a DENORM
607 _L0_6s:                                           607 _L0_6s:
608                                                   608 
609 #                                                 609 #
610 #       Result is now in FP0                      610 #       Result is now in FP0
611 #                                                 611 #
612         movm.l          EXC_DREGS(%a6),&0x0303    612         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
613         fmovm.l         USER_FPCR(%a6),%fpcr,%    613         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
614         fmovm.x         EXC_FP1(%a6),&0x40        614         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
615         unlk            %a6                       615         unlk            %a6
616         rts                                       616         rts
617                                                   617 
618         global          _fsind_                   618         global          _fsind_
619 _fsind_:                                          619 _fsind_:
620         link            %a6,&-LOCAL_SIZE          620         link            %a6,&-LOCAL_SIZE
621                                                   621 
622         movm.l          &0x0303,EXC_DREGS(%a6)    622         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
623         fmovm.l         %fpcr,%fpsr,USER_FPCR(    623         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
624         fmovm.x         &0xc0,EXC_FP0(%a6)        624         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
625                                                   625 
626         fmov.l          &0x0,%fpcr                626         fmov.l          &0x0,%fpcr              # zero FPCR
627                                                   627 
628 #                                                 628 #
629 #       copy, convert, and tag input argument     629 #       copy, convert, and tag input argument
630 #                                                 630 #
631         fmov.d          0x8(%a6),%fp0             631         fmov.d          0x8(%a6),%fp0           # load dbl input
632         fmov.x          %fp0,FP_SRC(%a6)          632         fmov.x          %fp0,FP_SRC(%a6)
633         lea             FP_SRC(%a6),%a0           633         lea             FP_SRC(%a6),%a0
634         bsr.l           tag                       634         bsr.l           tag                     # fetch operand type
635         mov.b           %d0,STAG(%a6)             635         mov.b           %d0,STAG(%a6)
636         mov.b           %d0,%d1                   636         mov.b           %d0,%d1
637                                                   637 
638         andi.l          &0x00ff00ff,USER_FPSR(    638         andi.l          &0x00ff00ff,USER_FPSR(%a6)
639                                                   639 
640         clr.l           %d0                       640         clr.l           %d0
641         mov.b           FPCR_MODE(%a6),%d0        641         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
642                                                   642 
643         mov.b           %d1,STAG(%a6)             643         mov.b           %d1,STAG(%a6)
644         tst.b           %d1                       644         tst.b           %d1
645         bne.b           _L0_2d                    645         bne.b           _L0_2d
646         bsr.l           ssin                      646         bsr.l           ssin                    # operand is a NORM
647         bra.b           _L0_6d                    647         bra.b           _L0_6d
648 _L0_2d:                                           648 _L0_2d:
649         cmpi.b          %d1,&ZERO                 649         cmpi.b          %d1,&ZERO               # is operand a ZERO?
650         bne.b           _L0_3d                    650         bne.b           _L0_3d                  # no
651         bsr.l           src_zero                  651         bsr.l           src_zero                        # yes
652         bra.b           _L0_6d                    652         bra.b           _L0_6d
653 _L0_3d:                                           653 _L0_3d:
654         cmpi.b          %d1,&INF                  654         cmpi.b          %d1,&INF                # is operand an INF?
655         bne.b           _L0_4d                    655         bne.b           _L0_4d                  # no
656         bsr.l           t_operr                   656         bsr.l           t_operr                 # yes
657         bra.b           _L0_6d                    657         bra.b           _L0_6d
658 _L0_4d:                                           658 _L0_4d:
659         cmpi.b          %d1,&QNAN                 659         cmpi.b          %d1,&QNAN               # is operand a QNAN?
660         bne.b           _L0_5d                    660         bne.b           _L0_5d                  # no
661         bsr.l           src_qnan                  661         bsr.l           src_qnan                        # yes
662         bra.b           _L0_6d                    662         bra.b           _L0_6d
663 _L0_5d:                                           663 _L0_5d:
664         bsr.l           ssind                     664         bsr.l           ssind                   # operand is a DENORM
665 _L0_6d:                                           665 _L0_6d:
666                                                   666 
667 #                                                 667 #
668 #       Result is now in FP0                      668 #       Result is now in FP0
669 #                                                 669 #
670         movm.l          EXC_DREGS(%a6),&0x0303    670         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
671         fmovm.l         USER_FPCR(%a6),%fpcr,%    671         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
672         fmovm.x         EXC_FP1(%a6),&0x40        672         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
673         unlk            %a6                       673         unlk            %a6
674         rts                                       674         rts
675                                                   675 
676         global          _fsinx_                   676         global          _fsinx_
677 _fsinx_:                                          677 _fsinx_:
678         link            %a6,&-LOCAL_SIZE          678         link            %a6,&-LOCAL_SIZE
679                                                   679 
680         movm.l          &0x0303,EXC_DREGS(%a6)    680         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
681         fmovm.l         %fpcr,%fpsr,USER_FPCR(    681         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
682         fmovm.x         &0xc0,EXC_FP0(%a6)        682         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
683                                                   683 
684         fmov.l          &0x0,%fpcr                684         fmov.l          &0x0,%fpcr              # zero FPCR
685                                                   685 
686 #                                                 686 #
687 #       copy, convert, and tag input argument     687 #       copy, convert, and tag input argument
688 #                                                 688 #
689         lea             FP_SRC(%a6),%a0           689         lea             FP_SRC(%a6),%a0
690         mov.l           0x8+0x0(%a6),0x0(%a0)     690         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
691         mov.l           0x8+0x4(%a6),0x4(%a0)     691         mov.l           0x8+0x4(%a6),0x4(%a0)
692         mov.l           0x8+0x8(%a6),0x8(%a0)     692         mov.l           0x8+0x8(%a6),0x8(%a0)
693         bsr.l           tag                       693         bsr.l           tag                     # fetch operand type
694         mov.b           %d0,STAG(%a6)             694         mov.b           %d0,STAG(%a6)
695         mov.b           %d0,%d1                   695         mov.b           %d0,%d1
696                                                   696 
697         andi.l          &0x00ff00ff,USER_FPSR(    697         andi.l          &0x00ff00ff,USER_FPSR(%a6)
698                                                   698 
699         clr.l           %d0                       699         clr.l           %d0
700         mov.b           FPCR_MODE(%a6),%d0        700         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
701                                                   701 
702         tst.b           %d1                       702         tst.b           %d1
703         bne.b           _L0_2x                    703         bne.b           _L0_2x
704         bsr.l           ssin                      704         bsr.l           ssin                    # operand is a NORM
705         bra.b           _L0_6x                    705         bra.b           _L0_6x
706 _L0_2x:                                           706 _L0_2x:
707         cmpi.b          %d1,&ZERO                 707         cmpi.b          %d1,&ZERO               # is operand a ZERO?
708         bne.b           _L0_3x                    708         bne.b           _L0_3x                  # no
709         bsr.l           src_zero                  709         bsr.l           src_zero                        # yes
710         bra.b           _L0_6x                    710         bra.b           _L0_6x
711 _L0_3x:                                           711 _L0_3x:
712         cmpi.b          %d1,&INF                  712         cmpi.b          %d1,&INF                # is operand an INF?
713         bne.b           _L0_4x                    713         bne.b           _L0_4x                  # no
714         bsr.l           t_operr                   714         bsr.l           t_operr                 # yes
715         bra.b           _L0_6x                    715         bra.b           _L0_6x
716 _L0_4x:                                           716 _L0_4x:
717         cmpi.b          %d1,&QNAN                 717         cmpi.b          %d1,&QNAN               # is operand a QNAN?
718         bne.b           _L0_5x                    718         bne.b           _L0_5x                  # no
719         bsr.l           src_qnan                  719         bsr.l           src_qnan                        # yes
720         bra.b           _L0_6x                    720         bra.b           _L0_6x
721 _L0_5x:                                           721 _L0_5x:
722         bsr.l           ssind                     722         bsr.l           ssind                   # operand is a DENORM
723 _L0_6x:                                           723 _L0_6x:
724                                                   724 
725 #                                                 725 #
726 #       Result is now in FP0                      726 #       Result is now in FP0
727 #                                                 727 #
728         movm.l          EXC_DREGS(%a6),&0x0303    728         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
729         fmovm.l         USER_FPCR(%a6),%fpcr,%    729         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
730         fmovm.x         EXC_FP1(%a6),&0x40        730         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
731         unlk            %a6                       731         unlk            %a6
732         rts                                       732         rts
733                                                   733 
734                                                   734 
735 ##############################################    735 #########################################################################
736 # MONADIC TEMPLATE                                736 # MONADIC TEMPLATE                                                      #
737 ##############################################    737 #########################################################################
738         global          _fcoss_                   738         global          _fcoss_
739 _fcoss_:                                          739 _fcoss_:
740         link            %a6,&-LOCAL_SIZE          740         link            %a6,&-LOCAL_SIZE
741                                                   741 
742         movm.l          &0x0303,EXC_DREGS(%a6)    742         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
743         fmovm.l         %fpcr,%fpsr,USER_FPCR(    743         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
744         fmovm.x         &0xc0,EXC_FP0(%a6)        744         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
745                                                   745 
746         fmov.l          &0x0,%fpcr                746         fmov.l          &0x0,%fpcr              # zero FPCR
747                                                   747 
748 #                                                 748 #
749 #       copy, convert, and tag input argument     749 #       copy, convert, and tag input argument
750 #                                                 750 #
751         fmov.s          0x8(%a6),%fp0             751         fmov.s          0x8(%a6),%fp0           # load sgl input
752         fmov.x          %fp0,FP_SRC(%a6)          752         fmov.x          %fp0,FP_SRC(%a6)
753         lea             FP_SRC(%a6),%a0           753         lea             FP_SRC(%a6),%a0
754         bsr.l           tag                       754         bsr.l           tag                     # fetch operand type
755         mov.b           %d0,STAG(%a6)             755         mov.b           %d0,STAG(%a6)
756         mov.b           %d0,%d1                   756         mov.b           %d0,%d1
757                                                   757 
758         andi.l          &0x00ff00ff,USER_FPSR(    758         andi.l          &0x00ff00ff,USER_FPSR(%a6)
759                                                   759 
760         clr.l           %d0                       760         clr.l           %d0
761         mov.b           FPCR_MODE(%a6),%d0        761         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
762                                                   762 
763         tst.b           %d1                       763         tst.b           %d1
764         bne.b           _L1_2s                    764         bne.b           _L1_2s
765         bsr.l           scos                      765         bsr.l           scos                    # operand is a NORM
766         bra.b           _L1_6s                    766         bra.b           _L1_6s
767 _L1_2s:                                           767 _L1_2s:
768         cmpi.b          %d1,&ZERO                 768         cmpi.b          %d1,&ZERO               # is operand a ZERO?
769         bne.b           _L1_3s                    769         bne.b           _L1_3s                  # no
770         bsr.l           ld_pone                   770         bsr.l           ld_pone                 # yes
771         bra.b           _L1_6s                    771         bra.b           _L1_6s
772 _L1_3s:                                           772 _L1_3s:
773         cmpi.b          %d1,&INF                  773         cmpi.b          %d1,&INF                # is operand an INF?
774         bne.b           _L1_4s                    774         bne.b           _L1_4s                  # no
775         bsr.l           t_operr                   775         bsr.l           t_operr                 # yes
776         bra.b           _L1_6s                    776         bra.b           _L1_6s
777 _L1_4s:                                           777 _L1_4s:
778         cmpi.b          %d1,&QNAN                 778         cmpi.b          %d1,&QNAN               # is operand a QNAN?
779         bne.b           _L1_5s                    779         bne.b           _L1_5s                  # no
780         bsr.l           src_qnan                  780         bsr.l           src_qnan                        # yes
781         bra.b           _L1_6s                    781         bra.b           _L1_6s
782 _L1_5s:                                           782 _L1_5s:
783         bsr.l           scosd                     783         bsr.l           scosd                   # operand is a DENORM
784 _L1_6s:                                           784 _L1_6s:
785                                                   785 
786 #                                                 786 #
787 #       Result is now in FP0                      787 #       Result is now in FP0
788 #                                                 788 #
789         movm.l          EXC_DREGS(%a6),&0x0303    789         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
790         fmovm.l         USER_FPCR(%a6),%fpcr,%    790         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
791         fmovm.x         EXC_FP1(%a6),&0x40        791         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
792         unlk            %a6                       792         unlk            %a6
793         rts                                       793         rts
794                                                   794 
795         global          _fcosd_                   795         global          _fcosd_
796 _fcosd_:                                          796 _fcosd_:
797         link            %a6,&-LOCAL_SIZE          797         link            %a6,&-LOCAL_SIZE
798                                                   798 
799         movm.l          &0x0303,EXC_DREGS(%a6)    799         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
800         fmovm.l         %fpcr,%fpsr,USER_FPCR(    800         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
801         fmovm.x         &0xc0,EXC_FP0(%a6)        801         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
802                                                   802 
803         fmov.l          &0x0,%fpcr                803         fmov.l          &0x0,%fpcr              # zero FPCR
804                                                   804 
805 #                                                 805 #
806 #       copy, convert, and tag input argument     806 #       copy, convert, and tag input argument
807 #                                                 807 #
808         fmov.d          0x8(%a6),%fp0             808         fmov.d          0x8(%a6),%fp0           # load dbl input
809         fmov.x          %fp0,FP_SRC(%a6)          809         fmov.x          %fp0,FP_SRC(%a6)
810         lea             FP_SRC(%a6),%a0           810         lea             FP_SRC(%a6),%a0
811         bsr.l           tag                       811         bsr.l           tag                     # fetch operand type
812         mov.b           %d0,STAG(%a6)             812         mov.b           %d0,STAG(%a6)
813         mov.b           %d0,%d1                   813         mov.b           %d0,%d1
814                                                   814 
815         andi.l          &0x00ff00ff,USER_FPSR(    815         andi.l          &0x00ff00ff,USER_FPSR(%a6)
816                                                   816 
817         clr.l           %d0                       817         clr.l           %d0
818         mov.b           FPCR_MODE(%a6),%d0        818         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
819                                                   819 
820         mov.b           %d1,STAG(%a6)             820         mov.b           %d1,STAG(%a6)
821         tst.b           %d1                       821         tst.b           %d1
822         bne.b           _L1_2d                    822         bne.b           _L1_2d
823         bsr.l           scos                      823         bsr.l           scos                    # operand is a NORM
824         bra.b           _L1_6d                    824         bra.b           _L1_6d
825 _L1_2d:                                           825 _L1_2d:
826         cmpi.b          %d1,&ZERO                 826         cmpi.b          %d1,&ZERO               # is operand a ZERO?
827         bne.b           _L1_3d                    827         bne.b           _L1_3d                  # no
828         bsr.l           ld_pone                   828         bsr.l           ld_pone                 # yes
829         bra.b           _L1_6d                    829         bra.b           _L1_6d
830 _L1_3d:                                           830 _L1_3d:
831         cmpi.b          %d1,&INF                  831         cmpi.b          %d1,&INF                # is operand an INF?
832         bne.b           _L1_4d                    832         bne.b           _L1_4d                  # no
833         bsr.l           t_operr                   833         bsr.l           t_operr                 # yes
834         bra.b           _L1_6d                    834         bra.b           _L1_6d
835 _L1_4d:                                           835 _L1_4d:
836         cmpi.b          %d1,&QNAN                 836         cmpi.b          %d1,&QNAN               # is operand a QNAN?
837         bne.b           _L1_5d                    837         bne.b           _L1_5d                  # no
838         bsr.l           src_qnan                  838         bsr.l           src_qnan                        # yes
839         bra.b           _L1_6d                    839         bra.b           _L1_6d
840 _L1_5d:                                           840 _L1_5d:
841         bsr.l           scosd                     841         bsr.l           scosd                   # operand is a DENORM
842 _L1_6d:                                           842 _L1_6d:
843                                                   843 
844 #                                                 844 #
845 #       Result is now in FP0                      845 #       Result is now in FP0
846 #                                                 846 #
847         movm.l          EXC_DREGS(%a6),&0x0303    847         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
848         fmovm.l         USER_FPCR(%a6),%fpcr,%    848         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
849         fmovm.x         EXC_FP1(%a6),&0x40        849         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
850         unlk            %a6                       850         unlk            %a6
851         rts                                       851         rts
852                                                   852 
853         global          _fcosx_                   853         global          _fcosx_
854 _fcosx_:                                          854 _fcosx_:
855         link            %a6,&-LOCAL_SIZE          855         link            %a6,&-LOCAL_SIZE
856                                                   856 
857         movm.l          &0x0303,EXC_DREGS(%a6)    857         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
858         fmovm.l         %fpcr,%fpsr,USER_FPCR(    858         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
859         fmovm.x         &0xc0,EXC_FP0(%a6)        859         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
860                                                   860 
861         fmov.l          &0x0,%fpcr                861         fmov.l          &0x0,%fpcr              # zero FPCR
862                                                   862 
863 #                                                 863 #
864 #       copy, convert, and tag input argument     864 #       copy, convert, and tag input argument
865 #                                                 865 #
866         lea             FP_SRC(%a6),%a0           866         lea             FP_SRC(%a6),%a0
867         mov.l           0x8+0x0(%a6),0x0(%a0)     867         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
868         mov.l           0x8+0x4(%a6),0x4(%a0)     868         mov.l           0x8+0x4(%a6),0x4(%a0)
869         mov.l           0x8+0x8(%a6),0x8(%a0)     869         mov.l           0x8+0x8(%a6),0x8(%a0)
870         bsr.l           tag                       870         bsr.l           tag                     # fetch operand type
871         mov.b           %d0,STAG(%a6)             871         mov.b           %d0,STAG(%a6)
872         mov.b           %d0,%d1                   872         mov.b           %d0,%d1
873                                                   873 
874         andi.l          &0x00ff00ff,USER_FPSR(    874         andi.l          &0x00ff00ff,USER_FPSR(%a6)
875                                                   875 
876         clr.l           %d0                       876         clr.l           %d0
877         mov.b           FPCR_MODE(%a6),%d0        877         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
878                                                   878 
879         tst.b           %d1                       879         tst.b           %d1
880         bne.b           _L1_2x                    880         bne.b           _L1_2x
881         bsr.l           scos                      881         bsr.l           scos                    # operand is a NORM
882         bra.b           _L1_6x                    882         bra.b           _L1_6x
883 _L1_2x:                                           883 _L1_2x:
884         cmpi.b          %d1,&ZERO                 884         cmpi.b          %d1,&ZERO               # is operand a ZERO?
885         bne.b           _L1_3x                    885         bne.b           _L1_3x                  # no
886         bsr.l           ld_pone                   886         bsr.l           ld_pone                 # yes
887         bra.b           _L1_6x                    887         bra.b           _L1_6x
888 _L1_3x:                                           888 _L1_3x:
889         cmpi.b          %d1,&INF                  889         cmpi.b          %d1,&INF                # is operand an INF?
890         bne.b           _L1_4x                    890         bne.b           _L1_4x                  # no
891         bsr.l           t_operr                   891         bsr.l           t_operr                 # yes
892         bra.b           _L1_6x                    892         bra.b           _L1_6x
893 _L1_4x:                                           893 _L1_4x:
894         cmpi.b          %d1,&QNAN                 894         cmpi.b          %d1,&QNAN               # is operand a QNAN?
895         bne.b           _L1_5x                    895         bne.b           _L1_5x                  # no
896         bsr.l           src_qnan                  896         bsr.l           src_qnan                        # yes
897         bra.b           _L1_6x                    897         bra.b           _L1_6x
898 _L1_5x:                                           898 _L1_5x:
899         bsr.l           scosd                     899         bsr.l           scosd                   # operand is a DENORM
900 _L1_6x:                                           900 _L1_6x:
901                                                   901 
902 #                                                 902 #
903 #       Result is now in FP0                      903 #       Result is now in FP0
904 #                                                 904 #
905         movm.l          EXC_DREGS(%a6),&0x0303    905         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
906         fmovm.l         USER_FPCR(%a6),%fpcr,%    906         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
907         fmovm.x         EXC_FP1(%a6),&0x40        907         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
908         unlk            %a6                       908         unlk            %a6
909         rts                                       909         rts
910                                                   910 
911                                                   911 
912 ##############################################    912 #########################################################################
913 # MONADIC TEMPLATE                                913 # MONADIC TEMPLATE                                                      #
914 ##############################################    914 #########################################################################
915         global          _fsinhs_                  915         global          _fsinhs_
916 _fsinhs_:                                         916 _fsinhs_:
917         link            %a6,&-LOCAL_SIZE          917         link            %a6,&-LOCAL_SIZE
918                                                   918 
919         movm.l          &0x0303,EXC_DREGS(%a6)    919         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
920         fmovm.l         %fpcr,%fpsr,USER_FPCR(    920         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
921         fmovm.x         &0xc0,EXC_FP0(%a6)        921         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
922                                                   922 
923         fmov.l          &0x0,%fpcr                923         fmov.l          &0x0,%fpcr              # zero FPCR
924                                                   924 
925 #                                                 925 #
926 #       copy, convert, and tag input argument     926 #       copy, convert, and tag input argument
927 #                                                 927 #
928         fmov.s          0x8(%a6),%fp0             928         fmov.s          0x8(%a6),%fp0           # load sgl input
929         fmov.x          %fp0,FP_SRC(%a6)          929         fmov.x          %fp0,FP_SRC(%a6)
930         lea             FP_SRC(%a6),%a0           930         lea             FP_SRC(%a6),%a0
931         bsr.l           tag                       931         bsr.l           tag                     # fetch operand type
932         mov.b           %d0,STAG(%a6)             932         mov.b           %d0,STAG(%a6)
933         mov.b           %d0,%d1                   933         mov.b           %d0,%d1
934                                                   934 
935         andi.l          &0x00ff00ff,USER_FPSR(    935         andi.l          &0x00ff00ff,USER_FPSR(%a6)
936                                                   936 
937         clr.l           %d0                       937         clr.l           %d0
938         mov.b           FPCR_MODE(%a6),%d0        938         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
939                                                   939 
940         tst.b           %d1                       940         tst.b           %d1
941         bne.b           _L2_2s                    941         bne.b           _L2_2s
942         bsr.l           ssinh                     942         bsr.l           ssinh                   # operand is a NORM
943         bra.b           _L2_6s                    943         bra.b           _L2_6s
944 _L2_2s:                                           944 _L2_2s:
945         cmpi.b          %d1,&ZERO                 945         cmpi.b          %d1,&ZERO               # is operand a ZERO?
946         bne.b           _L2_3s                    946         bne.b           _L2_3s                  # no
947         bsr.l           src_zero                  947         bsr.l           src_zero                        # yes
948         bra.b           _L2_6s                    948         bra.b           _L2_6s
949 _L2_3s:                                           949 _L2_3s:
950         cmpi.b          %d1,&INF                  950         cmpi.b          %d1,&INF                # is operand an INF?
951         bne.b           _L2_4s                    951         bne.b           _L2_4s                  # no
952         bsr.l           src_inf                   952         bsr.l           src_inf                 # yes
953         bra.b           _L2_6s                    953         bra.b           _L2_6s
954 _L2_4s:                                           954 _L2_4s:
955         cmpi.b          %d1,&QNAN                 955         cmpi.b          %d1,&QNAN               # is operand a QNAN?
956         bne.b           _L2_5s                    956         bne.b           _L2_5s                  # no
957         bsr.l           src_qnan                  957         bsr.l           src_qnan                        # yes
958         bra.b           _L2_6s                    958         bra.b           _L2_6s
959 _L2_5s:                                           959 _L2_5s:
960         bsr.l           ssinhd                    960         bsr.l           ssinhd                  # operand is a DENORM
961 _L2_6s:                                           961 _L2_6s:
962                                                   962 
963 #                                                 963 #
964 #       Result is now in FP0                      964 #       Result is now in FP0
965 #                                                 965 #
966         movm.l          EXC_DREGS(%a6),&0x0303    966         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
967         fmovm.l         USER_FPCR(%a6),%fpcr,%    967         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
968         fmovm.x         EXC_FP1(%a6),&0x40        968         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
969         unlk            %a6                       969         unlk            %a6
970         rts                                       970         rts
971                                                   971 
972         global          _fsinhd_                  972         global          _fsinhd_
973 _fsinhd_:                                         973 _fsinhd_:
974         link            %a6,&-LOCAL_SIZE          974         link            %a6,&-LOCAL_SIZE
975                                                   975 
976         movm.l          &0x0303,EXC_DREGS(%a6)    976         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
977         fmovm.l         %fpcr,%fpsr,USER_FPCR(    977         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
978         fmovm.x         &0xc0,EXC_FP0(%a6)        978         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
979                                                   979 
980         fmov.l          &0x0,%fpcr                980         fmov.l          &0x0,%fpcr              # zero FPCR
981                                                   981 
982 #                                                 982 #
983 #       copy, convert, and tag input argument     983 #       copy, convert, and tag input argument
984 #                                                 984 #
985         fmov.d          0x8(%a6),%fp0             985         fmov.d          0x8(%a6),%fp0           # load dbl input
986         fmov.x          %fp0,FP_SRC(%a6)          986         fmov.x          %fp0,FP_SRC(%a6)
987         lea             FP_SRC(%a6),%a0           987         lea             FP_SRC(%a6),%a0
988         bsr.l           tag                       988         bsr.l           tag                     # fetch operand type
989         mov.b           %d0,STAG(%a6)             989         mov.b           %d0,STAG(%a6)
990         mov.b           %d0,%d1                   990         mov.b           %d0,%d1
991                                                   991 
992         andi.l          &0x00ff00ff,USER_FPSR(    992         andi.l          &0x00ff00ff,USER_FPSR(%a6)
993                                                   993 
994         clr.l           %d0                       994         clr.l           %d0
995         mov.b           FPCR_MODE(%a6),%d0        995         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
996                                                   996 
997         mov.b           %d1,STAG(%a6)             997         mov.b           %d1,STAG(%a6)
998         tst.b           %d1                       998         tst.b           %d1
999         bne.b           _L2_2d                    999         bne.b           _L2_2d
1000         bsr.l           ssinh                    1000         bsr.l           ssinh                   # operand is a NORM
1001         bra.b           _L2_6d                   1001         bra.b           _L2_6d
1002 _L2_2d:                                          1002 _L2_2d:
1003         cmpi.b          %d1,&ZERO                1003         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1004         bne.b           _L2_3d                   1004         bne.b           _L2_3d                  # no
1005         bsr.l           src_zero                 1005         bsr.l           src_zero                        # yes
1006         bra.b           _L2_6d                   1006         bra.b           _L2_6d
1007 _L2_3d:                                          1007 _L2_3d:
1008         cmpi.b          %d1,&INF                 1008         cmpi.b          %d1,&INF                # is operand an INF?
1009         bne.b           _L2_4d                   1009         bne.b           _L2_4d                  # no
1010         bsr.l           src_inf                  1010         bsr.l           src_inf                 # yes
1011         bra.b           _L2_6d                   1011         bra.b           _L2_6d
1012 _L2_4d:                                          1012 _L2_4d:
1013         cmpi.b          %d1,&QNAN                1013         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1014         bne.b           _L2_5d                   1014         bne.b           _L2_5d                  # no
1015         bsr.l           src_qnan                 1015         bsr.l           src_qnan                        # yes
1016         bra.b           _L2_6d                   1016         bra.b           _L2_6d
1017 _L2_5d:                                          1017 _L2_5d:
1018         bsr.l           ssinhd                   1018         bsr.l           ssinhd                  # operand is a DENORM
1019 _L2_6d:                                          1019 _L2_6d:
1020                                                  1020 
1021 #                                                1021 #
1022 #       Result is now in FP0                     1022 #       Result is now in FP0
1023 #                                                1023 #
1024         movm.l          EXC_DREGS(%a6),&0x030    1024         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1025         fmovm.l         USER_FPCR(%a6),%fpcr,    1025         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1026         fmovm.x         EXC_FP1(%a6),&0x40       1026         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1027         unlk            %a6                      1027         unlk            %a6
1028         rts                                      1028         rts
1029                                                  1029 
1030         global          _fsinhx_                 1030         global          _fsinhx_
1031 _fsinhx_:                                        1031 _fsinhx_:
1032         link            %a6,&-LOCAL_SIZE         1032         link            %a6,&-LOCAL_SIZE
1033                                                  1033 
1034         movm.l          &0x0303,EXC_DREGS(%a6    1034         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1035         fmovm.l         %fpcr,%fpsr,USER_FPCR    1035         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1036         fmovm.x         &0xc0,EXC_FP0(%a6)       1036         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1037                                                  1037 
1038         fmov.l          &0x0,%fpcr               1038         fmov.l          &0x0,%fpcr              # zero FPCR
1039                                                  1039 
1040 #                                                1040 #
1041 #       copy, convert, and tag input argument    1041 #       copy, convert, and tag input argument
1042 #                                                1042 #
1043         lea             FP_SRC(%a6),%a0          1043         lea             FP_SRC(%a6),%a0
1044         mov.l           0x8+0x0(%a6),0x0(%a0)    1044         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
1045         mov.l           0x8+0x4(%a6),0x4(%a0)    1045         mov.l           0x8+0x4(%a6),0x4(%a0)
1046         mov.l           0x8+0x8(%a6),0x8(%a0)    1046         mov.l           0x8+0x8(%a6),0x8(%a0)
1047         bsr.l           tag                      1047         bsr.l           tag                     # fetch operand type
1048         mov.b           %d0,STAG(%a6)            1048         mov.b           %d0,STAG(%a6)
1049         mov.b           %d0,%d1                  1049         mov.b           %d0,%d1
1050                                                  1050 
1051         andi.l          &0x00ff00ff,USER_FPSR    1051         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1052                                                  1052 
1053         clr.l           %d0                      1053         clr.l           %d0
1054         mov.b           FPCR_MODE(%a6),%d0       1054         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1055                                                  1055 
1056         tst.b           %d1                      1056         tst.b           %d1
1057         bne.b           _L2_2x                   1057         bne.b           _L2_2x
1058         bsr.l           ssinh                    1058         bsr.l           ssinh                   # operand is a NORM
1059         bra.b           _L2_6x                   1059         bra.b           _L2_6x
1060 _L2_2x:                                          1060 _L2_2x:
1061         cmpi.b          %d1,&ZERO                1061         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1062         bne.b           _L2_3x                   1062         bne.b           _L2_3x                  # no
1063         bsr.l           src_zero                 1063         bsr.l           src_zero                        # yes
1064         bra.b           _L2_6x                   1064         bra.b           _L2_6x
1065 _L2_3x:                                          1065 _L2_3x:
1066         cmpi.b          %d1,&INF                 1066         cmpi.b          %d1,&INF                # is operand an INF?
1067         bne.b           _L2_4x                   1067         bne.b           _L2_4x                  # no
1068         bsr.l           src_inf                  1068         bsr.l           src_inf                 # yes
1069         bra.b           _L2_6x                   1069         bra.b           _L2_6x
1070 _L2_4x:                                          1070 _L2_4x:
1071         cmpi.b          %d1,&QNAN                1071         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1072         bne.b           _L2_5x                   1072         bne.b           _L2_5x                  # no
1073         bsr.l           src_qnan                 1073         bsr.l           src_qnan                        # yes
1074         bra.b           _L2_6x                   1074         bra.b           _L2_6x
1075 _L2_5x:                                          1075 _L2_5x:
1076         bsr.l           ssinhd                   1076         bsr.l           ssinhd                  # operand is a DENORM
1077 _L2_6x:                                          1077 _L2_6x:
1078                                                  1078 
1079 #                                                1079 #
1080 #       Result is now in FP0                     1080 #       Result is now in FP0
1081 #                                                1081 #
1082         movm.l          EXC_DREGS(%a6),&0x030    1082         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1083         fmovm.l         USER_FPCR(%a6),%fpcr,    1083         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1084         fmovm.x         EXC_FP1(%a6),&0x40       1084         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1085         unlk            %a6                      1085         unlk            %a6
1086         rts                                      1086         rts
1087                                                  1087 
1088                                                  1088 
1089 #############################################    1089 #########################################################################
1090 # MONADIC TEMPLATE                               1090 # MONADIC TEMPLATE                                                      #
1091 #############################################    1091 #########################################################################
1092         global          _flognp1s_               1092         global          _flognp1s_
1093 _flognp1s_:                                      1093 _flognp1s_:
1094         link            %a6,&-LOCAL_SIZE         1094         link            %a6,&-LOCAL_SIZE
1095                                                  1095 
1096         movm.l          &0x0303,EXC_DREGS(%a6    1096         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1097         fmovm.l         %fpcr,%fpsr,USER_FPCR    1097         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1098         fmovm.x         &0xc0,EXC_FP0(%a6)       1098         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1099                                                  1099 
1100         fmov.l          &0x0,%fpcr               1100         fmov.l          &0x0,%fpcr              # zero FPCR
1101                                                  1101 
1102 #                                                1102 #
1103 #       copy, convert, and tag input argument    1103 #       copy, convert, and tag input argument
1104 #                                                1104 #
1105         fmov.s          0x8(%a6),%fp0            1105         fmov.s          0x8(%a6),%fp0           # load sgl input
1106         fmov.x          %fp0,FP_SRC(%a6)         1106         fmov.x          %fp0,FP_SRC(%a6)
1107         lea             FP_SRC(%a6),%a0          1107         lea             FP_SRC(%a6),%a0
1108         bsr.l           tag                      1108         bsr.l           tag                     # fetch operand type
1109         mov.b           %d0,STAG(%a6)            1109         mov.b           %d0,STAG(%a6)
1110         mov.b           %d0,%d1                  1110         mov.b           %d0,%d1
1111                                                  1111 
1112         andi.l          &0x00ff00ff,USER_FPSR    1112         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1113                                                  1113 
1114         clr.l           %d0                      1114         clr.l           %d0
1115         mov.b           FPCR_MODE(%a6),%d0       1115         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1116                                                  1116 
1117         tst.b           %d1                      1117         tst.b           %d1
1118         bne.b           _L3_2s                   1118         bne.b           _L3_2s
1119         bsr.l           slognp1                  1119         bsr.l           slognp1                 # operand is a NORM
1120         bra.b           _L3_6s                   1120         bra.b           _L3_6s
1121 _L3_2s:                                          1121 _L3_2s:
1122         cmpi.b          %d1,&ZERO                1122         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1123         bne.b           _L3_3s                   1123         bne.b           _L3_3s                  # no
1124         bsr.l           src_zero                 1124         bsr.l           src_zero                        # yes
1125         bra.b           _L3_6s                   1125         bra.b           _L3_6s
1126 _L3_3s:                                          1126 _L3_3s:
1127         cmpi.b          %d1,&INF                 1127         cmpi.b          %d1,&INF                # is operand an INF?
1128         bne.b           _L3_4s                   1128         bne.b           _L3_4s                  # no
1129         bsr.l           sopr_inf                 1129         bsr.l           sopr_inf                        # yes
1130         bra.b           _L3_6s                   1130         bra.b           _L3_6s
1131 _L3_4s:                                          1131 _L3_4s:
1132         cmpi.b          %d1,&QNAN                1132         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1133         bne.b           _L3_5s                   1133         bne.b           _L3_5s                  # no
1134         bsr.l           src_qnan                 1134         bsr.l           src_qnan                        # yes
1135         bra.b           _L3_6s                   1135         bra.b           _L3_6s
1136 _L3_5s:                                          1136 _L3_5s:
1137         bsr.l           slognp1d                 1137         bsr.l           slognp1d                        # operand is a DENORM
1138 _L3_6s:                                          1138 _L3_6s:
1139                                                  1139 
1140 #                                                1140 #
1141 #       Result is now in FP0                     1141 #       Result is now in FP0
1142 #                                                1142 #
1143         movm.l          EXC_DREGS(%a6),&0x030    1143         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1144         fmovm.l         USER_FPCR(%a6),%fpcr,    1144         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1145         fmovm.x         EXC_FP1(%a6),&0x40       1145         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1146         unlk            %a6                      1146         unlk            %a6
1147         rts                                      1147         rts
1148                                                  1148 
1149         global          _flognp1d_               1149         global          _flognp1d_
1150 _flognp1d_:                                      1150 _flognp1d_:
1151         link            %a6,&-LOCAL_SIZE         1151         link            %a6,&-LOCAL_SIZE
1152                                                  1152 
1153         movm.l          &0x0303,EXC_DREGS(%a6    1153         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1154         fmovm.l         %fpcr,%fpsr,USER_FPCR    1154         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1155         fmovm.x         &0xc0,EXC_FP0(%a6)       1155         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1156                                                  1156 
1157         fmov.l          &0x0,%fpcr               1157         fmov.l          &0x0,%fpcr              # zero FPCR
1158                                                  1158 
1159 #                                                1159 #
1160 #       copy, convert, and tag input argument    1160 #       copy, convert, and tag input argument
1161 #                                                1161 #
1162         fmov.d          0x8(%a6),%fp0            1162         fmov.d          0x8(%a6),%fp0           # load dbl input
1163         fmov.x          %fp0,FP_SRC(%a6)         1163         fmov.x          %fp0,FP_SRC(%a6)
1164         lea             FP_SRC(%a6),%a0          1164         lea             FP_SRC(%a6),%a0
1165         bsr.l           tag                      1165         bsr.l           tag                     # fetch operand type
1166         mov.b           %d0,STAG(%a6)            1166         mov.b           %d0,STAG(%a6)
1167         mov.b           %d0,%d1                  1167         mov.b           %d0,%d1
1168                                                  1168 
1169         andi.l          &0x00ff00ff,USER_FPSR    1169         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1170                                                  1170 
1171         clr.l           %d0                      1171         clr.l           %d0
1172         mov.b           FPCR_MODE(%a6),%d0       1172         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1173                                                  1173 
1174         mov.b           %d1,STAG(%a6)            1174         mov.b           %d1,STAG(%a6)
1175         tst.b           %d1                      1175         tst.b           %d1
1176         bne.b           _L3_2d                   1176         bne.b           _L3_2d
1177         bsr.l           slognp1                  1177         bsr.l           slognp1                 # operand is a NORM
1178         bra.b           _L3_6d                   1178         bra.b           _L3_6d
1179 _L3_2d:                                          1179 _L3_2d:
1180         cmpi.b          %d1,&ZERO                1180         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1181         bne.b           _L3_3d                   1181         bne.b           _L3_3d                  # no
1182         bsr.l           src_zero                 1182         bsr.l           src_zero                        # yes
1183         bra.b           _L3_6d                   1183         bra.b           _L3_6d
1184 _L3_3d:                                          1184 _L3_3d:
1185         cmpi.b          %d1,&INF                 1185         cmpi.b          %d1,&INF                # is operand an INF?
1186         bne.b           _L3_4d                   1186         bne.b           _L3_4d                  # no
1187         bsr.l           sopr_inf                 1187         bsr.l           sopr_inf                        # yes
1188         bra.b           _L3_6d                   1188         bra.b           _L3_6d
1189 _L3_4d:                                          1189 _L3_4d:
1190         cmpi.b          %d1,&QNAN                1190         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1191         bne.b           _L3_5d                   1191         bne.b           _L3_5d                  # no
1192         bsr.l           src_qnan                 1192         bsr.l           src_qnan                        # yes
1193         bra.b           _L3_6d                   1193         bra.b           _L3_6d
1194 _L3_5d:                                          1194 _L3_5d:
1195         bsr.l           slognp1d                 1195         bsr.l           slognp1d                        # operand is a DENORM
1196 _L3_6d:                                          1196 _L3_6d:
1197                                                  1197 
1198 #                                                1198 #
1199 #       Result is now in FP0                     1199 #       Result is now in FP0
1200 #                                                1200 #
1201         movm.l          EXC_DREGS(%a6),&0x030    1201         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1202         fmovm.l         USER_FPCR(%a6),%fpcr,    1202         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1203         fmovm.x         EXC_FP1(%a6),&0x40       1203         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1204         unlk            %a6                      1204         unlk            %a6
1205         rts                                      1205         rts
1206                                                  1206 
1207         global          _flognp1x_               1207         global          _flognp1x_
1208 _flognp1x_:                                      1208 _flognp1x_:
1209         link            %a6,&-LOCAL_SIZE         1209         link            %a6,&-LOCAL_SIZE
1210                                                  1210 
1211         movm.l          &0x0303,EXC_DREGS(%a6    1211         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1212         fmovm.l         %fpcr,%fpsr,USER_FPCR    1212         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1213         fmovm.x         &0xc0,EXC_FP0(%a6)       1213         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1214                                                  1214 
1215         fmov.l          &0x0,%fpcr               1215         fmov.l          &0x0,%fpcr              # zero FPCR
1216                                                  1216 
1217 #                                                1217 #
1218 #       copy, convert, and tag input argument    1218 #       copy, convert, and tag input argument
1219 #                                                1219 #
1220         lea             FP_SRC(%a6),%a0          1220         lea             FP_SRC(%a6),%a0
1221         mov.l           0x8+0x0(%a6),0x0(%a0)    1221         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
1222         mov.l           0x8+0x4(%a6),0x4(%a0)    1222         mov.l           0x8+0x4(%a6),0x4(%a0)
1223         mov.l           0x8+0x8(%a6),0x8(%a0)    1223         mov.l           0x8+0x8(%a6),0x8(%a0)
1224         bsr.l           tag                      1224         bsr.l           tag                     # fetch operand type
1225         mov.b           %d0,STAG(%a6)            1225         mov.b           %d0,STAG(%a6)
1226         mov.b           %d0,%d1                  1226         mov.b           %d0,%d1
1227                                                  1227 
1228         andi.l          &0x00ff00ff,USER_FPSR    1228         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1229                                                  1229 
1230         clr.l           %d0                      1230         clr.l           %d0
1231         mov.b           FPCR_MODE(%a6),%d0       1231         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1232                                                  1232 
1233         tst.b           %d1                      1233         tst.b           %d1
1234         bne.b           _L3_2x                   1234         bne.b           _L3_2x
1235         bsr.l           slognp1                  1235         bsr.l           slognp1                 # operand is a NORM
1236         bra.b           _L3_6x                   1236         bra.b           _L3_6x
1237 _L3_2x:                                          1237 _L3_2x:
1238         cmpi.b          %d1,&ZERO                1238         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1239         bne.b           _L3_3x                   1239         bne.b           _L3_3x                  # no
1240         bsr.l           src_zero                 1240         bsr.l           src_zero                        # yes
1241         bra.b           _L3_6x                   1241         bra.b           _L3_6x
1242 _L3_3x:                                          1242 _L3_3x:
1243         cmpi.b          %d1,&INF                 1243         cmpi.b          %d1,&INF                # is operand an INF?
1244         bne.b           _L3_4x                   1244         bne.b           _L3_4x                  # no
1245         bsr.l           sopr_inf                 1245         bsr.l           sopr_inf                        # yes
1246         bra.b           _L3_6x                   1246         bra.b           _L3_6x
1247 _L3_4x:                                          1247 _L3_4x:
1248         cmpi.b          %d1,&QNAN                1248         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1249         bne.b           _L3_5x                   1249         bne.b           _L3_5x                  # no
1250         bsr.l           src_qnan                 1250         bsr.l           src_qnan                        # yes
1251         bra.b           _L3_6x                   1251         bra.b           _L3_6x
1252 _L3_5x:                                          1252 _L3_5x:
1253         bsr.l           slognp1d                 1253         bsr.l           slognp1d                        # operand is a DENORM
1254 _L3_6x:                                          1254 _L3_6x:
1255                                                  1255 
1256 #                                                1256 #
1257 #       Result is now in FP0                     1257 #       Result is now in FP0
1258 #                                                1258 #
1259         movm.l          EXC_DREGS(%a6),&0x030    1259         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1260         fmovm.l         USER_FPCR(%a6),%fpcr,    1260         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1261         fmovm.x         EXC_FP1(%a6),&0x40       1261         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1262         unlk            %a6                      1262         unlk            %a6
1263         rts                                      1263         rts
1264                                                  1264 
1265                                                  1265 
1266 #############################################    1266 #########################################################################
1267 # MONADIC TEMPLATE                               1267 # MONADIC TEMPLATE                                                      #
1268 #############################################    1268 #########################################################################
1269         global          _fetoxm1s_               1269         global          _fetoxm1s_
1270 _fetoxm1s_:                                      1270 _fetoxm1s_:
1271         link            %a6,&-LOCAL_SIZE         1271         link            %a6,&-LOCAL_SIZE
1272                                                  1272 
1273         movm.l          &0x0303,EXC_DREGS(%a6    1273         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1274         fmovm.l         %fpcr,%fpsr,USER_FPCR    1274         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1275         fmovm.x         &0xc0,EXC_FP0(%a6)       1275         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1276                                                  1276 
1277         fmov.l          &0x0,%fpcr               1277         fmov.l          &0x0,%fpcr              # zero FPCR
1278                                                  1278 
1279 #                                                1279 #
1280 #       copy, convert, and tag input argument    1280 #       copy, convert, and tag input argument
1281 #                                                1281 #
1282         fmov.s          0x8(%a6),%fp0            1282         fmov.s          0x8(%a6),%fp0           # load sgl input
1283         fmov.x          %fp0,FP_SRC(%a6)         1283         fmov.x          %fp0,FP_SRC(%a6)
1284         lea             FP_SRC(%a6),%a0          1284         lea             FP_SRC(%a6),%a0
1285         bsr.l           tag                      1285         bsr.l           tag                     # fetch operand type
1286         mov.b           %d0,STAG(%a6)            1286         mov.b           %d0,STAG(%a6)
1287         mov.b           %d0,%d1                  1287         mov.b           %d0,%d1
1288                                                  1288 
1289         andi.l          &0x00ff00ff,USER_FPSR    1289         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1290                                                  1290 
1291         clr.l           %d0                      1291         clr.l           %d0
1292         mov.b           FPCR_MODE(%a6),%d0       1292         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1293                                                  1293 
1294         tst.b           %d1                      1294         tst.b           %d1
1295         bne.b           _L4_2s                   1295         bne.b           _L4_2s
1296         bsr.l           setoxm1                  1296         bsr.l           setoxm1                 # operand is a NORM
1297         bra.b           _L4_6s                   1297         bra.b           _L4_6s
1298 _L4_2s:                                          1298 _L4_2s:
1299         cmpi.b          %d1,&ZERO                1299         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1300         bne.b           _L4_3s                   1300         bne.b           _L4_3s                  # no
1301         bsr.l           src_zero                 1301         bsr.l           src_zero                        # yes
1302         bra.b           _L4_6s                   1302         bra.b           _L4_6s
1303 _L4_3s:                                          1303 _L4_3s:
1304         cmpi.b          %d1,&INF                 1304         cmpi.b          %d1,&INF                # is operand an INF?
1305         bne.b           _L4_4s                   1305         bne.b           _L4_4s                  # no
1306         bsr.l           setoxm1i                 1306         bsr.l           setoxm1i                        # yes
1307         bra.b           _L4_6s                   1307         bra.b           _L4_6s
1308 _L4_4s:                                          1308 _L4_4s:
1309         cmpi.b          %d1,&QNAN                1309         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1310         bne.b           _L4_5s                   1310         bne.b           _L4_5s                  # no
1311         bsr.l           src_qnan                 1311         bsr.l           src_qnan                        # yes
1312         bra.b           _L4_6s                   1312         bra.b           _L4_6s
1313 _L4_5s:                                          1313 _L4_5s:
1314         bsr.l           setoxm1d                 1314         bsr.l           setoxm1d                        # operand is a DENORM
1315 _L4_6s:                                          1315 _L4_6s:
1316                                                  1316 
1317 #                                                1317 #
1318 #       Result is now in FP0                     1318 #       Result is now in FP0
1319 #                                                1319 #
1320         movm.l          EXC_DREGS(%a6),&0x030    1320         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1321         fmovm.l         USER_FPCR(%a6),%fpcr,    1321         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1322         fmovm.x         EXC_FP1(%a6),&0x40       1322         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1323         unlk            %a6                      1323         unlk            %a6
1324         rts                                      1324         rts
1325                                                  1325 
1326         global          _fetoxm1d_               1326         global          _fetoxm1d_
1327 _fetoxm1d_:                                      1327 _fetoxm1d_:
1328         link            %a6,&-LOCAL_SIZE         1328         link            %a6,&-LOCAL_SIZE
1329                                                  1329 
1330         movm.l          &0x0303,EXC_DREGS(%a6    1330         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1331         fmovm.l         %fpcr,%fpsr,USER_FPCR    1331         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1332         fmovm.x         &0xc0,EXC_FP0(%a6)       1332         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1333                                                  1333 
1334         fmov.l          &0x0,%fpcr               1334         fmov.l          &0x0,%fpcr              # zero FPCR
1335                                                  1335 
1336 #                                                1336 #
1337 #       copy, convert, and tag input argument    1337 #       copy, convert, and tag input argument
1338 #                                                1338 #
1339         fmov.d          0x8(%a6),%fp0            1339         fmov.d          0x8(%a6),%fp0           # load dbl input
1340         fmov.x          %fp0,FP_SRC(%a6)         1340         fmov.x          %fp0,FP_SRC(%a6)
1341         lea             FP_SRC(%a6),%a0          1341         lea             FP_SRC(%a6),%a0
1342         bsr.l           tag                      1342         bsr.l           tag                     # fetch operand type
1343         mov.b           %d0,STAG(%a6)            1343         mov.b           %d0,STAG(%a6)
1344         mov.b           %d0,%d1                  1344         mov.b           %d0,%d1
1345                                                  1345 
1346         andi.l          &0x00ff00ff,USER_FPSR    1346         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1347                                                  1347 
1348         clr.l           %d0                      1348         clr.l           %d0
1349         mov.b           FPCR_MODE(%a6),%d0       1349         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1350                                                  1350 
1351         mov.b           %d1,STAG(%a6)            1351         mov.b           %d1,STAG(%a6)
1352         tst.b           %d1                      1352         tst.b           %d1
1353         bne.b           _L4_2d                   1353         bne.b           _L4_2d
1354         bsr.l           setoxm1                  1354         bsr.l           setoxm1                 # operand is a NORM
1355         bra.b           _L4_6d                   1355         bra.b           _L4_6d
1356 _L4_2d:                                          1356 _L4_2d:
1357         cmpi.b          %d1,&ZERO                1357         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1358         bne.b           _L4_3d                   1358         bne.b           _L4_3d                  # no
1359         bsr.l           src_zero                 1359         bsr.l           src_zero                        # yes
1360         bra.b           _L4_6d                   1360         bra.b           _L4_6d
1361 _L4_3d:                                          1361 _L4_3d:
1362         cmpi.b          %d1,&INF                 1362         cmpi.b          %d1,&INF                # is operand an INF?
1363         bne.b           _L4_4d                   1363         bne.b           _L4_4d                  # no
1364         bsr.l           setoxm1i                 1364         bsr.l           setoxm1i                        # yes
1365         bra.b           _L4_6d                   1365         bra.b           _L4_6d
1366 _L4_4d:                                          1366 _L4_4d:
1367         cmpi.b          %d1,&QNAN                1367         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1368         bne.b           _L4_5d                   1368         bne.b           _L4_5d                  # no
1369         bsr.l           src_qnan                 1369         bsr.l           src_qnan                        # yes
1370         bra.b           _L4_6d                   1370         bra.b           _L4_6d
1371 _L4_5d:                                          1371 _L4_5d:
1372         bsr.l           setoxm1d                 1372         bsr.l           setoxm1d                        # operand is a DENORM
1373 _L4_6d:                                          1373 _L4_6d:
1374                                                  1374 
1375 #                                                1375 #
1376 #       Result is now in FP0                     1376 #       Result is now in FP0
1377 #                                                1377 #
1378         movm.l          EXC_DREGS(%a6),&0x030    1378         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1379         fmovm.l         USER_FPCR(%a6),%fpcr,    1379         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1380         fmovm.x         EXC_FP1(%a6),&0x40       1380         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1381         unlk            %a6                      1381         unlk            %a6
1382         rts                                      1382         rts
1383                                                  1383 
1384         global          _fetoxm1x_               1384         global          _fetoxm1x_
1385 _fetoxm1x_:                                      1385 _fetoxm1x_:
1386         link            %a6,&-LOCAL_SIZE         1386         link            %a6,&-LOCAL_SIZE
1387                                                  1387 
1388         movm.l          &0x0303,EXC_DREGS(%a6    1388         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1389         fmovm.l         %fpcr,%fpsr,USER_FPCR    1389         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1390         fmovm.x         &0xc0,EXC_FP0(%a6)       1390         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1391                                                  1391 
1392         fmov.l          &0x0,%fpcr               1392         fmov.l          &0x0,%fpcr              # zero FPCR
1393                                                  1393 
1394 #                                                1394 #
1395 #       copy, convert, and tag input argument    1395 #       copy, convert, and tag input argument
1396 #                                                1396 #
1397         lea             FP_SRC(%a6),%a0          1397         lea             FP_SRC(%a6),%a0
1398         mov.l           0x8+0x0(%a6),0x0(%a0)    1398         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
1399         mov.l           0x8+0x4(%a6),0x4(%a0)    1399         mov.l           0x8+0x4(%a6),0x4(%a0)
1400         mov.l           0x8+0x8(%a6),0x8(%a0)    1400         mov.l           0x8+0x8(%a6),0x8(%a0)
1401         bsr.l           tag                      1401         bsr.l           tag                     # fetch operand type
1402         mov.b           %d0,STAG(%a6)            1402         mov.b           %d0,STAG(%a6)
1403         mov.b           %d0,%d1                  1403         mov.b           %d0,%d1
1404                                                  1404 
1405         andi.l          &0x00ff00ff,USER_FPSR    1405         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1406                                                  1406 
1407         clr.l           %d0                      1407         clr.l           %d0
1408         mov.b           FPCR_MODE(%a6),%d0       1408         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1409                                                  1409 
1410         tst.b           %d1                      1410         tst.b           %d1
1411         bne.b           _L4_2x                   1411         bne.b           _L4_2x
1412         bsr.l           setoxm1                  1412         bsr.l           setoxm1                 # operand is a NORM
1413         bra.b           _L4_6x                   1413         bra.b           _L4_6x
1414 _L4_2x:                                          1414 _L4_2x:
1415         cmpi.b          %d1,&ZERO                1415         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1416         bne.b           _L4_3x                   1416         bne.b           _L4_3x                  # no
1417         bsr.l           src_zero                 1417         bsr.l           src_zero                        # yes
1418         bra.b           _L4_6x                   1418         bra.b           _L4_6x
1419 _L4_3x:                                          1419 _L4_3x:
1420         cmpi.b          %d1,&INF                 1420         cmpi.b          %d1,&INF                # is operand an INF?
1421         bne.b           _L4_4x                   1421         bne.b           _L4_4x                  # no
1422         bsr.l           setoxm1i                 1422         bsr.l           setoxm1i                        # yes
1423         bra.b           _L4_6x                   1423         bra.b           _L4_6x
1424 _L4_4x:                                          1424 _L4_4x:
1425         cmpi.b          %d1,&QNAN                1425         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1426         bne.b           _L4_5x                   1426         bne.b           _L4_5x                  # no
1427         bsr.l           src_qnan                 1427         bsr.l           src_qnan                        # yes
1428         bra.b           _L4_6x                   1428         bra.b           _L4_6x
1429 _L4_5x:                                          1429 _L4_5x:
1430         bsr.l           setoxm1d                 1430         bsr.l           setoxm1d                        # operand is a DENORM
1431 _L4_6x:                                          1431 _L4_6x:
1432                                                  1432 
1433 #                                                1433 #
1434 #       Result is now in FP0                     1434 #       Result is now in FP0
1435 #                                                1435 #
1436         movm.l          EXC_DREGS(%a6),&0x030    1436         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1437         fmovm.l         USER_FPCR(%a6),%fpcr,    1437         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1438         fmovm.x         EXC_FP1(%a6),&0x40       1438         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1439         unlk            %a6                      1439         unlk            %a6
1440         rts                                      1440         rts
1441                                                  1441 
1442                                                  1442 
1443 #############################################    1443 #########################################################################
1444 # MONADIC TEMPLATE                               1444 # MONADIC TEMPLATE                                                      #
1445 #############################################    1445 #########################################################################
1446         global          _ftanhs_                 1446         global          _ftanhs_
1447 _ftanhs_:                                        1447 _ftanhs_:
1448         link            %a6,&-LOCAL_SIZE         1448         link            %a6,&-LOCAL_SIZE
1449                                                  1449 
1450         movm.l          &0x0303,EXC_DREGS(%a6    1450         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1451         fmovm.l         %fpcr,%fpsr,USER_FPCR    1451         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1452         fmovm.x         &0xc0,EXC_FP0(%a6)       1452         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1453                                                  1453 
1454         fmov.l          &0x0,%fpcr               1454         fmov.l          &0x0,%fpcr              # zero FPCR
1455                                                  1455 
1456 #                                                1456 #
1457 #       copy, convert, and tag input argument    1457 #       copy, convert, and tag input argument
1458 #                                                1458 #
1459         fmov.s          0x8(%a6),%fp0            1459         fmov.s          0x8(%a6),%fp0           # load sgl input
1460         fmov.x          %fp0,FP_SRC(%a6)         1460         fmov.x          %fp0,FP_SRC(%a6)
1461         lea             FP_SRC(%a6),%a0          1461         lea             FP_SRC(%a6),%a0
1462         bsr.l           tag                      1462         bsr.l           tag                     # fetch operand type
1463         mov.b           %d0,STAG(%a6)            1463         mov.b           %d0,STAG(%a6)
1464         mov.b           %d0,%d1                  1464         mov.b           %d0,%d1
1465                                                  1465 
1466         andi.l          &0x00ff00ff,USER_FPSR    1466         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1467                                                  1467 
1468         clr.l           %d0                      1468         clr.l           %d0
1469         mov.b           FPCR_MODE(%a6),%d0       1469         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1470                                                  1470 
1471         tst.b           %d1                      1471         tst.b           %d1
1472         bne.b           _L5_2s                   1472         bne.b           _L5_2s
1473         bsr.l           stanh                    1473         bsr.l           stanh                   # operand is a NORM
1474         bra.b           _L5_6s                   1474         bra.b           _L5_6s
1475 _L5_2s:                                          1475 _L5_2s:
1476         cmpi.b          %d1,&ZERO                1476         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1477         bne.b           _L5_3s                   1477         bne.b           _L5_3s                  # no
1478         bsr.l           src_zero                 1478         bsr.l           src_zero                        # yes
1479         bra.b           _L5_6s                   1479         bra.b           _L5_6s
1480 _L5_3s:                                          1480 _L5_3s:
1481         cmpi.b          %d1,&INF                 1481         cmpi.b          %d1,&INF                # is operand an INF?
1482         bne.b           _L5_4s                   1482         bne.b           _L5_4s                  # no
1483         bsr.l           src_one                  1483         bsr.l           src_one                 # yes
1484         bra.b           _L5_6s                   1484         bra.b           _L5_6s
1485 _L5_4s:                                          1485 _L5_4s:
1486         cmpi.b          %d1,&QNAN                1486         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1487         bne.b           _L5_5s                   1487         bne.b           _L5_5s                  # no
1488         bsr.l           src_qnan                 1488         bsr.l           src_qnan                        # yes
1489         bra.b           _L5_6s                   1489         bra.b           _L5_6s
1490 _L5_5s:                                          1490 _L5_5s:
1491         bsr.l           stanhd                   1491         bsr.l           stanhd                  # operand is a DENORM
1492 _L5_6s:                                          1492 _L5_6s:
1493                                                  1493 
1494 #                                                1494 #
1495 #       Result is now in FP0                     1495 #       Result is now in FP0
1496 #                                                1496 #
1497         movm.l          EXC_DREGS(%a6),&0x030    1497         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1498         fmovm.l         USER_FPCR(%a6),%fpcr,    1498         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1499         fmovm.x         EXC_FP1(%a6),&0x40       1499         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1500         unlk            %a6                      1500         unlk            %a6
1501         rts                                      1501         rts
1502                                                  1502 
1503         global          _ftanhd_                 1503         global          _ftanhd_
1504 _ftanhd_:                                        1504 _ftanhd_:
1505         link            %a6,&-LOCAL_SIZE         1505         link            %a6,&-LOCAL_SIZE
1506                                                  1506 
1507         movm.l          &0x0303,EXC_DREGS(%a6    1507         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1508         fmovm.l         %fpcr,%fpsr,USER_FPCR    1508         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1509         fmovm.x         &0xc0,EXC_FP0(%a6)       1509         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1510                                                  1510 
1511         fmov.l          &0x0,%fpcr               1511         fmov.l          &0x0,%fpcr              # zero FPCR
1512                                                  1512 
1513 #                                                1513 #
1514 #       copy, convert, and tag input argument    1514 #       copy, convert, and tag input argument
1515 #                                                1515 #
1516         fmov.d          0x8(%a6),%fp0            1516         fmov.d          0x8(%a6),%fp0           # load dbl input
1517         fmov.x          %fp0,FP_SRC(%a6)         1517         fmov.x          %fp0,FP_SRC(%a6)
1518         lea             FP_SRC(%a6),%a0          1518         lea             FP_SRC(%a6),%a0
1519         bsr.l           tag                      1519         bsr.l           tag                     # fetch operand type
1520         mov.b           %d0,STAG(%a6)            1520         mov.b           %d0,STAG(%a6)
1521         mov.b           %d0,%d1                  1521         mov.b           %d0,%d1
1522                                                  1522 
1523         andi.l          &0x00ff00ff,USER_FPSR    1523         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1524                                                  1524 
1525         clr.l           %d0                      1525         clr.l           %d0
1526         mov.b           FPCR_MODE(%a6),%d0       1526         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1527                                                  1527 
1528         mov.b           %d1,STAG(%a6)            1528         mov.b           %d1,STAG(%a6)
1529         tst.b           %d1                      1529         tst.b           %d1
1530         bne.b           _L5_2d                   1530         bne.b           _L5_2d
1531         bsr.l           stanh                    1531         bsr.l           stanh                   # operand is a NORM
1532         bra.b           _L5_6d                   1532         bra.b           _L5_6d
1533 _L5_2d:                                          1533 _L5_2d:
1534         cmpi.b          %d1,&ZERO                1534         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1535         bne.b           _L5_3d                   1535         bne.b           _L5_3d                  # no
1536         bsr.l           src_zero                 1536         bsr.l           src_zero                        # yes
1537         bra.b           _L5_6d                   1537         bra.b           _L5_6d
1538 _L5_3d:                                          1538 _L5_3d:
1539         cmpi.b          %d1,&INF                 1539         cmpi.b          %d1,&INF                # is operand an INF?
1540         bne.b           _L5_4d                   1540         bne.b           _L5_4d                  # no
1541         bsr.l           src_one                  1541         bsr.l           src_one                 # yes
1542         bra.b           _L5_6d                   1542         bra.b           _L5_6d
1543 _L5_4d:                                          1543 _L5_4d:
1544         cmpi.b          %d1,&QNAN                1544         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1545         bne.b           _L5_5d                   1545         bne.b           _L5_5d                  # no
1546         bsr.l           src_qnan                 1546         bsr.l           src_qnan                        # yes
1547         bra.b           _L5_6d                   1547         bra.b           _L5_6d
1548 _L5_5d:                                          1548 _L5_5d:
1549         bsr.l           stanhd                   1549         bsr.l           stanhd                  # operand is a DENORM
1550 _L5_6d:                                          1550 _L5_6d:
1551                                                  1551 
1552 #                                                1552 #
1553 #       Result is now in FP0                     1553 #       Result is now in FP0
1554 #                                                1554 #
1555         movm.l          EXC_DREGS(%a6),&0x030    1555         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1556         fmovm.l         USER_FPCR(%a6),%fpcr,    1556         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1557         fmovm.x         EXC_FP1(%a6),&0x40       1557         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1558         unlk            %a6                      1558         unlk            %a6
1559         rts                                      1559         rts
1560                                                  1560 
1561         global          _ftanhx_                 1561         global          _ftanhx_
1562 _ftanhx_:                                        1562 _ftanhx_:
1563         link            %a6,&-LOCAL_SIZE         1563         link            %a6,&-LOCAL_SIZE
1564                                                  1564 
1565         movm.l          &0x0303,EXC_DREGS(%a6    1565         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1566         fmovm.l         %fpcr,%fpsr,USER_FPCR    1566         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1567         fmovm.x         &0xc0,EXC_FP0(%a6)       1567         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1568                                                  1568 
1569         fmov.l          &0x0,%fpcr               1569         fmov.l          &0x0,%fpcr              # zero FPCR
1570                                                  1570 
1571 #                                                1571 #
1572 #       copy, convert, and tag input argument    1572 #       copy, convert, and tag input argument
1573 #                                                1573 #
1574         lea             FP_SRC(%a6),%a0          1574         lea             FP_SRC(%a6),%a0
1575         mov.l           0x8+0x0(%a6),0x0(%a0)    1575         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
1576         mov.l           0x8+0x4(%a6),0x4(%a0)    1576         mov.l           0x8+0x4(%a6),0x4(%a0)
1577         mov.l           0x8+0x8(%a6),0x8(%a0)    1577         mov.l           0x8+0x8(%a6),0x8(%a0)
1578         bsr.l           tag                      1578         bsr.l           tag                     # fetch operand type
1579         mov.b           %d0,STAG(%a6)            1579         mov.b           %d0,STAG(%a6)
1580         mov.b           %d0,%d1                  1580         mov.b           %d0,%d1
1581                                                  1581 
1582         andi.l          &0x00ff00ff,USER_FPSR    1582         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1583                                                  1583 
1584         clr.l           %d0                      1584         clr.l           %d0
1585         mov.b           FPCR_MODE(%a6),%d0       1585         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1586                                                  1586 
1587         tst.b           %d1                      1587         tst.b           %d1
1588         bne.b           _L5_2x                   1588         bne.b           _L5_2x
1589         bsr.l           stanh                    1589         bsr.l           stanh                   # operand is a NORM
1590         bra.b           _L5_6x                   1590         bra.b           _L5_6x
1591 _L5_2x:                                          1591 _L5_2x:
1592         cmpi.b          %d1,&ZERO                1592         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1593         bne.b           _L5_3x                   1593         bne.b           _L5_3x                  # no
1594         bsr.l           src_zero                 1594         bsr.l           src_zero                        # yes
1595         bra.b           _L5_6x                   1595         bra.b           _L5_6x
1596 _L5_3x:                                          1596 _L5_3x:
1597         cmpi.b          %d1,&INF                 1597         cmpi.b          %d1,&INF                # is operand an INF?
1598         bne.b           _L5_4x                   1598         bne.b           _L5_4x                  # no
1599         bsr.l           src_one                  1599         bsr.l           src_one                 # yes
1600         bra.b           _L5_6x                   1600         bra.b           _L5_6x
1601 _L5_4x:                                          1601 _L5_4x:
1602         cmpi.b          %d1,&QNAN                1602         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1603         bne.b           _L5_5x                   1603         bne.b           _L5_5x                  # no
1604         bsr.l           src_qnan                 1604         bsr.l           src_qnan                        # yes
1605         bra.b           _L5_6x                   1605         bra.b           _L5_6x
1606 _L5_5x:                                          1606 _L5_5x:
1607         bsr.l           stanhd                   1607         bsr.l           stanhd                  # operand is a DENORM
1608 _L5_6x:                                          1608 _L5_6x:
1609                                                  1609 
1610 #                                                1610 #
1611 #       Result is now in FP0                     1611 #       Result is now in FP0
1612 #                                                1612 #
1613         movm.l          EXC_DREGS(%a6),&0x030    1613         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1614         fmovm.l         USER_FPCR(%a6),%fpcr,    1614         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1615         fmovm.x         EXC_FP1(%a6),&0x40       1615         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1616         unlk            %a6                      1616         unlk            %a6
1617         rts                                      1617         rts
1618                                                  1618 
1619                                                  1619 
1620 #############################################    1620 #########################################################################
1621 # MONADIC TEMPLATE                               1621 # MONADIC TEMPLATE                                                      #
1622 #############################################    1622 #########################################################################
1623         global          _fatans_                 1623         global          _fatans_
1624 _fatans_:                                        1624 _fatans_:
1625         link            %a6,&-LOCAL_SIZE         1625         link            %a6,&-LOCAL_SIZE
1626                                                  1626 
1627         movm.l          &0x0303,EXC_DREGS(%a6    1627         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1628         fmovm.l         %fpcr,%fpsr,USER_FPCR    1628         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1629         fmovm.x         &0xc0,EXC_FP0(%a6)       1629         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1630                                                  1630 
1631         fmov.l          &0x0,%fpcr               1631         fmov.l          &0x0,%fpcr              # zero FPCR
1632                                                  1632 
1633 #                                                1633 #
1634 #       copy, convert, and tag input argument    1634 #       copy, convert, and tag input argument
1635 #                                                1635 #
1636         fmov.s          0x8(%a6),%fp0            1636         fmov.s          0x8(%a6),%fp0           # load sgl input
1637         fmov.x          %fp0,FP_SRC(%a6)         1637         fmov.x          %fp0,FP_SRC(%a6)
1638         lea             FP_SRC(%a6),%a0          1638         lea             FP_SRC(%a6),%a0
1639         bsr.l           tag                      1639         bsr.l           tag                     # fetch operand type
1640         mov.b           %d0,STAG(%a6)            1640         mov.b           %d0,STAG(%a6)
1641         mov.b           %d0,%d1                  1641         mov.b           %d0,%d1
1642                                                  1642 
1643         andi.l          &0x00ff00ff,USER_FPSR    1643         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1644                                                  1644 
1645         clr.l           %d0                      1645         clr.l           %d0
1646         mov.b           FPCR_MODE(%a6),%d0       1646         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1647                                                  1647 
1648         tst.b           %d1                      1648         tst.b           %d1
1649         bne.b           _L6_2s                   1649         bne.b           _L6_2s
1650         bsr.l           satan                    1650         bsr.l           satan                   # operand is a NORM
1651         bra.b           _L6_6s                   1651         bra.b           _L6_6s
1652 _L6_2s:                                          1652 _L6_2s:
1653         cmpi.b          %d1,&ZERO                1653         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1654         bne.b           _L6_3s                   1654         bne.b           _L6_3s                  # no
1655         bsr.l           src_zero                 1655         bsr.l           src_zero                        # yes
1656         bra.b           _L6_6s                   1656         bra.b           _L6_6s
1657 _L6_3s:                                          1657 _L6_3s:
1658         cmpi.b          %d1,&INF                 1658         cmpi.b          %d1,&INF                # is operand an INF?
1659         bne.b           _L6_4s                   1659         bne.b           _L6_4s                  # no
1660         bsr.l           spi_2                    1660         bsr.l           spi_2                   # yes
1661         bra.b           _L6_6s                   1661         bra.b           _L6_6s
1662 _L6_4s:                                          1662 _L6_4s:
1663         cmpi.b          %d1,&QNAN                1663         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1664         bne.b           _L6_5s                   1664         bne.b           _L6_5s                  # no
1665         bsr.l           src_qnan                 1665         bsr.l           src_qnan                        # yes
1666         bra.b           _L6_6s                   1666         bra.b           _L6_6s
1667 _L6_5s:                                          1667 _L6_5s:
1668         bsr.l           satand                   1668         bsr.l           satand                  # operand is a DENORM
1669 _L6_6s:                                          1669 _L6_6s:
1670                                                  1670 
1671 #                                                1671 #
1672 #       Result is now in FP0                     1672 #       Result is now in FP0
1673 #                                                1673 #
1674         movm.l          EXC_DREGS(%a6),&0x030    1674         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1675         fmovm.l         USER_FPCR(%a6),%fpcr,    1675         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1676         fmovm.x         EXC_FP1(%a6),&0x40       1676         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1677         unlk            %a6                      1677         unlk            %a6
1678         rts                                      1678         rts
1679                                                  1679 
1680         global          _fatand_                 1680         global          _fatand_
1681 _fatand_:                                        1681 _fatand_:
1682         link            %a6,&-LOCAL_SIZE         1682         link            %a6,&-LOCAL_SIZE
1683                                                  1683 
1684         movm.l          &0x0303,EXC_DREGS(%a6    1684         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1685         fmovm.l         %fpcr,%fpsr,USER_FPCR    1685         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1686         fmovm.x         &0xc0,EXC_FP0(%a6)       1686         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1687                                                  1687 
1688         fmov.l          &0x0,%fpcr               1688         fmov.l          &0x0,%fpcr              # zero FPCR
1689                                                  1689 
1690 #                                                1690 #
1691 #       copy, convert, and tag input argument    1691 #       copy, convert, and tag input argument
1692 #                                                1692 #
1693         fmov.d          0x8(%a6),%fp0            1693         fmov.d          0x8(%a6),%fp0           # load dbl input
1694         fmov.x          %fp0,FP_SRC(%a6)         1694         fmov.x          %fp0,FP_SRC(%a6)
1695         lea             FP_SRC(%a6),%a0          1695         lea             FP_SRC(%a6),%a0
1696         bsr.l           tag                      1696         bsr.l           tag                     # fetch operand type
1697         mov.b           %d0,STAG(%a6)            1697         mov.b           %d0,STAG(%a6)
1698         mov.b           %d0,%d1                  1698         mov.b           %d0,%d1
1699                                                  1699 
1700         andi.l          &0x00ff00ff,USER_FPSR    1700         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1701                                                  1701 
1702         clr.l           %d0                      1702         clr.l           %d0
1703         mov.b           FPCR_MODE(%a6),%d0       1703         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1704                                                  1704 
1705         mov.b           %d1,STAG(%a6)            1705         mov.b           %d1,STAG(%a6)
1706         tst.b           %d1                      1706         tst.b           %d1
1707         bne.b           _L6_2d                   1707         bne.b           _L6_2d
1708         bsr.l           satan                    1708         bsr.l           satan                   # operand is a NORM
1709         bra.b           _L6_6d                   1709         bra.b           _L6_6d
1710 _L6_2d:                                          1710 _L6_2d:
1711         cmpi.b          %d1,&ZERO                1711         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1712         bne.b           _L6_3d                   1712         bne.b           _L6_3d                  # no
1713         bsr.l           src_zero                 1713         bsr.l           src_zero                        # yes
1714         bra.b           _L6_6d                   1714         bra.b           _L6_6d
1715 _L6_3d:                                          1715 _L6_3d:
1716         cmpi.b          %d1,&INF                 1716         cmpi.b          %d1,&INF                # is operand an INF?
1717         bne.b           _L6_4d                   1717         bne.b           _L6_4d                  # no
1718         bsr.l           spi_2                    1718         bsr.l           spi_2                   # yes
1719         bra.b           _L6_6d                   1719         bra.b           _L6_6d
1720 _L6_4d:                                          1720 _L6_4d:
1721         cmpi.b          %d1,&QNAN                1721         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1722         bne.b           _L6_5d                   1722         bne.b           _L6_5d                  # no
1723         bsr.l           src_qnan                 1723         bsr.l           src_qnan                        # yes
1724         bra.b           _L6_6d                   1724         bra.b           _L6_6d
1725 _L6_5d:                                          1725 _L6_5d:
1726         bsr.l           satand                   1726         bsr.l           satand                  # operand is a DENORM
1727 _L6_6d:                                          1727 _L6_6d:
1728                                                  1728 
1729 #                                                1729 #
1730 #       Result is now in FP0                     1730 #       Result is now in FP0
1731 #                                                1731 #
1732         movm.l          EXC_DREGS(%a6),&0x030    1732         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1733         fmovm.l         USER_FPCR(%a6),%fpcr,    1733         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1734         fmovm.x         EXC_FP1(%a6),&0x40       1734         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1735         unlk            %a6                      1735         unlk            %a6
1736         rts                                      1736         rts
1737                                                  1737 
1738         global          _fatanx_                 1738         global          _fatanx_
1739 _fatanx_:                                        1739 _fatanx_:
1740         link            %a6,&-LOCAL_SIZE         1740         link            %a6,&-LOCAL_SIZE
1741                                                  1741 
1742         movm.l          &0x0303,EXC_DREGS(%a6    1742         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1743         fmovm.l         %fpcr,%fpsr,USER_FPCR    1743         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1744         fmovm.x         &0xc0,EXC_FP0(%a6)       1744         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1745                                                  1745 
1746         fmov.l          &0x0,%fpcr               1746         fmov.l          &0x0,%fpcr              # zero FPCR
1747                                                  1747 
1748 #                                                1748 #
1749 #       copy, convert, and tag input argument    1749 #       copy, convert, and tag input argument
1750 #                                                1750 #
1751         lea             FP_SRC(%a6),%a0          1751         lea             FP_SRC(%a6),%a0
1752         mov.l           0x8+0x0(%a6),0x0(%a0)    1752         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
1753         mov.l           0x8+0x4(%a6),0x4(%a0)    1753         mov.l           0x8+0x4(%a6),0x4(%a0)
1754         mov.l           0x8+0x8(%a6),0x8(%a0)    1754         mov.l           0x8+0x8(%a6),0x8(%a0)
1755         bsr.l           tag                      1755         bsr.l           tag                     # fetch operand type
1756         mov.b           %d0,STAG(%a6)            1756         mov.b           %d0,STAG(%a6)
1757         mov.b           %d0,%d1                  1757         mov.b           %d0,%d1
1758                                                  1758 
1759         andi.l          &0x00ff00ff,USER_FPSR    1759         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1760                                                  1760 
1761         clr.l           %d0                      1761         clr.l           %d0
1762         mov.b           FPCR_MODE(%a6),%d0       1762         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1763                                                  1763 
1764         tst.b           %d1                      1764         tst.b           %d1
1765         bne.b           _L6_2x                   1765         bne.b           _L6_2x
1766         bsr.l           satan                    1766         bsr.l           satan                   # operand is a NORM
1767         bra.b           _L6_6x                   1767         bra.b           _L6_6x
1768 _L6_2x:                                          1768 _L6_2x:
1769         cmpi.b          %d1,&ZERO                1769         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1770         bne.b           _L6_3x                   1770         bne.b           _L6_3x                  # no
1771         bsr.l           src_zero                 1771         bsr.l           src_zero                        # yes
1772         bra.b           _L6_6x                   1772         bra.b           _L6_6x
1773 _L6_3x:                                          1773 _L6_3x:
1774         cmpi.b          %d1,&INF                 1774         cmpi.b          %d1,&INF                # is operand an INF?
1775         bne.b           _L6_4x                   1775         bne.b           _L6_4x                  # no
1776         bsr.l           spi_2                    1776         bsr.l           spi_2                   # yes
1777         bra.b           _L6_6x                   1777         bra.b           _L6_6x
1778 _L6_4x:                                          1778 _L6_4x:
1779         cmpi.b          %d1,&QNAN                1779         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1780         bne.b           _L6_5x                   1780         bne.b           _L6_5x                  # no
1781         bsr.l           src_qnan                 1781         bsr.l           src_qnan                        # yes
1782         bra.b           _L6_6x                   1782         bra.b           _L6_6x
1783 _L6_5x:                                          1783 _L6_5x:
1784         bsr.l           satand                   1784         bsr.l           satand                  # operand is a DENORM
1785 _L6_6x:                                          1785 _L6_6x:
1786                                                  1786 
1787 #                                                1787 #
1788 #       Result is now in FP0                     1788 #       Result is now in FP0
1789 #                                                1789 #
1790         movm.l          EXC_DREGS(%a6),&0x030    1790         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1791         fmovm.l         USER_FPCR(%a6),%fpcr,    1791         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1792         fmovm.x         EXC_FP1(%a6),&0x40       1792         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1793         unlk            %a6                      1793         unlk            %a6
1794         rts                                      1794         rts
1795                                                  1795 
1796                                                  1796 
1797 #############################################    1797 #########################################################################
1798 # MONADIC TEMPLATE                               1798 # MONADIC TEMPLATE                                                      #
1799 #############################################    1799 #########################################################################
1800         global          _fasins_                 1800         global          _fasins_
1801 _fasins_:                                        1801 _fasins_:
1802         link            %a6,&-LOCAL_SIZE         1802         link            %a6,&-LOCAL_SIZE
1803                                                  1803 
1804         movm.l          &0x0303,EXC_DREGS(%a6    1804         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1805         fmovm.l         %fpcr,%fpsr,USER_FPCR    1805         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1806         fmovm.x         &0xc0,EXC_FP0(%a6)       1806         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1807                                                  1807 
1808         fmov.l          &0x0,%fpcr               1808         fmov.l          &0x0,%fpcr              # zero FPCR
1809                                                  1809 
1810 #                                                1810 #
1811 #       copy, convert, and tag input argument    1811 #       copy, convert, and tag input argument
1812 #                                                1812 #
1813         fmov.s          0x8(%a6),%fp0            1813         fmov.s          0x8(%a6),%fp0           # load sgl input
1814         fmov.x          %fp0,FP_SRC(%a6)         1814         fmov.x          %fp0,FP_SRC(%a6)
1815         lea             FP_SRC(%a6),%a0          1815         lea             FP_SRC(%a6),%a0
1816         bsr.l           tag                      1816         bsr.l           tag                     # fetch operand type
1817         mov.b           %d0,STAG(%a6)            1817         mov.b           %d0,STAG(%a6)
1818         mov.b           %d0,%d1                  1818         mov.b           %d0,%d1
1819                                                  1819 
1820         andi.l          &0x00ff00ff,USER_FPSR    1820         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1821                                                  1821 
1822         clr.l           %d0                      1822         clr.l           %d0
1823         mov.b           FPCR_MODE(%a6),%d0       1823         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1824                                                  1824 
1825         tst.b           %d1                      1825         tst.b           %d1
1826         bne.b           _L7_2s                   1826         bne.b           _L7_2s
1827         bsr.l           sasin                    1827         bsr.l           sasin                   # operand is a NORM
1828         bra.b           _L7_6s                   1828         bra.b           _L7_6s
1829 _L7_2s:                                          1829 _L7_2s:
1830         cmpi.b          %d1,&ZERO                1830         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1831         bne.b           _L7_3s                   1831         bne.b           _L7_3s                  # no
1832         bsr.l           src_zero                 1832         bsr.l           src_zero                        # yes
1833         bra.b           _L7_6s                   1833         bra.b           _L7_6s
1834 _L7_3s:                                          1834 _L7_3s:
1835         cmpi.b          %d1,&INF                 1835         cmpi.b          %d1,&INF                # is operand an INF?
1836         bne.b           _L7_4s                   1836         bne.b           _L7_4s                  # no
1837         bsr.l           t_operr                  1837         bsr.l           t_operr                 # yes
1838         bra.b           _L7_6s                   1838         bra.b           _L7_6s
1839 _L7_4s:                                          1839 _L7_4s:
1840         cmpi.b          %d1,&QNAN                1840         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1841         bne.b           _L7_5s                   1841         bne.b           _L7_5s                  # no
1842         bsr.l           src_qnan                 1842         bsr.l           src_qnan                        # yes
1843         bra.b           _L7_6s                   1843         bra.b           _L7_6s
1844 _L7_5s:                                          1844 _L7_5s:
1845         bsr.l           sasind                   1845         bsr.l           sasind                  # operand is a DENORM
1846 _L7_6s:                                          1846 _L7_6s:
1847                                                  1847 
1848 #                                                1848 #
1849 #       Result is now in FP0                     1849 #       Result is now in FP0
1850 #                                                1850 #
1851         movm.l          EXC_DREGS(%a6),&0x030    1851         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1852         fmovm.l         USER_FPCR(%a6),%fpcr,    1852         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1853         fmovm.x         EXC_FP1(%a6),&0x40       1853         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1854         unlk            %a6                      1854         unlk            %a6
1855         rts                                      1855         rts
1856                                                  1856 
1857         global          _fasind_                 1857         global          _fasind_
1858 _fasind_:                                        1858 _fasind_:
1859         link            %a6,&-LOCAL_SIZE         1859         link            %a6,&-LOCAL_SIZE
1860                                                  1860 
1861         movm.l          &0x0303,EXC_DREGS(%a6    1861         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1862         fmovm.l         %fpcr,%fpsr,USER_FPCR    1862         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1863         fmovm.x         &0xc0,EXC_FP0(%a6)       1863         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1864                                                  1864 
1865         fmov.l          &0x0,%fpcr               1865         fmov.l          &0x0,%fpcr              # zero FPCR
1866                                                  1866 
1867 #                                                1867 #
1868 #       copy, convert, and tag input argument    1868 #       copy, convert, and tag input argument
1869 #                                                1869 #
1870         fmov.d          0x8(%a6),%fp0            1870         fmov.d          0x8(%a6),%fp0           # load dbl input
1871         fmov.x          %fp0,FP_SRC(%a6)         1871         fmov.x          %fp0,FP_SRC(%a6)
1872         lea             FP_SRC(%a6),%a0          1872         lea             FP_SRC(%a6),%a0
1873         bsr.l           tag                      1873         bsr.l           tag                     # fetch operand type
1874         mov.b           %d0,STAG(%a6)            1874         mov.b           %d0,STAG(%a6)
1875         mov.b           %d0,%d1                  1875         mov.b           %d0,%d1
1876                                                  1876 
1877         andi.l          &0x00ff00ff,USER_FPSR    1877         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1878                                                  1878 
1879         clr.l           %d0                      1879         clr.l           %d0
1880         mov.b           FPCR_MODE(%a6),%d0       1880         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1881                                                  1881 
1882         mov.b           %d1,STAG(%a6)            1882         mov.b           %d1,STAG(%a6)
1883         tst.b           %d1                      1883         tst.b           %d1
1884         bne.b           _L7_2d                   1884         bne.b           _L7_2d
1885         bsr.l           sasin                    1885         bsr.l           sasin                   # operand is a NORM
1886         bra.b           _L7_6d                   1886         bra.b           _L7_6d
1887 _L7_2d:                                          1887 _L7_2d:
1888         cmpi.b          %d1,&ZERO                1888         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1889         bne.b           _L7_3d                   1889         bne.b           _L7_3d                  # no
1890         bsr.l           src_zero                 1890         bsr.l           src_zero                        # yes
1891         bra.b           _L7_6d                   1891         bra.b           _L7_6d
1892 _L7_3d:                                          1892 _L7_3d:
1893         cmpi.b          %d1,&INF                 1893         cmpi.b          %d1,&INF                # is operand an INF?
1894         bne.b           _L7_4d                   1894         bne.b           _L7_4d                  # no
1895         bsr.l           t_operr                  1895         bsr.l           t_operr                 # yes
1896         bra.b           _L7_6d                   1896         bra.b           _L7_6d
1897 _L7_4d:                                          1897 _L7_4d:
1898         cmpi.b          %d1,&QNAN                1898         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1899         bne.b           _L7_5d                   1899         bne.b           _L7_5d                  # no
1900         bsr.l           src_qnan                 1900         bsr.l           src_qnan                        # yes
1901         bra.b           _L7_6d                   1901         bra.b           _L7_6d
1902 _L7_5d:                                          1902 _L7_5d:
1903         bsr.l           sasind                   1903         bsr.l           sasind                  # operand is a DENORM
1904 _L7_6d:                                          1904 _L7_6d:
1905                                                  1905 
1906 #                                                1906 #
1907 #       Result is now in FP0                     1907 #       Result is now in FP0
1908 #                                                1908 #
1909         movm.l          EXC_DREGS(%a6),&0x030    1909         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1910         fmovm.l         USER_FPCR(%a6),%fpcr,    1910         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1911         fmovm.x         EXC_FP1(%a6),&0x40       1911         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1912         unlk            %a6                      1912         unlk            %a6
1913         rts                                      1913         rts
1914                                                  1914 
1915         global          _fasinx_                 1915         global          _fasinx_
1916 _fasinx_:                                        1916 _fasinx_:
1917         link            %a6,&-LOCAL_SIZE         1917         link            %a6,&-LOCAL_SIZE
1918                                                  1918 
1919         movm.l          &0x0303,EXC_DREGS(%a6    1919         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1920         fmovm.l         %fpcr,%fpsr,USER_FPCR    1920         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1921         fmovm.x         &0xc0,EXC_FP0(%a6)       1921         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1922                                                  1922 
1923         fmov.l          &0x0,%fpcr               1923         fmov.l          &0x0,%fpcr              # zero FPCR
1924                                                  1924 
1925 #                                                1925 #
1926 #       copy, convert, and tag input argument    1926 #       copy, convert, and tag input argument
1927 #                                                1927 #
1928         lea             FP_SRC(%a6),%a0          1928         lea             FP_SRC(%a6),%a0
1929         mov.l           0x8+0x0(%a6),0x0(%a0)    1929         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
1930         mov.l           0x8+0x4(%a6),0x4(%a0)    1930         mov.l           0x8+0x4(%a6),0x4(%a0)
1931         mov.l           0x8+0x8(%a6),0x8(%a0)    1931         mov.l           0x8+0x8(%a6),0x8(%a0)
1932         bsr.l           tag                      1932         bsr.l           tag                     # fetch operand type
1933         mov.b           %d0,STAG(%a6)            1933         mov.b           %d0,STAG(%a6)
1934         mov.b           %d0,%d1                  1934         mov.b           %d0,%d1
1935                                                  1935 
1936         andi.l          &0x00ff00ff,USER_FPSR    1936         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1937                                                  1937 
1938         clr.l           %d0                      1938         clr.l           %d0
1939         mov.b           FPCR_MODE(%a6),%d0       1939         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
1940                                                  1940 
1941         tst.b           %d1                      1941         tst.b           %d1
1942         bne.b           _L7_2x                   1942         bne.b           _L7_2x
1943         bsr.l           sasin                    1943         bsr.l           sasin                   # operand is a NORM
1944         bra.b           _L7_6x                   1944         bra.b           _L7_6x
1945 _L7_2x:                                          1945 _L7_2x:
1946         cmpi.b          %d1,&ZERO                1946         cmpi.b          %d1,&ZERO               # is operand a ZERO?
1947         bne.b           _L7_3x                   1947         bne.b           _L7_3x                  # no
1948         bsr.l           src_zero                 1948         bsr.l           src_zero                        # yes
1949         bra.b           _L7_6x                   1949         bra.b           _L7_6x
1950 _L7_3x:                                          1950 _L7_3x:
1951         cmpi.b          %d1,&INF                 1951         cmpi.b          %d1,&INF                # is operand an INF?
1952         bne.b           _L7_4x                   1952         bne.b           _L7_4x                  # no
1953         bsr.l           t_operr                  1953         bsr.l           t_operr                 # yes
1954         bra.b           _L7_6x                   1954         bra.b           _L7_6x
1955 _L7_4x:                                          1955 _L7_4x:
1956         cmpi.b          %d1,&QNAN                1956         cmpi.b          %d1,&QNAN               # is operand a QNAN?
1957         bne.b           _L7_5x                   1957         bne.b           _L7_5x                  # no
1958         bsr.l           src_qnan                 1958         bsr.l           src_qnan                        # yes
1959         bra.b           _L7_6x                   1959         bra.b           _L7_6x
1960 _L7_5x:                                          1960 _L7_5x:
1961         bsr.l           sasind                   1961         bsr.l           sasind                  # operand is a DENORM
1962 _L7_6x:                                          1962 _L7_6x:
1963                                                  1963 
1964 #                                                1964 #
1965 #       Result is now in FP0                     1965 #       Result is now in FP0
1966 #                                                1966 #
1967         movm.l          EXC_DREGS(%a6),&0x030    1967         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
1968         fmovm.l         USER_FPCR(%a6),%fpcr,    1968         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1969         fmovm.x         EXC_FP1(%a6),&0x40       1969         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
1970         unlk            %a6                      1970         unlk            %a6
1971         rts                                      1971         rts
1972                                                  1972 
1973                                                  1973 
1974 #############################################    1974 #########################################################################
1975 # MONADIC TEMPLATE                               1975 # MONADIC TEMPLATE                                                      #
1976 #############################################    1976 #########################################################################
1977         global          _fatanhs_                1977         global          _fatanhs_
1978 _fatanhs_:                                       1978 _fatanhs_:
1979         link            %a6,&-LOCAL_SIZE         1979         link            %a6,&-LOCAL_SIZE
1980                                                  1980 
1981         movm.l          &0x0303,EXC_DREGS(%a6    1981         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
1982         fmovm.l         %fpcr,%fpsr,USER_FPCR    1982         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1983         fmovm.x         &0xc0,EXC_FP0(%a6)       1983         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
1984                                                  1984 
1985         fmov.l          &0x0,%fpcr               1985         fmov.l          &0x0,%fpcr              # zero FPCR
1986                                                  1986 
1987 #                                                1987 #
1988 #       copy, convert, and tag input argument    1988 #       copy, convert, and tag input argument
1989 #                                                1989 #
1990         fmov.s          0x8(%a6),%fp0            1990         fmov.s          0x8(%a6),%fp0           # load sgl input
1991         fmov.x          %fp0,FP_SRC(%a6)         1991         fmov.x          %fp0,FP_SRC(%a6)
1992         lea             FP_SRC(%a6),%a0          1992         lea             FP_SRC(%a6),%a0
1993         bsr.l           tag                      1993         bsr.l           tag                     # fetch operand type
1994         mov.b           %d0,STAG(%a6)            1994         mov.b           %d0,STAG(%a6)
1995         mov.b           %d0,%d1                  1995         mov.b           %d0,%d1
1996                                                  1996 
1997         andi.l          &0x00ff00ff,USER_FPSR    1997         andi.l          &0x00ff00ff,USER_FPSR(%a6)
1998                                                  1998 
1999         clr.l           %d0                      1999         clr.l           %d0
2000         mov.b           FPCR_MODE(%a6),%d0       2000         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2001                                                  2001 
2002         tst.b           %d1                      2002         tst.b           %d1
2003         bne.b           _L8_2s                   2003         bne.b           _L8_2s
2004         bsr.l           satanh                   2004         bsr.l           satanh                  # operand is a NORM
2005         bra.b           _L8_6s                   2005         bra.b           _L8_6s
2006 _L8_2s:                                          2006 _L8_2s:
2007         cmpi.b          %d1,&ZERO                2007         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2008         bne.b           _L8_3s                   2008         bne.b           _L8_3s                  # no
2009         bsr.l           src_zero                 2009         bsr.l           src_zero                        # yes
2010         bra.b           _L8_6s                   2010         bra.b           _L8_6s
2011 _L8_3s:                                          2011 _L8_3s:
2012         cmpi.b          %d1,&INF                 2012         cmpi.b          %d1,&INF                # is operand an INF?
2013         bne.b           _L8_4s                   2013         bne.b           _L8_4s                  # no
2014         bsr.l           t_operr                  2014         bsr.l           t_operr                 # yes
2015         bra.b           _L8_6s                   2015         bra.b           _L8_6s
2016 _L8_4s:                                          2016 _L8_4s:
2017         cmpi.b          %d1,&QNAN                2017         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2018         bne.b           _L8_5s                   2018         bne.b           _L8_5s                  # no
2019         bsr.l           src_qnan                 2019         bsr.l           src_qnan                        # yes
2020         bra.b           _L8_6s                   2020         bra.b           _L8_6s
2021 _L8_5s:                                          2021 _L8_5s:
2022         bsr.l           satanhd                  2022         bsr.l           satanhd                 # operand is a DENORM
2023 _L8_6s:                                          2023 _L8_6s:
2024                                                  2024 
2025 #                                                2025 #
2026 #       Result is now in FP0                     2026 #       Result is now in FP0
2027 #                                                2027 #
2028         movm.l          EXC_DREGS(%a6),&0x030    2028         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2029         fmovm.l         USER_FPCR(%a6),%fpcr,    2029         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2030         fmovm.x         EXC_FP1(%a6),&0x40       2030         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2031         unlk            %a6                      2031         unlk            %a6
2032         rts                                      2032         rts
2033                                                  2033 
2034         global          _fatanhd_                2034         global          _fatanhd_
2035 _fatanhd_:                                       2035 _fatanhd_:
2036         link            %a6,&-LOCAL_SIZE         2036         link            %a6,&-LOCAL_SIZE
2037                                                  2037 
2038         movm.l          &0x0303,EXC_DREGS(%a6    2038         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2039         fmovm.l         %fpcr,%fpsr,USER_FPCR    2039         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2040         fmovm.x         &0xc0,EXC_FP0(%a6)       2040         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2041                                                  2041 
2042         fmov.l          &0x0,%fpcr               2042         fmov.l          &0x0,%fpcr              # zero FPCR
2043                                                  2043 
2044 #                                                2044 #
2045 #       copy, convert, and tag input argument    2045 #       copy, convert, and tag input argument
2046 #                                                2046 #
2047         fmov.d          0x8(%a6),%fp0            2047         fmov.d          0x8(%a6),%fp0           # load dbl input
2048         fmov.x          %fp0,FP_SRC(%a6)         2048         fmov.x          %fp0,FP_SRC(%a6)
2049         lea             FP_SRC(%a6),%a0          2049         lea             FP_SRC(%a6),%a0
2050         bsr.l           tag                      2050         bsr.l           tag                     # fetch operand type
2051         mov.b           %d0,STAG(%a6)            2051         mov.b           %d0,STAG(%a6)
2052         mov.b           %d0,%d1                  2052         mov.b           %d0,%d1
2053                                                  2053 
2054         andi.l          &0x00ff00ff,USER_FPSR    2054         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2055                                                  2055 
2056         clr.l           %d0                      2056         clr.l           %d0
2057         mov.b           FPCR_MODE(%a6),%d0       2057         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2058                                                  2058 
2059         mov.b           %d1,STAG(%a6)            2059         mov.b           %d1,STAG(%a6)
2060         tst.b           %d1                      2060         tst.b           %d1
2061         bne.b           _L8_2d                   2061         bne.b           _L8_2d
2062         bsr.l           satanh                   2062         bsr.l           satanh                  # operand is a NORM
2063         bra.b           _L8_6d                   2063         bra.b           _L8_6d
2064 _L8_2d:                                          2064 _L8_2d:
2065         cmpi.b          %d1,&ZERO                2065         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2066         bne.b           _L8_3d                   2066         bne.b           _L8_3d                  # no
2067         bsr.l           src_zero                 2067         bsr.l           src_zero                        # yes
2068         bra.b           _L8_6d                   2068         bra.b           _L8_6d
2069 _L8_3d:                                          2069 _L8_3d:
2070         cmpi.b          %d1,&INF                 2070         cmpi.b          %d1,&INF                # is operand an INF?
2071         bne.b           _L8_4d                   2071         bne.b           _L8_4d                  # no
2072         bsr.l           t_operr                  2072         bsr.l           t_operr                 # yes
2073         bra.b           _L8_6d                   2073         bra.b           _L8_6d
2074 _L8_4d:                                          2074 _L8_4d:
2075         cmpi.b          %d1,&QNAN                2075         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2076         bne.b           _L8_5d                   2076         bne.b           _L8_5d                  # no
2077         bsr.l           src_qnan                 2077         bsr.l           src_qnan                        # yes
2078         bra.b           _L8_6d                   2078         bra.b           _L8_6d
2079 _L8_5d:                                          2079 _L8_5d:
2080         bsr.l           satanhd                  2080         bsr.l           satanhd                 # operand is a DENORM
2081 _L8_6d:                                          2081 _L8_6d:
2082                                                  2082 
2083 #                                                2083 #
2084 #       Result is now in FP0                     2084 #       Result is now in FP0
2085 #                                                2085 #
2086         movm.l          EXC_DREGS(%a6),&0x030    2086         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2087         fmovm.l         USER_FPCR(%a6),%fpcr,    2087         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2088         fmovm.x         EXC_FP1(%a6),&0x40       2088         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2089         unlk            %a6                      2089         unlk            %a6
2090         rts                                      2090         rts
2091                                                  2091 
2092         global          _fatanhx_                2092         global          _fatanhx_
2093 _fatanhx_:                                       2093 _fatanhx_:
2094         link            %a6,&-LOCAL_SIZE         2094         link            %a6,&-LOCAL_SIZE
2095                                                  2095 
2096         movm.l          &0x0303,EXC_DREGS(%a6    2096         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2097         fmovm.l         %fpcr,%fpsr,USER_FPCR    2097         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2098         fmovm.x         &0xc0,EXC_FP0(%a6)       2098         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2099                                                  2099 
2100         fmov.l          &0x0,%fpcr               2100         fmov.l          &0x0,%fpcr              # zero FPCR
2101                                                  2101 
2102 #                                                2102 #
2103 #       copy, convert, and tag input argument    2103 #       copy, convert, and tag input argument
2104 #                                                2104 #
2105         lea             FP_SRC(%a6),%a0          2105         lea             FP_SRC(%a6),%a0
2106         mov.l           0x8+0x0(%a6),0x0(%a0)    2106         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
2107         mov.l           0x8+0x4(%a6),0x4(%a0)    2107         mov.l           0x8+0x4(%a6),0x4(%a0)
2108         mov.l           0x8+0x8(%a6),0x8(%a0)    2108         mov.l           0x8+0x8(%a6),0x8(%a0)
2109         bsr.l           tag                      2109         bsr.l           tag                     # fetch operand type
2110         mov.b           %d0,STAG(%a6)            2110         mov.b           %d0,STAG(%a6)
2111         mov.b           %d0,%d1                  2111         mov.b           %d0,%d1
2112                                                  2112 
2113         andi.l          &0x00ff00ff,USER_FPSR    2113         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2114                                                  2114 
2115         clr.l           %d0                      2115         clr.l           %d0
2116         mov.b           FPCR_MODE(%a6),%d0       2116         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2117                                                  2117 
2118         tst.b           %d1                      2118         tst.b           %d1
2119         bne.b           _L8_2x                   2119         bne.b           _L8_2x
2120         bsr.l           satanh                   2120         bsr.l           satanh                  # operand is a NORM
2121         bra.b           _L8_6x                   2121         bra.b           _L8_6x
2122 _L8_2x:                                          2122 _L8_2x:
2123         cmpi.b          %d1,&ZERO                2123         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2124         bne.b           _L8_3x                   2124         bne.b           _L8_3x                  # no
2125         bsr.l           src_zero                 2125         bsr.l           src_zero                        # yes
2126         bra.b           _L8_6x                   2126         bra.b           _L8_6x
2127 _L8_3x:                                          2127 _L8_3x:
2128         cmpi.b          %d1,&INF                 2128         cmpi.b          %d1,&INF                # is operand an INF?
2129         bne.b           _L8_4x                   2129         bne.b           _L8_4x                  # no
2130         bsr.l           t_operr                  2130         bsr.l           t_operr                 # yes
2131         bra.b           _L8_6x                   2131         bra.b           _L8_6x
2132 _L8_4x:                                          2132 _L8_4x:
2133         cmpi.b          %d1,&QNAN                2133         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2134         bne.b           _L8_5x                   2134         bne.b           _L8_5x                  # no
2135         bsr.l           src_qnan                 2135         bsr.l           src_qnan                        # yes
2136         bra.b           _L8_6x                   2136         bra.b           _L8_6x
2137 _L8_5x:                                          2137 _L8_5x:
2138         bsr.l           satanhd                  2138         bsr.l           satanhd                 # operand is a DENORM
2139 _L8_6x:                                          2139 _L8_6x:
2140                                                  2140 
2141 #                                                2141 #
2142 #       Result is now in FP0                     2142 #       Result is now in FP0
2143 #                                                2143 #
2144         movm.l          EXC_DREGS(%a6),&0x030    2144         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2145         fmovm.l         USER_FPCR(%a6),%fpcr,    2145         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2146         fmovm.x         EXC_FP1(%a6),&0x40       2146         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2147         unlk            %a6                      2147         unlk            %a6
2148         rts                                      2148         rts
2149                                                  2149 
2150                                                  2150 
2151 #############################################    2151 #########################################################################
2152 # MONADIC TEMPLATE                               2152 # MONADIC TEMPLATE                                                      #
2153 #############################################    2153 #########################################################################
2154         global          _ftans_                  2154         global          _ftans_
2155 _ftans_:                                         2155 _ftans_:
2156         link            %a6,&-LOCAL_SIZE         2156         link            %a6,&-LOCAL_SIZE
2157                                                  2157 
2158         movm.l          &0x0303,EXC_DREGS(%a6    2158         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2159         fmovm.l         %fpcr,%fpsr,USER_FPCR    2159         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2160         fmovm.x         &0xc0,EXC_FP0(%a6)       2160         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2161                                                  2161 
2162         fmov.l          &0x0,%fpcr               2162         fmov.l          &0x0,%fpcr              # zero FPCR
2163                                                  2163 
2164 #                                                2164 #
2165 #       copy, convert, and tag input argument    2165 #       copy, convert, and tag input argument
2166 #                                                2166 #
2167         fmov.s          0x8(%a6),%fp0            2167         fmov.s          0x8(%a6),%fp0           # load sgl input
2168         fmov.x          %fp0,FP_SRC(%a6)         2168         fmov.x          %fp0,FP_SRC(%a6)
2169         lea             FP_SRC(%a6),%a0          2169         lea             FP_SRC(%a6),%a0
2170         bsr.l           tag                      2170         bsr.l           tag                     # fetch operand type
2171         mov.b           %d0,STAG(%a6)            2171         mov.b           %d0,STAG(%a6)
2172         mov.b           %d0,%d1                  2172         mov.b           %d0,%d1
2173                                                  2173 
2174         andi.l          &0x00ff00ff,USER_FPSR    2174         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2175                                                  2175 
2176         clr.l           %d0                      2176         clr.l           %d0
2177         mov.b           FPCR_MODE(%a6),%d0       2177         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2178                                                  2178 
2179         tst.b           %d1                      2179         tst.b           %d1
2180         bne.b           _L9_2s                   2180         bne.b           _L9_2s
2181         bsr.l           stan                     2181         bsr.l           stan                    # operand is a NORM
2182         bra.b           _L9_6s                   2182         bra.b           _L9_6s
2183 _L9_2s:                                          2183 _L9_2s:
2184         cmpi.b          %d1,&ZERO                2184         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2185         bne.b           _L9_3s                   2185         bne.b           _L9_3s                  # no
2186         bsr.l           src_zero                 2186         bsr.l           src_zero                        # yes
2187         bra.b           _L9_6s                   2187         bra.b           _L9_6s
2188 _L9_3s:                                          2188 _L9_3s:
2189         cmpi.b          %d1,&INF                 2189         cmpi.b          %d1,&INF                # is operand an INF?
2190         bne.b           _L9_4s                   2190         bne.b           _L9_4s                  # no
2191         bsr.l           t_operr                  2191         bsr.l           t_operr                 # yes
2192         bra.b           _L9_6s                   2192         bra.b           _L9_6s
2193 _L9_4s:                                          2193 _L9_4s:
2194         cmpi.b          %d1,&QNAN                2194         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2195         bne.b           _L9_5s                   2195         bne.b           _L9_5s                  # no
2196         bsr.l           src_qnan                 2196         bsr.l           src_qnan                        # yes
2197         bra.b           _L9_6s                   2197         bra.b           _L9_6s
2198 _L9_5s:                                          2198 _L9_5s:
2199         bsr.l           stand                    2199         bsr.l           stand                   # operand is a DENORM
2200 _L9_6s:                                          2200 _L9_6s:
2201                                                  2201 
2202 #                                                2202 #
2203 #       Result is now in FP0                     2203 #       Result is now in FP0
2204 #                                                2204 #
2205         movm.l          EXC_DREGS(%a6),&0x030    2205         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2206         fmovm.l         USER_FPCR(%a6),%fpcr,    2206         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2207         fmovm.x         EXC_FP1(%a6),&0x40       2207         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2208         unlk            %a6                      2208         unlk            %a6
2209         rts                                      2209         rts
2210                                                  2210 
2211         global          _ftand_                  2211         global          _ftand_
2212 _ftand_:                                         2212 _ftand_:
2213         link            %a6,&-LOCAL_SIZE         2213         link            %a6,&-LOCAL_SIZE
2214                                                  2214 
2215         movm.l          &0x0303,EXC_DREGS(%a6    2215         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2216         fmovm.l         %fpcr,%fpsr,USER_FPCR    2216         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2217         fmovm.x         &0xc0,EXC_FP0(%a6)       2217         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2218                                                  2218 
2219         fmov.l          &0x0,%fpcr               2219         fmov.l          &0x0,%fpcr              # zero FPCR
2220                                                  2220 
2221 #                                                2221 #
2222 #       copy, convert, and tag input argument    2222 #       copy, convert, and tag input argument
2223 #                                                2223 #
2224         fmov.d          0x8(%a6),%fp0            2224         fmov.d          0x8(%a6),%fp0           # load dbl input
2225         fmov.x          %fp0,FP_SRC(%a6)         2225         fmov.x          %fp0,FP_SRC(%a6)
2226         lea             FP_SRC(%a6),%a0          2226         lea             FP_SRC(%a6),%a0
2227         bsr.l           tag                      2227         bsr.l           tag                     # fetch operand type
2228         mov.b           %d0,STAG(%a6)            2228         mov.b           %d0,STAG(%a6)
2229         mov.b           %d0,%d1                  2229         mov.b           %d0,%d1
2230                                                  2230 
2231         andi.l          &0x00ff00ff,USER_FPSR    2231         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2232                                                  2232 
2233         clr.l           %d0                      2233         clr.l           %d0
2234         mov.b           FPCR_MODE(%a6),%d0       2234         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2235                                                  2235 
2236         mov.b           %d1,STAG(%a6)            2236         mov.b           %d1,STAG(%a6)
2237         tst.b           %d1                      2237         tst.b           %d1
2238         bne.b           _L9_2d                   2238         bne.b           _L9_2d
2239         bsr.l           stan                     2239         bsr.l           stan                    # operand is a NORM
2240         bra.b           _L9_6d                   2240         bra.b           _L9_6d
2241 _L9_2d:                                          2241 _L9_2d:
2242         cmpi.b          %d1,&ZERO                2242         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2243         bne.b           _L9_3d                   2243         bne.b           _L9_3d                  # no
2244         bsr.l           src_zero                 2244         bsr.l           src_zero                        # yes
2245         bra.b           _L9_6d                   2245         bra.b           _L9_6d
2246 _L9_3d:                                          2246 _L9_3d:
2247         cmpi.b          %d1,&INF                 2247         cmpi.b          %d1,&INF                # is operand an INF?
2248         bne.b           _L9_4d                   2248         bne.b           _L9_4d                  # no
2249         bsr.l           t_operr                  2249         bsr.l           t_operr                 # yes
2250         bra.b           _L9_6d                   2250         bra.b           _L9_6d
2251 _L9_4d:                                          2251 _L9_4d:
2252         cmpi.b          %d1,&QNAN                2252         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2253         bne.b           _L9_5d                   2253         bne.b           _L9_5d                  # no
2254         bsr.l           src_qnan                 2254         bsr.l           src_qnan                        # yes
2255         bra.b           _L9_6d                   2255         bra.b           _L9_6d
2256 _L9_5d:                                          2256 _L9_5d:
2257         bsr.l           stand                    2257         bsr.l           stand                   # operand is a DENORM
2258 _L9_6d:                                          2258 _L9_6d:
2259                                                  2259 
2260 #                                                2260 #
2261 #       Result is now in FP0                     2261 #       Result is now in FP0
2262 #                                                2262 #
2263         movm.l          EXC_DREGS(%a6),&0x030    2263         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2264         fmovm.l         USER_FPCR(%a6),%fpcr,    2264         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2265         fmovm.x         EXC_FP1(%a6),&0x40       2265         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2266         unlk            %a6                      2266         unlk            %a6
2267         rts                                      2267         rts
2268                                                  2268 
2269         global          _ftanx_                  2269         global          _ftanx_
2270 _ftanx_:                                         2270 _ftanx_:
2271         link            %a6,&-LOCAL_SIZE         2271         link            %a6,&-LOCAL_SIZE
2272                                                  2272 
2273         movm.l          &0x0303,EXC_DREGS(%a6    2273         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2274         fmovm.l         %fpcr,%fpsr,USER_FPCR    2274         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2275         fmovm.x         &0xc0,EXC_FP0(%a6)       2275         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2276                                                  2276 
2277         fmov.l          &0x0,%fpcr               2277         fmov.l          &0x0,%fpcr              # zero FPCR
2278                                                  2278 
2279 #                                                2279 #
2280 #       copy, convert, and tag input argument    2280 #       copy, convert, and tag input argument
2281 #                                                2281 #
2282         lea             FP_SRC(%a6),%a0          2282         lea             FP_SRC(%a6),%a0
2283         mov.l           0x8+0x0(%a6),0x0(%a0)    2283         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
2284         mov.l           0x8+0x4(%a6),0x4(%a0)    2284         mov.l           0x8+0x4(%a6),0x4(%a0)
2285         mov.l           0x8+0x8(%a6),0x8(%a0)    2285         mov.l           0x8+0x8(%a6),0x8(%a0)
2286         bsr.l           tag                      2286         bsr.l           tag                     # fetch operand type
2287         mov.b           %d0,STAG(%a6)            2287         mov.b           %d0,STAG(%a6)
2288         mov.b           %d0,%d1                  2288         mov.b           %d0,%d1
2289                                                  2289 
2290         andi.l          &0x00ff00ff,USER_FPSR    2290         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2291                                                  2291 
2292         clr.l           %d0                      2292         clr.l           %d0
2293         mov.b           FPCR_MODE(%a6),%d0       2293         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2294                                                  2294 
2295         tst.b           %d1                      2295         tst.b           %d1
2296         bne.b           _L9_2x                   2296         bne.b           _L9_2x
2297         bsr.l           stan                     2297         bsr.l           stan                    # operand is a NORM
2298         bra.b           _L9_6x                   2298         bra.b           _L9_6x
2299 _L9_2x:                                          2299 _L9_2x:
2300         cmpi.b          %d1,&ZERO                2300         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2301         bne.b           _L9_3x                   2301         bne.b           _L9_3x                  # no
2302         bsr.l           src_zero                 2302         bsr.l           src_zero                        # yes
2303         bra.b           _L9_6x                   2303         bra.b           _L9_6x
2304 _L9_3x:                                          2304 _L9_3x:
2305         cmpi.b          %d1,&INF                 2305         cmpi.b          %d1,&INF                # is operand an INF?
2306         bne.b           _L9_4x                   2306         bne.b           _L9_4x                  # no
2307         bsr.l           t_operr                  2307         bsr.l           t_operr                 # yes
2308         bra.b           _L9_6x                   2308         bra.b           _L9_6x
2309 _L9_4x:                                          2309 _L9_4x:
2310         cmpi.b          %d1,&QNAN                2310         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2311         bne.b           _L9_5x                   2311         bne.b           _L9_5x                  # no
2312         bsr.l           src_qnan                 2312         bsr.l           src_qnan                        # yes
2313         bra.b           _L9_6x                   2313         bra.b           _L9_6x
2314 _L9_5x:                                          2314 _L9_5x:
2315         bsr.l           stand                    2315         bsr.l           stand                   # operand is a DENORM
2316 _L9_6x:                                          2316 _L9_6x:
2317                                                  2317 
2318 #                                                2318 #
2319 #       Result is now in FP0                     2319 #       Result is now in FP0
2320 #                                                2320 #
2321         movm.l          EXC_DREGS(%a6),&0x030    2321         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2322         fmovm.l         USER_FPCR(%a6),%fpcr,    2322         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2323         fmovm.x         EXC_FP1(%a6),&0x40       2323         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2324         unlk            %a6                      2324         unlk            %a6
2325         rts                                      2325         rts
2326                                                  2326 
2327                                                  2327 
2328 #############################################    2328 #########################################################################
2329 # MONADIC TEMPLATE                               2329 # MONADIC TEMPLATE                                                      #
2330 #############################################    2330 #########################################################################
2331         global          _fetoxs_                 2331         global          _fetoxs_
2332 _fetoxs_:                                        2332 _fetoxs_:
2333         link            %a6,&-LOCAL_SIZE         2333         link            %a6,&-LOCAL_SIZE
2334                                                  2334 
2335         movm.l          &0x0303,EXC_DREGS(%a6    2335         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2336         fmovm.l         %fpcr,%fpsr,USER_FPCR    2336         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2337         fmovm.x         &0xc0,EXC_FP0(%a6)       2337         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2338                                                  2338 
2339         fmov.l          &0x0,%fpcr               2339         fmov.l          &0x0,%fpcr              # zero FPCR
2340                                                  2340 
2341 #                                                2341 #
2342 #       copy, convert, and tag input argument    2342 #       copy, convert, and tag input argument
2343 #                                                2343 #
2344         fmov.s          0x8(%a6),%fp0            2344         fmov.s          0x8(%a6),%fp0           # load sgl input
2345         fmov.x          %fp0,FP_SRC(%a6)         2345         fmov.x          %fp0,FP_SRC(%a6)
2346         lea             FP_SRC(%a6),%a0          2346         lea             FP_SRC(%a6),%a0
2347         bsr.l           tag                      2347         bsr.l           tag                     # fetch operand type
2348         mov.b           %d0,STAG(%a6)            2348         mov.b           %d0,STAG(%a6)
2349         mov.b           %d0,%d1                  2349         mov.b           %d0,%d1
2350                                                  2350 
2351         andi.l          &0x00ff00ff,USER_FPSR    2351         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2352                                                  2352 
2353         clr.l           %d0                      2353         clr.l           %d0
2354         mov.b           FPCR_MODE(%a6),%d0       2354         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2355                                                  2355 
2356         tst.b           %d1                      2356         tst.b           %d1
2357         bne.b           _L10_2s                  2357         bne.b           _L10_2s
2358         bsr.l           setox                    2358         bsr.l           setox                   # operand is a NORM
2359         bra.b           _L10_6s                  2359         bra.b           _L10_6s
2360 _L10_2s:                                         2360 _L10_2s:
2361         cmpi.b          %d1,&ZERO                2361         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2362         bne.b           _L10_3s                  2362         bne.b           _L10_3s                 # no
2363         bsr.l           ld_pone                  2363         bsr.l           ld_pone                 # yes
2364         bra.b           _L10_6s                  2364         bra.b           _L10_6s
2365 _L10_3s:                                         2365 _L10_3s:
2366         cmpi.b          %d1,&INF                 2366         cmpi.b          %d1,&INF                # is operand an INF?
2367         bne.b           _L10_4s                  2367         bne.b           _L10_4s                 # no
2368         bsr.l           szr_inf                  2368         bsr.l           szr_inf                 # yes
2369         bra.b           _L10_6s                  2369         bra.b           _L10_6s
2370 _L10_4s:                                         2370 _L10_4s:
2371         cmpi.b          %d1,&QNAN                2371         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2372         bne.b           _L10_5s                  2372         bne.b           _L10_5s                 # no
2373         bsr.l           src_qnan                 2373         bsr.l           src_qnan                        # yes
2374         bra.b           _L10_6s                  2374         bra.b           _L10_6s
2375 _L10_5s:                                         2375 _L10_5s:
2376         bsr.l           setoxd                   2376         bsr.l           setoxd                  # operand is a DENORM
2377 _L10_6s:                                         2377 _L10_6s:
2378                                                  2378 
2379 #                                                2379 #
2380 #       Result is now in FP0                     2380 #       Result is now in FP0
2381 #                                                2381 #
2382         movm.l          EXC_DREGS(%a6),&0x030    2382         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2383         fmovm.l         USER_FPCR(%a6),%fpcr,    2383         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2384         fmovm.x         EXC_FP1(%a6),&0x40       2384         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2385         unlk            %a6                      2385         unlk            %a6
2386         rts                                      2386         rts
2387                                                  2387 
2388         global          _fetoxd_                 2388         global          _fetoxd_
2389 _fetoxd_:                                        2389 _fetoxd_:
2390         link            %a6,&-LOCAL_SIZE         2390         link            %a6,&-LOCAL_SIZE
2391                                                  2391 
2392         movm.l          &0x0303,EXC_DREGS(%a6    2392         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2393         fmovm.l         %fpcr,%fpsr,USER_FPCR    2393         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2394         fmovm.x         &0xc0,EXC_FP0(%a6)       2394         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2395                                                  2395 
2396         fmov.l          &0x0,%fpcr               2396         fmov.l          &0x0,%fpcr              # zero FPCR
2397                                                  2397 
2398 #                                                2398 #
2399 #       copy, convert, and tag input argument    2399 #       copy, convert, and tag input argument
2400 #                                                2400 #
2401         fmov.d          0x8(%a6),%fp0            2401         fmov.d          0x8(%a6),%fp0           # load dbl input
2402         fmov.x          %fp0,FP_SRC(%a6)         2402         fmov.x          %fp0,FP_SRC(%a6)
2403         lea             FP_SRC(%a6),%a0          2403         lea             FP_SRC(%a6),%a0
2404         bsr.l           tag                      2404         bsr.l           tag                     # fetch operand type
2405         mov.b           %d0,STAG(%a6)            2405         mov.b           %d0,STAG(%a6)
2406         mov.b           %d0,%d1                  2406         mov.b           %d0,%d1
2407                                                  2407 
2408         andi.l          &0x00ff00ff,USER_FPSR    2408         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2409                                                  2409 
2410         clr.l           %d0                      2410         clr.l           %d0
2411         mov.b           FPCR_MODE(%a6),%d0       2411         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2412                                                  2412 
2413         mov.b           %d1,STAG(%a6)            2413         mov.b           %d1,STAG(%a6)
2414         tst.b           %d1                      2414         tst.b           %d1
2415         bne.b           _L10_2d                  2415         bne.b           _L10_2d
2416         bsr.l           setox                    2416         bsr.l           setox                   # operand is a NORM
2417         bra.b           _L10_6d                  2417         bra.b           _L10_6d
2418 _L10_2d:                                         2418 _L10_2d:
2419         cmpi.b          %d1,&ZERO                2419         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2420         bne.b           _L10_3d                  2420         bne.b           _L10_3d                 # no
2421         bsr.l           ld_pone                  2421         bsr.l           ld_pone                 # yes
2422         bra.b           _L10_6d                  2422         bra.b           _L10_6d
2423 _L10_3d:                                         2423 _L10_3d:
2424         cmpi.b          %d1,&INF                 2424         cmpi.b          %d1,&INF                # is operand an INF?
2425         bne.b           _L10_4d                  2425         bne.b           _L10_4d                 # no
2426         bsr.l           szr_inf                  2426         bsr.l           szr_inf                 # yes
2427         bra.b           _L10_6d                  2427         bra.b           _L10_6d
2428 _L10_4d:                                         2428 _L10_4d:
2429         cmpi.b          %d1,&QNAN                2429         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2430         bne.b           _L10_5d                  2430         bne.b           _L10_5d                 # no
2431         bsr.l           src_qnan                 2431         bsr.l           src_qnan                        # yes
2432         bra.b           _L10_6d                  2432         bra.b           _L10_6d
2433 _L10_5d:                                         2433 _L10_5d:
2434         bsr.l           setoxd                   2434         bsr.l           setoxd                  # operand is a DENORM
2435 _L10_6d:                                         2435 _L10_6d:
2436                                                  2436 
2437 #                                                2437 #
2438 #       Result is now in FP0                     2438 #       Result is now in FP0
2439 #                                                2439 #
2440         movm.l          EXC_DREGS(%a6),&0x030    2440         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2441         fmovm.l         USER_FPCR(%a6),%fpcr,    2441         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2442         fmovm.x         EXC_FP1(%a6),&0x40       2442         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2443         unlk            %a6                      2443         unlk            %a6
2444         rts                                      2444         rts
2445                                                  2445 
2446         global          _fetoxx_                 2446         global          _fetoxx_
2447 _fetoxx_:                                        2447 _fetoxx_:
2448         link            %a6,&-LOCAL_SIZE         2448         link            %a6,&-LOCAL_SIZE
2449                                                  2449 
2450         movm.l          &0x0303,EXC_DREGS(%a6    2450         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2451         fmovm.l         %fpcr,%fpsr,USER_FPCR    2451         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2452         fmovm.x         &0xc0,EXC_FP0(%a6)       2452         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2453                                                  2453 
2454         fmov.l          &0x0,%fpcr               2454         fmov.l          &0x0,%fpcr              # zero FPCR
2455                                                  2455 
2456 #                                                2456 #
2457 #       copy, convert, and tag input argument    2457 #       copy, convert, and tag input argument
2458 #                                                2458 #
2459         lea             FP_SRC(%a6),%a0          2459         lea             FP_SRC(%a6),%a0
2460         mov.l           0x8+0x0(%a6),0x0(%a0)    2460         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
2461         mov.l           0x8+0x4(%a6),0x4(%a0)    2461         mov.l           0x8+0x4(%a6),0x4(%a0)
2462         mov.l           0x8+0x8(%a6),0x8(%a0)    2462         mov.l           0x8+0x8(%a6),0x8(%a0)
2463         bsr.l           tag                      2463         bsr.l           tag                     # fetch operand type
2464         mov.b           %d0,STAG(%a6)            2464         mov.b           %d0,STAG(%a6)
2465         mov.b           %d0,%d1                  2465         mov.b           %d0,%d1
2466                                                  2466 
2467         andi.l          &0x00ff00ff,USER_FPSR    2467         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2468                                                  2468 
2469         clr.l           %d0                      2469         clr.l           %d0
2470         mov.b           FPCR_MODE(%a6),%d0       2470         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2471                                                  2471 
2472         tst.b           %d1                      2472         tst.b           %d1
2473         bne.b           _L10_2x                  2473         bne.b           _L10_2x
2474         bsr.l           setox                    2474         bsr.l           setox                   # operand is a NORM
2475         bra.b           _L10_6x                  2475         bra.b           _L10_6x
2476 _L10_2x:                                         2476 _L10_2x:
2477         cmpi.b          %d1,&ZERO                2477         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2478         bne.b           _L10_3x                  2478         bne.b           _L10_3x                 # no
2479         bsr.l           ld_pone                  2479         bsr.l           ld_pone                 # yes
2480         bra.b           _L10_6x                  2480         bra.b           _L10_6x
2481 _L10_3x:                                         2481 _L10_3x:
2482         cmpi.b          %d1,&INF                 2482         cmpi.b          %d1,&INF                # is operand an INF?
2483         bne.b           _L10_4x                  2483         bne.b           _L10_4x                 # no
2484         bsr.l           szr_inf                  2484         bsr.l           szr_inf                 # yes
2485         bra.b           _L10_6x                  2485         bra.b           _L10_6x
2486 _L10_4x:                                         2486 _L10_4x:
2487         cmpi.b          %d1,&QNAN                2487         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2488         bne.b           _L10_5x                  2488         bne.b           _L10_5x                 # no
2489         bsr.l           src_qnan                 2489         bsr.l           src_qnan                        # yes
2490         bra.b           _L10_6x                  2490         bra.b           _L10_6x
2491 _L10_5x:                                         2491 _L10_5x:
2492         bsr.l           setoxd                   2492         bsr.l           setoxd                  # operand is a DENORM
2493 _L10_6x:                                         2493 _L10_6x:
2494                                                  2494 
2495 #                                                2495 #
2496 #       Result is now in FP0                     2496 #       Result is now in FP0
2497 #                                                2497 #
2498         movm.l          EXC_DREGS(%a6),&0x030    2498         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2499         fmovm.l         USER_FPCR(%a6),%fpcr,    2499         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2500         fmovm.x         EXC_FP1(%a6),&0x40       2500         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2501         unlk            %a6                      2501         unlk            %a6
2502         rts                                      2502         rts
2503                                                  2503 
2504                                                  2504 
2505 #############################################    2505 #########################################################################
2506 # MONADIC TEMPLATE                               2506 # MONADIC TEMPLATE                                                      #
2507 #############################################    2507 #########################################################################
2508         global          _ftwotoxs_               2508         global          _ftwotoxs_
2509 _ftwotoxs_:                                      2509 _ftwotoxs_:
2510         link            %a6,&-LOCAL_SIZE         2510         link            %a6,&-LOCAL_SIZE
2511                                                  2511 
2512         movm.l          &0x0303,EXC_DREGS(%a6    2512         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2513         fmovm.l         %fpcr,%fpsr,USER_FPCR    2513         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2514         fmovm.x         &0xc0,EXC_FP0(%a6)       2514         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2515                                                  2515 
2516         fmov.l          &0x0,%fpcr               2516         fmov.l          &0x0,%fpcr              # zero FPCR
2517                                                  2517 
2518 #                                                2518 #
2519 #       copy, convert, and tag input argument    2519 #       copy, convert, and tag input argument
2520 #                                                2520 #
2521         fmov.s          0x8(%a6),%fp0            2521         fmov.s          0x8(%a6),%fp0           # load sgl input
2522         fmov.x          %fp0,FP_SRC(%a6)         2522         fmov.x          %fp0,FP_SRC(%a6)
2523         lea             FP_SRC(%a6),%a0          2523         lea             FP_SRC(%a6),%a0
2524         bsr.l           tag                      2524         bsr.l           tag                     # fetch operand type
2525         mov.b           %d0,STAG(%a6)            2525         mov.b           %d0,STAG(%a6)
2526         mov.b           %d0,%d1                  2526         mov.b           %d0,%d1
2527                                                  2527 
2528         andi.l          &0x00ff00ff,USER_FPSR    2528         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2529                                                  2529 
2530         clr.l           %d0                      2530         clr.l           %d0
2531         mov.b           FPCR_MODE(%a6),%d0       2531         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2532                                                  2532 
2533         tst.b           %d1                      2533         tst.b           %d1
2534         bne.b           _L11_2s                  2534         bne.b           _L11_2s
2535         bsr.l           stwotox                  2535         bsr.l           stwotox                 # operand is a NORM
2536         bra.b           _L11_6s                  2536         bra.b           _L11_6s
2537 _L11_2s:                                         2537 _L11_2s:
2538         cmpi.b          %d1,&ZERO                2538         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2539         bne.b           _L11_3s                  2539         bne.b           _L11_3s                 # no
2540         bsr.l           ld_pone                  2540         bsr.l           ld_pone                 # yes
2541         bra.b           _L11_6s                  2541         bra.b           _L11_6s
2542 _L11_3s:                                         2542 _L11_3s:
2543         cmpi.b          %d1,&INF                 2543         cmpi.b          %d1,&INF                # is operand an INF?
2544         bne.b           _L11_4s                  2544         bne.b           _L11_4s                 # no
2545         bsr.l           szr_inf                  2545         bsr.l           szr_inf                 # yes
2546         bra.b           _L11_6s                  2546         bra.b           _L11_6s
2547 _L11_4s:                                         2547 _L11_4s:
2548         cmpi.b          %d1,&QNAN                2548         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2549         bne.b           _L11_5s                  2549         bne.b           _L11_5s                 # no
2550         bsr.l           src_qnan                 2550         bsr.l           src_qnan                        # yes
2551         bra.b           _L11_6s                  2551         bra.b           _L11_6s
2552 _L11_5s:                                         2552 _L11_5s:
2553         bsr.l           stwotoxd                 2553         bsr.l           stwotoxd                        # operand is a DENORM
2554 _L11_6s:                                         2554 _L11_6s:
2555                                                  2555 
2556 #                                                2556 #
2557 #       Result is now in FP0                     2557 #       Result is now in FP0
2558 #                                                2558 #
2559         movm.l          EXC_DREGS(%a6),&0x030    2559         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2560         fmovm.l         USER_FPCR(%a6),%fpcr,    2560         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2561         fmovm.x         EXC_FP1(%a6),&0x40       2561         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2562         unlk            %a6                      2562         unlk            %a6
2563         rts                                      2563         rts
2564                                                  2564 
2565         global          _ftwotoxd_               2565         global          _ftwotoxd_
2566 _ftwotoxd_:                                      2566 _ftwotoxd_:
2567         link            %a6,&-LOCAL_SIZE         2567         link            %a6,&-LOCAL_SIZE
2568                                                  2568 
2569         movm.l          &0x0303,EXC_DREGS(%a6    2569         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2570         fmovm.l         %fpcr,%fpsr,USER_FPCR    2570         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2571         fmovm.x         &0xc0,EXC_FP0(%a6)       2571         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2572                                                  2572 
2573         fmov.l          &0x0,%fpcr               2573         fmov.l          &0x0,%fpcr              # zero FPCR
2574                                                  2574 
2575 #                                                2575 #
2576 #       copy, convert, and tag input argument    2576 #       copy, convert, and tag input argument
2577 #                                                2577 #
2578         fmov.d          0x8(%a6),%fp0            2578         fmov.d          0x8(%a6),%fp0           # load dbl input
2579         fmov.x          %fp0,FP_SRC(%a6)         2579         fmov.x          %fp0,FP_SRC(%a6)
2580         lea             FP_SRC(%a6),%a0          2580         lea             FP_SRC(%a6),%a0
2581         bsr.l           tag                      2581         bsr.l           tag                     # fetch operand type
2582         mov.b           %d0,STAG(%a6)            2582         mov.b           %d0,STAG(%a6)
2583         mov.b           %d0,%d1                  2583         mov.b           %d0,%d1
2584                                                  2584 
2585         andi.l          &0x00ff00ff,USER_FPSR    2585         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2586                                                  2586 
2587         clr.l           %d0                      2587         clr.l           %d0
2588         mov.b           FPCR_MODE(%a6),%d0       2588         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2589                                                  2589 
2590         mov.b           %d1,STAG(%a6)            2590         mov.b           %d1,STAG(%a6)
2591         tst.b           %d1                      2591         tst.b           %d1
2592         bne.b           _L11_2d                  2592         bne.b           _L11_2d
2593         bsr.l           stwotox                  2593         bsr.l           stwotox                 # operand is a NORM
2594         bra.b           _L11_6d                  2594         bra.b           _L11_6d
2595 _L11_2d:                                         2595 _L11_2d:
2596         cmpi.b          %d1,&ZERO                2596         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2597         bne.b           _L11_3d                  2597         bne.b           _L11_3d                 # no
2598         bsr.l           ld_pone                  2598         bsr.l           ld_pone                 # yes
2599         bra.b           _L11_6d                  2599         bra.b           _L11_6d
2600 _L11_3d:                                         2600 _L11_3d:
2601         cmpi.b          %d1,&INF                 2601         cmpi.b          %d1,&INF                # is operand an INF?
2602         bne.b           _L11_4d                  2602         bne.b           _L11_4d                 # no
2603         bsr.l           szr_inf                  2603         bsr.l           szr_inf                 # yes
2604         bra.b           _L11_6d                  2604         bra.b           _L11_6d
2605 _L11_4d:                                         2605 _L11_4d:
2606         cmpi.b          %d1,&QNAN                2606         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2607         bne.b           _L11_5d                  2607         bne.b           _L11_5d                 # no
2608         bsr.l           src_qnan                 2608         bsr.l           src_qnan                        # yes
2609         bra.b           _L11_6d                  2609         bra.b           _L11_6d
2610 _L11_5d:                                         2610 _L11_5d:
2611         bsr.l           stwotoxd                 2611         bsr.l           stwotoxd                        # operand is a DENORM
2612 _L11_6d:                                         2612 _L11_6d:
2613                                                  2613 
2614 #                                                2614 #
2615 #       Result is now in FP0                     2615 #       Result is now in FP0
2616 #                                                2616 #
2617         movm.l          EXC_DREGS(%a6),&0x030    2617         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2618         fmovm.l         USER_FPCR(%a6),%fpcr,    2618         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2619         fmovm.x         EXC_FP1(%a6),&0x40       2619         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2620         unlk            %a6                      2620         unlk            %a6
2621         rts                                      2621         rts
2622                                                  2622 
2623         global          _ftwotoxx_               2623         global          _ftwotoxx_
2624 _ftwotoxx_:                                      2624 _ftwotoxx_:
2625         link            %a6,&-LOCAL_SIZE         2625         link            %a6,&-LOCAL_SIZE
2626                                                  2626 
2627         movm.l          &0x0303,EXC_DREGS(%a6    2627         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2628         fmovm.l         %fpcr,%fpsr,USER_FPCR    2628         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2629         fmovm.x         &0xc0,EXC_FP0(%a6)       2629         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2630                                                  2630 
2631         fmov.l          &0x0,%fpcr               2631         fmov.l          &0x0,%fpcr              # zero FPCR
2632                                                  2632 
2633 #                                                2633 #
2634 #       copy, convert, and tag input argument    2634 #       copy, convert, and tag input argument
2635 #                                                2635 #
2636         lea             FP_SRC(%a6),%a0          2636         lea             FP_SRC(%a6),%a0
2637         mov.l           0x8+0x0(%a6),0x0(%a0)    2637         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
2638         mov.l           0x8+0x4(%a6),0x4(%a0)    2638         mov.l           0x8+0x4(%a6),0x4(%a0)
2639         mov.l           0x8+0x8(%a6),0x8(%a0)    2639         mov.l           0x8+0x8(%a6),0x8(%a0)
2640         bsr.l           tag                      2640         bsr.l           tag                     # fetch operand type
2641         mov.b           %d0,STAG(%a6)            2641         mov.b           %d0,STAG(%a6)
2642         mov.b           %d0,%d1                  2642         mov.b           %d0,%d1
2643                                                  2643 
2644         andi.l          &0x00ff00ff,USER_FPSR    2644         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2645                                                  2645 
2646         clr.l           %d0                      2646         clr.l           %d0
2647         mov.b           FPCR_MODE(%a6),%d0       2647         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2648                                                  2648 
2649         tst.b           %d1                      2649         tst.b           %d1
2650         bne.b           _L11_2x                  2650         bne.b           _L11_2x
2651         bsr.l           stwotox                  2651         bsr.l           stwotox                 # operand is a NORM
2652         bra.b           _L11_6x                  2652         bra.b           _L11_6x
2653 _L11_2x:                                         2653 _L11_2x:
2654         cmpi.b          %d1,&ZERO                2654         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2655         bne.b           _L11_3x                  2655         bne.b           _L11_3x                 # no
2656         bsr.l           ld_pone                  2656         bsr.l           ld_pone                 # yes
2657         bra.b           _L11_6x                  2657         bra.b           _L11_6x
2658 _L11_3x:                                         2658 _L11_3x:
2659         cmpi.b          %d1,&INF                 2659         cmpi.b          %d1,&INF                # is operand an INF?
2660         bne.b           _L11_4x                  2660         bne.b           _L11_4x                 # no
2661         bsr.l           szr_inf                  2661         bsr.l           szr_inf                 # yes
2662         bra.b           _L11_6x                  2662         bra.b           _L11_6x
2663 _L11_4x:                                         2663 _L11_4x:
2664         cmpi.b          %d1,&QNAN                2664         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2665         bne.b           _L11_5x                  2665         bne.b           _L11_5x                 # no
2666         bsr.l           src_qnan                 2666         bsr.l           src_qnan                        # yes
2667         bra.b           _L11_6x                  2667         bra.b           _L11_6x
2668 _L11_5x:                                         2668 _L11_5x:
2669         bsr.l           stwotoxd                 2669         bsr.l           stwotoxd                        # operand is a DENORM
2670 _L11_6x:                                         2670 _L11_6x:
2671                                                  2671 
2672 #                                                2672 #
2673 #       Result is now in FP0                     2673 #       Result is now in FP0
2674 #                                                2674 #
2675         movm.l          EXC_DREGS(%a6),&0x030    2675         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2676         fmovm.l         USER_FPCR(%a6),%fpcr,    2676         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2677         fmovm.x         EXC_FP1(%a6),&0x40       2677         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2678         unlk            %a6                      2678         unlk            %a6
2679         rts                                      2679         rts
2680                                                  2680 
2681                                                  2681 
2682 #############################################    2682 #########################################################################
2683 # MONADIC TEMPLATE                               2683 # MONADIC TEMPLATE                                                      #
2684 #############################################    2684 #########################################################################
2685         global          _ftentoxs_               2685         global          _ftentoxs_
2686 _ftentoxs_:                                      2686 _ftentoxs_:
2687         link            %a6,&-LOCAL_SIZE         2687         link            %a6,&-LOCAL_SIZE
2688                                                  2688 
2689         movm.l          &0x0303,EXC_DREGS(%a6    2689         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2690         fmovm.l         %fpcr,%fpsr,USER_FPCR    2690         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2691         fmovm.x         &0xc0,EXC_FP0(%a6)       2691         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2692                                                  2692 
2693         fmov.l          &0x0,%fpcr               2693         fmov.l          &0x0,%fpcr              # zero FPCR
2694                                                  2694 
2695 #                                                2695 #
2696 #       copy, convert, and tag input argument    2696 #       copy, convert, and tag input argument
2697 #                                                2697 #
2698         fmov.s          0x8(%a6),%fp0            2698         fmov.s          0x8(%a6),%fp0           # load sgl input
2699         fmov.x          %fp0,FP_SRC(%a6)         2699         fmov.x          %fp0,FP_SRC(%a6)
2700         lea             FP_SRC(%a6),%a0          2700         lea             FP_SRC(%a6),%a0
2701         bsr.l           tag                      2701         bsr.l           tag                     # fetch operand type
2702         mov.b           %d0,STAG(%a6)            2702         mov.b           %d0,STAG(%a6)
2703         mov.b           %d0,%d1                  2703         mov.b           %d0,%d1
2704                                                  2704 
2705         andi.l          &0x00ff00ff,USER_FPSR    2705         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2706                                                  2706 
2707         clr.l           %d0                      2707         clr.l           %d0
2708         mov.b           FPCR_MODE(%a6),%d0       2708         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2709                                                  2709 
2710         tst.b           %d1                      2710         tst.b           %d1
2711         bne.b           _L12_2s                  2711         bne.b           _L12_2s
2712         bsr.l           stentox                  2712         bsr.l           stentox                 # operand is a NORM
2713         bra.b           _L12_6s                  2713         bra.b           _L12_6s
2714 _L12_2s:                                         2714 _L12_2s:
2715         cmpi.b          %d1,&ZERO                2715         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2716         bne.b           _L12_3s                  2716         bne.b           _L12_3s                 # no
2717         bsr.l           ld_pone                  2717         bsr.l           ld_pone                 # yes
2718         bra.b           _L12_6s                  2718         bra.b           _L12_6s
2719 _L12_3s:                                         2719 _L12_3s:
2720         cmpi.b          %d1,&INF                 2720         cmpi.b          %d1,&INF                # is operand an INF?
2721         bne.b           _L12_4s                  2721         bne.b           _L12_4s                 # no
2722         bsr.l           szr_inf                  2722         bsr.l           szr_inf                 # yes
2723         bra.b           _L12_6s                  2723         bra.b           _L12_6s
2724 _L12_4s:                                         2724 _L12_4s:
2725         cmpi.b          %d1,&QNAN                2725         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2726         bne.b           _L12_5s                  2726         bne.b           _L12_5s                 # no
2727         bsr.l           src_qnan                 2727         bsr.l           src_qnan                        # yes
2728         bra.b           _L12_6s                  2728         bra.b           _L12_6s
2729 _L12_5s:                                         2729 _L12_5s:
2730         bsr.l           stentoxd                 2730         bsr.l           stentoxd                        # operand is a DENORM
2731 _L12_6s:                                         2731 _L12_6s:
2732                                                  2732 
2733 #                                                2733 #
2734 #       Result is now in FP0                     2734 #       Result is now in FP0
2735 #                                                2735 #
2736         movm.l          EXC_DREGS(%a6),&0x030    2736         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2737         fmovm.l         USER_FPCR(%a6),%fpcr,    2737         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2738         fmovm.x         EXC_FP1(%a6),&0x40       2738         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2739         unlk            %a6                      2739         unlk            %a6
2740         rts                                      2740         rts
2741                                                  2741 
2742         global          _ftentoxd_               2742         global          _ftentoxd_
2743 _ftentoxd_:                                      2743 _ftentoxd_:
2744         link            %a6,&-LOCAL_SIZE         2744         link            %a6,&-LOCAL_SIZE
2745                                                  2745 
2746         movm.l          &0x0303,EXC_DREGS(%a6    2746         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2747         fmovm.l         %fpcr,%fpsr,USER_FPCR    2747         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2748         fmovm.x         &0xc0,EXC_FP0(%a6)       2748         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2749                                                  2749 
2750         fmov.l          &0x0,%fpcr               2750         fmov.l          &0x0,%fpcr              # zero FPCR
2751                                                  2751 
2752 #                                                2752 #
2753 #       copy, convert, and tag input argument    2753 #       copy, convert, and tag input argument
2754 #                                                2754 #
2755         fmov.d          0x8(%a6),%fp0            2755         fmov.d          0x8(%a6),%fp0           # load dbl input
2756         fmov.x          %fp0,FP_SRC(%a6)         2756         fmov.x          %fp0,FP_SRC(%a6)
2757         lea             FP_SRC(%a6),%a0          2757         lea             FP_SRC(%a6),%a0
2758         bsr.l           tag                      2758         bsr.l           tag                     # fetch operand type
2759         mov.b           %d0,STAG(%a6)            2759         mov.b           %d0,STAG(%a6)
2760         mov.b           %d0,%d1                  2760         mov.b           %d0,%d1
2761                                                  2761 
2762         andi.l          &0x00ff00ff,USER_FPSR    2762         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2763                                                  2763 
2764         clr.l           %d0                      2764         clr.l           %d0
2765         mov.b           FPCR_MODE(%a6),%d0       2765         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2766                                                  2766 
2767         mov.b           %d1,STAG(%a6)            2767         mov.b           %d1,STAG(%a6)
2768         tst.b           %d1                      2768         tst.b           %d1
2769         bne.b           _L12_2d                  2769         bne.b           _L12_2d
2770         bsr.l           stentox                  2770         bsr.l           stentox                 # operand is a NORM
2771         bra.b           _L12_6d                  2771         bra.b           _L12_6d
2772 _L12_2d:                                         2772 _L12_2d:
2773         cmpi.b          %d1,&ZERO                2773         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2774         bne.b           _L12_3d                  2774         bne.b           _L12_3d                 # no
2775         bsr.l           ld_pone                  2775         bsr.l           ld_pone                 # yes
2776         bra.b           _L12_6d                  2776         bra.b           _L12_6d
2777 _L12_3d:                                         2777 _L12_3d:
2778         cmpi.b          %d1,&INF                 2778         cmpi.b          %d1,&INF                # is operand an INF?
2779         bne.b           _L12_4d                  2779         bne.b           _L12_4d                 # no
2780         bsr.l           szr_inf                  2780         bsr.l           szr_inf                 # yes
2781         bra.b           _L12_6d                  2781         bra.b           _L12_6d
2782 _L12_4d:                                         2782 _L12_4d:
2783         cmpi.b          %d1,&QNAN                2783         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2784         bne.b           _L12_5d                  2784         bne.b           _L12_5d                 # no
2785         bsr.l           src_qnan                 2785         bsr.l           src_qnan                        # yes
2786         bra.b           _L12_6d                  2786         bra.b           _L12_6d
2787 _L12_5d:                                         2787 _L12_5d:
2788         bsr.l           stentoxd                 2788         bsr.l           stentoxd                        # operand is a DENORM
2789 _L12_6d:                                         2789 _L12_6d:
2790                                                  2790 
2791 #                                                2791 #
2792 #       Result is now in FP0                     2792 #       Result is now in FP0
2793 #                                                2793 #
2794         movm.l          EXC_DREGS(%a6),&0x030    2794         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2795         fmovm.l         USER_FPCR(%a6),%fpcr,    2795         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2796         fmovm.x         EXC_FP1(%a6),&0x40       2796         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2797         unlk            %a6                      2797         unlk            %a6
2798         rts                                      2798         rts
2799                                                  2799 
2800         global          _ftentoxx_               2800         global          _ftentoxx_
2801 _ftentoxx_:                                      2801 _ftentoxx_:
2802         link            %a6,&-LOCAL_SIZE         2802         link            %a6,&-LOCAL_SIZE
2803                                                  2803 
2804         movm.l          &0x0303,EXC_DREGS(%a6    2804         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2805         fmovm.l         %fpcr,%fpsr,USER_FPCR    2805         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2806         fmovm.x         &0xc0,EXC_FP0(%a6)       2806         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2807                                                  2807 
2808         fmov.l          &0x0,%fpcr               2808         fmov.l          &0x0,%fpcr              # zero FPCR
2809                                                  2809 
2810 #                                                2810 #
2811 #       copy, convert, and tag input argument    2811 #       copy, convert, and tag input argument
2812 #                                                2812 #
2813         lea             FP_SRC(%a6),%a0          2813         lea             FP_SRC(%a6),%a0
2814         mov.l           0x8+0x0(%a6),0x0(%a0)    2814         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
2815         mov.l           0x8+0x4(%a6),0x4(%a0)    2815         mov.l           0x8+0x4(%a6),0x4(%a0)
2816         mov.l           0x8+0x8(%a6),0x8(%a0)    2816         mov.l           0x8+0x8(%a6),0x8(%a0)
2817         bsr.l           tag                      2817         bsr.l           tag                     # fetch operand type
2818         mov.b           %d0,STAG(%a6)            2818         mov.b           %d0,STAG(%a6)
2819         mov.b           %d0,%d1                  2819         mov.b           %d0,%d1
2820                                                  2820 
2821         andi.l          &0x00ff00ff,USER_FPSR    2821         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2822                                                  2822 
2823         clr.l           %d0                      2823         clr.l           %d0
2824         mov.b           FPCR_MODE(%a6),%d0       2824         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2825                                                  2825 
2826         tst.b           %d1                      2826         tst.b           %d1
2827         bne.b           _L12_2x                  2827         bne.b           _L12_2x
2828         bsr.l           stentox                  2828         bsr.l           stentox                 # operand is a NORM
2829         bra.b           _L12_6x                  2829         bra.b           _L12_6x
2830 _L12_2x:                                         2830 _L12_2x:
2831         cmpi.b          %d1,&ZERO                2831         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2832         bne.b           _L12_3x                  2832         bne.b           _L12_3x                 # no
2833         bsr.l           ld_pone                  2833         bsr.l           ld_pone                 # yes
2834         bra.b           _L12_6x                  2834         bra.b           _L12_6x
2835 _L12_3x:                                         2835 _L12_3x:
2836         cmpi.b          %d1,&INF                 2836         cmpi.b          %d1,&INF                # is operand an INF?
2837         bne.b           _L12_4x                  2837         bne.b           _L12_4x                 # no
2838         bsr.l           szr_inf                  2838         bsr.l           szr_inf                 # yes
2839         bra.b           _L12_6x                  2839         bra.b           _L12_6x
2840 _L12_4x:                                         2840 _L12_4x:
2841         cmpi.b          %d1,&QNAN                2841         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2842         bne.b           _L12_5x                  2842         bne.b           _L12_5x                 # no
2843         bsr.l           src_qnan                 2843         bsr.l           src_qnan                        # yes
2844         bra.b           _L12_6x                  2844         bra.b           _L12_6x
2845 _L12_5x:                                         2845 _L12_5x:
2846         bsr.l           stentoxd                 2846         bsr.l           stentoxd                        # operand is a DENORM
2847 _L12_6x:                                         2847 _L12_6x:
2848                                                  2848 
2849 #                                                2849 #
2850 #       Result is now in FP0                     2850 #       Result is now in FP0
2851 #                                                2851 #
2852         movm.l          EXC_DREGS(%a6),&0x030    2852         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2853         fmovm.l         USER_FPCR(%a6),%fpcr,    2853         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2854         fmovm.x         EXC_FP1(%a6),&0x40       2854         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2855         unlk            %a6                      2855         unlk            %a6
2856         rts                                      2856         rts
2857                                                  2857 
2858                                                  2858 
2859 #############################################    2859 #########################################################################
2860 # MONADIC TEMPLATE                               2860 # MONADIC TEMPLATE                                                      #
2861 #############################################    2861 #########################################################################
2862         global          _flogns_                 2862         global          _flogns_
2863 _flogns_:                                        2863 _flogns_:
2864         link            %a6,&-LOCAL_SIZE         2864         link            %a6,&-LOCAL_SIZE
2865                                                  2865 
2866         movm.l          &0x0303,EXC_DREGS(%a6    2866         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2867         fmovm.l         %fpcr,%fpsr,USER_FPCR    2867         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2868         fmovm.x         &0xc0,EXC_FP0(%a6)       2868         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2869                                                  2869 
2870         fmov.l          &0x0,%fpcr               2870         fmov.l          &0x0,%fpcr              # zero FPCR
2871                                                  2871 
2872 #                                                2872 #
2873 #       copy, convert, and tag input argument    2873 #       copy, convert, and tag input argument
2874 #                                                2874 #
2875         fmov.s          0x8(%a6),%fp0            2875         fmov.s          0x8(%a6),%fp0           # load sgl input
2876         fmov.x          %fp0,FP_SRC(%a6)         2876         fmov.x          %fp0,FP_SRC(%a6)
2877         lea             FP_SRC(%a6),%a0          2877         lea             FP_SRC(%a6),%a0
2878         bsr.l           tag                      2878         bsr.l           tag                     # fetch operand type
2879         mov.b           %d0,STAG(%a6)            2879         mov.b           %d0,STAG(%a6)
2880         mov.b           %d0,%d1                  2880         mov.b           %d0,%d1
2881                                                  2881 
2882         andi.l          &0x00ff00ff,USER_FPSR    2882         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2883                                                  2883 
2884         clr.l           %d0                      2884         clr.l           %d0
2885         mov.b           FPCR_MODE(%a6),%d0       2885         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2886                                                  2886 
2887         tst.b           %d1                      2887         tst.b           %d1
2888         bne.b           _L13_2s                  2888         bne.b           _L13_2s
2889         bsr.l           slogn                    2889         bsr.l           slogn                   # operand is a NORM
2890         bra.b           _L13_6s                  2890         bra.b           _L13_6s
2891 _L13_2s:                                         2891 _L13_2s:
2892         cmpi.b          %d1,&ZERO                2892         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2893         bne.b           _L13_3s                  2893         bne.b           _L13_3s                 # no
2894         bsr.l           t_dz2                    2894         bsr.l           t_dz2                   # yes
2895         bra.b           _L13_6s                  2895         bra.b           _L13_6s
2896 _L13_3s:                                         2896 _L13_3s:
2897         cmpi.b          %d1,&INF                 2897         cmpi.b          %d1,&INF                # is operand an INF?
2898         bne.b           _L13_4s                  2898         bne.b           _L13_4s                 # no
2899         bsr.l           sopr_inf                 2899         bsr.l           sopr_inf                        # yes
2900         bra.b           _L13_6s                  2900         bra.b           _L13_6s
2901 _L13_4s:                                         2901 _L13_4s:
2902         cmpi.b          %d1,&QNAN                2902         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2903         bne.b           _L13_5s                  2903         bne.b           _L13_5s                 # no
2904         bsr.l           src_qnan                 2904         bsr.l           src_qnan                        # yes
2905         bra.b           _L13_6s                  2905         bra.b           _L13_6s
2906 _L13_5s:                                         2906 _L13_5s:
2907         bsr.l           slognd                   2907         bsr.l           slognd                  # operand is a DENORM
2908 _L13_6s:                                         2908 _L13_6s:
2909                                                  2909 
2910 #                                                2910 #
2911 #       Result is now in FP0                     2911 #       Result is now in FP0
2912 #                                                2912 #
2913         movm.l          EXC_DREGS(%a6),&0x030    2913         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2914         fmovm.l         USER_FPCR(%a6),%fpcr,    2914         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2915         fmovm.x         EXC_FP1(%a6),&0x40       2915         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2916         unlk            %a6                      2916         unlk            %a6
2917         rts                                      2917         rts
2918                                                  2918 
2919         global          _flognd_                 2919         global          _flognd_
2920 _flognd_:                                        2920 _flognd_:
2921         link            %a6,&-LOCAL_SIZE         2921         link            %a6,&-LOCAL_SIZE
2922                                                  2922 
2923         movm.l          &0x0303,EXC_DREGS(%a6    2923         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2924         fmovm.l         %fpcr,%fpsr,USER_FPCR    2924         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2925         fmovm.x         &0xc0,EXC_FP0(%a6)       2925         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2926                                                  2926 
2927         fmov.l          &0x0,%fpcr               2927         fmov.l          &0x0,%fpcr              # zero FPCR
2928                                                  2928 
2929 #                                                2929 #
2930 #       copy, convert, and tag input argument    2930 #       copy, convert, and tag input argument
2931 #                                                2931 #
2932         fmov.d          0x8(%a6),%fp0            2932         fmov.d          0x8(%a6),%fp0           # load dbl input
2933         fmov.x          %fp0,FP_SRC(%a6)         2933         fmov.x          %fp0,FP_SRC(%a6)
2934         lea             FP_SRC(%a6),%a0          2934         lea             FP_SRC(%a6),%a0
2935         bsr.l           tag                      2935         bsr.l           tag                     # fetch operand type
2936         mov.b           %d0,STAG(%a6)            2936         mov.b           %d0,STAG(%a6)
2937         mov.b           %d0,%d1                  2937         mov.b           %d0,%d1
2938                                                  2938 
2939         andi.l          &0x00ff00ff,USER_FPSR    2939         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2940                                                  2940 
2941         clr.l           %d0                      2941         clr.l           %d0
2942         mov.b           FPCR_MODE(%a6),%d0       2942         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
2943                                                  2943 
2944         mov.b           %d1,STAG(%a6)            2944         mov.b           %d1,STAG(%a6)
2945         tst.b           %d1                      2945         tst.b           %d1
2946         bne.b           _L13_2d                  2946         bne.b           _L13_2d
2947         bsr.l           slogn                    2947         bsr.l           slogn                   # operand is a NORM
2948         bra.b           _L13_6d                  2948         bra.b           _L13_6d
2949 _L13_2d:                                         2949 _L13_2d:
2950         cmpi.b          %d1,&ZERO                2950         cmpi.b          %d1,&ZERO               # is operand a ZERO?
2951         bne.b           _L13_3d                  2951         bne.b           _L13_3d                 # no
2952         bsr.l           t_dz2                    2952         bsr.l           t_dz2                   # yes
2953         bra.b           _L13_6d                  2953         bra.b           _L13_6d
2954 _L13_3d:                                         2954 _L13_3d:
2955         cmpi.b          %d1,&INF                 2955         cmpi.b          %d1,&INF                # is operand an INF?
2956         bne.b           _L13_4d                  2956         bne.b           _L13_4d                 # no
2957         bsr.l           sopr_inf                 2957         bsr.l           sopr_inf                        # yes
2958         bra.b           _L13_6d                  2958         bra.b           _L13_6d
2959 _L13_4d:                                         2959 _L13_4d:
2960         cmpi.b          %d1,&QNAN                2960         cmpi.b          %d1,&QNAN               # is operand a QNAN?
2961         bne.b           _L13_5d                  2961         bne.b           _L13_5d                 # no
2962         bsr.l           src_qnan                 2962         bsr.l           src_qnan                        # yes
2963         bra.b           _L13_6d                  2963         bra.b           _L13_6d
2964 _L13_5d:                                         2964 _L13_5d:
2965         bsr.l           slognd                   2965         bsr.l           slognd                  # operand is a DENORM
2966 _L13_6d:                                         2966 _L13_6d:
2967                                                  2967 
2968 #                                                2968 #
2969 #       Result is now in FP0                     2969 #       Result is now in FP0
2970 #                                                2970 #
2971         movm.l          EXC_DREGS(%a6),&0x030    2971         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
2972         fmovm.l         USER_FPCR(%a6),%fpcr,    2972         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2973         fmovm.x         EXC_FP1(%a6),&0x40       2973         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
2974         unlk            %a6                      2974         unlk            %a6
2975         rts                                      2975         rts
2976                                                  2976 
2977         global          _flognx_                 2977         global          _flognx_
2978 _flognx_:                                        2978 _flognx_:
2979         link            %a6,&-LOCAL_SIZE         2979         link            %a6,&-LOCAL_SIZE
2980                                                  2980 
2981         movm.l          &0x0303,EXC_DREGS(%a6    2981         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
2982         fmovm.l         %fpcr,%fpsr,USER_FPCR    2982         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2983         fmovm.x         &0xc0,EXC_FP0(%a6)       2983         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
2984                                                  2984 
2985         fmov.l          &0x0,%fpcr               2985         fmov.l          &0x0,%fpcr              # zero FPCR
2986                                                  2986 
2987 #                                                2987 #
2988 #       copy, convert, and tag input argument    2988 #       copy, convert, and tag input argument
2989 #                                                2989 #
2990         lea             FP_SRC(%a6),%a0          2990         lea             FP_SRC(%a6),%a0
2991         mov.l           0x8+0x0(%a6),0x0(%a0)    2991         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
2992         mov.l           0x8+0x4(%a6),0x4(%a0)    2992         mov.l           0x8+0x4(%a6),0x4(%a0)
2993         mov.l           0x8+0x8(%a6),0x8(%a0)    2993         mov.l           0x8+0x8(%a6),0x8(%a0)
2994         bsr.l           tag                      2994         bsr.l           tag                     # fetch operand type
2995         mov.b           %d0,STAG(%a6)            2995         mov.b           %d0,STAG(%a6)
2996         mov.b           %d0,%d1                  2996         mov.b           %d0,%d1
2997                                                  2997 
2998         andi.l          &0x00ff00ff,USER_FPSR    2998         andi.l          &0x00ff00ff,USER_FPSR(%a6)
2999                                                  2999 
3000         clr.l           %d0                      3000         clr.l           %d0
3001         mov.b           FPCR_MODE(%a6),%d0       3001         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3002                                                  3002 
3003         tst.b           %d1                      3003         tst.b           %d1
3004         bne.b           _L13_2x                  3004         bne.b           _L13_2x
3005         bsr.l           slogn                    3005         bsr.l           slogn                   # operand is a NORM
3006         bra.b           _L13_6x                  3006         bra.b           _L13_6x
3007 _L13_2x:                                         3007 _L13_2x:
3008         cmpi.b          %d1,&ZERO                3008         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3009         bne.b           _L13_3x                  3009         bne.b           _L13_3x                 # no
3010         bsr.l           t_dz2                    3010         bsr.l           t_dz2                   # yes
3011         bra.b           _L13_6x                  3011         bra.b           _L13_6x
3012 _L13_3x:                                         3012 _L13_3x:
3013         cmpi.b          %d1,&INF                 3013         cmpi.b          %d1,&INF                # is operand an INF?
3014         bne.b           _L13_4x                  3014         bne.b           _L13_4x                 # no
3015         bsr.l           sopr_inf                 3015         bsr.l           sopr_inf                        # yes
3016         bra.b           _L13_6x                  3016         bra.b           _L13_6x
3017 _L13_4x:                                         3017 _L13_4x:
3018         cmpi.b          %d1,&QNAN                3018         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3019         bne.b           _L13_5x                  3019         bne.b           _L13_5x                 # no
3020         bsr.l           src_qnan                 3020         bsr.l           src_qnan                        # yes
3021         bra.b           _L13_6x                  3021         bra.b           _L13_6x
3022 _L13_5x:                                         3022 _L13_5x:
3023         bsr.l           slognd                   3023         bsr.l           slognd                  # operand is a DENORM
3024 _L13_6x:                                         3024 _L13_6x:
3025                                                  3025 
3026 #                                                3026 #
3027 #       Result is now in FP0                     3027 #       Result is now in FP0
3028 #                                                3028 #
3029         movm.l          EXC_DREGS(%a6),&0x030    3029         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3030         fmovm.l         USER_FPCR(%a6),%fpcr,    3030         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3031         fmovm.x         EXC_FP1(%a6),&0x40       3031         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3032         unlk            %a6                      3032         unlk            %a6
3033         rts                                      3033         rts
3034                                                  3034 
3035                                                  3035 
3036 #############################################    3036 #########################################################################
3037 # MONADIC TEMPLATE                               3037 # MONADIC TEMPLATE                                                      #
3038 #############################################    3038 #########################################################################
3039         global          _flog10s_                3039         global          _flog10s_
3040 _flog10s_:                                       3040 _flog10s_:
3041         link            %a6,&-LOCAL_SIZE         3041         link            %a6,&-LOCAL_SIZE
3042                                                  3042 
3043         movm.l          &0x0303,EXC_DREGS(%a6    3043         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3044         fmovm.l         %fpcr,%fpsr,USER_FPCR    3044         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3045         fmovm.x         &0xc0,EXC_FP0(%a6)       3045         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3046                                                  3046 
3047         fmov.l          &0x0,%fpcr               3047         fmov.l          &0x0,%fpcr              # zero FPCR
3048                                                  3048 
3049 #                                                3049 #
3050 #       copy, convert, and tag input argument    3050 #       copy, convert, and tag input argument
3051 #                                                3051 #
3052         fmov.s          0x8(%a6),%fp0            3052         fmov.s          0x8(%a6),%fp0           # load sgl input
3053         fmov.x          %fp0,FP_SRC(%a6)         3053         fmov.x          %fp0,FP_SRC(%a6)
3054         lea             FP_SRC(%a6),%a0          3054         lea             FP_SRC(%a6),%a0
3055         bsr.l           tag                      3055         bsr.l           tag                     # fetch operand type
3056         mov.b           %d0,STAG(%a6)            3056         mov.b           %d0,STAG(%a6)
3057         mov.b           %d0,%d1                  3057         mov.b           %d0,%d1
3058                                                  3058 
3059         andi.l          &0x00ff00ff,USER_FPSR    3059         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3060                                                  3060 
3061         clr.l           %d0                      3061         clr.l           %d0
3062         mov.b           FPCR_MODE(%a6),%d0       3062         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3063                                                  3063 
3064         tst.b           %d1                      3064         tst.b           %d1
3065         bne.b           _L14_2s                  3065         bne.b           _L14_2s
3066         bsr.l           slog10                   3066         bsr.l           slog10                  # operand is a NORM
3067         bra.b           _L14_6s                  3067         bra.b           _L14_6s
3068 _L14_2s:                                         3068 _L14_2s:
3069         cmpi.b          %d1,&ZERO                3069         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3070         bne.b           _L14_3s                  3070         bne.b           _L14_3s                 # no
3071         bsr.l           t_dz2                    3071         bsr.l           t_dz2                   # yes
3072         bra.b           _L14_6s                  3072         bra.b           _L14_6s
3073 _L14_3s:                                         3073 _L14_3s:
3074         cmpi.b          %d1,&INF                 3074         cmpi.b          %d1,&INF                # is operand an INF?
3075         bne.b           _L14_4s                  3075         bne.b           _L14_4s                 # no
3076         bsr.l           sopr_inf                 3076         bsr.l           sopr_inf                        # yes
3077         bra.b           _L14_6s                  3077         bra.b           _L14_6s
3078 _L14_4s:                                         3078 _L14_4s:
3079         cmpi.b          %d1,&QNAN                3079         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3080         bne.b           _L14_5s                  3080         bne.b           _L14_5s                 # no
3081         bsr.l           src_qnan                 3081         bsr.l           src_qnan                        # yes
3082         bra.b           _L14_6s                  3082         bra.b           _L14_6s
3083 _L14_5s:                                         3083 _L14_5s:
3084         bsr.l           slog10d                  3084         bsr.l           slog10d                 # operand is a DENORM
3085 _L14_6s:                                         3085 _L14_6s:
3086                                                  3086 
3087 #                                                3087 #
3088 #       Result is now in FP0                     3088 #       Result is now in FP0
3089 #                                                3089 #
3090         movm.l          EXC_DREGS(%a6),&0x030    3090         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3091         fmovm.l         USER_FPCR(%a6),%fpcr,    3091         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3092         fmovm.x         EXC_FP1(%a6),&0x40       3092         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3093         unlk            %a6                      3093         unlk            %a6
3094         rts                                      3094         rts
3095                                                  3095 
3096         global          _flog10d_                3096         global          _flog10d_
3097 _flog10d_:                                       3097 _flog10d_:
3098         link            %a6,&-LOCAL_SIZE         3098         link            %a6,&-LOCAL_SIZE
3099                                                  3099 
3100         movm.l          &0x0303,EXC_DREGS(%a6    3100         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3101         fmovm.l         %fpcr,%fpsr,USER_FPCR    3101         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3102         fmovm.x         &0xc0,EXC_FP0(%a6)       3102         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3103                                                  3103 
3104         fmov.l          &0x0,%fpcr               3104         fmov.l          &0x0,%fpcr              # zero FPCR
3105                                                  3105 
3106 #                                                3106 #
3107 #       copy, convert, and tag input argument    3107 #       copy, convert, and tag input argument
3108 #                                                3108 #
3109         fmov.d          0x8(%a6),%fp0            3109         fmov.d          0x8(%a6),%fp0           # load dbl input
3110         fmov.x          %fp0,FP_SRC(%a6)         3110         fmov.x          %fp0,FP_SRC(%a6)
3111         lea             FP_SRC(%a6),%a0          3111         lea             FP_SRC(%a6),%a0
3112         bsr.l           tag                      3112         bsr.l           tag                     # fetch operand type
3113         mov.b           %d0,STAG(%a6)            3113         mov.b           %d0,STAG(%a6)
3114         mov.b           %d0,%d1                  3114         mov.b           %d0,%d1
3115                                                  3115 
3116         andi.l          &0x00ff00ff,USER_FPSR    3116         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3117                                                  3117 
3118         clr.l           %d0                      3118         clr.l           %d0
3119         mov.b           FPCR_MODE(%a6),%d0       3119         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3120                                                  3120 
3121         mov.b           %d1,STAG(%a6)            3121         mov.b           %d1,STAG(%a6)
3122         tst.b           %d1                      3122         tst.b           %d1
3123         bne.b           _L14_2d                  3123         bne.b           _L14_2d
3124         bsr.l           slog10                   3124         bsr.l           slog10                  # operand is a NORM
3125         bra.b           _L14_6d                  3125         bra.b           _L14_6d
3126 _L14_2d:                                         3126 _L14_2d:
3127         cmpi.b          %d1,&ZERO                3127         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3128         bne.b           _L14_3d                  3128         bne.b           _L14_3d                 # no
3129         bsr.l           t_dz2                    3129         bsr.l           t_dz2                   # yes
3130         bra.b           _L14_6d                  3130         bra.b           _L14_6d
3131 _L14_3d:                                         3131 _L14_3d:
3132         cmpi.b          %d1,&INF                 3132         cmpi.b          %d1,&INF                # is operand an INF?
3133         bne.b           _L14_4d                  3133         bne.b           _L14_4d                 # no
3134         bsr.l           sopr_inf                 3134         bsr.l           sopr_inf                        # yes
3135         bra.b           _L14_6d                  3135         bra.b           _L14_6d
3136 _L14_4d:                                         3136 _L14_4d:
3137         cmpi.b          %d1,&QNAN                3137         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3138         bne.b           _L14_5d                  3138         bne.b           _L14_5d                 # no
3139         bsr.l           src_qnan                 3139         bsr.l           src_qnan                        # yes
3140         bra.b           _L14_6d                  3140         bra.b           _L14_6d
3141 _L14_5d:                                         3141 _L14_5d:
3142         bsr.l           slog10d                  3142         bsr.l           slog10d                 # operand is a DENORM
3143 _L14_6d:                                         3143 _L14_6d:
3144                                                  3144 
3145 #                                                3145 #
3146 #       Result is now in FP0                     3146 #       Result is now in FP0
3147 #                                                3147 #
3148         movm.l          EXC_DREGS(%a6),&0x030    3148         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3149         fmovm.l         USER_FPCR(%a6),%fpcr,    3149         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3150         fmovm.x         EXC_FP1(%a6),&0x40       3150         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3151         unlk            %a6                      3151         unlk            %a6
3152         rts                                      3152         rts
3153                                                  3153 
3154         global          _flog10x_                3154         global          _flog10x_
3155 _flog10x_:                                       3155 _flog10x_:
3156         link            %a6,&-LOCAL_SIZE         3156         link            %a6,&-LOCAL_SIZE
3157                                                  3157 
3158         movm.l          &0x0303,EXC_DREGS(%a6    3158         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3159         fmovm.l         %fpcr,%fpsr,USER_FPCR    3159         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3160         fmovm.x         &0xc0,EXC_FP0(%a6)       3160         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3161                                                  3161 
3162         fmov.l          &0x0,%fpcr               3162         fmov.l          &0x0,%fpcr              # zero FPCR
3163                                                  3163 
3164 #                                                3164 #
3165 #       copy, convert, and tag input argument    3165 #       copy, convert, and tag input argument
3166 #                                                3166 #
3167         lea             FP_SRC(%a6),%a0          3167         lea             FP_SRC(%a6),%a0
3168         mov.l           0x8+0x0(%a6),0x0(%a0)    3168         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
3169         mov.l           0x8+0x4(%a6),0x4(%a0)    3169         mov.l           0x8+0x4(%a6),0x4(%a0)
3170         mov.l           0x8+0x8(%a6),0x8(%a0)    3170         mov.l           0x8+0x8(%a6),0x8(%a0)
3171         bsr.l           tag                      3171         bsr.l           tag                     # fetch operand type
3172         mov.b           %d0,STAG(%a6)            3172         mov.b           %d0,STAG(%a6)
3173         mov.b           %d0,%d1                  3173         mov.b           %d0,%d1
3174                                                  3174 
3175         andi.l          &0x00ff00ff,USER_FPSR    3175         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3176                                                  3176 
3177         clr.l           %d0                      3177         clr.l           %d0
3178         mov.b           FPCR_MODE(%a6),%d0       3178         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3179                                                  3179 
3180         tst.b           %d1                      3180         tst.b           %d1
3181         bne.b           _L14_2x                  3181         bne.b           _L14_2x
3182         bsr.l           slog10                   3182         bsr.l           slog10                  # operand is a NORM
3183         bra.b           _L14_6x                  3183         bra.b           _L14_6x
3184 _L14_2x:                                         3184 _L14_2x:
3185         cmpi.b          %d1,&ZERO                3185         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3186         bne.b           _L14_3x                  3186         bne.b           _L14_3x                 # no
3187         bsr.l           t_dz2                    3187         bsr.l           t_dz2                   # yes
3188         bra.b           _L14_6x                  3188         bra.b           _L14_6x
3189 _L14_3x:                                         3189 _L14_3x:
3190         cmpi.b          %d1,&INF                 3190         cmpi.b          %d1,&INF                # is operand an INF?
3191         bne.b           _L14_4x                  3191         bne.b           _L14_4x                 # no
3192         bsr.l           sopr_inf                 3192         bsr.l           sopr_inf                        # yes
3193         bra.b           _L14_6x                  3193         bra.b           _L14_6x
3194 _L14_4x:                                         3194 _L14_4x:
3195         cmpi.b          %d1,&QNAN                3195         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3196         bne.b           _L14_5x                  3196         bne.b           _L14_5x                 # no
3197         bsr.l           src_qnan                 3197         bsr.l           src_qnan                        # yes
3198         bra.b           _L14_6x                  3198         bra.b           _L14_6x
3199 _L14_5x:                                         3199 _L14_5x:
3200         bsr.l           slog10d                  3200         bsr.l           slog10d                 # operand is a DENORM
3201 _L14_6x:                                         3201 _L14_6x:
3202                                                  3202 
3203 #                                                3203 #
3204 #       Result is now in FP0                     3204 #       Result is now in FP0
3205 #                                                3205 #
3206         movm.l          EXC_DREGS(%a6),&0x030    3206         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3207         fmovm.l         USER_FPCR(%a6),%fpcr,    3207         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3208         fmovm.x         EXC_FP1(%a6),&0x40       3208         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3209         unlk            %a6                      3209         unlk            %a6
3210         rts                                      3210         rts
3211                                                  3211 
3212                                                  3212 
3213 #############################################    3213 #########################################################################
3214 # MONADIC TEMPLATE                               3214 # MONADIC TEMPLATE                                                      #
3215 #############################################    3215 #########################################################################
3216         global          _flog2s_                 3216         global          _flog2s_
3217 _flog2s_:                                        3217 _flog2s_:
3218         link            %a6,&-LOCAL_SIZE         3218         link            %a6,&-LOCAL_SIZE
3219                                                  3219 
3220         movm.l          &0x0303,EXC_DREGS(%a6    3220         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3221         fmovm.l         %fpcr,%fpsr,USER_FPCR    3221         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3222         fmovm.x         &0xc0,EXC_FP0(%a6)       3222         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3223                                                  3223 
3224         fmov.l          &0x0,%fpcr               3224         fmov.l          &0x0,%fpcr              # zero FPCR
3225                                                  3225 
3226 #                                                3226 #
3227 #       copy, convert, and tag input argument    3227 #       copy, convert, and tag input argument
3228 #                                                3228 #
3229         fmov.s          0x8(%a6),%fp0            3229         fmov.s          0x8(%a6),%fp0           # load sgl input
3230         fmov.x          %fp0,FP_SRC(%a6)         3230         fmov.x          %fp0,FP_SRC(%a6)
3231         lea             FP_SRC(%a6),%a0          3231         lea             FP_SRC(%a6),%a0
3232         bsr.l           tag                      3232         bsr.l           tag                     # fetch operand type
3233         mov.b           %d0,STAG(%a6)            3233         mov.b           %d0,STAG(%a6)
3234         mov.b           %d0,%d1                  3234         mov.b           %d0,%d1
3235                                                  3235 
3236         andi.l          &0x00ff00ff,USER_FPSR    3236         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3237                                                  3237 
3238         clr.l           %d0                      3238         clr.l           %d0
3239         mov.b           FPCR_MODE(%a6),%d0       3239         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3240                                                  3240 
3241         tst.b           %d1                      3241         tst.b           %d1
3242         bne.b           _L15_2s                  3242         bne.b           _L15_2s
3243         bsr.l           slog2                    3243         bsr.l           slog2                   # operand is a NORM
3244         bra.b           _L15_6s                  3244         bra.b           _L15_6s
3245 _L15_2s:                                         3245 _L15_2s:
3246         cmpi.b          %d1,&ZERO                3246         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3247         bne.b           _L15_3s                  3247         bne.b           _L15_3s                 # no
3248         bsr.l           t_dz2                    3248         bsr.l           t_dz2                   # yes
3249         bra.b           _L15_6s                  3249         bra.b           _L15_6s
3250 _L15_3s:                                         3250 _L15_3s:
3251         cmpi.b          %d1,&INF                 3251         cmpi.b          %d1,&INF                # is operand an INF?
3252         bne.b           _L15_4s                  3252         bne.b           _L15_4s                 # no
3253         bsr.l           sopr_inf                 3253         bsr.l           sopr_inf                        # yes
3254         bra.b           _L15_6s                  3254         bra.b           _L15_6s
3255 _L15_4s:                                         3255 _L15_4s:
3256         cmpi.b          %d1,&QNAN                3256         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3257         bne.b           _L15_5s                  3257         bne.b           _L15_5s                 # no
3258         bsr.l           src_qnan                 3258         bsr.l           src_qnan                        # yes
3259         bra.b           _L15_6s                  3259         bra.b           _L15_6s
3260 _L15_5s:                                         3260 _L15_5s:
3261         bsr.l           slog2d                   3261         bsr.l           slog2d                  # operand is a DENORM
3262 _L15_6s:                                         3262 _L15_6s:
3263                                                  3263 
3264 #                                                3264 #
3265 #       Result is now in FP0                     3265 #       Result is now in FP0
3266 #                                                3266 #
3267         movm.l          EXC_DREGS(%a6),&0x030    3267         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3268         fmovm.l         USER_FPCR(%a6),%fpcr,    3268         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3269         fmovm.x         EXC_FP1(%a6),&0x40       3269         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3270         unlk            %a6                      3270         unlk            %a6
3271         rts                                      3271         rts
3272                                                  3272 
3273         global          _flog2d_                 3273         global          _flog2d_
3274 _flog2d_:                                        3274 _flog2d_:
3275         link            %a6,&-LOCAL_SIZE         3275         link            %a6,&-LOCAL_SIZE
3276                                                  3276 
3277         movm.l          &0x0303,EXC_DREGS(%a6    3277         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3278         fmovm.l         %fpcr,%fpsr,USER_FPCR    3278         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3279         fmovm.x         &0xc0,EXC_FP0(%a6)       3279         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3280                                                  3280 
3281         fmov.l          &0x0,%fpcr               3281         fmov.l          &0x0,%fpcr              # zero FPCR
3282                                                  3282 
3283 #                                                3283 #
3284 #       copy, convert, and tag input argument    3284 #       copy, convert, and tag input argument
3285 #                                                3285 #
3286         fmov.d          0x8(%a6),%fp0            3286         fmov.d          0x8(%a6),%fp0           # load dbl input
3287         fmov.x          %fp0,FP_SRC(%a6)         3287         fmov.x          %fp0,FP_SRC(%a6)
3288         lea             FP_SRC(%a6),%a0          3288         lea             FP_SRC(%a6),%a0
3289         bsr.l           tag                      3289         bsr.l           tag                     # fetch operand type
3290         mov.b           %d0,STAG(%a6)            3290         mov.b           %d0,STAG(%a6)
3291         mov.b           %d0,%d1                  3291         mov.b           %d0,%d1
3292                                                  3292 
3293         andi.l          &0x00ff00ff,USER_FPSR    3293         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3294                                                  3294 
3295         clr.l           %d0                      3295         clr.l           %d0
3296         mov.b           FPCR_MODE(%a6),%d0       3296         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3297                                                  3297 
3298         mov.b           %d1,STAG(%a6)            3298         mov.b           %d1,STAG(%a6)
3299         tst.b           %d1                      3299         tst.b           %d1
3300         bne.b           _L15_2d                  3300         bne.b           _L15_2d
3301         bsr.l           slog2                    3301         bsr.l           slog2                   # operand is a NORM
3302         bra.b           _L15_6d                  3302         bra.b           _L15_6d
3303 _L15_2d:                                         3303 _L15_2d:
3304         cmpi.b          %d1,&ZERO                3304         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3305         bne.b           _L15_3d                  3305         bne.b           _L15_3d                 # no
3306         bsr.l           t_dz2                    3306         bsr.l           t_dz2                   # yes
3307         bra.b           _L15_6d                  3307         bra.b           _L15_6d
3308 _L15_3d:                                         3308 _L15_3d:
3309         cmpi.b          %d1,&INF                 3309         cmpi.b          %d1,&INF                # is operand an INF?
3310         bne.b           _L15_4d                  3310         bne.b           _L15_4d                 # no
3311         bsr.l           sopr_inf                 3311         bsr.l           sopr_inf                        # yes
3312         bra.b           _L15_6d                  3312         bra.b           _L15_6d
3313 _L15_4d:                                         3313 _L15_4d:
3314         cmpi.b          %d1,&QNAN                3314         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3315         bne.b           _L15_5d                  3315         bne.b           _L15_5d                 # no
3316         bsr.l           src_qnan                 3316         bsr.l           src_qnan                        # yes
3317         bra.b           _L15_6d                  3317         bra.b           _L15_6d
3318 _L15_5d:                                         3318 _L15_5d:
3319         bsr.l           slog2d                   3319         bsr.l           slog2d                  # operand is a DENORM
3320 _L15_6d:                                         3320 _L15_6d:
3321                                                  3321 
3322 #                                                3322 #
3323 #       Result is now in FP0                     3323 #       Result is now in FP0
3324 #                                                3324 #
3325         movm.l          EXC_DREGS(%a6),&0x030    3325         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3326         fmovm.l         USER_FPCR(%a6),%fpcr,    3326         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3327         fmovm.x         EXC_FP1(%a6),&0x40       3327         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3328         unlk            %a6                      3328         unlk            %a6
3329         rts                                      3329         rts
3330                                                  3330 
3331         global          _flog2x_                 3331         global          _flog2x_
3332 _flog2x_:                                        3332 _flog2x_:
3333         link            %a6,&-LOCAL_SIZE         3333         link            %a6,&-LOCAL_SIZE
3334                                                  3334 
3335         movm.l          &0x0303,EXC_DREGS(%a6    3335         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3336         fmovm.l         %fpcr,%fpsr,USER_FPCR    3336         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3337         fmovm.x         &0xc0,EXC_FP0(%a6)       3337         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3338                                                  3338 
3339         fmov.l          &0x0,%fpcr               3339         fmov.l          &0x0,%fpcr              # zero FPCR
3340                                                  3340 
3341 #                                                3341 #
3342 #       copy, convert, and tag input argument    3342 #       copy, convert, and tag input argument
3343 #                                                3343 #
3344         lea             FP_SRC(%a6),%a0          3344         lea             FP_SRC(%a6),%a0
3345         mov.l           0x8+0x0(%a6),0x0(%a0)    3345         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
3346         mov.l           0x8+0x4(%a6),0x4(%a0)    3346         mov.l           0x8+0x4(%a6),0x4(%a0)
3347         mov.l           0x8+0x8(%a6),0x8(%a0)    3347         mov.l           0x8+0x8(%a6),0x8(%a0)
3348         bsr.l           tag                      3348         bsr.l           tag                     # fetch operand type
3349         mov.b           %d0,STAG(%a6)            3349         mov.b           %d0,STAG(%a6)
3350         mov.b           %d0,%d1                  3350         mov.b           %d0,%d1
3351                                                  3351 
3352         andi.l          &0x00ff00ff,USER_FPSR    3352         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3353                                                  3353 
3354         clr.l           %d0                      3354         clr.l           %d0
3355         mov.b           FPCR_MODE(%a6),%d0       3355         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3356                                                  3356 
3357         tst.b           %d1                      3357         tst.b           %d1
3358         bne.b           _L15_2x                  3358         bne.b           _L15_2x
3359         bsr.l           slog2                    3359         bsr.l           slog2                   # operand is a NORM
3360         bra.b           _L15_6x                  3360         bra.b           _L15_6x
3361 _L15_2x:                                         3361 _L15_2x:
3362         cmpi.b          %d1,&ZERO                3362         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3363         bne.b           _L15_3x                  3363         bne.b           _L15_3x                 # no
3364         bsr.l           t_dz2                    3364         bsr.l           t_dz2                   # yes
3365         bra.b           _L15_6x                  3365         bra.b           _L15_6x
3366 _L15_3x:                                         3366 _L15_3x:
3367         cmpi.b          %d1,&INF                 3367         cmpi.b          %d1,&INF                # is operand an INF?
3368         bne.b           _L15_4x                  3368         bne.b           _L15_4x                 # no
3369         bsr.l           sopr_inf                 3369         bsr.l           sopr_inf                        # yes
3370         bra.b           _L15_6x                  3370         bra.b           _L15_6x
3371 _L15_4x:                                         3371 _L15_4x:
3372         cmpi.b          %d1,&QNAN                3372         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3373         bne.b           _L15_5x                  3373         bne.b           _L15_5x                 # no
3374         bsr.l           src_qnan                 3374         bsr.l           src_qnan                        # yes
3375         bra.b           _L15_6x                  3375         bra.b           _L15_6x
3376 _L15_5x:                                         3376 _L15_5x:
3377         bsr.l           slog2d                   3377         bsr.l           slog2d                  # operand is a DENORM
3378 _L15_6x:                                         3378 _L15_6x:
3379                                                  3379 
3380 #                                                3380 #
3381 #       Result is now in FP0                     3381 #       Result is now in FP0
3382 #                                                3382 #
3383         movm.l          EXC_DREGS(%a6),&0x030    3383         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3384         fmovm.l         USER_FPCR(%a6),%fpcr,    3384         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3385         fmovm.x         EXC_FP1(%a6),&0x40       3385         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3386         unlk            %a6                      3386         unlk            %a6
3387         rts                                      3387         rts
3388                                                  3388 
3389                                                  3389 
3390 #############################################    3390 #########################################################################
3391 # MONADIC TEMPLATE                               3391 # MONADIC TEMPLATE                                                      #
3392 #############################################    3392 #########################################################################
3393         global          _fcoshs_                 3393         global          _fcoshs_
3394 _fcoshs_:                                        3394 _fcoshs_:
3395         link            %a6,&-LOCAL_SIZE         3395         link            %a6,&-LOCAL_SIZE
3396                                                  3396 
3397         movm.l          &0x0303,EXC_DREGS(%a6    3397         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3398         fmovm.l         %fpcr,%fpsr,USER_FPCR    3398         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3399         fmovm.x         &0xc0,EXC_FP0(%a6)       3399         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3400                                                  3400 
3401         fmov.l          &0x0,%fpcr               3401         fmov.l          &0x0,%fpcr              # zero FPCR
3402                                                  3402 
3403 #                                                3403 #
3404 #       copy, convert, and tag input argument    3404 #       copy, convert, and tag input argument
3405 #                                                3405 #
3406         fmov.s          0x8(%a6),%fp0            3406         fmov.s          0x8(%a6),%fp0           # load sgl input
3407         fmov.x          %fp0,FP_SRC(%a6)         3407         fmov.x          %fp0,FP_SRC(%a6)
3408         lea             FP_SRC(%a6),%a0          3408         lea             FP_SRC(%a6),%a0
3409         bsr.l           tag                      3409         bsr.l           tag                     # fetch operand type
3410         mov.b           %d0,STAG(%a6)            3410         mov.b           %d0,STAG(%a6)
3411         mov.b           %d0,%d1                  3411         mov.b           %d0,%d1
3412                                                  3412 
3413         andi.l          &0x00ff00ff,USER_FPSR    3413         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3414                                                  3414 
3415         clr.l           %d0                      3415         clr.l           %d0
3416         mov.b           FPCR_MODE(%a6),%d0       3416         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3417                                                  3417 
3418         tst.b           %d1                      3418         tst.b           %d1
3419         bne.b           _L16_2s                  3419         bne.b           _L16_2s
3420         bsr.l           scosh                    3420         bsr.l           scosh                   # operand is a NORM
3421         bra.b           _L16_6s                  3421         bra.b           _L16_6s
3422 _L16_2s:                                         3422 _L16_2s:
3423         cmpi.b          %d1,&ZERO                3423         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3424         bne.b           _L16_3s                  3424         bne.b           _L16_3s                 # no
3425         bsr.l           ld_pone                  3425         bsr.l           ld_pone                 # yes
3426         bra.b           _L16_6s                  3426         bra.b           _L16_6s
3427 _L16_3s:                                         3427 _L16_3s:
3428         cmpi.b          %d1,&INF                 3428         cmpi.b          %d1,&INF                # is operand an INF?
3429         bne.b           _L16_4s                  3429         bne.b           _L16_4s                 # no
3430         bsr.l           ld_pinf                  3430         bsr.l           ld_pinf                 # yes
3431         bra.b           _L16_6s                  3431         bra.b           _L16_6s
3432 _L16_4s:                                         3432 _L16_4s:
3433         cmpi.b          %d1,&QNAN                3433         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3434         bne.b           _L16_5s                  3434         bne.b           _L16_5s                 # no
3435         bsr.l           src_qnan                 3435         bsr.l           src_qnan                        # yes
3436         bra.b           _L16_6s                  3436         bra.b           _L16_6s
3437 _L16_5s:                                         3437 _L16_5s:
3438         bsr.l           scoshd                   3438         bsr.l           scoshd                  # operand is a DENORM
3439 _L16_6s:                                         3439 _L16_6s:
3440                                                  3440 
3441 #                                                3441 #
3442 #       Result is now in FP0                     3442 #       Result is now in FP0
3443 #                                                3443 #
3444         movm.l          EXC_DREGS(%a6),&0x030    3444         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3445         fmovm.l         USER_FPCR(%a6),%fpcr,    3445         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3446         fmovm.x         EXC_FP1(%a6),&0x40       3446         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3447         unlk            %a6                      3447         unlk            %a6
3448         rts                                      3448         rts
3449                                                  3449 
3450         global          _fcoshd_                 3450         global          _fcoshd_
3451 _fcoshd_:                                        3451 _fcoshd_:
3452         link            %a6,&-LOCAL_SIZE         3452         link            %a6,&-LOCAL_SIZE
3453                                                  3453 
3454         movm.l          &0x0303,EXC_DREGS(%a6    3454         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3455         fmovm.l         %fpcr,%fpsr,USER_FPCR    3455         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3456         fmovm.x         &0xc0,EXC_FP0(%a6)       3456         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3457                                                  3457 
3458         fmov.l          &0x0,%fpcr               3458         fmov.l          &0x0,%fpcr              # zero FPCR
3459                                                  3459 
3460 #                                                3460 #
3461 #       copy, convert, and tag input argument    3461 #       copy, convert, and tag input argument
3462 #                                                3462 #
3463         fmov.d          0x8(%a6),%fp0            3463         fmov.d          0x8(%a6),%fp0           # load dbl input
3464         fmov.x          %fp0,FP_SRC(%a6)         3464         fmov.x          %fp0,FP_SRC(%a6)
3465         lea             FP_SRC(%a6),%a0          3465         lea             FP_SRC(%a6),%a0
3466         bsr.l           tag                      3466         bsr.l           tag                     # fetch operand type
3467         mov.b           %d0,STAG(%a6)            3467         mov.b           %d0,STAG(%a6)
3468         mov.b           %d0,%d1                  3468         mov.b           %d0,%d1
3469                                                  3469 
3470         andi.l          &0x00ff00ff,USER_FPSR    3470         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3471                                                  3471 
3472         clr.l           %d0                      3472         clr.l           %d0
3473         mov.b           FPCR_MODE(%a6),%d0       3473         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3474                                                  3474 
3475         mov.b           %d1,STAG(%a6)            3475         mov.b           %d1,STAG(%a6)
3476         tst.b           %d1                      3476         tst.b           %d1
3477         bne.b           _L16_2d                  3477         bne.b           _L16_2d
3478         bsr.l           scosh                    3478         bsr.l           scosh                   # operand is a NORM
3479         bra.b           _L16_6d                  3479         bra.b           _L16_6d
3480 _L16_2d:                                         3480 _L16_2d:
3481         cmpi.b          %d1,&ZERO                3481         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3482         bne.b           _L16_3d                  3482         bne.b           _L16_3d                 # no
3483         bsr.l           ld_pone                  3483         bsr.l           ld_pone                 # yes
3484         bra.b           _L16_6d                  3484         bra.b           _L16_6d
3485 _L16_3d:                                         3485 _L16_3d:
3486         cmpi.b          %d1,&INF                 3486         cmpi.b          %d1,&INF                # is operand an INF?
3487         bne.b           _L16_4d                  3487         bne.b           _L16_4d                 # no
3488         bsr.l           ld_pinf                  3488         bsr.l           ld_pinf                 # yes
3489         bra.b           _L16_6d                  3489         bra.b           _L16_6d
3490 _L16_4d:                                         3490 _L16_4d:
3491         cmpi.b          %d1,&QNAN                3491         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3492         bne.b           _L16_5d                  3492         bne.b           _L16_5d                 # no
3493         bsr.l           src_qnan                 3493         bsr.l           src_qnan                        # yes
3494         bra.b           _L16_6d                  3494         bra.b           _L16_6d
3495 _L16_5d:                                         3495 _L16_5d:
3496         bsr.l           scoshd                   3496         bsr.l           scoshd                  # operand is a DENORM
3497 _L16_6d:                                         3497 _L16_6d:
3498                                                  3498 
3499 #                                                3499 #
3500 #       Result is now in FP0                     3500 #       Result is now in FP0
3501 #                                                3501 #
3502         movm.l          EXC_DREGS(%a6),&0x030    3502         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3503         fmovm.l         USER_FPCR(%a6),%fpcr,    3503         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3504         fmovm.x         EXC_FP1(%a6),&0x40       3504         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3505         unlk            %a6                      3505         unlk            %a6
3506         rts                                      3506         rts
3507                                                  3507 
3508         global          _fcoshx_                 3508         global          _fcoshx_
3509 _fcoshx_:                                        3509 _fcoshx_:
3510         link            %a6,&-LOCAL_SIZE         3510         link            %a6,&-LOCAL_SIZE
3511                                                  3511 
3512         movm.l          &0x0303,EXC_DREGS(%a6    3512         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3513         fmovm.l         %fpcr,%fpsr,USER_FPCR    3513         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3514         fmovm.x         &0xc0,EXC_FP0(%a6)       3514         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3515                                                  3515 
3516         fmov.l          &0x0,%fpcr               3516         fmov.l          &0x0,%fpcr              # zero FPCR
3517                                                  3517 
3518 #                                                3518 #
3519 #       copy, convert, and tag input argument    3519 #       copy, convert, and tag input argument
3520 #                                                3520 #
3521         lea             FP_SRC(%a6),%a0          3521         lea             FP_SRC(%a6),%a0
3522         mov.l           0x8+0x0(%a6),0x0(%a0)    3522         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
3523         mov.l           0x8+0x4(%a6),0x4(%a0)    3523         mov.l           0x8+0x4(%a6),0x4(%a0)
3524         mov.l           0x8+0x8(%a6),0x8(%a0)    3524         mov.l           0x8+0x8(%a6),0x8(%a0)
3525         bsr.l           tag                      3525         bsr.l           tag                     # fetch operand type
3526         mov.b           %d0,STAG(%a6)            3526         mov.b           %d0,STAG(%a6)
3527         mov.b           %d0,%d1                  3527         mov.b           %d0,%d1
3528                                                  3528 
3529         andi.l          &0x00ff00ff,USER_FPSR    3529         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3530                                                  3530 
3531         clr.l           %d0                      3531         clr.l           %d0
3532         mov.b           FPCR_MODE(%a6),%d0       3532         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3533                                                  3533 
3534         tst.b           %d1                      3534         tst.b           %d1
3535         bne.b           _L16_2x                  3535         bne.b           _L16_2x
3536         bsr.l           scosh                    3536         bsr.l           scosh                   # operand is a NORM
3537         bra.b           _L16_6x                  3537         bra.b           _L16_6x
3538 _L16_2x:                                         3538 _L16_2x:
3539         cmpi.b          %d1,&ZERO                3539         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3540         bne.b           _L16_3x                  3540         bne.b           _L16_3x                 # no
3541         bsr.l           ld_pone                  3541         bsr.l           ld_pone                 # yes
3542         bra.b           _L16_6x                  3542         bra.b           _L16_6x
3543 _L16_3x:                                         3543 _L16_3x:
3544         cmpi.b          %d1,&INF                 3544         cmpi.b          %d1,&INF                # is operand an INF?
3545         bne.b           _L16_4x                  3545         bne.b           _L16_4x                 # no
3546         bsr.l           ld_pinf                  3546         bsr.l           ld_pinf                 # yes
3547         bra.b           _L16_6x                  3547         bra.b           _L16_6x
3548 _L16_4x:                                         3548 _L16_4x:
3549         cmpi.b          %d1,&QNAN                3549         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3550         bne.b           _L16_5x                  3550         bne.b           _L16_5x                 # no
3551         bsr.l           src_qnan                 3551         bsr.l           src_qnan                        # yes
3552         bra.b           _L16_6x                  3552         bra.b           _L16_6x
3553 _L16_5x:                                         3553 _L16_5x:
3554         bsr.l           scoshd                   3554         bsr.l           scoshd                  # operand is a DENORM
3555 _L16_6x:                                         3555 _L16_6x:
3556                                                  3556 
3557 #                                                3557 #
3558 #       Result is now in FP0                     3558 #       Result is now in FP0
3559 #                                                3559 #
3560         movm.l          EXC_DREGS(%a6),&0x030    3560         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3561         fmovm.l         USER_FPCR(%a6),%fpcr,    3561         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3562         fmovm.x         EXC_FP1(%a6),&0x40       3562         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3563         unlk            %a6                      3563         unlk            %a6
3564         rts                                      3564         rts
3565                                                  3565 
3566                                                  3566 
3567 #############################################    3567 #########################################################################
3568 # MONADIC TEMPLATE                               3568 # MONADIC TEMPLATE                                                      #
3569 #############################################    3569 #########################################################################
3570         global          _facoss_                 3570         global          _facoss_
3571 _facoss_:                                        3571 _facoss_:
3572         link            %a6,&-LOCAL_SIZE         3572         link            %a6,&-LOCAL_SIZE
3573                                                  3573 
3574         movm.l          &0x0303,EXC_DREGS(%a6    3574         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3575         fmovm.l         %fpcr,%fpsr,USER_FPCR    3575         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3576         fmovm.x         &0xc0,EXC_FP0(%a6)       3576         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3577                                                  3577 
3578         fmov.l          &0x0,%fpcr               3578         fmov.l          &0x0,%fpcr              # zero FPCR
3579                                                  3579 
3580 #                                                3580 #
3581 #       copy, convert, and tag input argument    3581 #       copy, convert, and tag input argument
3582 #                                                3582 #
3583         fmov.s          0x8(%a6),%fp0            3583         fmov.s          0x8(%a6),%fp0           # load sgl input
3584         fmov.x          %fp0,FP_SRC(%a6)         3584         fmov.x          %fp0,FP_SRC(%a6)
3585         lea             FP_SRC(%a6),%a0          3585         lea             FP_SRC(%a6),%a0
3586         bsr.l           tag                      3586         bsr.l           tag                     # fetch operand type
3587         mov.b           %d0,STAG(%a6)            3587         mov.b           %d0,STAG(%a6)
3588         mov.b           %d0,%d1                  3588         mov.b           %d0,%d1
3589                                                  3589 
3590         andi.l          &0x00ff00ff,USER_FPSR    3590         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3591                                                  3591 
3592         clr.l           %d0                      3592         clr.l           %d0
3593         mov.b           FPCR_MODE(%a6),%d0       3593         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3594                                                  3594 
3595         tst.b           %d1                      3595         tst.b           %d1
3596         bne.b           _L17_2s                  3596         bne.b           _L17_2s
3597         bsr.l           sacos                    3597         bsr.l           sacos                   # operand is a NORM
3598         bra.b           _L17_6s                  3598         bra.b           _L17_6s
3599 _L17_2s:                                         3599 _L17_2s:
3600         cmpi.b          %d1,&ZERO                3600         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3601         bne.b           _L17_3s                  3601         bne.b           _L17_3s                 # no
3602         bsr.l           ld_ppi2                  3602         bsr.l           ld_ppi2                 # yes
3603         bra.b           _L17_6s                  3603         bra.b           _L17_6s
3604 _L17_3s:                                         3604 _L17_3s:
3605         cmpi.b          %d1,&INF                 3605         cmpi.b          %d1,&INF                # is operand an INF?
3606         bne.b           _L17_4s                  3606         bne.b           _L17_4s                 # no
3607         bsr.l           t_operr                  3607         bsr.l           t_operr                 # yes
3608         bra.b           _L17_6s                  3608         bra.b           _L17_6s
3609 _L17_4s:                                         3609 _L17_4s:
3610         cmpi.b          %d1,&QNAN                3610         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3611         bne.b           _L17_5s                  3611         bne.b           _L17_5s                 # no
3612         bsr.l           src_qnan                 3612         bsr.l           src_qnan                        # yes
3613         bra.b           _L17_6s                  3613         bra.b           _L17_6s
3614 _L17_5s:                                         3614 _L17_5s:
3615         bsr.l           sacosd                   3615         bsr.l           sacosd                  # operand is a DENORM
3616 _L17_6s:                                         3616 _L17_6s:
3617                                                  3617 
3618 #                                                3618 #
3619 #       Result is now in FP0                     3619 #       Result is now in FP0
3620 #                                                3620 #
3621         movm.l          EXC_DREGS(%a6),&0x030    3621         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3622         fmovm.l         USER_FPCR(%a6),%fpcr,    3622         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3623         fmovm.x         EXC_FP1(%a6),&0x40       3623         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3624         unlk            %a6                      3624         unlk            %a6
3625         rts                                      3625         rts
3626                                                  3626 
3627         global          _facosd_                 3627         global          _facosd_
3628 _facosd_:                                        3628 _facosd_:
3629         link            %a6,&-LOCAL_SIZE         3629         link            %a6,&-LOCAL_SIZE
3630                                                  3630 
3631         movm.l          &0x0303,EXC_DREGS(%a6    3631         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3632         fmovm.l         %fpcr,%fpsr,USER_FPCR    3632         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3633         fmovm.x         &0xc0,EXC_FP0(%a6)       3633         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3634                                                  3634 
3635         fmov.l          &0x0,%fpcr               3635         fmov.l          &0x0,%fpcr              # zero FPCR
3636                                                  3636 
3637 #                                                3637 #
3638 #       copy, convert, and tag input argument    3638 #       copy, convert, and tag input argument
3639 #                                                3639 #
3640         fmov.d          0x8(%a6),%fp0            3640         fmov.d          0x8(%a6),%fp0           # load dbl input
3641         fmov.x          %fp0,FP_SRC(%a6)         3641         fmov.x          %fp0,FP_SRC(%a6)
3642         lea             FP_SRC(%a6),%a0          3642         lea             FP_SRC(%a6),%a0
3643         bsr.l           tag                      3643         bsr.l           tag                     # fetch operand type
3644         mov.b           %d0,STAG(%a6)            3644         mov.b           %d0,STAG(%a6)
3645         mov.b           %d0,%d1                  3645         mov.b           %d0,%d1
3646                                                  3646 
3647         andi.l          &0x00ff00ff,USER_FPSR    3647         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3648                                                  3648 
3649         clr.l           %d0                      3649         clr.l           %d0
3650         mov.b           FPCR_MODE(%a6),%d0       3650         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3651                                                  3651 
3652         mov.b           %d1,STAG(%a6)            3652         mov.b           %d1,STAG(%a6)
3653         tst.b           %d1                      3653         tst.b           %d1
3654         bne.b           _L17_2d                  3654         bne.b           _L17_2d
3655         bsr.l           sacos                    3655         bsr.l           sacos                   # operand is a NORM
3656         bra.b           _L17_6d                  3656         bra.b           _L17_6d
3657 _L17_2d:                                         3657 _L17_2d:
3658         cmpi.b          %d1,&ZERO                3658         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3659         bne.b           _L17_3d                  3659         bne.b           _L17_3d                 # no
3660         bsr.l           ld_ppi2                  3660         bsr.l           ld_ppi2                 # yes
3661         bra.b           _L17_6d                  3661         bra.b           _L17_6d
3662 _L17_3d:                                         3662 _L17_3d:
3663         cmpi.b          %d1,&INF                 3663         cmpi.b          %d1,&INF                # is operand an INF?
3664         bne.b           _L17_4d                  3664         bne.b           _L17_4d                 # no
3665         bsr.l           t_operr                  3665         bsr.l           t_operr                 # yes
3666         bra.b           _L17_6d                  3666         bra.b           _L17_6d
3667 _L17_4d:                                         3667 _L17_4d:
3668         cmpi.b          %d1,&QNAN                3668         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3669         bne.b           _L17_5d                  3669         bne.b           _L17_5d                 # no
3670         bsr.l           src_qnan                 3670         bsr.l           src_qnan                        # yes
3671         bra.b           _L17_6d                  3671         bra.b           _L17_6d
3672 _L17_5d:                                         3672 _L17_5d:
3673         bsr.l           sacosd                   3673         bsr.l           sacosd                  # operand is a DENORM
3674 _L17_6d:                                         3674 _L17_6d:
3675                                                  3675 
3676 #                                                3676 #
3677 #       Result is now in FP0                     3677 #       Result is now in FP0
3678 #                                                3678 #
3679         movm.l          EXC_DREGS(%a6),&0x030    3679         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3680         fmovm.l         USER_FPCR(%a6),%fpcr,    3680         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3681         fmovm.x         EXC_FP1(%a6),&0x40       3681         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3682         unlk            %a6                      3682         unlk            %a6
3683         rts                                      3683         rts
3684                                                  3684 
3685         global          _facosx_                 3685         global          _facosx_
3686 _facosx_:                                        3686 _facosx_:
3687         link            %a6,&-LOCAL_SIZE         3687         link            %a6,&-LOCAL_SIZE
3688                                                  3688 
3689         movm.l          &0x0303,EXC_DREGS(%a6    3689         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3690         fmovm.l         %fpcr,%fpsr,USER_FPCR    3690         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3691         fmovm.x         &0xc0,EXC_FP0(%a6)       3691         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3692                                                  3692 
3693         fmov.l          &0x0,%fpcr               3693         fmov.l          &0x0,%fpcr              # zero FPCR
3694                                                  3694 
3695 #                                                3695 #
3696 #       copy, convert, and tag input argument    3696 #       copy, convert, and tag input argument
3697 #                                                3697 #
3698         lea             FP_SRC(%a6),%a0          3698         lea             FP_SRC(%a6),%a0
3699         mov.l           0x8+0x0(%a6),0x0(%a0)    3699         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
3700         mov.l           0x8+0x4(%a6),0x4(%a0)    3700         mov.l           0x8+0x4(%a6),0x4(%a0)
3701         mov.l           0x8+0x8(%a6),0x8(%a0)    3701         mov.l           0x8+0x8(%a6),0x8(%a0)
3702         bsr.l           tag                      3702         bsr.l           tag                     # fetch operand type
3703         mov.b           %d0,STAG(%a6)            3703         mov.b           %d0,STAG(%a6)
3704         mov.b           %d0,%d1                  3704         mov.b           %d0,%d1
3705                                                  3705 
3706         andi.l          &0x00ff00ff,USER_FPSR    3706         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3707                                                  3707 
3708         clr.l           %d0                      3708         clr.l           %d0
3709         mov.b           FPCR_MODE(%a6),%d0       3709         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3710                                                  3710 
3711         tst.b           %d1                      3711         tst.b           %d1
3712         bne.b           _L17_2x                  3712         bne.b           _L17_2x
3713         bsr.l           sacos                    3713         bsr.l           sacos                   # operand is a NORM
3714         bra.b           _L17_6x                  3714         bra.b           _L17_6x
3715 _L17_2x:                                         3715 _L17_2x:
3716         cmpi.b          %d1,&ZERO                3716         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3717         bne.b           _L17_3x                  3717         bne.b           _L17_3x                 # no
3718         bsr.l           ld_ppi2                  3718         bsr.l           ld_ppi2                 # yes
3719         bra.b           _L17_6x                  3719         bra.b           _L17_6x
3720 _L17_3x:                                         3720 _L17_3x:
3721         cmpi.b          %d1,&INF                 3721         cmpi.b          %d1,&INF                # is operand an INF?
3722         bne.b           _L17_4x                  3722         bne.b           _L17_4x                 # no
3723         bsr.l           t_operr                  3723         bsr.l           t_operr                 # yes
3724         bra.b           _L17_6x                  3724         bra.b           _L17_6x
3725 _L17_4x:                                         3725 _L17_4x:
3726         cmpi.b          %d1,&QNAN                3726         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3727         bne.b           _L17_5x                  3727         bne.b           _L17_5x                 # no
3728         bsr.l           src_qnan                 3728         bsr.l           src_qnan                        # yes
3729         bra.b           _L17_6x                  3729         bra.b           _L17_6x
3730 _L17_5x:                                         3730 _L17_5x:
3731         bsr.l           sacosd                   3731         bsr.l           sacosd                  # operand is a DENORM
3732 _L17_6x:                                         3732 _L17_6x:
3733                                                  3733 
3734 #                                                3734 #
3735 #       Result is now in FP0                     3735 #       Result is now in FP0
3736 #                                                3736 #
3737         movm.l          EXC_DREGS(%a6),&0x030    3737         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3738         fmovm.l         USER_FPCR(%a6),%fpcr,    3738         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3739         fmovm.x         EXC_FP1(%a6),&0x40       3739         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3740         unlk            %a6                      3740         unlk            %a6
3741         rts                                      3741         rts
3742                                                  3742 
3743                                                  3743 
3744 #############################################    3744 #########################################################################
3745 # MONADIC TEMPLATE                               3745 # MONADIC TEMPLATE                                                      #
3746 #############################################    3746 #########################################################################
3747         global          _fgetexps_               3747         global          _fgetexps_
3748 _fgetexps_:                                      3748 _fgetexps_:
3749         link            %a6,&-LOCAL_SIZE         3749         link            %a6,&-LOCAL_SIZE
3750                                                  3750 
3751         movm.l          &0x0303,EXC_DREGS(%a6    3751         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3752         fmovm.l         %fpcr,%fpsr,USER_FPCR    3752         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3753         fmovm.x         &0xc0,EXC_FP0(%a6)       3753         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3754                                                  3754 
3755         fmov.l          &0x0,%fpcr               3755         fmov.l          &0x0,%fpcr              # zero FPCR
3756                                                  3756 
3757 #                                                3757 #
3758 #       copy, convert, and tag input argument    3758 #       copy, convert, and tag input argument
3759 #                                                3759 #
3760         fmov.s          0x8(%a6),%fp0            3760         fmov.s          0x8(%a6),%fp0           # load sgl input
3761         fmov.x          %fp0,FP_SRC(%a6)         3761         fmov.x          %fp0,FP_SRC(%a6)
3762         lea             FP_SRC(%a6),%a0          3762         lea             FP_SRC(%a6),%a0
3763         bsr.l           tag                      3763         bsr.l           tag                     # fetch operand type
3764         mov.b           %d0,STAG(%a6)            3764         mov.b           %d0,STAG(%a6)
3765         mov.b           %d0,%d1                  3765         mov.b           %d0,%d1
3766                                                  3766 
3767         andi.l          &0x00ff00ff,USER_FPSR    3767         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3768                                                  3768 
3769         clr.l           %d0                      3769         clr.l           %d0
3770         mov.b           FPCR_MODE(%a6),%d0       3770         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3771                                                  3771 
3772         tst.b           %d1                      3772         tst.b           %d1
3773         bne.b           _L18_2s                  3773         bne.b           _L18_2s
3774         bsr.l           sgetexp                  3774         bsr.l           sgetexp                 # operand is a NORM
3775         bra.b           _L18_6s                  3775         bra.b           _L18_6s
3776 _L18_2s:                                         3776 _L18_2s:
3777         cmpi.b          %d1,&ZERO                3777         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3778         bne.b           _L18_3s                  3778         bne.b           _L18_3s                 # no
3779         bsr.l           src_zero                 3779         bsr.l           src_zero                        # yes
3780         bra.b           _L18_6s                  3780         bra.b           _L18_6s
3781 _L18_3s:                                         3781 _L18_3s:
3782         cmpi.b          %d1,&INF                 3782         cmpi.b          %d1,&INF                # is operand an INF?
3783         bne.b           _L18_4s                  3783         bne.b           _L18_4s                 # no
3784         bsr.l           t_operr                  3784         bsr.l           t_operr                 # yes
3785         bra.b           _L18_6s                  3785         bra.b           _L18_6s
3786 _L18_4s:                                         3786 _L18_4s:
3787         cmpi.b          %d1,&QNAN                3787         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3788         bne.b           _L18_5s                  3788         bne.b           _L18_5s                 # no
3789         bsr.l           src_qnan                 3789         bsr.l           src_qnan                        # yes
3790         bra.b           _L18_6s                  3790         bra.b           _L18_6s
3791 _L18_5s:                                         3791 _L18_5s:
3792         bsr.l           sgetexpd                 3792         bsr.l           sgetexpd                        # operand is a DENORM
3793 _L18_6s:                                         3793 _L18_6s:
3794                                                  3794 
3795 #                                                3795 #
3796 #       Result is now in FP0                     3796 #       Result is now in FP0
3797 #                                                3797 #
3798         movm.l          EXC_DREGS(%a6),&0x030    3798         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3799         fmovm.l         USER_FPCR(%a6),%fpcr,    3799         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3800         fmovm.x         EXC_FP1(%a6),&0x40       3800         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3801         unlk            %a6                      3801         unlk            %a6
3802         rts                                      3802         rts
3803                                                  3803 
3804         global          _fgetexpd_               3804         global          _fgetexpd_
3805 _fgetexpd_:                                      3805 _fgetexpd_:
3806         link            %a6,&-LOCAL_SIZE         3806         link            %a6,&-LOCAL_SIZE
3807                                                  3807 
3808         movm.l          &0x0303,EXC_DREGS(%a6    3808         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3809         fmovm.l         %fpcr,%fpsr,USER_FPCR    3809         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3810         fmovm.x         &0xc0,EXC_FP0(%a6)       3810         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3811                                                  3811 
3812         fmov.l          &0x0,%fpcr               3812         fmov.l          &0x0,%fpcr              # zero FPCR
3813                                                  3813 
3814 #                                                3814 #
3815 #       copy, convert, and tag input argument    3815 #       copy, convert, and tag input argument
3816 #                                                3816 #
3817         fmov.d          0x8(%a6),%fp0            3817         fmov.d          0x8(%a6),%fp0           # load dbl input
3818         fmov.x          %fp0,FP_SRC(%a6)         3818         fmov.x          %fp0,FP_SRC(%a6)
3819         lea             FP_SRC(%a6),%a0          3819         lea             FP_SRC(%a6),%a0
3820         bsr.l           tag                      3820         bsr.l           tag                     # fetch operand type
3821         mov.b           %d0,STAG(%a6)            3821         mov.b           %d0,STAG(%a6)
3822         mov.b           %d0,%d1                  3822         mov.b           %d0,%d1
3823                                                  3823 
3824         andi.l          &0x00ff00ff,USER_FPSR    3824         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3825                                                  3825 
3826         clr.l           %d0                      3826         clr.l           %d0
3827         mov.b           FPCR_MODE(%a6),%d0       3827         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3828                                                  3828 
3829         mov.b           %d1,STAG(%a6)            3829         mov.b           %d1,STAG(%a6)
3830         tst.b           %d1                      3830         tst.b           %d1
3831         bne.b           _L18_2d                  3831         bne.b           _L18_2d
3832         bsr.l           sgetexp                  3832         bsr.l           sgetexp                 # operand is a NORM
3833         bra.b           _L18_6d                  3833         bra.b           _L18_6d
3834 _L18_2d:                                         3834 _L18_2d:
3835         cmpi.b          %d1,&ZERO                3835         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3836         bne.b           _L18_3d                  3836         bne.b           _L18_3d                 # no
3837         bsr.l           src_zero                 3837         bsr.l           src_zero                        # yes
3838         bra.b           _L18_6d                  3838         bra.b           _L18_6d
3839 _L18_3d:                                         3839 _L18_3d:
3840         cmpi.b          %d1,&INF                 3840         cmpi.b          %d1,&INF                # is operand an INF?
3841         bne.b           _L18_4d                  3841         bne.b           _L18_4d                 # no
3842         bsr.l           t_operr                  3842         bsr.l           t_operr                 # yes
3843         bra.b           _L18_6d                  3843         bra.b           _L18_6d
3844 _L18_4d:                                         3844 _L18_4d:
3845         cmpi.b          %d1,&QNAN                3845         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3846         bne.b           _L18_5d                  3846         bne.b           _L18_5d                 # no
3847         bsr.l           src_qnan                 3847         bsr.l           src_qnan                        # yes
3848         bra.b           _L18_6d                  3848         bra.b           _L18_6d
3849 _L18_5d:                                         3849 _L18_5d:
3850         bsr.l           sgetexpd                 3850         bsr.l           sgetexpd                        # operand is a DENORM
3851 _L18_6d:                                         3851 _L18_6d:
3852                                                  3852 
3853 #                                                3853 #
3854 #       Result is now in FP0                     3854 #       Result is now in FP0
3855 #                                                3855 #
3856         movm.l          EXC_DREGS(%a6),&0x030    3856         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3857         fmovm.l         USER_FPCR(%a6),%fpcr,    3857         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3858         fmovm.x         EXC_FP1(%a6),&0x40       3858         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3859         unlk            %a6                      3859         unlk            %a6
3860         rts                                      3860         rts
3861                                                  3861 
3862         global          _fgetexpx_               3862         global          _fgetexpx_
3863 _fgetexpx_:                                      3863 _fgetexpx_:
3864         link            %a6,&-LOCAL_SIZE         3864         link            %a6,&-LOCAL_SIZE
3865                                                  3865 
3866         movm.l          &0x0303,EXC_DREGS(%a6    3866         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3867         fmovm.l         %fpcr,%fpsr,USER_FPCR    3867         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3868         fmovm.x         &0xc0,EXC_FP0(%a6)       3868         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3869                                                  3869 
3870         fmov.l          &0x0,%fpcr               3870         fmov.l          &0x0,%fpcr              # zero FPCR
3871                                                  3871 
3872 #                                                3872 #
3873 #       copy, convert, and tag input argument    3873 #       copy, convert, and tag input argument
3874 #                                                3874 #
3875         lea             FP_SRC(%a6),%a0          3875         lea             FP_SRC(%a6),%a0
3876         mov.l           0x8+0x0(%a6),0x0(%a0)    3876         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
3877         mov.l           0x8+0x4(%a6),0x4(%a0)    3877         mov.l           0x8+0x4(%a6),0x4(%a0)
3878         mov.l           0x8+0x8(%a6),0x8(%a0)    3878         mov.l           0x8+0x8(%a6),0x8(%a0)
3879         bsr.l           tag                      3879         bsr.l           tag                     # fetch operand type
3880         mov.b           %d0,STAG(%a6)            3880         mov.b           %d0,STAG(%a6)
3881         mov.b           %d0,%d1                  3881         mov.b           %d0,%d1
3882                                                  3882 
3883         andi.l          &0x00ff00ff,USER_FPSR    3883         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3884                                                  3884 
3885         clr.l           %d0                      3885         clr.l           %d0
3886         mov.b           FPCR_MODE(%a6),%d0       3886         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3887                                                  3887 
3888         tst.b           %d1                      3888         tst.b           %d1
3889         bne.b           _L18_2x                  3889         bne.b           _L18_2x
3890         bsr.l           sgetexp                  3890         bsr.l           sgetexp                 # operand is a NORM
3891         bra.b           _L18_6x                  3891         bra.b           _L18_6x
3892 _L18_2x:                                         3892 _L18_2x:
3893         cmpi.b          %d1,&ZERO                3893         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3894         bne.b           _L18_3x                  3894         bne.b           _L18_3x                 # no
3895         bsr.l           src_zero                 3895         bsr.l           src_zero                        # yes
3896         bra.b           _L18_6x                  3896         bra.b           _L18_6x
3897 _L18_3x:                                         3897 _L18_3x:
3898         cmpi.b          %d1,&INF                 3898         cmpi.b          %d1,&INF                # is operand an INF?
3899         bne.b           _L18_4x                  3899         bne.b           _L18_4x                 # no
3900         bsr.l           t_operr                  3900         bsr.l           t_operr                 # yes
3901         bra.b           _L18_6x                  3901         bra.b           _L18_6x
3902 _L18_4x:                                         3902 _L18_4x:
3903         cmpi.b          %d1,&QNAN                3903         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3904         bne.b           _L18_5x                  3904         bne.b           _L18_5x                 # no
3905         bsr.l           src_qnan                 3905         bsr.l           src_qnan                        # yes
3906         bra.b           _L18_6x                  3906         bra.b           _L18_6x
3907 _L18_5x:                                         3907 _L18_5x:
3908         bsr.l           sgetexpd                 3908         bsr.l           sgetexpd                        # operand is a DENORM
3909 _L18_6x:                                         3909 _L18_6x:
3910                                                  3910 
3911 #                                                3911 #
3912 #       Result is now in FP0                     3912 #       Result is now in FP0
3913 #                                                3913 #
3914         movm.l          EXC_DREGS(%a6),&0x030    3914         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3915         fmovm.l         USER_FPCR(%a6),%fpcr,    3915         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3916         fmovm.x         EXC_FP1(%a6),&0x40       3916         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3917         unlk            %a6                      3917         unlk            %a6
3918         rts                                      3918         rts
3919                                                  3919 
3920                                                  3920 
3921 #############################################    3921 #########################################################################
3922 # MONADIC TEMPLATE                               3922 # MONADIC TEMPLATE                                                      #
3923 #############################################    3923 #########################################################################
3924         global          _fgetmans_               3924         global          _fgetmans_
3925 _fgetmans_:                                      3925 _fgetmans_:
3926         link            %a6,&-LOCAL_SIZE         3926         link            %a6,&-LOCAL_SIZE
3927                                                  3927 
3928         movm.l          &0x0303,EXC_DREGS(%a6    3928         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3929         fmovm.l         %fpcr,%fpsr,USER_FPCR    3929         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3930         fmovm.x         &0xc0,EXC_FP0(%a6)       3930         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3931                                                  3931 
3932         fmov.l          &0x0,%fpcr               3932         fmov.l          &0x0,%fpcr              # zero FPCR
3933                                                  3933 
3934 #                                                3934 #
3935 #       copy, convert, and tag input argument    3935 #       copy, convert, and tag input argument
3936 #                                                3936 #
3937         fmov.s          0x8(%a6),%fp0            3937         fmov.s          0x8(%a6),%fp0           # load sgl input
3938         fmov.x          %fp0,FP_SRC(%a6)         3938         fmov.x          %fp0,FP_SRC(%a6)
3939         lea             FP_SRC(%a6),%a0          3939         lea             FP_SRC(%a6),%a0
3940         bsr.l           tag                      3940         bsr.l           tag                     # fetch operand type
3941         mov.b           %d0,STAG(%a6)            3941         mov.b           %d0,STAG(%a6)
3942         mov.b           %d0,%d1                  3942         mov.b           %d0,%d1
3943                                                  3943 
3944         andi.l          &0x00ff00ff,USER_FPSR    3944         andi.l          &0x00ff00ff,USER_FPSR(%a6)
3945                                                  3945 
3946         clr.l           %d0                      3946         clr.l           %d0
3947         mov.b           FPCR_MODE(%a6),%d0       3947         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
3948                                                  3948 
3949         tst.b           %d1                      3949         tst.b           %d1
3950         bne.b           _L19_2s                  3950         bne.b           _L19_2s
3951         bsr.l           sgetman                  3951         bsr.l           sgetman                 # operand is a NORM
3952         bra.b           _L19_6s                  3952         bra.b           _L19_6s
3953 _L19_2s:                                         3953 _L19_2s:
3954         cmpi.b          %d1,&ZERO                3954         cmpi.b          %d1,&ZERO               # is operand a ZERO?
3955         bne.b           _L19_3s                  3955         bne.b           _L19_3s                 # no
3956         bsr.l           src_zero                 3956         bsr.l           src_zero                        # yes
3957         bra.b           _L19_6s                  3957         bra.b           _L19_6s
3958 _L19_3s:                                         3958 _L19_3s:
3959         cmpi.b          %d1,&INF                 3959         cmpi.b          %d1,&INF                # is operand an INF?
3960         bne.b           _L19_4s                  3960         bne.b           _L19_4s                 # no
3961         bsr.l           t_operr                  3961         bsr.l           t_operr                 # yes
3962         bra.b           _L19_6s                  3962         bra.b           _L19_6s
3963 _L19_4s:                                         3963 _L19_4s:
3964         cmpi.b          %d1,&QNAN                3964         cmpi.b          %d1,&QNAN               # is operand a QNAN?
3965         bne.b           _L19_5s                  3965         bne.b           _L19_5s                 # no
3966         bsr.l           src_qnan                 3966         bsr.l           src_qnan                        # yes
3967         bra.b           _L19_6s                  3967         bra.b           _L19_6s
3968 _L19_5s:                                         3968 _L19_5s:
3969         bsr.l           sgetmand                 3969         bsr.l           sgetmand                        # operand is a DENORM
3970 _L19_6s:                                         3970 _L19_6s:
3971                                                  3971 
3972 #                                                3972 #
3973 #       Result is now in FP0                     3973 #       Result is now in FP0
3974 #                                                3974 #
3975         movm.l          EXC_DREGS(%a6),&0x030    3975         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
3976         fmovm.l         USER_FPCR(%a6),%fpcr,    3976         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3977         fmovm.x         EXC_FP1(%a6),&0x40       3977         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
3978         unlk            %a6                      3978         unlk            %a6
3979         rts                                      3979         rts
3980                                                  3980 
3981         global          _fgetmand_               3981         global          _fgetmand_
3982 _fgetmand_:                                      3982 _fgetmand_:
3983         link            %a6,&-LOCAL_SIZE         3983         link            %a6,&-LOCAL_SIZE
3984                                                  3984 
3985         movm.l          &0x0303,EXC_DREGS(%a6    3985         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
3986         fmovm.l         %fpcr,%fpsr,USER_FPCR    3986         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3987         fmovm.x         &0xc0,EXC_FP0(%a6)       3987         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
3988                                                  3988 
3989         fmov.l          &0x0,%fpcr               3989         fmov.l          &0x0,%fpcr              # zero FPCR
3990                                                  3990 
3991 #                                                3991 #
3992 #       copy, convert, and tag input argument    3992 #       copy, convert, and tag input argument
3993 #                                                3993 #
3994         fmov.d          0x8(%a6),%fp0            3994         fmov.d          0x8(%a6),%fp0           # load dbl input
3995         fmov.x          %fp0,FP_SRC(%a6)         3995         fmov.x          %fp0,FP_SRC(%a6)
3996         lea             FP_SRC(%a6),%a0          3996         lea             FP_SRC(%a6),%a0
3997         bsr.l           tag                      3997         bsr.l           tag                     # fetch operand type
3998         mov.b           %d0,STAG(%a6)            3998         mov.b           %d0,STAG(%a6)
3999         mov.b           %d0,%d1                  3999         mov.b           %d0,%d1
4000                                                  4000 
4001         andi.l          &0x00ff00ff,USER_FPSR    4001         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4002                                                  4002 
4003         clr.l           %d0                      4003         clr.l           %d0
4004         mov.b           FPCR_MODE(%a6),%d0       4004         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4005                                                  4005 
4006         mov.b           %d1,STAG(%a6)            4006         mov.b           %d1,STAG(%a6)
4007         tst.b           %d1                      4007         tst.b           %d1
4008         bne.b           _L19_2d                  4008         bne.b           _L19_2d
4009         bsr.l           sgetman                  4009         bsr.l           sgetman                 # operand is a NORM
4010         bra.b           _L19_6d                  4010         bra.b           _L19_6d
4011 _L19_2d:                                         4011 _L19_2d:
4012         cmpi.b          %d1,&ZERO                4012         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4013         bne.b           _L19_3d                  4013         bne.b           _L19_3d                 # no
4014         bsr.l           src_zero                 4014         bsr.l           src_zero                        # yes
4015         bra.b           _L19_6d                  4015         bra.b           _L19_6d
4016 _L19_3d:                                         4016 _L19_3d:
4017         cmpi.b          %d1,&INF                 4017         cmpi.b          %d1,&INF                # is operand an INF?
4018         bne.b           _L19_4d                  4018         bne.b           _L19_4d                 # no
4019         bsr.l           t_operr                  4019         bsr.l           t_operr                 # yes
4020         bra.b           _L19_6d                  4020         bra.b           _L19_6d
4021 _L19_4d:                                         4021 _L19_4d:
4022         cmpi.b          %d1,&QNAN                4022         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4023         bne.b           _L19_5d                  4023         bne.b           _L19_5d                 # no
4024         bsr.l           src_qnan                 4024         bsr.l           src_qnan                        # yes
4025         bra.b           _L19_6d                  4025         bra.b           _L19_6d
4026 _L19_5d:                                         4026 _L19_5d:
4027         bsr.l           sgetmand                 4027         bsr.l           sgetmand                        # operand is a DENORM
4028 _L19_6d:                                         4028 _L19_6d:
4029                                                  4029 
4030 #                                                4030 #
4031 #       Result is now in FP0                     4031 #       Result is now in FP0
4032 #                                                4032 #
4033         movm.l          EXC_DREGS(%a6),&0x030    4033         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4034         fmovm.l         USER_FPCR(%a6),%fpcr,    4034         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4035         fmovm.x         EXC_FP1(%a6),&0x40       4035         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4036         unlk            %a6                      4036         unlk            %a6
4037         rts                                      4037         rts
4038                                                  4038 
4039         global          _fgetmanx_               4039         global          _fgetmanx_
4040 _fgetmanx_:                                      4040 _fgetmanx_:
4041         link            %a6,&-LOCAL_SIZE         4041         link            %a6,&-LOCAL_SIZE
4042                                                  4042 
4043         movm.l          &0x0303,EXC_DREGS(%a6    4043         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4044         fmovm.l         %fpcr,%fpsr,USER_FPCR    4044         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4045         fmovm.x         &0xc0,EXC_FP0(%a6)       4045         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4046                                                  4046 
4047         fmov.l          &0x0,%fpcr               4047         fmov.l          &0x0,%fpcr              # zero FPCR
4048                                                  4048 
4049 #                                                4049 #
4050 #       copy, convert, and tag input argument    4050 #       copy, convert, and tag input argument
4051 #                                                4051 #
4052         lea             FP_SRC(%a6),%a0          4052         lea             FP_SRC(%a6),%a0
4053         mov.l           0x8+0x0(%a6),0x0(%a0)    4053         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
4054         mov.l           0x8+0x4(%a6),0x4(%a0)    4054         mov.l           0x8+0x4(%a6),0x4(%a0)
4055         mov.l           0x8+0x8(%a6),0x8(%a0)    4055         mov.l           0x8+0x8(%a6),0x8(%a0)
4056         bsr.l           tag                      4056         bsr.l           tag                     # fetch operand type
4057         mov.b           %d0,STAG(%a6)            4057         mov.b           %d0,STAG(%a6)
4058         mov.b           %d0,%d1                  4058         mov.b           %d0,%d1
4059                                                  4059 
4060         andi.l          &0x00ff00ff,USER_FPSR    4060         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4061                                                  4061 
4062         clr.l           %d0                      4062         clr.l           %d0
4063         mov.b           FPCR_MODE(%a6),%d0       4063         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4064                                                  4064 
4065         tst.b           %d1                      4065         tst.b           %d1
4066         bne.b           _L19_2x                  4066         bne.b           _L19_2x
4067         bsr.l           sgetman                  4067         bsr.l           sgetman                 # operand is a NORM
4068         bra.b           _L19_6x                  4068         bra.b           _L19_6x
4069 _L19_2x:                                         4069 _L19_2x:
4070         cmpi.b          %d1,&ZERO                4070         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4071         bne.b           _L19_3x                  4071         bne.b           _L19_3x                 # no
4072         bsr.l           src_zero                 4072         bsr.l           src_zero                        # yes
4073         bra.b           _L19_6x                  4073         bra.b           _L19_6x
4074 _L19_3x:                                         4074 _L19_3x:
4075         cmpi.b          %d1,&INF                 4075         cmpi.b          %d1,&INF                # is operand an INF?
4076         bne.b           _L19_4x                  4076         bne.b           _L19_4x                 # no
4077         bsr.l           t_operr                  4077         bsr.l           t_operr                 # yes
4078         bra.b           _L19_6x                  4078         bra.b           _L19_6x
4079 _L19_4x:                                         4079 _L19_4x:
4080         cmpi.b          %d1,&QNAN                4080         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4081         bne.b           _L19_5x                  4081         bne.b           _L19_5x                 # no
4082         bsr.l           src_qnan                 4082         bsr.l           src_qnan                        # yes
4083         bra.b           _L19_6x                  4083         bra.b           _L19_6x
4084 _L19_5x:                                         4084 _L19_5x:
4085         bsr.l           sgetmand                 4085         bsr.l           sgetmand                        # operand is a DENORM
4086 _L19_6x:                                         4086 _L19_6x:
4087                                                  4087 
4088 #                                                4088 #
4089 #       Result is now in FP0                     4089 #       Result is now in FP0
4090 #                                                4090 #
4091         movm.l          EXC_DREGS(%a6),&0x030    4091         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4092         fmovm.l         USER_FPCR(%a6),%fpcr,    4092         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4093         fmovm.x         EXC_FP1(%a6),&0x40       4093         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4094         unlk            %a6                      4094         unlk            %a6
4095         rts                                      4095         rts
4096                                                  4096 
4097                                                  4097 
4098 #############################################    4098 #########################################################################
4099 # MONADIC TEMPLATE                               4099 # MONADIC TEMPLATE                                                      #
4100 #############################################    4100 #########################################################################
4101         global          _fsincoss_               4101         global          _fsincoss_
4102 _fsincoss_:                                      4102 _fsincoss_:
4103         link            %a6,&-LOCAL_SIZE         4103         link            %a6,&-LOCAL_SIZE
4104                                                  4104 
4105         movm.l          &0x0303,EXC_DREGS(%a6    4105         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4106         fmovm.l         %fpcr,%fpsr,USER_FPCR    4106         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4107         fmovm.x         &0xc0,EXC_FP0(%a6)       4107         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4108                                                  4108 
4109         fmov.l          &0x0,%fpcr               4109         fmov.l          &0x0,%fpcr              # zero FPCR
4110                                                  4110 
4111 #                                                4111 #
4112 #       copy, convert, and tag input argument    4112 #       copy, convert, and tag input argument
4113 #                                                4113 #
4114         fmov.s          0x8(%a6),%fp0            4114         fmov.s          0x8(%a6),%fp0           # load sgl input
4115         fmov.x          %fp0,FP_SRC(%a6)         4115         fmov.x          %fp0,FP_SRC(%a6)
4116         lea             FP_SRC(%a6),%a0          4116         lea             FP_SRC(%a6),%a0
4117         bsr.l           tag                      4117         bsr.l           tag                     # fetch operand type
4118         mov.b           %d0,STAG(%a6)            4118         mov.b           %d0,STAG(%a6)
4119         mov.b           %d0,%d1                  4119         mov.b           %d0,%d1
4120                                                  4120 
4121         andi.l          &0x00ff00ff,USER_FPSR    4121         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4122                                                  4122 
4123         clr.l           %d0                      4123         clr.l           %d0
4124         mov.b           FPCR_MODE(%a6),%d0       4124         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4125                                                  4125 
4126         tst.b           %d1                      4126         tst.b           %d1
4127         bne.b           _L20_2s                  4127         bne.b           _L20_2s
4128         bsr.l           ssincos                  4128         bsr.l           ssincos                 # operand is a NORM
4129         bra.b           _L20_6s                  4129         bra.b           _L20_6s
4130 _L20_2s:                                         4130 _L20_2s:
4131         cmpi.b          %d1,&ZERO                4131         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4132         bne.b           _L20_3s                  4132         bne.b           _L20_3s                 # no
4133         bsr.l           ssincosz                 4133         bsr.l           ssincosz                        # yes
4134         bra.b           _L20_6s                  4134         bra.b           _L20_6s
4135 _L20_3s:                                         4135 _L20_3s:
4136         cmpi.b          %d1,&INF                 4136         cmpi.b          %d1,&INF                # is operand an INF?
4137         bne.b           _L20_4s                  4137         bne.b           _L20_4s                 # no
4138         bsr.l           ssincosi                 4138         bsr.l           ssincosi                        # yes
4139         bra.b           _L20_6s                  4139         bra.b           _L20_6s
4140 _L20_4s:                                         4140 _L20_4s:
4141         cmpi.b          %d1,&QNAN                4141         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4142         bne.b           _L20_5s                  4142         bne.b           _L20_5s                 # no
4143         bsr.l           ssincosqnan              4143         bsr.l           ssincosqnan                     # yes
4144         bra.b           _L20_6s                  4144         bra.b           _L20_6s
4145 _L20_5s:                                         4145 _L20_5s:
4146         bsr.l           ssincosd                 4146         bsr.l           ssincosd                        # operand is a DENORM
4147 _L20_6s:                                         4147 _L20_6s:
4148                                                  4148 
4149 #                                                4149 #
4150 #       Result is now in FP0                     4150 #       Result is now in FP0
4151 #                                                4151 #
4152         movm.l          EXC_DREGS(%a6),&0x030    4152         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4153         fmovm.l         USER_FPCR(%a6),%fpcr,    4153         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4154         fmovm.x         &0x03,-(%sp)             4154         fmovm.x         &0x03,-(%sp)            # store off fp0/fp1
4155         fmovm.x         (%sp)+,&0x40             4155         fmovm.x         (%sp)+,&0x40            # fp0 now in fp1
4156         fmovm.x         (%sp)+,&0x80             4156         fmovm.x         (%sp)+,&0x80            # fp1 now in fp0
4157         unlk            %a6                      4157         unlk            %a6
4158         rts                                      4158         rts
4159                                                  4159 
4160         global          _fsincosd_               4160         global          _fsincosd_
4161 _fsincosd_:                                      4161 _fsincosd_:
4162         link            %a6,&-LOCAL_SIZE         4162         link            %a6,&-LOCAL_SIZE
4163                                                  4163 
4164         movm.l          &0x0303,EXC_DREGS(%a6    4164         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4165         fmovm.l         %fpcr,%fpsr,USER_FPCR    4165         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4166         fmovm.x         &0xc0,EXC_FP0(%a6)       4166         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4167                                                  4167 
4168         fmov.l          &0x0,%fpcr               4168         fmov.l          &0x0,%fpcr              # zero FPCR
4169                                                  4169 
4170 #                                                4170 #
4171 #       copy, convert, and tag input argument    4171 #       copy, convert, and tag input argument
4172 #                                                4172 #
4173         fmov.d          0x8(%a6),%fp0            4173         fmov.d          0x8(%a6),%fp0           # load dbl input
4174         fmov.x          %fp0,FP_SRC(%a6)         4174         fmov.x          %fp0,FP_SRC(%a6)
4175         lea             FP_SRC(%a6),%a0          4175         lea             FP_SRC(%a6),%a0
4176         bsr.l           tag                      4176         bsr.l           tag                     # fetch operand type
4177         mov.b           %d0,STAG(%a6)            4177         mov.b           %d0,STAG(%a6)
4178         mov.b           %d0,%d1                  4178         mov.b           %d0,%d1
4179                                                  4179 
4180         andi.l          &0x00ff00ff,USER_FPSR    4180         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4181                                                  4181 
4182         clr.l           %d0                      4182         clr.l           %d0
4183         mov.b           FPCR_MODE(%a6),%d0       4183         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4184                                                  4184 
4185         mov.b           %d1,STAG(%a6)            4185         mov.b           %d1,STAG(%a6)
4186         tst.b           %d1                      4186         tst.b           %d1
4187         bne.b           _L20_2d                  4187         bne.b           _L20_2d
4188         bsr.l           ssincos                  4188         bsr.l           ssincos                 # operand is a NORM
4189         bra.b           _L20_6d                  4189         bra.b           _L20_6d
4190 _L20_2d:                                         4190 _L20_2d:
4191         cmpi.b          %d1,&ZERO                4191         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4192         bne.b           _L20_3d                  4192         bne.b           _L20_3d                 # no
4193         bsr.l           ssincosz                 4193         bsr.l           ssincosz                        # yes
4194         bra.b           _L20_6d                  4194         bra.b           _L20_6d
4195 _L20_3d:                                         4195 _L20_3d:
4196         cmpi.b          %d1,&INF                 4196         cmpi.b          %d1,&INF                # is operand an INF?
4197         bne.b           _L20_4d                  4197         bne.b           _L20_4d                 # no
4198         bsr.l           ssincosi                 4198         bsr.l           ssincosi                        # yes
4199         bra.b           _L20_6d                  4199         bra.b           _L20_6d
4200 _L20_4d:                                         4200 _L20_4d:
4201         cmpi.b          %d1,&QNAN                4201         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4202         bne.b           _L20_5d                  4202         bne.b           _L20_5d                 # no
4203         bsr.l           ssincosqnan              4203         bsr.l           ssincosqnan                     # yes
4204         bra.b           _L20_6d                  4204         bra.b           _L20_6d
4205 _L20_5d:                                         4205 _L20_5d:
4206         bsr.l           ssincosd                 4206         bsr.l           ssincosd                        # operand is a DENORM
4207 _L20_6d:                                         4207 _L20_6d:
4208                                                  4208 
4209 #                                                4209 #
4210 #       Result is now in FP0                     4210 #       Result is now in FP0
4211 #                                                4211 #
4212         movm.l          EXC_DREGS(%a6),&0x030    4212         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4213         fmovm.l         USER_FPCR(%a6),%fpcr,    4213         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4214         fmovm.x         &0x03,-(%sp)             4214         fmovm.x         &0x03,-(%sp)            # store off fp0/fp1
4215         fmovm.x         (%sp)+,&0x40             4215         fmovm.x         (%sp)+,&0x40            # fp0 now in fp1
4216         fmovm.x         (%sp)+,&0x80             4216         fmovm.x         (%sp)+,&0x80            # fp1 now in fp0
4217         unlk            %a6                      4217         unlk            %a6
4218         rts                                      4218         rts
4219                                                  4219 
4220         global          _fsincosx_               4220         global          _fsincosx_
4221 _fsincosx_:                                      4221 _fsincosx_:
4222         link            %a6,&-LOCAL_SIZE         4222         link            %a6,&-LOCAL_SIZE
4223                                                  4223 
4224         movm.l          &0x0303,EXC_DREGS(%a6    4224         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4225         fmovm.l         %fpcr,%fpsr,USER_FPCR    4225         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4226         fmovm.x         &0xc0,EXC_FP0(%a6)       4226         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4227                                                  4227 
4228         fmov.l          &0x0,%fpcr               4228         fmov.l          &0x0,%fpcr              # zero FPCR
4229                                                  4229 
4230 #                                                4230 #
4231 #       copy, convert, and tag input argument    4231 #       copy, convert, and tag input argument
4232 #                                                4232 #
4233         lea             FP_SRC(%a6),%a0          4233         lea             FP_SRC(%a6),%a0
4234         mov.l           0x8+0x0(%a6),0x0(%a0)    4234         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext input
4235         mov.l           0x8+0x4(%a6),0x4(%a0)    4235         mov.l           0x8+0x4(%a6),0x4(%a0)
4236         mov.l           0x8+0x8(%a6),0x8(%a0)    4236         mov.l           0x8+0x8(%a6),0x8(%a0)
4237         bsr.l           tag                      4237         bsr.l           tag                     # fetch operand type
4238         mov.b           %d0,STAG(%a6)            4238         mov.b           %d0,STAG(%a6)
4239         mov.b           %d0,%d1                  4239         mov.b           %d0,%d1
4240                                                  4240 
4241         andi.l          &0x00ff00ff,USER_FPSR    4241         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4242                                                  4242 
4243         clr.l           %d0                      4243         clr.l           %d0
4244         mov.b           FPCR_MODE(%a6),%d0       4244         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4245                                                  4245 
4246         tst.b           %d1                      4246         tst.b           %d1
4247         bne.b           _L20_2x                  4247         bne.b           _L20_2x
4248         bsr.l           ssincos                  4248         bsr.l           ssincos                 # operand is a NORM
4249         bra.b           _L20_6x                  4249         bra.b           _L20_6x
4250 _L20_2x:                                         4250 _L20_2x:
4251         cmpi.b          %d1,&ZERO                4251         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4252         bne.b           _L20_3x                  4252         bne.b           _L20_3x                 # no
4253         bsr.l           ssincosz                 4253         bsr.l           ssincosz                        # yes
4254         bra.b           _L20_6x                  4254         bra.b           _L20_6x
4255 _L20_3x:                                         4255 _L20_3x:
4256         cmpi.b          %d1,&INF                 4256         cmpi.b          %d1,&INF                # is operand an INF?
4257         bne.b           _L20_4x                  4257         bne.b           _L20_4x                 # no
4258         bsr.l           ssincosi                 4258         bsr.l           ssincosi                        # yes
4259         bra.b           _L20_6x                  4259         bra.b           _L20_6x
4260 _L20_4x:                                         4260 _L20_4x:
4261         cmpi.b          %d1,&QNAN                4261         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4262         bne.b           _L20_5x                  4262         bne.b           _L20_5x                 # no
4263         bsr.l           ssincosqnan              4263         bsr.l           ssincosqnan                     # yes
4264         bra.b           _L20_6x                  4264         bra.b           _L20_6x
4265 _L20_5x:                                         4265 _L20_5x:
4266         bsr.l           ssincosd                 4266         bsr.l           ssincosd                        # operand is a DENORM
4267 _L20_6x:                                         4267 _L20_6x:
4268                                                  4268 
4269 #                                                4269 #
4270 #       Result is now in FP0                     4270 #       Result is now in FP0
4271 #                                                4271 #
4272         movm.l          EXC_DREGS(%a6),&0x030    4272         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4273         fmovm.l         USER_FPCR(%a6),%fpcr,    4273         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4274         fmovm.x         &0x03,-(%sp)             4274         fmovm.x         &0x03,-(%sp)            # store off fp0/fp1
4275         fmovm.x         (%sp)+,&0x40             4275         fmovm.x         (%sp)+,&0x40            # fp0 now in fp1
4276         fmovm.x         (%sp)+,&0x80             4276         fmovm.x         (%sp)+,&0x80            # fp1 now in fp0
4277         unlk            %a6                      4277         unlk            %a6
4278         rts                                      4278         rts
4279                                                  4279 
4280                                                  4280 
4281 #############################################    4281 #########################################################################
4282 # DYADIC TEMPLATE                                4282 # DYADIC TEMPLATE                                                       #
4283 #############################################    4283 #########################################################################
4284         global          _frems_                  4284         global          _frems_
4285 _frems_:                                         4285 _frems_:
4286         link            %a6,&-LOCAL_SIZE         4286         link            %a6,&-LOCAL_SIZE
4287                                                  4287 
4288         movm.l          &0x0303,EXC_DREGS(%a6    4288         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4289         fmovm.l         %fpcr,%fpsr,USER_FPCR    4289         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4290         fmovm.x         &0xc0,EXC_FP0(%a6)       4290         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4291                                                  4291 
4292         fmov.l          &0x0,%fpcr               4292         fmov.l          &0x0,%fpcr              # zero FPCR
4293                                                  4293 
4294 #                                                4294 #
4295 #       copy, convert, and tag input argument    4295 #       copy, convert, and tag input argument
4296 #                                                4296 #
4297         fmov.s          0x8(%a6),%fp0            4297         fmov.s          0x8(%a6),%fp0           # load sgl dst
4298         fmov.x          %fp0,FP_DST(%a6)         4298         fmov.x          %fp0,FP_DST(%a6)
4299         lea             FP_DST(%a6),%a0          4299         lea             FP_DST(%a6),%a0
4300         bsr.l           tag                      4300         bsr.l           tag                     # fetch operand type
4301         mov.b           %d0,DTAG(%a6)            4301         mov.b           %d0,DTAG(%a6)
4302                                                  4302 
4303         fmov.s          0xc(%a6),%fp0            4303         fmov.s          0xc(%a6),%fp0           # load sgl src
4304         fmov.x          %fp0,FP_SRC(%a6)         4304         fmov.x          %fp0,FP_SRC(%a6)
4305         lea             FP_SRC(%a6),%a0          4305         lea             FP_SRC(%a6),%a0
4306         bsr.l           tag                      4306         bsr.l           tag                     # fetch operand type
4307         mov.b           %d0,STAG(%a6)            4307         mov.b           %d0,STAG(%a6)
4308         mov.l           %d0,%d1                  4308         mov.l           %d0,%d1
4309                                                  4309 
4310         andi.l          &0x00ff00ff,USER_FPSR    4310         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4311                                                  4311 
4312         clr.l           %d0                      4312         clr.l           %d0
4313         mov.b           FPCR_MODE(%a6),%d0       4313         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4314                                                  4314 
4315         lea             FP_SRC(%a6),%a0          4315         lea             FP_SRC(%a6),%a0         # pass ptr to src
4316         lea             FP_DST(%a6),%a1          4316         lea             FP_DST(%a6),%a1         # pass ptr to dst
4317                                                  4317 
4318         tst.b           %d1                      4318         tst.b           %d1
4319         bne.b           _L21_2s                  4319         bne.b           _L21_2s
4320         bsr.l           srem_snorm               4320         bsr.l           srem_snorm                      # operand is a NORM
4321         bra.b           _L21_6s                  4321         bra.b           _L21_6s
4322 _L21_2s:                                         4322 _L21_2s:
4323         cmpi.b          %d1,&ZERO                4323         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4324         bne.b           _L21_3s                  4324         bne.b           _L21_3s                 # no
4325         bsr.l           srem_szero               4325         bsr.l           srem_szero                      # yes
4326         bra.b           _L21_6s                  4326         bra.b           _L21_6s
4327 _L21_3s:                                         4327 _L21_3s:
4328         cmpi.b          %d1,&INF                 4328         cmpi.b          %d1,&INF                # is operand an INF?
4329         bne.b           _L21_4s                  4329         bne.b           _L21_4s                 # no
4330         bsr.l           srem_sinf                4330         bsr.l           srem_sinf                       # yes
4331         bra.b           _L21_6s                  4331         bra.b           _L21_6s
4332 _L21_4s:                                         4332 _L21_4s:
4333         cmpi.b          %d1,&QNAN                4333         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4334         bne.b           _L21_5s                  4334         bne.b           _L21_5s                 # no
4335         bsr.l           sop_sqnan                4335         bsr.l           sop_sqnan                       # yes
4336         bra.b           _L21_6s                  4336         bra.b           _L21_6s
4337 _L21_5s:                                         4337 _L21_5s:
4338         bsr.l           srem_sdnrm               4338         bsr.l           srem_sdnrm                      # operand is a DENORM
4339 _L21_6s:                                         4339 _L21_6s:
4340                                                  4340 
4341 #                                                4341 #
4342 #       Result is now in FP0                     4342 #       Result is now in FP0
4343 #                                                4343 #
4344         movm.l          EXC_DREGS(%a6),&0x030    4344         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4345         fmovm.l         USER_FPCR(%a6),%fpcr,    4345         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4346         fmovm.x         EXC_FP1(%a6),&0x40       4346         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4347         unlk            %a6                      4347         unlk            %a6
4348         rts                                      4348         rts
4349                                                  4349 
4350         global          _fremd_                  4350         global          _fremd_
4351 _fremd_:                                         4351 _fremd_:
4352         link            %a6,&-LOCAL_SIZE         4352         link            %a6,&-LOCAL_SIZE
4353                                                  4353 
4354         movm.l          &0x0303,EXC_DREGS(%a6    4354         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4355         fmovm.l         %fpcr,%fpsr,USER_FPCR    4355         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4356         fmovm.x         &0xc0,EXC_FP0(%a6)       4356         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4357                                                  4357 
4358         fmov.l          &0x0,%fpcr               4358         fmov.l          &0x0,%fpcr              # zero FPCR
4359                                                  4359 
4360 #                                                4360 #
4361 #       copy, convert, and tag input argument    4361 #       copy, convert, and tag input argument
4362 #                                                4362 #
4363         fmov.d          0x8(%a6),%fp0            4363         fmov.d          0x8(%a6),%fp0           # load dbl dst
4364         fmov.x          %fp0,FP_DST(%a6)         4364         fmov.x          %fp0,FP_DST(%a6)
4365         lea             FP_DST(%a6),%a0          4365         lea             FP_DST(%a6),%a0
4366         bsr.l           tag                      4366         bsr.l           tag                     # fetch operand type
4367         mov.b           %d0,DTAG(%a6)            4367         mov.b           %d0,DTAG(%a6)
4368                                                  4368 
4369         fmov.d          0x10(%a6),%fp0           4369         fmov.d          0x10(%a6),%fp0          # load dbl src
4370         fmov.x          %fp0,FP_SRC(%a6)         4370         fmov.x          %fp0,FP_SRC(%a6)
4371         lea             FP_SRC(%a6),%a0          4371         lea             FP_SRC(%a6),%a0
4372         bsr.l           tag                      4372         bsr.l           tag                     # fetch operand type
4373         mov.b           %d0,STAG(%a6)            4373         mov.b           %d0,STAG(%a6)
4374         mov.l           %d0,%d1                  4374         mov.l           %d0,%d1
4375                                                  4375 
4376         andi.l          &0x00ff00ff,USER_FPSR    4376         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4377                                                  4377 
4378         clr.l           %d0                      4378         clr.l           %d0
4379         mov.b           FPCR_MODE(%a6),%d0       4379         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4380                                                  4380 
4381         lea             FP_SRC(%a6),%a0          4381         lea             FP_SRC(%a6),%a0         # pass ptr to src
4382         lea             FP_DST(%a6),%a1          4382         lea             FP_DST(%a6),%a1         # pass ptr to dst
4383                                                  4383 
4384         tst.b           %d1                      4384         tst.b           %d1
4385         bne.b           _L21_2d                  4385         bne.b           _L21_2d
4386         bsr.l           srem_snorm               4386         bsr.l           srem_snorm                      # operand is a NORM
4387         bra.b           _L21_6d                  4387         bra.b           _L21_6d
4388 _L21_2d:                                         4388 _L21_2d:
4389         cmpi.b          %d1,&ZERO                4389         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4390         bne.b           _L21_3d                  4390         bne.b           _L21_3d                 # no
4391         bsr.l           srem_szero               4391         bsr.l           srem_szero                      # yes
4392         bra.b           _L21_6d                  4392         bra.b           _L21_6d
4393 _L21_3d:                                         4393 _L21_3d:
4394         cmpi.b          %d1,&INF                 4394         cmpi.b          %d1,&INF                # is operand an INF?
4395         bne.b           _L21_4d                  4395         bne.b           _L21_4d                 # no
4396         bsr.l           srem_sinf                4396         bsr.l           srem_sinf                       # yes
4397         bra.b           _L21_6d                  4397         bra.b           _L21_6d
4398 _L21_4d:                                         4398 _L21_4d:
4399         cmpi.b          %d1,&QNAN                4399         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4400         bne.b           _L21_5d                  4400         bne.b           _L21_5d                 # no
4401         bsr.l           sop_sqnan                4401         bsr.l           sop_sqnan                       # yes
4402         bra.b           _L21_6d                  4402         bra.b           _L21_6d
4403 _L21_5d:                                         4403 _L21_5d:
4404         bsr.l           srem_sdnrm               4404         bsr.l           srem_sdnrm                      # operand is a DENORM
4405 _L21_6d:                                         4405 _L21_6d:
4406                                                  4406 
4407 #                                                4407 #
4408 #       Result is now in FP0                     4408 #       Result is now in FP0
4409 #                                                4409 #
4410         movm.l          EXC_DREGS(%a6),&0x030    4410         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4411         fmovm.l         USER_FPCR(%a6),%fpcr,    4411         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4412         fmovm.x         EXC_FP1(%a6),&0x40       4412         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4413         unlk            %a6                      4413         unlk            %a6
4414         rts                                      4414         rts
4415                                                  4415 
4416         global          _fremx_                  4416         global          _fremx_
4417 _fremx_:                                         4417 _fremx_:
4418         link            %a6,&-LOCAL_SIZE         4418         link            %a6,&-LOCAL_SIZE
4419                                                  4419 
4420         movm.l          &0x0303,EXC_DREGS(%a6    4420         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4421         fmovm.l         %fpcr,%fpsr,USER_FPCR    4421         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4422         fmovm.x         &0xc0,EXC_FP0(%a6)       4422         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4423                                                  4423 
4424         fmov.l          &0x0,%fpcr               4424         fmov.l          &0x0,%fpcr              # zero FPCR
4425                                                  4425 
4426 #                                                4426 #
4427 #       copy, convert, and tag input argument    4427 #       copy, convert, and tag input argument
4428 #                                                4428 #
4429         lea             FP_DST(%a6),%a0          4429         lea             FP_DST(%a6),%a0
4430         mov.l           0x8+0x0(%a6),0x0(%a0)    4430         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext dst
4431         mov.l           0x8+0x4(%a6),0x4(%a0)    4431         mov.l           0x8+0x4(%a6),0x4(%a0)
4432         mov.l           0x8+0x8(%a6),0x8(%a0)    4432         mov.l           0x8+0x8(%a6),0x8(%a0)
4433         bsr.l           tag                      4433         bsr.l           tag                     # fetch operand type
4434         mov.b           %d0,DTAG(%a6)            4434         mov.b           %d0,DTAG(%a6)
4435                                                  4435 
4436         lea             FP_SRC(%a6),%a0          4436         lea             FP_SRC(%a6),%a0
4437         mov.l           0x14+0x0(%a6),0x0(%a0    4437         mov.l           0x14+0x0(%a6),0x0(%a0)  # load ext src
4438         mov.l           0x14+0x4(%a6),0x4(%a0    4438         mov.l           0x14+0x4(%a6),0x4(%a0)
4439         mov.l           0x14+0x8(%a6),0x8(%a0    4439         mov.l           0x14+0x8(%a6),0x8(%a0)
4440         bsr.l           tag                      4440         bsr.l           tag                     # fetch operand type
4441         mov.b           %d0,STAG(%a6)            4441         mov.b           %d0,STAG(%a6)
4442         mov.l           %d0,%d1                  4442         mov.l           %d0,%d1
4443                                                  4443 
4444         andi.l          &0x00ff00ff,USER_FPSR    4444         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4445                                                  4445 
4446         clr.l           %d0                      4446         clr.l           %d0
4447         mov.b           FPCR_MODE(%a6),%d0       4447         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4448                                                  4448 
4449         lea             FP_SRC(%a6),%a0          4449         lea             FP_SRC(%a6),%a0         # pass ptr to src
4450         lea             FP_DST(%a6),%a1          4450         lea             FP_DST(%a6),%a1         # pass ptr to dst
4451                                                  4451 
4452         tst.b           %d1                      4452         tst.b           %d1
4453         bne.b           _L21_2x                  4453         bne.b           _L21_2x
4454         bsr.l           srem_snorm               4454         bsr.l           srem_snorm                      # operand is a NORM
4455         bra.b           _L21_6x                  4455         bra.b           _L21_6x
4456 _L21_2x:                                         4456 _L21_2x:
4457         cmpi.b          %d1,&ZERO                4457         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4458         bne.b           _L21_3x                  4458         bne.b           _L21_3x                 # no
4459         bsr.l           srem_szero               4459         bsr.l           srem_szero                      # yes
4460         bra.b           _L21_6x                  4460         bra.b           _L21_6x
4461 _L21_3x:                                         4461 _L21_3x:
4462         cmpi.b          %d1,&INF                 4462         cmpi.b          %d1,&INF                # is operand an INF?
4463         bne.b           _L21_4x                  4463         bne.b           _L21_4x                 # no
4464         bsr.l           srem_sinf                4464         bsr.l           srem_sinf                       # yes
4465         bra.b           _L21_6x                  4465         bra.b           _L21_6x
4466 _L21_4x:                                         4466 _L21_4x:
4467         cmpi.b          %d1,&QNAN                4467         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4468         bne.b           _L21_5x                  4468         bne.b           _L21_5x                 # no
4469         bsr.l           sop_sqnan                4469         bsr.l           sop_sqnan                       # yes
4470         bra.b           _L21_6x                  4470         bra.b           _L21_6x
4471 _L21_5x:                                         4471 _L21_5x:
4472         bsr.l           srem_sdnrm               4472         bsr.l           srem_sdnrm                      # operand is a DENORM
4473 _L21_6x:                                         4473 _L21_6x:
4474                                                  4474 
4475 #                                                4475 #
4476 #       Result is now in FP0                     4476 #       Result is now in FP0
4477 #                                                4477 #
4478         movm.l          EXC_DREGS(%a6),&0x030    4478         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4479         fmovm.l         USER_FPCR(%a6),%fpcr,    4479         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4480         fmovm.x         EXC_FP1(%a6),&0x40       4480         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4481         unlk            %a6                      4481         unlk            %a6
4482         rts                                      4482         rts
4483                                                  4483 
4484                                                  4484 
4485 #############################################    4485 #########################################################################
4486 # DYADIC TEMPLATE                                4486 # DYADIC TEMPLATE                                                       #
4487 #############################################    4487 #########################################################################
4488         global          _fmods_                  4488         global          _fmods_
4489 _fmods_:                                         4489 _fmods_:
4490         link            %a6,&-LOCAL_SIZE         4490         link            %a6,&-LOCAL_SIZE
4491                                                  4491 
4492         movm.l          &0x0303,EXC_DREGS(%a6    4492         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4493         fmovm.l         %fpcr,%fpsr,USER_FPCR    4493         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4494         fmovm.x         &0xc0,EXC_FP0(%a6)       4494         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4495                                                  4495 
4496         fmov.l          &0x0,%fpcr               4496         fmov.l          &0x0,%fpcr              # zero FPCR
4497                                                  4497 
4498 #                                                4498 #
4499 #       copy, convert, and tag input argument    4499 #       copy, convert, and tag input argument
4500 #                                                4500 #
4501         fmov.s          0x8(%a6),%fp0            4501         fmov.s          0x8(%a6),%fp0           # load sgl dst
4502         fmov.x          %fp0,FP_DST(%a6)         4502         fmov.x          %fp0,FP_DST(%a6)
4503         lea             FP_DST(%a6),%a0          4503         lea             FP_DST(%a6),%a0
4504         bsr.l           tag                      4504         bsr.l           tag                     # fetch operand type
4505         mov.b           %d0,DTAG(%a6)            4505         mov.b           %d0,DTAG(%a6)
4506                                                  4506 
4507         fmov.s          0xc(%a6),%fp0            4507         fmov.s          0xc(%a6),%fp0           # load sgl src
4508         fmov.x          %fp0,FP_SRC(%a6)         4508         fmov.x          %fp0,FP_SRC(%a6)
4509         lea             FP_SRC(%a6),%a0          4509         lea             FP_SRC(%a6),%a0
4510         bsr.l           tag                      4510         bsr.l           tag                     # fetch operand type
4511         mov.b           %d0,STAG(%a6)            4511         mov.b           %d0,STAG(%a6)
4512         mov.l           %d0,%d1                  4512         mov.l           %d0,%d1
4513                                                  4513 
4514         andi.l          &0x00ff00ff,USER_FPSR    4514         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4515                                                  4515 
4516         clr.l           %d0                      4516         clr.l           %d0
4517         mov.b           FPCR_MODE(%a6),%d0       4517         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4518                                                  4518 
4519         lea             FP_SRC(%a6),%a0          4519         lea             FP_SRC(%a6),%a0         # pass ptr to src
4520         lea             FP_DST(%a6),%a1          4520         lea             FP_DST(%a6),%a1         # pass ptr to dst
4521                                                  4521 
4522         tst.b           %d1                      4522         tst.b           %d1
4523         bne.b           _L22_2s                  4523         bne.b           _L22_2s
4524         bsr.l           smod_snorm               4524         bsr.l           smod_snorm                      # operand is a NORM
4525         bra.b           _L22_6s                  4525         bra.b           _L22_6s
4526 _L22_2s:                                         4526 _L22_2s:
4527         cmpi.b          %d1,&ZERO                4527         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4528         bne.b           _L22_3s                  4528         bne.b           _L22_3s                 # no
4529         bsr.l           smod_szero               4529         bsr.l           smod_szero                      # yes
4530         bra.b           _L22_6s                  4530         bra.b           _L22_6s
4531 _L22_3s:                                         4531 _L22_3s:
4532         cmpi.b          %d1,&INF                 4532         cmpi.b          %d1,&INF                # is operand an INF?
4533         bne.b           _L22_4s                  4533         bne.b           _L22_4s                 # no
4534         bsr.l           smod_sinf                4534         bsr.l           smod_sinf                       # yes
4535         bra.b           _L22_6s                  4535         bra.b           _L22_6s
4536 _L22_4s:                                         4536 _L22_4s:
4537         cmpi.b          %d1,&QNAN                4537         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4538         bne.b           _L22_5s                  4538         bne.b           _L22_5s                 # no
4539         bsr.l           sop_sqnan                4539         bsr.l           sop_sqnan                       # yes
4540         bra.b           _L22_6s                  4540         bra.b           _L22_6s
4541 _L22_5s:                                         4541 _L22_5s:
4542         bsr.l           smod_sdnrm               4542         bsr.l           smod_sdnrm                      # operand is a DENORM
4543 _L22_6s:                                         4543 _L22_6s:
4544                                                  4544 
4545 #                                                4545 #
4546 #       Result is now in FP0                     4546 #       Result is now in FP0
4547 #                                                4547 #
4548         movm.l          EXC_DREGS(%a6),&0x030    4548         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4549         fmovm.l         USER_FPCR(%a6),%fpcr,    4549         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4550         fmovm.x         EXC_FP1(%a6),&0x40       4550         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4551         unlk            %a6                      4551         unlk            %a6
4552         rts                                      4552         rts
4553                                                  4553 
4554         global          _fmodd_                  4554         global          _fmodd_
4555 _fmodd_:                                         4555 _fmodd_:
4556         link            %a6,&-LOCAL_SIZE         4556         link            %a6,&-LOCAL_SIZE
4557                                                  4557 
4558         movm.l          &0x0303,EXC_DREGS(%a6    4558         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4559         fmovm.l         %fpcr,%fpsr,USER_FPCR    4559         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4560         fmovm.x         &0xc0,EXC_FP0(%a6)       4560         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4561                                                  4561 
4562         fmov.l          &0x0,%fpcr               4562         fmov.l          &0x0,%fpcr              # zero FPCR
4563                                                  4563 
4564 #                                                4564 #
4565 #       copy, convert, and tag input argument    4565 #       copy, convert, and tag input argument
4566 #                                                4566 #
4567         fmov.d          0x8(%a6),%fp0            4567         fmov.d          0x8(%a6),%fp0           # load dbl dst
4568         fmov.x          %fp0,FP_DST(%a6)         4568         fmov.x          %fp0,FP_DST(%a6)
4569         lea             FP_DST(%a6),%a0          4569         lea             FP_DST(%a6),%a0
4570         bsr.l           tag                      4570         bsr.l           tag                     # fetch operand type
4571         mov.b           %d0,DTAG(%a6)            4571         mov.b           %d0,DTAG(%a6)
4572                                                  4572 
4573         fmov.d          0x10(%a6),%fp0           4573         fmov.d          0x10(%a6),%fp0          # load dbl src
4574         fmov.x          %fp0,FP_SRC(%a6)         4574         fmov.x          %fp0,FP_SRC(%a6)
4575         lea             FP_SRC(%a6),%a0          4575         lea             FP_SRC(%a6),%a0
4576         bsr.l           tag                      4576         bsr.l           tag                     # fetch operand type
4577         mov.b           %d0,STAG(%a6)            4577         mov.b           %d0,STAG(%a6)
4578         mov.l           %d0,%d1                  4578         mov.l           %d0,%d1
4579                                                  4579 
4580         andi.l          &0x00ff00ff,USER_FPSR    4580         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4581                                                  4581 
4582         clr.l           %d0                      4582         clr.l           %d0
4583         mov.b           FPCR_MODE(%a6),%d0       4583         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4584                                                  4584 
4585         lea             FP_SRC(%a6),%a0          4585         lea             FP_SRC(%a6),%a0         # pass ptr to src
4586         lea             FP_DST(%a6),%a1          4586         lea             FP_DST(%a6),%a1         # pass ptr to dst
4587                                                  4587 
4588         tst.b           %d1                      4588         tst.b           %d1
4589         bne.b           _L22_2d                  4589         bne.b           _L22_2d
4590         bsr.l           smod_snorm               4590         bsr.l           smod_snorm                      # operand is a NORM
4591         bra.b           _L22_6d                  4591         bra.b           _L22_6d
4592 _L22_2d:                                         4592 _L22_2d:
4593         cmpi.b          %d1,&ZERO                4593         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4594         bne.b           _L22_3d                  4594         bne.b           _L22_3d                 # no
4595         bsr.l           smod_szero               4595         bsr.l           smod_szero                      # yes
4596         bra.b           _L22_6d                  4596         bra.b           _L22_6d
4597 _L22_3d:                                         4597 _L22_3d:
4598         cmpi.b          %d1,&INF                 4598         cmpi.b          %d1,&INF                # is operand an INF?
4599         bne.b           _L22_4d                  4599         bne.b           _L22_4d                 # no
4600         bsr.l           smod_sinf                4600         bsr.l           smod_sinf                       # yes
4601         bra.b           _L22_6d                  4601         bra.b           _L22_6d
4602 _L22_4d:                                         4602 _L22_4d:
4603         cmpi.b          %d1,&QNAN                4603         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4604         bne.b           _L22_5d                  4604         bne.b           _L22_5d                 # no
4605         bsr.l           sop_sqnan                4605         bsr.l           sop_sqnan                       # yes
4606         bra.b           _L22_6d                  4606         bra.b           _L22_6d
4607 _L22_5d:                                         4607 _L22_5d:
4608         bsr.l           smod_sdnrm               4608         bsr.l           smod_sdnrm                      # operand is a DENORM
4609 _L22_6d:                                         4609 _L22_6d:
4610                                                  4610 
4611 #                                                4611 #
4612 #       Result is now in FP0                     4612 #       Result is now in FP0
4613 #                                                4613 #
4614         movm.l          EXC_DREGS(%a6),&0x030    4614         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4615         fmovm.l         USER_FPCR(%a6),%fpcr,    4615         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4616         fmovm.x         EXC_FP1(%a6),&0x40       4616         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4617         unlk            %a6                      4617         unlk            %a6
4618         rts                                      4618         rts
4619                                                  4619 
4620         global          _fmodx_                  4620         global          _fmodx_
4621 _fmodx_:                                         4621 _fmodx_:
4622         link            %a6,&-LOCAL_SIZE         4622         link            %a6,&-LOCAL_SIZE
4623                                                  4623 
4624         movm.l          &0x0303,EXC_DREGS(%a6    4624         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4625         fmovm.l         %fpcr,%fpsr,USER_FPCR    4625         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4626         fmovm.x         &0xc0,EXC_FP0(%a6)       4626         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4627                                                  4627 
4628         fmov.l          &0x0,%fpcr               4628         fmov.l          &0x0,%fpcr              # zero FPCR
4629                                                  4629 
4630 #                                                4630 #
4631 #       copy, convert, and tag input argument    4631 #       copy, convert, and tag input argument
4632 #                                                4632 #
4633         lea             FP_DST(%a6),%a0          4633         lea             FP_DST(%a6),%a0
4634         mov.l           0x8+0x0(%a6),0x0(%a0)    4634         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext dst
4635         mov.l           0x8+0x4(%a6),0x4(%a0)    4635         mov.l           0x8+0x4(%a6),0x4(%a0)
4636         mov.l           0x8+0x8(%a6),0x8(%a0)    4636         mov.l           0x8+0x8(%a6),0x8(%a0)
4637         bsr.l           tag                      4637         bsr.l           tag                     # fetch operand type
4638         mov.b           %d0,DTAG(%a6)            4638         mov.b           %d0,DTAG(%a6)
4639                                                  4639 
4640         lea             FP_SRC(%a6),%a0          4640         lea             FP_SRC(%a6),%a0
4641         mov.l           0x14+0x0(%a6),0x0(%a0    4641         mov.l           0x14+0x0(%a6),0x0(%a0)  # load ext src
4642         mov.l           0x14+0x4(%a6),0x4(%a0    4642         mov.l           0x14+0x4(%a6),0x4(%a0)
4643         mov.l           0x14+0x8(%a6),0x8(%a0    4643         mov.l           0x14+0x8(%a6),0x8(%a0)
4644         bsr.l           tag                      4644         bsr.l           tag                     # fetch operand type
4645         mov.b           %d0,STAG(%a6)            4645         mov.b           %d0,STAG(%a6)
4646         mov.l           %d0,%d1                  4646         mov.l           %d0,%d1
4647                                                  4647 
4648         andi.l          &0x00ff00ff,USER_FPSR    4648         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4649                                                  4649 
4650         clr.l           %d0                      4650         clr.l           %d0
4651         mov.b           FPCR_MODE(%a6),%d0       4651         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4652                                                  4652 
4653         lea             FP_SRC(%a6),%a0          4653         lea             FP_SRC(%a6),%a0         # pass ptr to src
4654         lea             FP_DST(%a6),%a1          4654         lea             FP_DST(%a6),%a1         # pass ptr to dst
4655                                                  4655 
4656         tst.b           %d1                      4656         tst.b           %d1
4657         bne.b           _L22_2x                  4657         bne.b           _L22_2x
4658         bsr.l           smod_snorm               4658         bsr.l           smod_snorm                      # operand is a NORM
4659         bra.b           _L22_6x                  4659         bra.b           _L22_6x
4660 _L22_2x:                                         4660 _L22_2x:
4661         cmpi.b          %d1,&ZERO                4661         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4662         bne.b           _L22_3x                  4662         bne.b           _L22_3x                 # no
4663         bsr.l           smod_szero               4663         bsr.l           smod_szero                      # yes
4664         bra.b           _L22_6x                  4664         bra.b           _L22_6x
4665 _L22_3x:                                         4665 _L22_3x:
4666         cmpi.b          %d1,&INF                 4666         cmpi.b          %d1,&INF                # is operand an INF?
4667         bne.b           _L22_4x                  4667         bne.b           _L22_4x                 # no
4668         bsr.l           smod_sinf                4668         bsr.l           smod_sinf                       # yes
4669         bra.b           _L22_6x                  4669         bra.b           _L22_6x
4670 _L22_4x:                                         4670 _L22_4x:
4671         cmpi.b          %d1,&QNAN                4671         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4672         bne.b           _L22_5x                  4672         bne.b           _L22_5x                 # no
4673         bsr.l           sop_sqnan                4673         bsr.l           sop_sqnan                       # yes
4674         bra.b           _L22_6x                  4674         bra.b           _L22_6x
4675 _L22_5x:                                         4675 _L22_5x:
4676         bsr.l           smod_sdnrm               4676         bsr.l           smod_sdnrm                      # operand is a DENORM
4677 _L22_6x:                                         4677 _L22_6x:
4678                                                  4678 
4679 #                                                4679 #
4680 #       Result is now in FP0                     4680 #       Result is now in FP0
4681 #                                                4681 #
4682         movm.l          EXC_DREGS(%a6),&0x030    4682         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4683         fmovm.l         USER_FPCR(%a6),%fpcr,    4683         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4684         fmovm.x         EXC_FP1(%a6),&0x40       4684         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4685         unlk            %a6                      4685         unlk            %a6
4686         rts                                      4686         rts
4687                                                  4687 
4688                                                  4688 
4689 #############################################    4689 #########################################################################
4690 # DYADIC TEMPLATE                                4690 # DYADIC TEMPLATE                                                       #
4691 #############################################    4691 #########################################################################
4692         global          _fscales_                4692         global          _fscales_
4693 _fscales_:                                       4693 _fscales_:
4694         link            %a6,&-LOCAL_SIZE         4694         link            %a6,&-LOCAL_SIZE
4695                                                  4695 
4696         movm.l          &0x0303,EXC_DREGS(%a6    4696         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4697         fmovm.l         %fpcr,%fpsr,USER_FPCR    4697         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4698         fmovm.x         &0xc0,EXC_FP0(%a6)       4698         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4699                                                  4699 
4700         fmov.l          &0x0,%fpcr               4700         fmov.l          &0x0,%fpcr              # zero FPCR
4701                                                  4701 
4702 #                                                4702 #
4703 #       copy, convert, and tag input argument    4703 #       copy, convert, and tag input argument
4704 #                                                4704 #
4705         fmov.s          0x8(%a6),%fp0            4705         fmov.s          0x8(%a6),%fp0           # load sgl dst
4706         fmov.x          %fp0,FP_DST(%a6)         4706         fmov.x          %fp0,FP_DST(%a6)
4707         lea             FP_DST(%a6),%a0          4707         lea             FP_DST(%a6),%a0
4708         bsr.l           tag                      4708         bsr.l           tag                     # fetch operand type
4709         mov.b           %d0,DTAG(%a6)            4709         mov.b           %d0,DTAG(%a6)
4710                                                  4710 
4711         fmov.s          0xc(%a6),%fp0            4711         fmov.s          0xc(%a6),%fp0           # load sgl src
4712         fmov.x          %fp0,FP_SRC(%a6)         4712         fmov.x          %fp0,FP_SRC(%a6)
4713         lea             FP_SRC(%a6),%a0          4713         lea             FP_SRC(%a6),%a0
4714         bsr.l           tag                      4714         bsr.l           tag                     # fetch operand type
4715         mov.b           %d0,STAG(%a6)            4715         mov.b           %d0,STAG(%a6)
4716         mov.l           %d0,%d1                  4716         mov.l           %d0,%d1
4717                                                  4717 
4718         andi.l          &0x00ff00ff,USER_FPSR    4718         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4719                                                  4719 
4720         clr.l           %d0                      4720         clr.l           %d0
4721         mov.b           FPCR_MODE(%a6),%d0       4721         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4722                                                  4722 
4723         lea             FP_SRC(%a6),%a0          4723         lea             FP_SRC(%a6),%a0         # pass ptr to src
4724         lea             FP_DST(%a6),%a1          4724         lea             FP_DST(%a6),%a1         # pass ptr to dst
4725                                                  4725 
4726         tst.b           %d1                      4726         tst.b           %d1
4727         bne.b           _L23_2s                  4727         bne.b           _L23_2s
4728         bsr.l           sscale_snorm             4728         bsr.l           sscale_snorm                    # operand is a NORM
4729         bra.b           _L23_6s                  4729         bra.b           _L23_6s
4730 _L23_2s:                                         4730 _L23_2s:
4731         cmpi.b          %d1,&ZERO                4731         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4732         bne.b           _L23_3s                  4732         bne.b           _L23_3s                 # no
4733         bsr.l           sscale_szero             4733         bsr.l           sscale_szero                    # yes
4734         bra.b           _L23_6s                  4734         bra.b           _L23_6s
4735 _L23_3s:                                         4735 _L23_3s:
4736         cmpi.b          %d1,&INF                 4736         cmpi.b          %d1,&INF                # is operand an INF?
4737         bne.b           _L23_4s                  4737         bne.b           _L23_4s                 # no
4738         bsr.l           sscale_sinf              4738         bsr.l           sscale_sinf                     # yes
4739         bra.b           _L23_6s                  4739         bra.b           _L23_6s
4740 _L23_4s:                                         4740 _L23_4s:
4741         cmpi.b          %d1,&QNAN                4741         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4742         bne.b           _L23_5s                  4742         bne.b           _L23_5s                 # no
4743         bsr.l           sop_sqnan                4743         bsr.l           sop_sqnan                       # yes
4744         bra.b           _L23_6s                  4744         bra.b           _L23_6s
4745 _L23_5s:                                         4745 _L23_5s:
4746         bsr.l           sscale_sdnrm             4746         bsr.l           sscale_sdnrm                    # operand is a DENORM
4747 _L23_6s:                                         4747 _L23_6s:
4748                                                  4748 
4749 #                                                4749 #
4750 #       Result is now in FP0                     4750 #       Result is now in FP0
4751 #                                                4751 #
4752         movm.l          EXC_DREGS(%a6),&0x030    4752         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4753         fmovm.l         USER_FPCR(%a6),%fpcr,    4753         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4754         fmovm.x         EXC_FP1(%a6),&0x40       4754         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4755         unlk            %a6                      4755         unlk            %a6
4756         rts                                      4756         rts
4757                                                  4757 
4758         global          _fscaled_                4758         global          _fscaled_
4759 _fscaled_:                                       4759 _fscaled_:
4760         link            %a6,&-LOCAL_SIZE         4760         link            %a6,&-LOCAL_SIZE
4761                                                  4761 
4762         movm.l          &0x0303,EXC_DREGS(%a6    4762         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4763         fmovm.l         %fpcr,%fpsr,USER_FPCR    4763         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4764         fmovm.x         &0xc0,EXC_FP0(%a6)       4764         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4765                                                  4765 
4766         fmov.l          &0x0,%fpcr               4766         fmov.l          &0x0,%fpcr              # zero FPCR
4767                                                  4767 
4768 #                                                4768 #
4769 #       copy, convert, and tag input argument    4769 #       copy, convert, and tag input argument
4770 #                                                4770 #
4771         fmov.d          0x8(%a6),%fp0            4771         fmov.d          0x8(%a6),%fp0           # load dbl dst
4772         fmov.x          %fp0,FP_DST(%a6)         4772         fmov.x          %fp0,FP_DST(%a6)
4773         lea             FP_DST(%a6),%a0          4773         lea             FP_DST(%a6),%a0
4774         bsr.l           tag                      4774         bsr.l           tag                     # fetch operand type
4775         mov.b           %d0,DTAG(%a6)            4775         mov.b           %d0,DTAG(%a6)
4776                                                  4776 
4777         fmov.d          0x10(%a6),%fp0           4777         fmov.d          0x10(%a6),%fp0          # load dbl src
4778         fmov.x          %fp0,FP_SRC(%a6)         4778         fmov.x          %fp0,FP_SRC(%a6)
4779         lea             FP_SRC(%a6),%a0          4779         lea             FP_SRC(%a6),%a0
4780         bsr.l           tag                      4780         bsr.l           tag                     # fetch operand type
4781         mov.b           %d0,STAG(%a6)            4781         mov.b           %d0,STAG(%a6)
4782         mov.l           %d0,%d1                  4782         mov.l           %d0,%d1
4783                                                  4783 
4784         andi.l          &0x00ff00ff,USER_FPSR    4784         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4785                                                  4785 
4786         clr.l           %d0                      4786         clr.l           %d0
4787         mov.b           FPCR_MODE(%a6),%d0       4787         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4788                                                  4788 
4789         lea             FP_SRC(%a6),%a0          4789         lea             FP_SRC(%a6),%a0         # pass ptr to src
4790         lea             FP_DST(%a6),%a1          4790         lea             FP_DST(%a6),%a1         # pass ptr to dst
4791                                                  4791 
4792         tst.b           %d1                      4792         tst.b           %d1
4793         bne.b           _L23_2d                  4793         bne.b           _L23_2d
4794         bsr.l           sscale_snorm             4794         bsr.l           sscale_snorm                    # operand is a NORM
4795         bra.b           _L23_6d                  4795         bra.b           _L23_6d
4796 _L23_2d:                                         4796 _L23_2d:
4797         cmpi.b          %d1,&ZERO                4797         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4798         bne.b           _L23_3d                  4798         bne.b           _L23_3d                 # no
4799         bsr.l           sscale_szero             4799         bsr.l           sscale_szero                    # yes
4800         bra.b           _L23_6d                  4800         bra.b           _L23_6d
4801 _L23_3d:                                         4801 _L23_3d:
4802         cmpi.b          %d1,&INF                 4802         cmpi.b          %d1,&INF                # is operand an INF?
4803         bne.b           _L23_4d                  4803         bne.b           _L23_4d                 # no
4804         bsr.l           sscale_sinf              4804         bsr.l           sscale_sinf                     # yes
4805         bra.b           _L23_6d                  4805         bra.b           _L23_6d
4806 _L23_4d:                                         4806 _L23_4d:
4807         cmpi.b          %d1,&QNAN                4807         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4808         bne.b           _L23_5d                  4808         bne.b           _L23_5d                 # no
4809         bsr.l           sop_sqnan                4809         bsr.l           sop_sqnan                       # yes
4810         bra.b           _L23_6d                  4810         bra.b           _L23_6d
4811 _L23_5d:                                         4811 _L23_5d:
4812         bsr.l           sscale_sdnrm             4812         bsr.l           sscale_sdnrm                    # operand is a DENORM
4813 _L23_6d:                                         4813 _L23_6d:
4814                                                  4814 
4815 #                                                4815 #
4816 #       Result is now in FP0                     4816 #       Result is now in FP0
4817 #                                                4817 #
4818         movm.l          EXC_DREGS(%a6),&0x030    4818         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4819         fmovm.l         USER_FPCR(%a6),%fpcr,    4819         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4820         fmovm.x         EXC_FP1(%a6),&0x40       4820         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4821         unlk            %a6                      4821         unlk            %a6
4822         rts                                      4822         rts
4823                                                  4823 
4824         global          _fscalex_                4824         global          _fscalex_
4825 _fscalex_:                                       4825 _fscalex_:
4826         link            %a6,&-LOCAL_SIZE         4826         link            %a6,&-LOCAL_SIZE
4827                                                  4827 
4828         movm.l          &0x0303,EXC_DREGS(%a6    4828         movm.l          &0x0303,EXC_DREGS(%a6)  # save d0-d1/a0-a1
4829         fmovm.l         %fpcr,%fpsr,USER_FPCR    4829         fmovm.l         %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4830         fmovm.x         &0xc0,EXC_FP0(%a6)       4830         fmovm.x         &0xc0,EXC_FP0(%a6)      # save fp0/fp1
4831                                                  4831 
4832         fmov.l          &0x0,%fpcr               4832         fmov.l          &0x0,%fpcr              # zero FPCR
4833                                                  4833 
4834 #                                                4834 #
4835 #       copy, convert, and tag input argument    4835 #       copy, convert, and tag input argument
4836 #                                                4836 #
4837         lea             FP_DST(%a6),%a0          4837         lea             FP_DST(%a6),%a0
4838         mov.l           0x8+0x0(%a6),0x0(%a0)    4838         mov.l           0x8+0x0(%a6),0x0(%a0)   # load ext dst
4839         mov.l           0x8+0x4(%a6),0x4(%a0)    4839         mov.l           0x8+0x4(%a6),0x4(%a0)
4840         mov.l           0x8+0x8(%a6),0x8(%a0)    4840         mov.l           0x8+0x8(%a6),0x8(%a0)
4841         bsr.l           tag                      4841         bsr.l           tag                     # fetch operand type
4842         mov.b           %d0,DTAG(%a6)            4842         mov.b           %d0,DTAG(%a6)
4843                                                  4843 
4844         lea             FP_SRC(%a6),%a0          4844         lea             FP_SRC(%a6),%a0
4845         mov.l           0x14+0x0(%a6),0x0(%a0    4845         mov.l           0x14+0x0(%a6),0x0(%a0)  # load ext src
4846         mov.l           0x14+0x4(%a6),0x4(%a0    4846         mov.l           0x14+0x4(%a6),0x4(%a0)
4847         mov.l           0x14+0x8(%a6),0x8(%a0    4847         mov.l           0x14+0x8(%a6),0x8(%a0)
4848         bsr.l           tag                      4848         bsr.l           tag                     # fetch operand type
4849         mov.b           %d0,STAG(%a6)            4849         mov.b           %d0,STAG(%a6)
4850         mov.l           %d0,%d1                  4850         mov.l           %d0,%d1
4851                                                  4851 
4852         andi.l          &0x00ff00ff,USER_FPSR    4852         andi.l          &0x00ff00ff,USER_FPSR(%a6)
4853                                                  4853 
4854         clr.l           %d0                      4854         clr.l           %d0
4855         mov.b           FPCR_MODE(%a6),%d0       4855         mov.b           FPCR_MODE(%a6),%d0      # pass rnd mode,prec
4856                                                  4856 
4857         lea             FP_SRC(%a6),%a0          4857         lea             FP_SRC(%a6),%a0         # pass ptr to src
4858         lea             FP_DST(%a6),%a1          4858         lea             FP_DST(%a6),%a1         # pass ptr to dst
4859                                                  4859 
4860         tst.b           %d1                      4860         tst.b           %d1
4861         bne.b           _L23_2x                  4861         bne.b           _L23_2x
4862         bsr.l           sscale_snorm             4862         bsr.l           sscale_snorm                    # operand is a NORM
4863         bra.b           _L23_6x                  4863         bra.b           _L23_6x
4864 _L23_2x:                                         4864 _L23_2x:
4865         cmpi.b          %d1,&ZERO                4865         cmpi.b          %d1,&ZERO               # is operand a ZERO?
4866         bne.b           _L23_3x                  4866         bne.b           _L23_3x                 # no
4867         bsr.l           sscale_szero             4867         bsr.l           sscale_szero                    # yes
4868         bra.b           _L23_6x                  4868         bra.b           _L23_6x
4869 _L23_3x:                                         4869 _L23_3x:
4870         cmpi.b          %d1,&INF                 4870         cmpi.b          %d1,&INF                # is operand an INF?
4871         bne.b           _L23_4x                  4871         bne.b           _L23_4x                 # no
4872         bsr.l           sscale_sinf              4872         bsr.l           sscale_sinf                     # yes
4873         bra.b           _L23_6x                  4873         bra.b           _L23_6x
4874 _L23_4x:                                         4874 _L23_4x:
4875         cmpi.b          %d1,&QNAN                4875         cmpi.b          %d1,&QNAN               # is operand a QNAN?
4876         bne.b           _L23_5x                  4876         bne.b           _L23_5x                 # no
4877         bsr.l           sop_sqnan                4877         bsr.l           sop_sqnan                       # yes
4878         bra.b           _L23_6x                  4878         bra.b           _L23_6x
4879 _L23_5x:                                         4879 _L23_5x:
4880         bsr.l           sscale_sdnrm             4880         bsr.l           sscale_sdnrm                    # operand is a DENORM
4881 _L23_6x:                                         4881 _L23_6x:
4882                                                  4882 
4883 #                                                4883 #
4884 #       Result is now in FP0                     4884 #       Result is now in FP0
4885 #                                                4885 #
4886         movm.l          EXC_DREGS(%a6),&0x030    4886         movm.l          EXC_DREGS(%a6),&0x0303  # restore d0-d1/a0-a1
4887         fmovm.l         USER_FPCR(%a6),%fpcr,    4887         fmovm.l         USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4888         fmovm.x         EXC_FP1(%a6),&0x40       4888         fmovm.x         EXC_FP1(%a6),&0x40      # restore fp1
4889         unlk            %a6                      4889         unlk            %a6
4890         rts                                      4890         rts
4891                                                  4891 
4892                                                  4892 
4893 #############################################    4893 #########################################################################
4894 # ssin():     computes the sine of a normaliz    4894 # ssin():     computes the sine of a normalized input                   #
4895 # ssind():    computes the sine of a denormal    4895 # ssind():    computes the sine of a denormalized input                 #
4896 # scos():     computes the cosine of a normal    4896 # scos():     computes the cosine of a normalized input                 #
4897 # scosd():    computes the cosine of a denorm    4897 # scosd():    computes the cosine of a denormalized input               #
4898 # ssincos():  computes the sine and cosine of    4898 # ssincos():  computes the sine and cosine of a normalized input        #
4899 # ssincosd(): computes the sine and cosine of    4899 # ssincosd(): computes the sine and cosine of a denormalized input      #
4900 #                                                4900 #                                                                       #
4901 # INPUT *************************************    4901 # INPUT *************************************************************** #
4902 #       a0 = pointer to extended precision in    4902 #       a0 = pointer to extended precision input                        #
4903 #       d0 = round precision,mode                4903 #       d0 = round precision,mode                                       #
4904 #                                                4904 #                                                                       #
4905 # OUTPUT ************************************    4905 # OUTPUT ************************************************************** #
4906 #       fp0 = sin(X) or cos(X)                   4906 #       fp0 = sin(X) or cos(X)                                          #
4907 #                                                4907 #                                                                       #
4908 #    For ssincos(X):                             4908 #    For ssincos(X):                                                    #
4909 #       fp0 = sin(X)                             4909 #       fp0 = sin(X)                                                    #
4910 #       fp1 = cos(X)                             4910 #       fp1 = cos(X)                                                    #
4911 #                                                4911 #                                                                       #
4912 # ACCURACY and MONOTONICITY *****************    4912 # ACCURACY and MONOTONICITY ******************************************* #
4913 #       The returned result is within 1 ulp i    4913 #       The returned result is within 1 ulp in 64 significant bit, i.e. #
4914 #       within 0.5001 ulp to 53 bits if the r    4914 #       within 0.5001 ulp to 53 bits if the result is subsequently      #
4915 #       rounded to double precision. The resu    4915 #       rounded to double precision. The result is provably monotonic   #
4916 #       in double precision.                     4916 #       in double precision.                                            #
4917 #                                                4917 #                                                                       #
4918 # ALGORITHM *********************************    4918 # ALGORITHM *********************************************************** #
4919 #                                                4919 #                                                                       #
4920 #       SIN and COS:                             4920 #       SIN and COS:                                                    #
4921 #       1. If SIN is invoked, set AdjN := 0;     4921 #       1. If SIN is invoked, set AdjN := 0; otherwise, set AdjN := 1.  #
4922 #                                                4922 #                                                                       #
4923 #       2. If |X| >= 15Pi or |X| < 2**(-40),     4923 #       2. If |X| >= 15Pi or |X| < 2**(-40), go to 7.                   #
4924 #                                                4924 #                                                                       #
4925 #       3. Decompose X as X = N(Pi/2) + r whe    4925 #       3. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let        #
4926 #               k = N mod 4, so in particular    4926 #               k = N mod 4, so in particular, k = 0,1,2,or 3.          #
4927 #               Overwrite k by k := k + AdjN.    4927 #               Overwrite k by k := k + AdjN.                           #
4928 #                                                4928 #                                                                       #
4929 #       4. If k is even, go to 6.                4929 #       4. If k is even, go to 6.                                       #
4930 #                                                4930 #                                                                       #
4931 #       5. (k is odd) Set j := (k-1)/2, sgn :    4931 #       5. (k is odd) Set j := (k-1)/2, sgn := (-1)**j.                 #
4932 #               Return sgn*cos(r) where cos(r    4932 #               Return sgn*cos(r) where cos(r) is approximated by an    #
4933 #               even polynomial in r, 1 + r*r    4933 #               even polynomial in r, 1 + r*r*(B1+s*(B2+ ... + s*B8)),  #
4934 #               s = r*r.                         4934 #               s = r*r.                                                #
4935 #               Exit.                            4935 #               Exit.                                                   #
4936 #                                                4936 #                                                                       #
4937 #       6. (k is even) Set j := k/2, sgn := (    4937 #       6. (k is even) Set j := k/2, sgn := (-1)**j. Return sgn*sin(r)  #
4938 #               where sin(r) is approximated     4938 #               where sin(r) is approximated by an odd polynomial in r  #
4939 #               r + r*s*(A1+s*(A2+ ... + s*A7    4939 #               r + r*s*(A1+s*(A2+ ... + s*A7)),        s = r*r.        #
4940 #               Exit.                            4940 #               Exit.                                                   #
4941 #                                                4941 #                                                                       #
4942 #       7. If |X| > 1, go to 9.                  4942 #       7. If |X| > 1, go to 9.                                         #
4943 #                                                4943 #                                                                       #
4944 #       8. (|X|<2**(-40)) If SIN is invoked,     4944 #       8. (|X|<2**(-40)) If SIN is invoked, return X;                  #
4945 #               otherwise return 1.              4945 #               otherwise return 1.                                     #
4946 #                                                4946 #                                                                       #
4947 #       9. Overwrite X by X := X rem 2Pi. Now    4947 #       9. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi,           #
4948 #               go back to 3.                    4948 #               go back to 3.                                           #
4949 #                                                4949 #                                                                       #
4950 #       SINCOS:                                  4950 #       SINCOS:                                                         #
4951 #       1. If |X| >= 15Pi or |X| < 2**(-40),     4951 #       1. If |X| >= 15Pi or |X| < 2**(-40), go to 6.                   #
4952 #                                                4952 #                                                                       #
4953 #       2. Decompose X as X = N(Pi/2) + r whe    4953 #       2. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let        #
4954 #               k = N mod 4, so in particular    4954 #               k = N mod 4, so in particular, k = 0,1,2,or 3.          #
4955 #                                                4955 #                                                                       #
4956 #       3. If k is even, go to 5.                4956 #       3. If k is even, go to 5.                                       #
4957 #                                                4957 #                                                                       #
4958 #       4. (k is odd) Set j1 := (k-1)/2, j2 :    4958 #       4. (k is odd) Set j1 := (k-1)/2, j2 := j1 (EOR) (k mod 2), ie.  #
4959 #               j1 exclusive or with the l.s.    4959 #               j1 exclusive or with the l.s.b. of k.                   #
4960 #               sgn1 := (-1)**j1, sgn2 := (-1    4960 #               sgn1 := (-1)**j1, sgn2 := (-1)**j2.                     #
4961 #               SIN(X) = sgn1 * cos(r) and CO    4961 #               SIN(X) = sgn1 * cos(r) and COS(X) = sgn2*sin(r) where   #
4962 #               sin(r) and cos(r) are compute    4962 #               sin(r) and cos(r) are computed as odd and even          #
4963 #               polynomials in r, respectivel    4963 #               polynomials in r, respectively. Exit                    #
4964 #                                                4964 #                                                                       #
4965 #       5. (k is even) Set j1 := k/2, sgn1 :=    4965 #       5. (k is even) Set j1 := k/2, sgn1 := (-1)**j1.                 #
4966 #               SIN(X) = sgn1 * sin(r) and CO    4966 #               SIN(X) = sgn1 * sin(r) and COS(X) = sgn1*cos(r) where   #
4967 #               sin(r) and cos(r) are compute    4967 #               sin(r) and cos(r) are computed as odd and even          #
4968 #               polynomials in r, respectivel    4968 #               polynomials in r, respectively. Exit                    #
4969 #                                                4969 #                                                                       #
4970 #       6. If |X| > 1, go to 8.                  4970 #       6. If |X| > 1, go to 8.                                         #
4971 #                                                4971 #                                                                       #
4972 #       7. (|X|<2**(-40)) SIN(X) = X and COS(    4972 #       7. (|X|<2**(-40)) SIN(X) = X and COS(X) = 1. Exit.              #
4973 #                                                4973 #                                                                       #
4974 #       8. Overwrite X by X := X rem 2Pi. Now    4974 #       8. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi,           #
4975 #               go back to 2.                    4975 #               go back to 2.                                           #
4976 #                                                4976 #                                                                       #
4977 #############################################    4977 #########################################################################
4978                                                  4978 
4979 SINA7:  long            0xBD6AAA77,0xCCC994F5    4979 SINA7:  long            0xBD6AAA77,0xCCC994F5
4980 SINA6:  long            0x3DE61209,0x7AAE8DA1    4980 SINA6:  long            0x3DE61209,0x7AAE8DA1
4981 SINA5:  long            0xBE5AE645,0x2A118AE4    4981 SINA5:  long            0xBE5AE645,0x2A118AE4
4982 SINA4:  long            0x3EC71DE3,0xA5341531    4982 SINA4:  long            0x3EC71DE3,0xA5341531
4983 SINA3:  long            0xBF2A01A0,0x1A018B59    4983 SINA3:  long            0xBF2A01A0,0x1A018B59,0x00000000,0x00000000
4984 SINA2:  long            0x3FF80000,0x88888888    4984 SINA2:  long            0x3FF80000,0x88888888,0x888859AF,0x00000000
4985 SINA1:  long            0xBFFC0000,0xAAAAAAAA    4985 SINA1:  long            0xBFFC0000,0xAAAAAAAA,0xAAAAAA99,0x00000000
4986                                                  4986 
4987 COSB8:  long            0x3D2AC4D0,0xD6011EE3    4987 COSB8:  long            0x3D2AC4D0,0xD6011EE3
4988 COSB7:  long            0xBDA9396F,0x9F45AC19    4988 COSB7:  long            0xBDA9396F,0x9F45AC19
4989 COSB6:  long            0x3E21EED9,0x0612C972    4989 COSB6:  long            0x3E21EED9,0x0612C972
4990 COSB5:  long            0xBE927E4F,0xB79D9FCF    4990 COSB5:  long            0xBE927E4F,0xB79D9FCF
4991 COSB4:  long            0x3EFA01A0,0x1A01D423    4991 COSB4:  long            0x3EFA01A0,0x1A01D423,0x00000000,0x00000000
4992 COSB3:  long            0xBFF50000,0xB60B60B6    4992 COSB3:  long            0xBFF50000,0xB60B60B6,0x0B61D438,0x00000000
4993 COSB2:  long            0x3FFA0000,0xAAAAAAAA    4993 COSB2:  long            0x3FFA0000,0xAAAAAAAA,0xAAAAAB5E
4994 COSB1:  long            0xBF000000               4994 COSB1:  long            0xBF000000
4995                                                  4995 
4996         set             INARG,FP_SCR0            4996         set             INARG,FP_SCR0
4997                                                  4997 
4998         set             X,FP_SCR0                4998         set             X,FP_SCR0
4999 #       set             XDCARE,X+2               4999 #       set             XDCARE,X+2
5000         set             XFRAC,X+4                5000         set             XFRAC,X+4
5001                                                  5001 
5002         set             RPRIME,FP_SCR0           5002         set             RPRIME,FP_SCR0
5003         set             SPRIME,FP_SCR1           5003         set             SPRIME,FP_SCR1
5004                                                  5004 
5005         set             POSNEG1,L_SCR1           5005         set             POSNEG1,L_SCR1
5006         set             TWOTO63,L_SCR1           5006         set             TWOTO63,L_SCR1
5007                                                  5007 
5008         set             ENDFLAG,L_SCR2           5008         set             ENDFLAG,L_SCR2
5009         set             INT,L_SCR2               5009         set             INT,L_SCR2
5010                                                  5010 
5011         set             ADJN,L_SCR3              5011         set             ADJN,L_SCR3
5012                                                  5012 
5013 ############################################     5013 ############################################
5014         global          ssin                     5014         global          ssin
5015 ssin:                                            5015 ssin:
5016         mov.l           &0,ADJN(%a6)             5016         mov.l           &0,ADJN(%a6)            # yes; SET ADJN TO 0
5017         bra.b           SINBGN                   5017         bra.b           SINBGN
5018                                                  5018 
5019 ############################################     5019 ############################################
5020         global          scos                     5020         global          scos
5021 scos:                                            5021 scos:
5022         mov.l           &1,ADJN(%a6)             5022         mov.l           &1,ADJN(%a6)            # yes; SET ADJN TO 1
5023                                                  5023 
5024 ############################################     5024 ############################################
5025 SINBGN:                                          5025 SINBGN:
5026 #--SAVE FPCR, FP1. CHECK IF |X| IS TOO SMALL     5026 #--SAVE FPCR, FP1. CHECK IF |X| IS TOO SMALL OR LARGE
5027                                                  5027 
5028         fmov.x          (%a0),%fp0               5028         fmov.x          (%a0),%fp0              # LOAD INPUT
5029         fmov.x          %fp0,X(%a6)              5029         fmov.x          %fp0,X(%a6)             # save input at X
5030                                                  5030 
5031 # "COMPACTIFY" X                                 5031 # "COMPACTIFY" X
5032         mov.l           (%a0),%d1                5032         mov.l           (%a0),%d1               # put exp in hi word
5033         mov.w           4(%a0),%d1               5033         mov.w           4(%a0),%d1              # fetch hi(man)
5034         and.l           &0x7FFFFFFF,%d1          5034         and.l           &0x7FFFFFFF,%d1         # strip sign
5035                                                  5035 
5036         cmpi.l          %d1,&0x3FD78000          5036         cmpi.l          %d1,&0x3FD78000         # is |X| >= 2**(-40)?
5037         bge.b           SOK1                     5037         bge.b           SOK1                    # no
5038         bra.w           SINSM                    5038         bra.w           SINSM                   # yes; input is very small
5039                                                  5039 
5040 SOK1:                                            5040 SOK1:
5041         cmp.l           %d1,&0x4004BC7E          5041         cmp.l           %d1,&0x4004BC7E         # is |X| < 15 PI?
5042         blt.b           SINMAIN                  5042         blt.b           SINMAIN                 # no
5043         bra.w           SREDUCEX                 5043         bra.w           SREDUCEX                # yes; input is very large
5044                                                  5044 
5045 #--THIS IS THE USUAL CASE, |X| <= 15 PI.         5045 #--THIS IS THE USUAL CASE, |X| <= 15 PI.
5046 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LO    5046 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
5047 SINMAIN:                                         5047 SINMAIN:
5048         fmov.x          %fp0,%fp1                5048         fmov.x          %fp0,%fp1
5049         fmul.d          TWOBYPI(%pc),%fp1        5049         fmul.d          TWOBYPI(%pc),%fp1       # X*2/PI
5050                                                  5050 
5051         lea             PITBL+0x200(%pc),%a1     5051         lea             PITBL+0x200(%pc),%a1    # TABLE OF N*PI/2, N = -32,...,32
5052                                                  5052 
5053         fmov.l          %fp1,INT(%a6)            5053         fmov.l          %fp1,INT(%a6)           # CONVERT TO INTEGER
5054                                                  5054 
5055         mov.l           INT(%a6),%d1             5055         mov.l           INT(%a6),%d1            # make a copy of N
5056         asl.l           &4,%d1                   5056         asl.l           &4,%d1                  # N *= 16
5057         add.l           %d1,%a1                  5057         add.l           %d1,%a1                 # tbl_addr = a1 + (N*16)
5058                                                  5058 
5059 # A1 IS THE ADDRESS OF N*PIBY2                   5059 # A1 IS THE ADDRESS OF N*PIBY2
5060 # ...WHICH IS IN TWO PIECES Y1 & Y2              5060 # ...WHICH IS IN TWO PIECES Y1 & Y2
5061         fsub.x          (%a1)+,%fp0              5061         fsub.x          (%a1)+,%fp0             # X-Y1
5062         fsub.s          (%a1),%fp0               5062         fsub.s          (%a1),%fp0              # fp0 = R = (X-Y1)-Y2
5063                                                  5063 
5064 SINCONT:                                         5064 SINCONT:
5065 #--continuation from REDUCEX                     5065 #--continuation from REDUCEX
5066                                                  5066 
5067 #--GET N+ADJN AND SEE IF SIN(R) OR COS(R) IS     5067 #--GET N+ADJN AND SEE IF SIN(R) OR COS(R) IS NEEDED
5068         mov.l           INT(%a6),%d1             5068         mov.l           INT(%a6),%d1
5069         add.l           ADJN(%a6),%d1            5069         add.l           ADJN(%a6),%d1           # SEE IF D0 IS ODD OR EVEN
5070         ror.l           &1,%d1                   5070         ror.l           &1,%d1                  # D0 WAS ODD IFF D0 IS NEGATIVE
5071         cmp.l           %d1,&0                   5071         cmp.l           %d1,&0
5072         blt.w           COSPOLY                  5072         blt.w           COSPOLY
5073                                                  5073 
5074 #--LET J BE THE LEAST SIG. BIT OF D0, LET SGN    5074 #--LET J BE THE LEAST SIG. BIT OF D0, LET SGN := (-1)**J.
5075 #--THEN WE RETURN       SGN*SIN(R). SGN*SIN(R    5075 #--THEN WE RETURN       SGN*SIN(R). SGN*SIN(R) IS COMPUTED BY
5076 #--R' + R'*S*(A1 + S(A2 + S(A3 + S(A4 + ... +    5076 #--R' + R'*S*(A1 + S(A2 + S(A3 + S(A4 + ... + SA7)))), WHERE
5077 #--R' = SGN*R, S=R*R. THIS CAN BE REWRITTEN A    5077 #--R' = SGN*R, S=R*R. THIS CAN BE REWRITTEN AS
5078 #--R' + R'*S*( [A1+T(A3+T(A5+TA7))] + [S(A2+T    5078 #--R' + R'*S*( [A1+T(A3+T(A5+TA7))] + [S(A2+T(A4+TA6))])
5079 #--WHERE T=S*S.                                  5079 #--WHERE T=S*S.
5080 #--NOTE THAT A3 THROUGH A7 ARE STORED IN DOUB    5080 #--NOTE THAT A3 THROUGH A7 ARE STORED IN DOUBLE PRECISION
5081 #--WHILE A1 AND A2 ARE IN DOUBLE-EXTENDED FOR    5081 #--WHILE A1 AND A2 ARE IN DOUBLE-EXTENDED FORMAT.
5082 SINPOLY:                                         5082 SINPOLY:
5083         fmovm.x         &0x0c,-(%sp)             5083         fmovm.x         &0x0c,-(%sp)            # save fp2/fp3
5084                                                  5084 
5085         fmov.x          %fp0,X(%a6)              5085         fmov.x          %fp0,X(%a6)             # X IS R
5086         fmul.x          %fp0,%fp0                5086         fmul.x          %fp0,%fp0               # FP0 IS S
5087                                                  5087 
5088         fmov.d          SINA7(%pc),%fp3          5088         fmov.d          SINA7(%pc),%fp3
5089         fmov.d          SINA6(%pc),%fp2          5089         fmov.d          SINA6(%pc),%fp2
5090                                                  5090 
5091         fmov.x          %fp0,%fp1                5091         fmov.x          %fp0,%fp1
5092         fmul.x          %fp1,%fp1                5092         fmul.x          %fp1,%fp1               # FP1 IS T
5093                                                  5093 
5094         ror.l           &1,%d1                   5094         ror.l           &1,%d1
5095         and.l           &0x80000000,%d1          5095         and.l           &0x80000000,%d1
5096 # ...LEAST SIG. BIT OF D0 IN SIGN POSITION       5096 # ...LEAST SIG. BIT OF D0 IN SIGN POSITION
5097         eor.l           %d1,X(%a6)               5097         eor.l           %d1,X(%a6)              # X IS NOW R'= SGN*R
5098                                                  5098 
5099         fmul.x          %fp1,%fp3                5099         fmul.x          %fp1,%fp3               # TA7
5100         fmul.x          %fp1,%fp2                5100         fmul.x          %fp1,%fp2               # TA6
5101                                                  5101 
5102         fadd.d          SINA5(%pc),%fp3          5102         fadd.d          SINA5(%pc),%fp3         # A5+TA7
5103         fadd.d          SINA4(%pc),%fp2          5103         fadd.d          SINA4(%pc),%fp2         # A4+TA6
5104                                                  5104 
5105         fmul.x          %fp1,%fp3                5105         fmul.x          %fp1,%fp3               # T(A5+TA7)
5106         fmul.x          %fp1,%fp2                5106         fmul.x          %fp1,%fp2               # T(A4+TA6)
5107                                                  5107 
5108         fadd.d          SINA3(%pc),%fp3          5108         fadd.d          SINA3(%pc),%fp3         # A3+T(A5+TA7)
5109         fadd.x          SINA2(%pc),%fp2          5109         fadd.x          SINA2(%pc),%fp2         # A2+T(A4+TA6)
5110                                                  5110 
5111         fmul.x          %fp3,%fp1                5111         fmul.x          %fp3,%fp1               # T(A3+T(A5+TA7))
5112                                                  5112 
5113         fmul.x          %fp0,%fp2                5113         fmul.x          %fp0,%fp2               # S(A2+T(A4+TA6))
5114         fadd.x          SINA1(%pc),%fp1          5114         fadd.x          SINA1(%pc),%fp1         # A1+T(A3+T(A5+TA7))
5115         fmul.x          X(%a6),%fp0              5115         fmul.x          X(%a6),%fp0             # R'*S
5116                                                  5116 
5117         fadd.x          %fp2,%fp1                5117         fadd.x          %fp2,%fp1               # [A1+T(A3+T(A5+TA7))]+[S(A2+T(A4+TA6))]
5118                                                  5118 
5119         fmul.x          %fp1,%fp0                5119         fmul.x          %fp1,%fp0               # SIN(R')-R'
5120                                                  5120 
5121         fmovm.x         (%sp)+,&0x30             5121         fmovm.x         (%sp)+,&0x30            # restore fp2/fp3
5122                                                  5122 
5123         fmov.l          %d0,%fpcr                5123         fmov.l          %d0,%fpcr               # restore users round mode,prec
5124         fadd.x          X(%a6),%fp0              5124         fadd.x          X(%a6),%fp0             # last inst - possible exception set
5125         bra             t_inx2                   5125         bra             t_inx2
5126                                                  5126 
5127 #--LET J BE THE LEAST SIG. BIT OF D0, LET SGN    5127 #--LET J BE THE LEAST SIG. BIT OF D0, LET SGN := (-1)**J.
5128 #--THEN WE RETURN       SGN*COS(R). SGN*COS(R    5128 #--THEN WE RETURN       SGN*COS(R). SGN*COS(R) IS COMPUTED BY
5129 #--SGN + S'*(B1 + S(B2 + S(B3 + S(B4 + ... +     5129 #--SGN + S'*(B1 + S(B2 + S(B3 + S(B4 + ... + SB8)))), WHERE
5130 #--S=R*R AND S'=SGN*S. THIS CAN BE REWRITTEN     5130 #--S=R*R AND S'=SGN*S. THIS CAN BE REWRITTEN AS
5131 #--SGN + S'*([B1+T(B3+T(B5+TB7))] + [S(B2+T(B    5131 #--SGN + S'*([B1+T(B3+T(B5+TB7))] + [S(B2+T(B4+T(B6+TB8)))])
5132 #--WHERE T=S*S.                                  5132 #--WHERE T=S*S.
5133 #--NOTE THAT B4 THROUGH B8 ARE STORED IN DOUB    5133 #--NOTE THAT B4 THROUGH B8 ARE STORED IN DOUBLE PRECISION
5134 #--WHILE B2 AND B3 ARE IN DOUBLE-EXTENDED FOR    5134 #--WHILE B2 AND B3 ARE IN DOUBLE-EXTENDED FORMAT, B1 IS -1/2
5135 #--AND IS THEREFORE STORED AS SINGLE PRECISIO    5135 #--AND IS THEREFORE STORED AS SINGLE PRECISION.
5136 COSPOLY:                                         5136 COSPOLY:
5137         fmovm.x         &0x0c,-(%sp)             5137         fmovm.x         &0x0c,-(%sp)            # save fp2/fp3
5138                                                  5138 
5139         fmul.x          %fp0,%fp0                5139         fmul.x          %fp0,%fp0               # FP0 IS S
5140                                                  5140 
5141         fmov.d          COSB8(%pc),%fp2          5141         fmov.d          COSB8(%pc),%fp2
5142         fmov.d          COSB7(%pc),%fp3          5142         fmov.d          COSB7(%pc),%fp3
5143                                                  5143 
5144         fmov.x          %fp0,%fp1                5144         fmov.x          %fp0,%fp1
5145         fmul.x          %fp1,%fp1                5145         fmul.x          %fp1,%fp1               # FP1 IS T
5146                                                  5146 
5147         fmov.x          %fp0,X(%a6)              5147         fmov.x          %fp0,X(%a6)             # X IS S
5148         ror.l           &1,%d1                   5148         ror.l           &1,%d1
5149         and.l           &0x80000000,%d1          5149         and.l           &0x80000000,%d1
5150 # ...LEAST SIG. BIT OF D0 IN SIGN POSITION       5150 # ...LEAST SIG. BIT OF D0 IN SIGN POSITION
5151                                                  5151 
5152         fmul.x          %fp1,%fp2                5152         fmul.x          %fp1,%fp2               # TB8
5153                                                  5153 
5154         eor.l           %d1,X(%a6)               5154         eor.l           %d1,X(%a6)              # X IS NOW S'= SGN*S
5155         and.l           &0x80000000,%d1          5155         and.l           &0x80000000,%d1
5156                                                  5156 
5157         fmul.x          %fp1,%fp3                5157         fmul.x          %fp1,%fp3               # TB7
5158                                                  5158 
5159         or.l            &0x3F800000,%d1          5159         or.l            &0x3F800000,%d1         # D0 IS SGN IN SINGLE
5160         mov.l           %d1,POSNEG1(%a6)         5160         mov.l           %d1,POSNEG1(%a6)
5161                                                  5161 
5162         fadd.d          COSB6(%pc),%fp2          5162         fadd.d          COSB6(%pc),%fp2         # B6+TB8
5163         fadd.d          COSB5(%pc),%fp3          5163         fadd.d          COSB5(%pc),%fp3         # B5+TB7
5164                                                  5164 
5165         fmul.x          %fp1,%fp2                5165         fmul.x          %fp1,%fp2               # T(B6+TB8)
5166         fmul.x          %fp1,%fp3                5166         fmul.x          %fp1,%fp3               # T(B5+TB7)
5167                                                  5167 
5168         fadd.d          COSB4(%pc),%fp2          5168         fadd.d          COSB4(%pc),%fp2         # B4+T(B6+TB8)
5169         fadd.x          COSB3(%pc),%fp3          5169         fadd.x          COSB3(%pc),%fp3         # B3+T(B5+TB7)
5170                                                  5170 
5171         fmul.x          %fp1,%fp2                5171         fmul.x          %fp1,%fp2               # T(B4+T(B6+TB8))
5172         fmul.x          %fp3,%fp1                5172         fmul.x          %fp3,%fp1               # T(B3+T(B5+TB7))
5173                                                  5173 
5174         fadd.x          COSB2(%pc),%fp2          5174         fadd.x          COSB2(%pc),%fp2         # B2+T(B4+T(B6+TB8))
5175         fadd.s          COSB1(%pc),%fp1          5175         fadd.s          COSB1(%pc),%fp1         # B1+T(B3+T(B5+TB7))
5176                                                  5176 
5177         fmul.x          %fp2,%fp0                5177         fmul.x          %fp2,%fp0               # S(B2+T(B4+T(B6+TB8)))
5178                                                  5178 
5179         fadd.x          %fp1,%fp0                5179         fadd.x          %fp1,%fp0
5180                                                  5180 
5181         fmul.x          X(%a6),%fp0              5181         fmul.x          X(%a6),%fp0
5182                                                  5182 
5183         fmovm.x         (%sp)+,&0x30             5183         fmovm.x         (%sp)+,&0x30            # restore fp2/fp3
5184                                                  5184 
5185         fmov.l          %d0,%fpcr                5185         fmov.l          %d0,%fpcr               # restore users round mode,prec
5186         fadd.s          POSNEG1(%a6),%fp0        5186         fadd.s          POSNEG1(%a6),%fp0       # last inst - possible exception set
5187         bra             t_inx2                   5187         bra             t_inx2
5188                                                  5188 
5189 #############################################    5189 ##############################################
5190                                                  5190 
5191 # SINe: Big OR Small?                            5191 # SINe: Big OR Small?
5192 #--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT    5192 #--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT REDUCTION.
5193 #--IF |X| < 2**(-40), RETURN X OR 1.             5193 #--IF |X| < 2**(-40), RETURN X OR 1.
5194 SINBORS:                                         5194 SINBORS:
5195         cmp.l           %d1,&0x3FFF8000          5195         cmp.l           %d1,&0x3FFF8000
5196         bgt.l           SREDUCEX                 5196         bgt.l           SREDUCEX
5197                                                  5197 
5198 SINSM:                                           5198 SINSM:
5199         mov.l           ADJN(%a6),%d1            5199         mov.l           ADJN(%a6),%d1
5200         cmp.l           %d1,&0                   5200         cmp.l           %d1,&0
5201         bgt.b           COSTINY                  5201         bgt.b           COSTINY
5202                                                  5202 
5203 # here, the operation may underflow iff the p    5203 # here, the operation may underflow iff the precision is sgl or dbl.
5204 # extended denorms are handled through anothe    5204 # extended denorms are handled through another entry point.
5205 SINTINY:                                         5205 SINTINY:
5206 #       mov.w           &0x0000,XDCARE(%a6)      5206 #       mov.w           &0x0000,XDCARE(%a6)     # JUST IN CASE
5207                                                  5207 
5208         fmov.l          %d0,%fpcr                5208         fmov.l          %d0,%fpcr               # restore users round mode,prec
5209         mov.b           &FMOV_OP,%d1             5209         mov.b           &FMOV_OP,%d1            # last inst is MOVE
5210         fmov.x          X(%a6),%fp0              5210         fmov.x          X(%a6),%fp0             # last inst - possible exception set
5211         bra             t_catch                  5211         bra             t_catch
5212                                                  5212 
5213 COSTINY:                                         5213 COSTINY:
5214         fmov.s          &0x3F800000,%fp0         5214         fmov.s          &0x3F800000,%fp0        # fp0 = 1.0
5215         fmov.l          %d0,%fpcr                5215         fmov.l          %d0,%fpcr               # restore users round mode,prec
5216         fadd.s          &0x80800000,%fp0         5216         fadd.s          &0x80800000,%fp0        # last inst - possible exception set
5217         bra             t_pinx2                  5217         bra             t_pinx2
5218                                                  5218 
5219 #############################################    5219 ################################################
5220         global          ssind                    5220         global          ssind
5221 #--SIN(X) = X FOR DENORMALIZED X                 5221 #--SIN(X) = X FOR DENORMALIZED X
5222 ssind:                                           5222 ssind:
5223         bra             t_extdnrm                5223         bra             t_extdnrm
5224                                                  5224 
5225 ############################################     5225 ############################################
5226         global          scosd                    5226         global          scosd
5227 #--COS(X) = 1 FOR DENORMALIZED X                 5227 #--COS(X) = 1 FOR DENORMALIZED X
5228 scosd:                                           5228 scosd:
5229         fmov.s          &0x3F800000,%fp0         5229         fmov.s          &0x3F800000,%fp0        # fp0 = 1.0
5230         bra             t_pinx2                  5230         bra             t_pinx2
5231                                                  5231 
5232 #############################################    5232 ##################################################
5233                                                  5233 
5234         global          ssincos                  5234         global          ssincos
5235 ssincos:                                         5235 ssincos:
5236 #--SET ADJN TO 4                                 5236 #--SET ADJN TO 4
5237         mov.l           &4,ADJN(%a6)             5237         mov.l           &4,ADJN(%a6)
5238                                                  5238 
5239         fmov.x          (%a0),%fp0               5239         fmov.x          (%a0),%fp0              # LOAD INPUT
5240         fmov.x          %fp0,X(%a6)              5240         fmov.x          %fp0,X(%a6)
5241                                                  5241 
5242         mov.l           (%a0),%d1                5242         mov.l           (%a0),%d1
5243         mov.w           4(%a0),%d1               5243         mov.w           4(%a0),%d1
5244         and.l           &0x7FFFFFFF,%d1          5244         and.l           &0x7FFFFFFF,%d1         # COMPACTIFY X
5245                                                  5245 
5246         cmp.l           %d1,&0x3FD78000          5246         cmp.l           %d1,&0x3FD78000         # |X| >= 2**(-40)?
5247         bge.b           SCOK1                    5247         bge.b           SCOK1
5248         bra.w           SCSM                     5248         bra.w           SCSM
5249                                                  5249 
5250 SCOK1:                                           5250 SCOK1:
5251         cmp.l           %d1,&0x4004BC7E          5251         cmp.l           %d1,&0x4004BC7E         # |X| < 15 PI?
5252         blt.b           SCMAIN                   5252         blt.b           SCMAIN
5253         bra.w           SREDUCEX                 5253         bra.w           SREDUCEX
5254                                                  5254 
5255                                                  5255 
5256 #--THIS IS THE USUAL CASE, |X| <= 15 PI.         5256 #--THIS IS THE USUAL CASE, |X| <= 15 PI.
5257 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LO    5257 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
5258 SCMAIN:                                          5258 SCMAIN:
5259         fmov.x          %fp0,%fp1                5259         fmov.x          %fp0,%fp1
5260                                                  5260 
5261         fmul.d          TWOBYPI(%pc),%fp1        5261         fmul.d          TWOBYPI(%pc),%fp1       # X*2/PI
5262                                                  5262 
5263         lea             PITBL+0x200(%pc),%a1     5263         lea             PITBL+0x200(%pc),%a1    # TABLE OF N*PI/2, N = -32,...,32
5264                                                  5264 
5265         fmov.l          %fp1,INT(%a6)            5265         fmov.l          %fp1,INT(%a6)           # CONVERT TO INTEGER
5266                                                  5266 
5267         mov.l           INT(%a6),%d1             5267         mov.l           INT(%a6),%d1
5268         asl.l           &4,%d1                   5268         asl.l           &4,%d1
5269         add.l           %d1,%a1                  5269         add.l           %d1,%a1                 # ADDRESS OF N*PIBY2, IN Y1, Y2
5270                                                  5270 
5271         fsub.x          (%a1)+,%fp0              5271         fsub.x          (%a1)+,%fp0             # X-Y1
5272         fsub.s          (%a1),%fp0               5272         fsub.s          (%a1),%fp0              # FP0 IS R = (X-Y1)-Y2
5273                                                  5273 
5274 SCCONT:                                          5274 SCCONT:
5275 #--continuation point from REDUCEX               5275 #--continuation point from REDUCEX
5276                                                  5276 
5277         mov.l           INT(%a6),%d1             5277         mov.l           INT(%a6),%d1
5278         ror.l           &1,%d1                   5278         ror.l           &1,%d1
5279         cmp.l           %d1,&0                   5279         cmp.l           %d1,&0                  # D0 < 0 IFF N IS ODD
5280         bge.w           NEVEN                    5280         bge.w           NEVEN
5281                                                  5281 
5282 SNODD:                                           5282 SNODD:
5283 #--REGISTERS SAVED SO FAR: D0, A0, FP2.          5283 #--REGISTERS SAVED SO FAR: D0, A0, FP2.
5284         fmovm.x         &0x04,-(%sp)             5284         fmovm.x         &0x04,-(%sp)            # save fp2
5285                                                  5285 
5286         fmov.x          %fp0,RPRIME(%a6)         5286         fmov.x          %fp0,RPRIME(%a6)
5287         fmul.x          %fp0,%fp0                5287         fmul.x          %fp0,%fp0               # FP0 IS S = R*R
5288         fmov.d          SINA7(%pc),%fp1          5288         fmov.d          SINA7(%pc),%fp1         # A7
5289         fmov.d          COSB8(%pc),%fp2          5289         fmov.d          COSB8(%pc),%fp2         # B8
5290         fmul.x          %fp0,%fp1                5290         fmul.x          %fp0,%fp1               # SA7
5291         fmul.x          %fp0,%fp2                5291         fmul.x          %fp0,%fp2               # SB8
5292                                                  5292 
5293         mov.l           %d2,-(%sp)               5293         mov.l           %d2,-(%sp)
5294         mov.l           %d1,%d2                  5294         mov.l           %d1,%d2
5295         ror.l           &1,%d2                   5295         ror.l           &1,%d2
5296         and.l           &0x80000000,%d2          5296         and.l           &0x80000000,%d2
5297         eor.l           %d1,%d2                  5297         eor.l           %d1,%d2
5298         and.l           &0x80000000,%d2          5298         and.l           &0x80000000,%d2
5299                                                  5299 
5300         fadd.d          SINA6(%pc),%fp1          5300         fadd.d          SINA6(%pc),%fp1         # A6+SA7
5301         fadd.d          COSB7(%pc),%fp2          5301         fadd.d          COSB7(%pc),%fp2         # B7+SB8
5302                                                  5302 
5303         fmul.x          %fp0,%fp1                5303         fmul.x          %fp0,%fp1               # S(A6+SA7)
5304         eor.l           %d2,RPRIME(%a6)          5304         eor.l           %d2,RPRIME(%a6)
5305         mov.l           (%sp)+,%d2               5305         mov.l           (%sp)+,%d2
5306         fmul.x          %fp0,%fp2                5306         fmul.x          %fp0,%fp2               # S(B7+SB8)
5307         ror.l           &1,%d1                   5307         ror.l           &1,%d1
5308         and.l           &0x80000000,%d1          5308         and.l           &0x80000000,%d1
5309         mov.l           &0x3F800000,POSNEG1(%    5309         mov.l           &0x3F800000,POSNEG1(%a6)
5310         eor.l           %d1,POSNEG1(%a6)         5310         eor.l           %d1,POSNEG1(%a6)
5311                                                  5311 
5312         fadd.d          SINA5(%pc),%fp1          5312         fadd.d          SINA5(%pc),%fp1         # A5+S(A6+SA7)
5313         fadd.d          COSB6(%pc),%fp2          5313         fadd.d          COSB6(%pc),%fp2         # B6+S(B7+SB8)
5314                                                  5314 
5315         fmul.x          %fp0,%fp1                5315         fmul.x          %fp0,%fp1               # S(A5+S(A6+SA7))
5316         fmul.x          %fp0,%fp2                5316         fmul.x          %fp0,%fp2               # S(B6+S(B7+SB8))
5317         fmov.x          %fp0,SPRIME(%a6)         5317         fmov.x          %fp0,SPRIME(%a6)
5318                                                  5318 
5319         fadd.d          SINA4(%pc),%fp1          5319         fadd.d          SINA4(%pc),%fp1         # A4+S(A5+S(A6+SA7))
5320         eor.l           %d1,SPRIME(%a6)          5320         eor.l           %d1,SPRIME(%a6)
5321         fadd.d          COSB5(%pc),%fp2          5321         fadd.d          COSB5(%pc),%fp2         # B5+S(B6+S(B7+SB8))
5322                                                  5322 
5323         fmul.x          %fp0,%fp1                5323         fmul.x          %fp0,%fp1               # S(A4+...)
5324         fmul.x          %fp0,%fp2                5324         fmul.x          %fp0,%fp2               # S(B5+...)
5325                                                  5325 
5326         fadd.d          SINA3(%pc),%fp1          5326         fadd.d          SINA3(%pc),%fp1         # A3+S(A4+...)
5327         fadd.d          COSB4(%pc),%fp2          5327         fadd.d          COSB4(%pc),%fp2         # B4+S(B5+...)
5328                                                  5328 
5329         fmul.x          %fp0,%fp1                5329         fmul.x          %fp0,%fp1               # S(A3+...)
5330         fmul.x          %fp0,%fp2                5330         fmul.x          %fp0,%fp2               # S(B4+...)
5331                                                  5331 
5332         fadd.x          SINA2(%pc),%fp1          5332         fadd.x          SINA2(%pc),%fp1         # A2+S(A3+...)
5333         fadd.x          COSB3(%pc),%fp2          5333         fadd.x          COSB3(%pc),%fp2         # B3+S(B4+...)
5334                                                  5334 
5335         fmul.x          %fp0,%fp1                5335         fmul.x          %fp0,%fp1               # S(A2+...)
5336         fmul.x          %fp0,%fp2                5336         fmul.x          %fp0,%fp2               # S(B3+...)
5337                                                  5337 
5338         fadd.x          SINA1(%pc),%fp1          5338         fadd.x          SINA1(%pc),%fp1         # A1+S(A2+...)
5339         fadd.x          COSB2(%pc),%fp2          5339         fadd.x          COSB2(%pc),%fp2         # B2+S(B3+...)
5340                                                  5340 
5341         fmul.x          %fp0,%fp1                5341         fmul.x          %fp0,%fp1               # S(A1+...)
5342         fmul.x          %fp2,%fp0                5342         fmul.x          %fp2,%fp0               # S(B2+...)
5343                                                  5343 
5344         fmul.x          RPRIME(%a6),%fp1         5344         fmul.x          RPRIME(%a6),%fp1        # R'S(A1+...)
5345         fadd.s          COSB1(%pc),%fp0          5345         fadd.s          COSB1(%pc),%fp0         # B1+S(B2...)
5346         fmul.x          SPRIME(%a6),%fp0         5346         fmul.x          SPRIME(%a6),%fp0        # S'(B1+S(B2+...))
5347                                                  5347 
5348         fmovm.x         (%sp)+,&0x20             5348         fmovm.x         (%sp)+,&0x20            # restore fp2
5349                                                  5349 
5350         fmov.l          %d0,%fpcr                5350         fmov.l          %d0,%fpcr
5351         fadd.x          RPRIME(%a6),%fp1         5351         fadd.x          RPRIME(%a6),%fp1        # COS(X)
5352         bsr             sto_cos                  5352         bsr             sto_cos                 # store cosine result
5353         fadd.s          POSNEG1(%a6),%fp0        5353         fadd.s          POSNEG1(%a6),%fp0       # SIN(X)
5354         bra             t_inx2                   5354         bra             t_inx2
5355                                                  5355 
5356 NEVEN:                                           5356 NEVEN:
5357 #--REGISTERS SAVED SO FAR: FP2.                  5357 #--REGISTERS SAVED SO FAR: FP2.
5358         fmovm.x         &0x04,-(%sp)             5358         fmovm.x         &0x04,-(%sp)            # save fp2
5359                                                  5359 
5360         fmov.x          %fp0,RPRIME(%a6)         5360         fmov.x          %fp0,RPRIME(%a6)
5361         fmul.x          %fp0,%fp0                5361         fmul.x          %fp0,%fp0               # FP0 IS S = R*R
5362                                                  5362 
5363         fmov.d          COSB8(%pc),%fp1          5363         fmov.d          COSB8(%pc),%fp1         # B8
5364         fmov.d          SINA7(%pc),%fp2          5364         fmov.d          SINA7(%pc),%fp2         # A7
5365                                                  5365 
5366         fmul.x          %fp0,%fp1                5366         fmul.x          %fp0,%fp1               # SB8
5367         fmov.x          %fp0,SPRIME(%a6)         5367         fmov.x          %fp0,SPRIME(%a6)
5368         fmul.x          %fp0,%fp2                5368         fmul.x          %fp0,%fp2               # SA7
5369                                                  5369 
5370         ror.l           &1,%d1                   5370         ror.l           &1,%d1
5371         and.l           &0x80000000,%d1          5371         and.l           &0x80000000,%d1
5372                                                  5372 
5373         fadd.d          COSB7(%pc),%fp1          5373         fadd.d          COSB7(%pc),%fp1         # B7+SB8
5374         fadd.d          SINA6(%pc),%fp2          5374         fadd.d          SINA6(%pc),%fp2         # A6+SA7
5375                                                  5375 
5376         eor.l           %d1,RPRIME(%a6)          5376         eor.l           %d1,RPRIME(%a6)
5377         eor.l           %d1,SPRIME(%a6)          5377         eor.l           %d1,SPRIME(%a6)
5378                                                  5378 
5379         fmul.x          %fp0,%fp1                5379         fmul.x          %fp0,%fp1               # S(B7+SB8)
5380                                                  5380 
5381         or.l            &0x3F800000,%d1          5381         or.l            &0x3F800000,%d1
5382         mov.l           %d1,POSNEG1(%a6)         5382         mov.l           %d1,POSNEG1(%a6)
5383                                                  5383 
5384         fmul.x          %fp0,%fp2                5384         fmul.x          %fp0,%fp2               # S(A6+SA7)
5385                                                  5385 
5386         fadd.d          COSB6(%pc),%fp1          5386         fadd.d          COSB6(%pc),%fp1         # B6+S(B7+SB8)
5387         fadd.d          SINA5(%pc),%fp2          5387         fadd.d          SINA5(%pc),%fp2         # A5+S(A6+SA7)
5388                                                  5388 
5389         fmul.x          %fp0,%fp1                5389         fmul.x          %fp0,%fp1               # S(B6+S(B7+SB8))
5390         fmul.x          %fp0,%fp2                5390         fmul.x          %fp0,%fp2               # S(A5+S(A6+SA7))
5391                                                  5391 
5392         fadd.d          COSB5(%pc),%fp1          5392         fadd.d          COSB5(%pc),%fp1         # B5+S(B6+S(B7+SB8))
5393         fadd.d          SINA4(%pc),%fp2          5393         fadd.d          SINA4(%pc),%fp2         # A4+S(A5+S(A6+SA7))
5394                                                  5394 
5395         fmul.x          %fp0,%fp1                5395         fmul.x          %fp0,%fp1               # S(B5+...)
5396         fmul.x          %fp0,%fp2                5396         fmul.x          %fp0,%fp2               # S(A4+...)
5397                                                  5397 
5398         fadd.d          COSB4(%pc),%fp1          5398         fadd.d          COSB4(%pc),%fp1         # B4+S(B5+...)
5399         fadd.d          SINA3(%pc),%fp2          5399         fadd.d          SINA3(%pc),%fp2         # A3+S(A4+...)
5400                                                  5400 
5401         fmul.x          %fp0,%fp1                5401         fmul.x          %fp0,%fp1               # S(B4+...)
5402         fmul.x          %fp0,%fp2                5402         fmul.x          %fp0,%fp2               # S(A3+...)
5403                                                  5403 
5404         fadd.x          COSB3(%pc),%fp1          5404         fadd.x          COSB3(%pc),%fp1         # B3+S(B4+...)
5405         fadd.x          SINA2(%pc),%fp2          5405         fadd.x          SINA2(%pc),%fp2         # A2+S(A3+...)
5406                                                  5406 
5407         fmul.x          %fp0,%fp1                5407         fmul.x          %fp0,%fp1               # S(B3+...)
5408         fmul.x          %fp0,%fp2                5408         fmul.x          %fp0,%fp2               # S(A2+...)
5409                                                  5409 
5410         fadd.x          COSB2(%pc),%fp1          5410         fadd.x          COSB2(%pc),%fp1         # B2+S(B3+...)
5411         fadd.x          SINA1(%pc),%fp2          5411         fadd.x          SINA1(%pc),%fp2         # A1+S(A2+...)
5412                                                  5412 
5413         fmul.x          %fp0,%fp1                5413         fmul.x          %fp0,%fp1               # S(B2+...)
5414         fmul.x          %fp2,%fp0                5414         fmul.x          %fp2,%fp0               # s(a1+...)
5415                                                  5415 
5416                                                  5416 
5417         fadd.s          COSB1(%pc),%fp1          5417         fadd.s          COSB1(%pc),%fp1         # B1+S(B2...)
5418         fmul.x          RPRIME(%a6),%fp0         5418         fmul.x          RPRIME(%a6),%fp0        # R'S(A1+...)
5419         fmul.x          SPRIME(%a6),%fp1         5419         fmul.x          SPRIME(%a6),%fp1        # S'(B1+S(B2+...))
5420                                                  5420 
5421         fmovm.x         (%sp)+,&0x20             5421         fmovm.x         (%sp)+,&0x20            # restore fp2
5422                                                  5422 
5423         fmov.l          %d0,%fpcr                5423         fmov.l          %d0,%fpcr
5424         fadd.s          POSNEG1(%a6),%fp1        5424         fadd.s          POSNEG1(%a6),%fp1       # COS(X)
5425         bsr             sto_cos                  5425         bsr             sto_cos                 # store cosine result
5426         fadd.x          RPRIME(%a6),%fp0         5426         fadd.x          RPRIME(%a6),%fp0        # SIN(X)
5427         bra             t_inx2                   5427         bra             t_inx2
5428                                                  5428 
5429 #############################################    5429 ################################################
5430                                                  5430 
5431 SCBORS:                                          5431 SCBORS:
5432         cmp.l           %d1,&0x3FFF8000          5432         cmp.l           %d1,&0x3FFF8000
5433         bgt.w           SREDUCEX                 5433         bgt.w           SREDUCEX
5434                                                  5434 
5435 #############################################    5435 ################################################
5436                                                  5436 
5437 SCSM:                                            5437 SCSM:
5438 #       mov.w           &0x0000,XDCARE(%a6)      5438 #       mov.w           &0x0000,XDCARE(%a6)
5439         fmov.s          &0x3F800000,%fp1         5439         fmov.s          &0x3F800000,%fp1
5440                                                  5440 
5441         fmov.l          %d0,%fpcr                5441         fmov.l          %d0,%fpcr
5442         fsub.s          &0x00800000,%fp1         5442         fsub.s          &0x00800000,%fp1
5443         bsr             sto_cos                  5443         bsr             sto_cos                 # store cosine result
5444         fmov.l          %fpcr,%d0                5444         fmov.l          %fpcr,%d0               # d0 must have fpcr,too
5445         mov.b           &FMOV_OP,%d1             5445         mov.b           &FMOV_OP,%d1            # last inst is MOVE
5446         fmov.x          X(%a6),%fp0              5446         fmov.x          X(%a6),%fp0
5447         bra             t_catch                  5447         bra             t_catch
5448                                                  5448 
5449 #############################################    5449 ##############################################
5450                                                  5450 
5451         global          ssincosd                 5451         global          ssincosd
5452 #--SIN AND COS OF X FOR DENORMALIZED X           5452 #--SIN AND COS OF X FOR DENORMALIZED X
5453 ssincosd:                                        5453 ssincosd:
5454         mov.l           %d0,-(%sp)               5454         mov.l           %d0,-(%sp)              # save d0
5455         fmov.s          &0x3F800000,%fp1         5455         fmov.s          &0x3F800000,%fp1
5456         bsr             sto_cos                  5456         bsr             sto_cos                 # store cosine result
5457         mov.l           (%sp)+,%d0               5457         mov.l           (%sp)+,%d0              # restore d0
5458         bra             t_extdnrm                5458         bra             t_extdnrm
5459                                                  5459 
5460 ############################################     5460 ############################################
5461                                                  5461 
5462 #--WHEN REDUCEX IS USED, THE CODE WILL INEVIT    5462 #--WHEN REDUCEX IS USED, THE CODE WILL INEVITABLY BE SLOW.
5463 #--THIS REDUCTION METHOD, HOWEVER, IS MUCH FA    5463 #--THIS REDUCTION METHOD, HOWEVER, IS MUCH FASTER THAN USING
5464 #--THE REMAINDER INSTRUCTION WHICH IS NOW IN     5464 #--THE REMAINDER INSTRUCTION WHICH IS NOW IN SOFTWARE.
5465 SREDUCEX:                                        5465 SREDUCEX:
5466         fmovm.x         &0x3c,-(%sp)             5466         fmovm.x         &0x3c,-(%sp)            # save {fp2-fp5}
5467         mov.l           %d2,-(%sp)               5467         mov.l           %d2,-(%sp)              # save d2
5468         fmov.s          &0x00000000,%fp1         5468         fmov.s          &0x00000000,%fp1        # fp1 = 0
5469                                                  5469 
5470 #--If compact form of abs(arg) in d0=$7ffefff    5470 #--If compact form of abs(arg) in d0=$7ffeffff, argument is so large that
5471 #--there is a danger of unwanted overflow in     5471 #--there is a danger of unwanted overflow in first LOOP iteration.  In this
5472 #--case, reduce argument by one remainder ste    5472 #--case, reduce argument by one remainder step to make subsequent reduction
5473 #--safe.                                         5473 #--safe.
5474         cmp.l           %d1,&0x7ffeffff          5474         cmp.l           %d1,&0x7ffeffff         # is arg dangerously large?
5475         bne.b           SLOOP                    5475         bne.b           SLOOP                   # no
5476                                                  5476 
5477 # yes; create 2**16383*PI/2                      5477 # yes; create 2**16383*PI/2
5478         mov.w           &0x7ffe,FP_SCR0_EX(%a    5478         mov.w           &0x7ffe,FP_SCR0_EX(%a6)
5479         mov.l           &0xc90fdaa2,FP_SCR0_H    5479         mov.l           &0xc90fdaa2,FP_SCR0_HI(%a6)
5480         clr.l           FP_SCR0_LO(%a6)          5480         clr.l           FP_SCR0_LO(%a6)
5481                                                  5481 
5482 # create low half of 2**16383*PI/2 at FP_SCR1    5482 # create low half of 2**16383*PI/2 at FP_SCR1
5483         mov.w           &0x7fdc,FP_SCR1_EX(%a    5483         mov.w           &0x7fdc,FP_SCR1_EX(%a6)
5484         mov.l           &0x85a308d3,FP_SCR1_H    5484         mov.l           &0x85a308d3,FP_SCR1_HI(%a6)
5485         clr.l           FP_SCR1_LO(%a6)          5485         clr.l           FP_SCR1_LO(%a6)
5486                                                  5486 
5487         ftest.x         %fp0                     5487         ftest.x         %fp0                    # test sign of argument
5488         fblt.w          sred_neg                 5488         fblt.w          sred_neg
5489                                                  5489 
5490         or.b            &0x80,FP_SCR0_EX(%a6)    5490         or.b            &0x80,FP_SCR0_EX(%a6)   # positive arg
5491         or.b            &0x80,FP_SCR1_EX(%a6)    5491         or.b            &0x80,FP_SCR1_EX(%a6)
5492 sred_neg:                                        5492 sred_neg:
5493         fadd.x          FP_SCR0(%a6),%fp0        5493         fadd.x          FP_SCR0(%a6),%fp0       # high part of reduction is exact
5494         fmov.x          %fp0,%fp1                5494         fmov.x          %fp0,%fp1               # save high result in fp1
5495         fadd.x          FP_SCR1(%a6),%fp0        5495         fadd.x          FP_SCR1(%a6),%fp0       # low part of reduction
5496         fsub.x          %fp0,%fp1                5496         fsub.x          %fp0,%fp1               # determine low component of result
5497         fadd.x          FP_SCR1(%a6),%fp1        5497         fadd.x          FP_SCR1(%a6),%fp1       # fp0/fp1 are reduced argument.
5498                                                  5498 
5499 #--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X RE    5499 #--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X REM PI/2, |X| <= PI/4.
5500 #--integer quotient will be stored in N          5500 #--integer quotient will be stored in N
5501 #--Intermeditate remainder is 66-bit long; (R    5501 #--Intermeditate remainder is 66-bit long; (R,r) in (FP0,FP1)
5502 SLOOP:                                           5502 SLOOP:
5503         fmov.x          %fp0,INARG(%a6)          5503         fmov.x          %fp0,INARG(%a6)         # +-2**K * F, 1 <= F < 2
5504         mov.w           INARG(%a6),%d1           5504         mov.w           INARG(%a6),%d1
5505         mov.l           %d1,%a1                  5505         mov.l           %d1,%a1                 # save a copy of D0
5506         and.l           &0x00007FFF,%d1          5506         and.l           &0x00007FFF,%d1
5507         sub.l           &0x00003FFF,%d1          5507         sub.l           &0x00003FFF,%d1         # d0 = K
5508         cmp.l           %d1,&28                  5508         cmp.l           %d1,&28
5509         ble.b           SLASTLOOP                5509         ble.b           SLASTLOOP
5510 SCONTLOOP:                                       5510 SCONTLOOP:
5511         sub.l           &27,%d1                  5511         sub.l           &27,%d1                 # d0 = L := K-27
5512         mov.b           &0,ENDFLAG(%a6)          5512         mov.b           &0,ENDFLAG(%a6)
5513         bra.b           SWORK                    5513         bra.b           SWORK
5514 SLASTLOOP:                                       5514 SLASTLOOP:
5515         clr.l           %d1                      5515         clr.l           %d1                     # d0 = L := 0
5516         mov.b           &1,ENDFLAG(%a6)          5516         mov.b           &1,ENDFLAG(%a6)
5517                                                  5517 
5518 SWORK:                                           5518 SWORK:
5519 #--FIND THE REMAINDER OF (R,r) W.R.T.   2**L     5519 #--FIND THE REMAINDER OF (R,r) W.R.T.   2**L * (PI/2). L IS SO CHOSEN
5520 #--THAT INT( X * (2/PI) / 2**(L) ) < 2**29.      5520 #--THAT INT( X * (2/PI) / 2**(L) ) < 2**29.
5521                                                  5521 
5522 #--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(6    5522 #--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(63),
5523 #--2**L * (PIby2_1), 2**L * (PIby2_2)            5523 #--2**L * (PIby2_1), 2**L * (PIby2_2)
5524                                                  5524 
5525         mov.l           &0x00003FFE,%d2          5525         mov.l           &0x00003FFE,%d2         # BIASED EXP OF 2/PI
5526         sub.l           %d1,%d2                  5526         sub.l           %d1,%d2                 # BIASED EXP OF 2**(-L)*(2/PI)
5527                                                  5527 
5528         mov.l           &0xA2F9836E,FP_SCR0_H    5528         mov.l           &0xA2F9836E,FP_SCR0_HI(%a6)
5529         mov.l           &0x4E44152A,FP_SCR0_L    5529         mov.l           &0x4E44152A,FP_SCR0_LO(%a6)
5530         mov.w           %d2,FP_SCR0_EX(%a6)      5530         mov.w           %d2,FP_SCR0_EX(%a6)     # FP_SCR0 = 2**(-L)*(2/PI)
5531                                                  5531 
5532         fmov.x          %fp0,%fp2                5532         fmov.x          %fp0,%fp2
5533         fmul.x          FP_SCR0(%a6),%fp2        5533         fmul.x          FP_SCR0(%a6),%fp2       # fp2 = X * 2**(-L)*(2/PI)
5534                                                  5534 
5535 #--WE MUST NOW FIND INT(FP2). SINCE WE NEED T    5535 #--WE MUST NOW FIND INT(FP2). SINCE WE NEED THIS VALUE IN
5536 #--FLOATING POINT FORMAT, THE TWO FMOVE'S        5536 #--FLOATING POINT FORMAT, THE TWO FMOVE'S       FMOVE.L FP <--> N
5537 #--WILL BE TOO INEFFICIENT. THE WAY AROUND IT    5537 #--WILL BE TOO INEFFICIENT. THE WAY AROUND IT IS THAT
5538 #--(SIGN(INARG)*2**63   +       FP2) - SIGN(I    5538 #--(SIGN(INARG)*2**63   +       FP2) - SIGN(INARG)*2**63 WILL GIVE
5539 #--US THE DESIRED VALUE IN FLOATING POINT.       5539 #--US THE DESIRED VALUE IN FLOATING POINT.
5540         mov.l           %a1,%d2                  5540         mov.l           %a1,%d2
5541         swap            %d2                      5541         swap            %d2
5542         and.l           &0x80000000,%d2          5542         and.l           &0x80000000,%d2
5543         or.l            &0x5F000000,%d2          5543         or.l            &0x5F000000,%d2         # d2 = SIGN(INARG)*2**63 IN SGL
5544         mov.l           %d2,TWOTO63(%a6)         5544         mov.l           %d2,TWOTO63(%a6)
5545         fadd.s          TWOTO63(%a6),%fp2        5545         fadd.s          TWOTO63(%a6),%fp2       # THE FRACTIONAL PART OF FP1 IS ROUNDED
5546         fsub.s          TWOTO63(%a6),%fp2        5546         fsub.s          TWOTO63(%a6),%fp2       # fp2 = N
5547 #       fint.x          %fp2                     5547 #       fint.x          %fp2
5548                                                  5548 
5549 #--CREATING 2**(L)*Piby2_1 and 2**(L)*Piby2_2    5549 #--CREATING 2**(L)*Piby2_1 and 2**(L)*Piby2_2
5550         mov.l           %d1,%d2                  5550         mov.l           %d1,%d2                 # d2 = L
5551                                                  5551 
5552         add.l           &0x00003FFF,%d2          5552         add.l           &0x00003FFF,%d2         # BIASED EXP OF 2**L * (PI/2)
5553         mov.w           %d2,FP_SCR0_EX(%a6)      5553         mov.w           %d2,FP_SCR0_EX(%a6)
5554         mov.l           &0xC90FDAA2,FP_SCR0_H    5554         mov.l           &0xC90FDAA2,FP_SCR0_HI(%a6)
5555         clr.l           FP_SCR0_LO(%a6)          5555         clr.l           FP_SCR0_LO(%a6)         # FP_SCR0 = 2**(L) * Piby2_1
5556                                                  5556 
5557         add.l           &0x00003FDD,%d1          5557         add.l           &0x00003FDD,%d1
5558         mov.w           %d1,FP_SCR1_EX(%a6)      5558         mov.w           %d1,FP_SCR1_EX(%a6)
5559         mov.l           &0x85A308D3,FP_SCR1_H    5559         mov.l           &0x85A308D3,FP_SCR1_HI(%a6)
5560         clr.l           FP_SCR1_LO(%a6)          5560         clr.l           FP_SCR1_LO(%a6)         # FP_SCR1 = 2**(L) * Piby2_2
5561                                                  5561 
5562         mov.b           ENDFLAG(%a6),%d1         5562         mov.b           ENDFLAG(%a6),%d1
5563                                                  5563 
5564 #--We are now ready to perform (R+r) - N*P1 -    5564 #--We are now ready to perform (R+r) - N*P1 - N*P2, P1 = 2**(L) * Piby2_1 and
5565 #--P2 = 2**(L) * Piby2_2                         5565 #--P2 = 2**(L) * Piby2_2
5566         fmov.x          %fp2,%fp4                5566         fmov.x          %fp2,%fp4               # fp4 = N
5567         fmul.x          FP_SCR0(%a6),%fp4        5567         fmul.x          FP_SCR0(%a6),%fp4       # fp4 = W = N*P1
5568         fmov.x          %fp2,%fp5                5568         fmov.x          %fp2,%fp5               # fp5 = N
5569         fmul.x          FP_SCR1(%a6),%fp5        5569         fmul.x          FP_SCR1(%a6),%fp5       # fp5 = w = N*P2
5570         fmov.x          %fp4,%fp3                5570         fmov.x          %fp4,%fp3               # fp3 = W = N*P1
5571                                                  5571 
5572 #--we want P+p = W+w  but  |p| <= half ulp of    5572 #--we want P+p = W+w  but  |p| <= half ulp of P
5573 #--Then, we need to compute  A := R-P   and      5573 #--Then, we need to compute  A := R-P   and  a := r-p
5574         fadd.x          %fp5,%fp3                5574         fadd.x          %fp5,%fp3               # fp3 = P
5575         fsub.x          %fp3,%fp4                5575         fsub.x          %fp3,%fp4               # fp4 = W-P
5576                                                  5576 
5577         fsub.x          %fp3,%fp0                5577         fsub.x          %fp3,%fp0               # fp0 = A := R - P
5578         fadd.x          %fp5,%fp4                5578         fadd.x          %fp5,%fp4               # fp4 = p = (W-P)+w
5579                                                  5579 
5580         fmov.x          %fp0,%fp3                5580         fmov.x          %fp0,%fp3               # fp3 = A
5581         fsub.x          %fp4,%fp1                5581         fsub.x          %fp4,%fp1               # fp1 = a := r - p
5582                                                  5582 
5583 #--Now we need to normalize (A,a) to  "new (R    5583 #--Now we need to normalize (A,a) to  "new (R,r)" where R+r = A+a but
5584 #--|r| <= half ulp of R.                         5584 #--|r| <= half ulp of R.
5585         fadd.x          %fp1,%fp0                5585         fadd.x          %fp1,%fp0               # fp0 = R := A+a
5586 #--No need to calculate r if this is the last    5586 #--No need to calculate r if this is the last loop
5587         cmp.b           %d1,&0                   5587         cmp.b           %d1,&0
5588         bgt.w           SRESTORE                 5588         bgt.w           SRESTORE
5589                                                  5589 
5590 #--Need to calculate r                           5590 #--Need to calculate r
5591         fsub.x          %fp0,%fp3                5591         fsub.x          %fp0,%fp3               # fp3 = A-R
5592         fadd.x          %fp3,%fp1                5592         fadd.x          %fp3,%fp1               # fp1 = r := (A-R)+a
5593         bra.w           SLOOP                    5593         bra.w           SLOOP
5594                                                  5594 
5595 SRESTORE:                                        5595 SRESTORE:
5596         fmov.l          %fp2,INT(%a6)            5596         fmov.l          %fp2,INT(%a6)
5597         mov.l           (%sp)+,%d2               5597         mov.l           (%sp)+,%d2              # restore d2
5598         fmovm.x         (%sp)+,&0x3c             5598         fmovm.x         (%sp)+,&0x3c            # restore {fp2-fp5}
5599                                                  5599 
5600         mov.l           ADJN(%a6),%d1            5600         mov.l           ADJN(%a6),%d1
5601         cmp.l           %d1,&4                   5601         cmp.l           %d1,&4
5602                                                  5602 
5603         blt.w           SINCONT                  5603         blt.w           SINCONT
5604         bra.w           SCCONT                   5604         bra.w           SCCONT
5605                                                  5605 
5606 #############################################    5606 #########################################################################
5607 # stan():  computes the tangent of a normaliz    5607 # stan():  computes the tangent of a normalized input                   #
5608 # stand(): computes the tangent of a denormal    5608 # stand(): computes the tangent of a denormalized input                 #
5609 #                                                5609 #                                                                       #
5610 # INPUT *************************************    5610 # INPUT *************************************************************** #
5611 #       a0 = pointer to extended precision in    5611 #       a0 = pointer to extended precision input                        #
5612 #       d0 = round precision,mode                5612 #       d0 = round precision,mode                                       #
5613 #                                                5613 #                                                                       #
5614 # OUTPUT ************************************    5614 # OUTPUT ************************************************************** #
5615 #       fp0 = tan(X)                             5615 #       fp0 = tan(X)                                                    #
5616 #                                                5616 #                                                                       #
5617 # ACCURACY and MONOTONICITY *****************    5617 # ACCURACY and MONOTONICITY ******************************************* #
5618 #       The returned result is within 3 ulp i    5618 #       The returned result is within 3 ulp in 64 significant bit, i.e. #
5619 #       within 0.5001 ulp to 53 bits if the r    5619 #       within 0.5001 ulp to 53 bits if the result is subsequently      #
5620 #       rounded to double precision. The resu    5620 #       rounded to double precision. The result is provably monotonic   #
5621 #       in double precision.                     5621 #       in double precision.                                            #
5622 #                                                5622 #                                                                       #
5623 # ALGORITHM *********************************    5623 # ALGORITHM *********************************************************** #
5624 #                                                5624 #                                                                       #
5625 #       1. If |X| >= 15Pi or |X| < 2**(-40),     5625 #       1. If |X| >= 15Pi or |X| < 2**(-40), go to 6.                   #
5626 #                                                5626 #                                                                       #
5627 #       2. Decompose X as X = N(Pi/2) + r whe    5627 #       2. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let        #
5628 #               k = N mod 2, so in particular    5628 #               k = N mod 2, so in particular, k = 0 or 1.              #
5629 #                                                5629 #                                                                       #
5630 #       3. If k is odd, go to 5.                 5630 #       3. If k is odd, go to 5.                                        #
5631 #                                                5631 #                                                                       #
5632 #       4. (k is even) Tan(X) = tan(r) and ta    5632 #       4. (k is even) Tan(X) = tan(r) and tan(r) is approximated by a  #
5633 #               rational function U/V where      5633 #               rational function U/V where                             #
5634 #               U = r + r*s*(P1 + s*(P2 + s*P    5634 #               U = r + r*s*(P1 + s*(P2 + s*P3)), and                   #
5635 #               V = 1 + s*(Q1 + s*(Q2 + s*(Q3    5635 #               V = 1 + s*(Q1 + s*(Q2 + s*(Q3 + s*Q4))),  s = r*r.      #
5636 #               Exit.                            5636 #               Exit.                                                   #
5637 #                                                5637 #                                                                       #
5638 #       4. (k is odd) Tan(X) = -cot(r). Since    5638 #       4. (k is odd) Tan(X) = -cot(r). Since tan(r) is approximated by #
5639 #               a rational function U/V where    5639 #               a rational function U/V where                           #
5640 #               U = r + r*s*(P1 + s*(P2 + s*P    5640 #               U = r + r*s*(P1 + s*(P2 + s*P3)), and                   #
5641 #               V = 1 + s*(Q1 + s*(Q2 + s*(Q3    5641 #               V = 1 + s*(Q1 + s*(Q2 + s*(Q3 + s*Q4))), s = r*r,       #
5642 #               -Cot(r) = -V/U. Exit.            5642 #               -Cot(r) = -V/U. Exit.                                   #
5643 #                                                5643 #                                                                       #
5644 #       6. If |X| > 1, go to 8.                  5644 #       6. If |X| > 1, go to 8.                                         #
5645 #                                                5645 #                                                                       #
5646 #       7. (|X|<2**(-40)) Tan(X) = X. Exit.      5646 #       7. (|X|<2**(-40)) Tan(X) = X. Exit.                             #
5647 #                                                5647 #                                                                       #
5648 #       8. Overwrite X by X := X rem 2Pi. Now    5648 #       8. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi, go back   #
5649 #               to 2.                            5649 #               to 2.                                                   #
5650 #                                                5650 #                                                                       #
5651 #############################################    5651 #########################################################################
5652                                                  5652 
5653 TANQ4:                                           5653 TANQ4:
5654         long            0x3EA0B759,0xF50F8688    5654         long            0x3EA0B759,0xF50F8688
5655 TANP3:                                           5655 TANP3:
5656         long            0xBEF2BAA5,0xA8924F04    5656         long            0xBEF2BAA5,0xA8924F04
5657                                                  5657 
5658 TANQ3:                                           5658 TANQ3:
5659         long            0xBF346F59,0xB39BA65F    5659         long            0xBF346F59,0xB39BA65F,0x00000000,0x00000000
5660                                                  5660 
5661 TANP2:                                           5661 TANP2:
5662         long            0x3FF60000,0xE073D3FC    5662         long            0x3FF60000,0xE073D3FC,0x199C4A00,0x00000000
5663                                                  5663 
5664 TANQ2:                                           5664 TANQ2:
5665         long            0x3FF90000,0xD23CD684    5665         long            0x3FF90000,0xD23CD684,0x15D95FA1,0x00000000
5666                                                  5666 
5667 TANP1:                                           5667 TANP1:
5668         long            0xBFFC0000,0x8895A6C5    5668         long            0xBFFC0000,0x8895A6C5,0xFB423BCA,0x00000000
5669                                                  5669 
5670 TANQ1:                                           5670 TANQ1:
5671         long            0xBFFD0000,0xEEF57E0D    5671         long            0xBFFD0000,0xEEF57E0D,0xA84BC8CE,0x00000000
5672                                                  5672 
5673 INVTWOPI:                                        5673 INVTWOPI:
5674         long            0x3FFC0000,0xA2F9836E    5674         long            0x3FFC0000,0xA2F9836E,0x4E44152A,0x00000000
5675                                                  5675 
5676 TWOPI1:                                          5676 TWOPI1:
5677         long            0x40010000,0xC90FDAA2    5677         long            0x40010000,0xC90FDAA2,0x00000000,0x00000000
5678 TWOPI2:                                          5678 TWOPI2:
5679         long            0x3FDF0000,0x85A308D4    5679         long            0x3FDF0000,0x85A308D4,0x00000000,0x00000000
5680                                                  5680 
5681 #--N*PI/2, -32 <= N <= 32, IN A LEADING TERM     5681 #--N*PI/2, -32 <= N <= 32, IN A LEADING TERM IN EXT. AND TRAILING
5682 #--TERM IN SGL. NOTE THAT PI IS 64-BIT LONG,     5682 #--TERM IN SGL. NOTE THAT PI IS 64-BIT LONG, THUS N*PI/2 IS AT
5683 #--MOST 69 BITS LONG.                            5683 #--MOST 69 BITS LONG.
5684 #       global          PITBL                    5684 #       global          PITBL
5685 PITBL:                                           5685 PITBL:
5686         long            0xC0040000,0xC90FDAA2    5686         long            0xC0040000,0xC90FDAA2,0x2168C235,0x21800000
5687         long            0xC0040000,0xC2C75BCD    5687         long            0xC0040000,0xC2C75BCD,0x105D7C23,0xA0D00000
5688         long            0xC0040000,0xBC7EDCF7    5688         long            0xC0040000,0xBC7EDCF7,0xFF523611,0xA1E80000
5689         long            0xC0040000,0xB6365E22    5689         long            0xC0040000,0xB6365E22,0xEE46F000,0x21480000
5690         long            0xC0040000,0xAFEDDF4D    5690         long            0xC0040000,0xAFEDDF4D,0xDD3BA9EE,0xA1200000
5691         long            0xC0040000,0xA9A56078    5691         long            0xC0040000,0xA9A56078,0xCC3063DD,0x21FC0000
5692         long            0xC0040000,0xA35CE1A3    5692         long            0xC0040000,0xA35CE1A3,0xBB251DCB,0x21100000
5693         long            0xC0040000,0x9D1462CE    5693         long            0xC0040000,0x9D1462CE,0xAA19D7B9,0xA1580000
5694         long            0xC0040000,0x96CBE3F9    5694         long            0xC0040000,0x96CBE3F9,0x990E91A8,0x21E00000
5695         long            0xC0040000,0x90836524    5695         long            0xC0040000,0x90836524,0x88034B96,0x20B00000
5696         long            0xC0040000,0x8A3AE64F    5696         long            0xC0040000,0x8A3AE64F,0x76F80584,0xA1880000
5697         long            0xC0040000,0x83F2677A    5697         long            0xC0040000,0x83F2677A,0x65ECBF73,0x21C40000
5698         long            0xC0030000,0xFB53D14A    5698         long            0xC0030000,0xFB53D14A,0xA9C2F2C2,0x20000000
5699         long            0xC0030000,0xEEC2D3A0    5699         long            0xC0030000,0xEEC2D3A0,0x87AC669F,0x21380000
5700         long            0xC0030000,0xE231D5F6    5700         long            0xC0030000,0xE231D5F6,0x6595DA7B,0xA1300000
5701         long            0xC0030000,0xD5A0D84C    5701         long            0xC0030000,0xD5A0D84C,0x437F4E58,0x9FC00000
5702         long            0xC0030000,0xC90FDAA2    5702         long            0xC0030000,0xC90FDAA2,0x2168C235,0x21000000
5703         long            0xC0030000,0xBC7EDCF7    5703         long            0xC0030000,0xBC7EDCF7,0xFF523611,0xA1680000
5704         long            0xC0030000,0xAFEDDF4D    5704         long            0xC0030000,0xAFEDDF4D,0xDD3BA9EE,0xA0A00000
5705         long            0xC0030000,0xA35CE1A3    5705         long            0xC0030000,0xA35CE1A3,0xBB251DCB,0x20900000
5706         long            0xC0030000,0x96CBE3F9    5706         long            0xC0030000,0x96CBE3F9,0x990E91A8,0x21600000
5707         long            0xC0030000,0x8A3AE64F    5707         long            0xC0030000,0x8A3AE64F,0x76F80584,0xA1080000
5708         long            0xC0020000,0xFB53D14A    5708         long            0xC0020000,0xFB53D14A,0xA9C2F2C2,0x1F800000
5709         long            0xC0020000,0xE231D5F6    5709         long            0xC0020000,0xE231D5F6,0x6595DA7B,0xA0B00000
5710         long            0xC0020000,0xC90FDAA2    5710         long            0xC0020000,0xC90FDAA2,0x2168C235,0x20800000
5711         long            0xC0020000,0xAFEDDF4D    5711         long            0xC0020000,0xAFEDDF4D,0xDD3BA9EE,0xA0200000
5712         long            0xC0020000,0x96CBE3F9    5712         long            0xC0020000,0x96CBE3F9,0x990E91A8,0x20E00000
5713         long            0xC0010000,0xFB53D14A    5713         long            0xC0010000,0xFB53D14A,0xA9C2F2C2,0x1F000000
5714         long            0xC0010000,0xC90FDAA2    5714         long            0xC0010000,0xC90FDAA2,0x2168C235,0x20000000
5715         long            0xC0010000,0x96CBE3F9    5715         long            0xC0010000,0x96CBE3F9,0x990E91A8,0x20600000
5716         long            0xC0000000,0xC90FDAA2    5716         long            0xC0000000,0xC90FDAA2,0x2168C235,0x1F800000
5717         long            0xBFFF0000,0xC90FDAA2    5717         long            0xBFFF0000,0xC90FDAA2,0x2168C235,0x1F000000
5718         long            0x00000000,0x00000000    5718         long            0x00000000,0x00000000,0x00000000,0x00000000
5719         long            0x3FFF0000,0xC90FDAA2    5719         long            0x3FFF0000,0xC90FDAA2,0x2168C235,0x9F000000
5720         long            0x40000000,0xC90FDAA2    5720         long            0x40000000,0xC90FDAA2,0x2168C235,0x9F800000
5721         long            0x40010000,0x96CBE3F9    5721         long            0x40010000,0x96CBE3F9,0x990E91A8,0xA0600000
5722         long            0x40010000,0xC90FDAA2    5722         long            0x40010000,0xC90FDAA2,0x2168C235,0xA0000000
5723         long            0x40010000,0xFB53D14A    5723         long            0x40010000,0xFB53D14A,0xA9C2F2C2,0x9F000000
5724         long            0x40020000,0x96CBE3F9    5724         long            0x40020000,0x96CBE3F9,0x990E91A8,0xA0E00000
5725         long            0x40020000,0xAFEDDF4D    5725         long            0x40020000,0xAFEDDF4D,0xDD3BA9EE,0x20200000
5726         long            0x40020000,0xC90FDAA2    5726         long            0x40020000,0xC90FDAA2,0x2168C235,0xA0800000
5727         long            0x40020000,0xE231D5F6    5727         long            0x40020000,0xE231D5F6,0x6595DA7B,0x20B00000
5728         long            0x40020000,0xFB53D14A    5728         long            0x40020000,0xFB53D14A,0xA9C2F2C2,0x9F800000
5729         long            0x40030000,0x8A3AE64F    5729         long            0x40030000,0x8A3AE64F,0x76F80584,0x21080000
5730         long            0x40030000,0x96CBE3F9    5730         long            0x40030000,0x96CBE3F9,0x990E91A8,0xA1600000
5731         long            0x40030000,0xA35CE1A3    5731         long            0x40030000,0xA35CE1A3,0xBB251DCB,0xA0900000
5732         long            0x40030000,0xAFEDDF4D    5732         long            0x40030000,0xAFEDDF4D,0xDD3BA9EE,0x20A00000
5733         long            0x40030000,0xBC7EDCF7    5733         long            0x40030000,0xBC7EDCF7,0xFF523611,0x21680000
5734         long            0x40030000,0xC90FDAA2    5734         long            0x40030000,0xC90FDAA2,0x2168C235,0xA1000000
5735         long            0x40030000,0xD5A0D84C    5735         long            0x40030000,0xD5A0D84C,0x437F4E58,0x1FC00000
5736         long            0x40030000,0xE231D5F6    5736         long            0x40030000,0xE231D5F6,0x6595DA7B,0x21300000
5737         long            0x40030000,0xEEC2D3A0    5737         long            0x40030000,0xEEC2D3A0,0x87AC669F,0xA1380000
5738         long            0x40030000,0xFB53D14A    5738         long            0x40030000,0xFB53D14A,0xA9C2F2C2,0xA0000000
5739         long            0x40040000,0x83F2677A    5739         long            0x40040000,0x83F2677A,0x65ECBF73,0xA1C40000
5740         long            0x40040000,0x8A3AE64F    5740         long            0x40040000,0x8A3AE64F,0x76F80584,0x21880000
5741         long            0x40040000,0x90836524    5741         long            0x40040000,0x90836524,0x88034B96,0xA0B00000
5742         long            0x40040000,0x96CBE3F9    5742         long            0x40040000,0x96CBE3F9,0x990E91A8,0xA1E00000
5743         long            0x40040000,0x9D1462CE    5743         long            0x40040000,0x9D1462CE,0xAA19D7B9,0x21580000
5744         long            0x40040000,0xA35CE1A3    5744         long            0x40040000,0xA35CE1A3,0xBB251DCB,0xA1100000
5745         long            0x40040000,0xA9A56078    5745         long            0x40040000,0xA9A56078,0xCC3063DD,0xA1FC0000
5746         long            0x40040000,0xAFEDDF4D    5746         long            0x40040000,0xAFEDDF4D,0xDD3BA9EE,0x21200000
5747         long            0x40040000,0xB6365E22    5747         long            0x40040000,0xB6365E22,0xEE46F000,0xA1480000
5748         long            0x40040000,0xBC7EDCF7    5748         long            0x40040000,0xBC7EDCF7,0xFF523611,0x21E80000
5749         long            0x40040000,0xC2C75BCD    5749         long            0x40040000,0xC2C75BCD,0x105D7C23,0x20D00000
5750         long            0x40040000,0xC90FDAA2    5750         long            0x40040000,0xC90FDAA2,0x2168C235,0xA1800000
5751                                                  5751 
5752         set             INARG,FP_SCR0            5752         set             INARG,FP_SCR0
5753                                                  5753 
5754         set             TWOTO63,L_SCR1           5754         set             TWOTO63,L_SCR1
5755         set             INT,L_SCR1               5755         set             INT,L_SCR1
5756         set             ENDFLAG,L_SCR2           5756         set             ENDFLAG,L_SCR2
5757                                                  5757 
5758         global          stan                     5758         global          stan
5759 stan:                                            5759 stan:
5760         fmov.x          (%a0),%fp0               5760         fmov.x          (%a0),%fp0              # LOAD INPUT
5761                                                  5761 
5762         mov.l           (%a0),%d1                5762         mov.l           (%a0),%d1
5763         mov.w           4(%a0),%d1               5763         mov.w           4(%a0),%d1
5764         and.l           &0x7FFFFFFF,%d1          5764         and.l           &0x7FFFFFFF,%d1
5765                                                  5765 
5766         cmp.l           %d1,&0x3FD78000          5766         cmp.l           %d1,&0x3FD78000         # |X| >= 2**(-40)?
5767         bge.b           TANOK1                   5767         bge.b           TANOK1
5768         bra.w           TANSM                    5768         bra.w           TANSM
5769 TANOK1:                                          5769 TANOK1:
5770         cmp.l           %d1,&0x4004BC7E          5770         cmp.l           %d1,&0x4004BC7E         # |X| < 15 PI?
5771         blt.b           TANMAIN                  5771         blt.b           TANMAIN
5772         bra.w           REDUCEX                  5772         bra.w           REDUCEX
5773                                                  5773 
5774 TANMAIN:                                         5774 TANMAIN:
5775 #--THIS IS THE USUAL CASE, |X| <= 15 PI.         5775 #--THIS IS THE USUAL CASE, |X| <= 15 PI.
5776 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LO    5776 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
5777         fmov.x          %fp0,%fp1                5777         fmov.x          %fp0,%fp1
5778         fmul.d          TWOBYPI(%pc),%fp1        5778         fmul.d          TWOBYPI(%pc),%fp1       # X*2/PI
5779                                                  5779 
5780         lea.l           PITBL+0x200(%pc),%a1     5780         lea.l           PITBL+0x200(%pc),%a1    # TABLE OF N*PI/2, N = -32,...,32
5781                                                  5781 
5782         fmov.l          %fp1,%d1                 5782         fmov.l          %fp1,%d1                # CONVERT TO INTEGER
5783                                                  5783 
5784         asl.l           &4,%d1                   5784         asl.l           &4,%d1
5785         add.l           %d1,%a1                  5785         add.l           %d1,%a1                 # ADDRESS N*PIBY2 IN Y1, Y2
5786                                                  5786 
5787         fsub.x          (%a1)+,%fp0              5787         fsub.x          (%a1)+,%fp0             # X-Y1
5788                                                  5788 
5789         fsub.s          (%a1),%fp0               5789         fsub.s          (%a1),%fp0              # FP0 IS R = (X-Y1)-Y2
5790                                                  5790 
5791         ror.l           &5,%d1                   5791         ror.l           &5,%d1
5792         and.l           &0x80000000,%d1          5792         and.l           &0x80000000,%d1         # D0 WAS ODD IFF D0 < 0
5793                                                  5793 
5794 TANCONT:                                         5794 TANCONT:
5795         fmovm.x         &0x0c,-(%sp)             5795         fmovm.x         &0x0c,-(%sp)            # save fp2,fp3
5796                                                  5796 
5797         cmp.l           %d1,&0                   5797         cmp.l           %d1,&0
5798         blt.w           NODD                     5798         blt.w           NODD
5799                                                  5799 
5800         fmov.x          %fp0,%fp1                5800         fmov.x          %fp0,%fp1
5801         fmul.x          %fp1,%fp1                5801         fmul.x          %fp1,%fp1               # S = R*R
5802                                                  5802 
5803         fmov.d          TANQ4(%pc),%fp3          5803         fmov.d          TANQ4(%pc),%fp3
5804         fmov.d          TANP3(%pc),%fp2          5804         fmov.d          TANP3(%pc),%fp2
5805                                                  5805 
5806         fmul.x          %fp1,%fp3                5806         fmul.x          %fp1,%fp3               # SQ4
5807         fmul.x          %fp1,%fp2                5807         fmul.x          %fp1,%fp2               # SP3
5808                                                  5808 
5809         fadd.d          TANQ3(%pc),%fp3          5809         fadd.d          TANQ3(%pc),%fp3         # Q3+SQ4
5810         fadd.x          TANP2(%pc),%fp2          5810         fadd.x          TANP2(%pc),%fp2         # P2+SP3
5811                                                  5811 
5812         fmul.x          %fp1,%fp3                5812         fmul.x          %fp1,%fp3               # S(Q3+SQ4)
5813         fmul.x          %fp1,%fp2                5813         fmul.x          %fp1,%fp2               # S(P2+SP3)
5814                                                  5814 
5815         fadd.x          TANQ2(%pc),%fp3          5815         fadd.x          TANQ2(%pc),%fp3         # Q2+S(Q3+SQ4)
5816         fadd.x          TANP1(%pc),%fp2          5816         fadd.x          TANP1(%pc),%fp2         # P1+S(P2+SP3)
5817                                                  5817 
5818         fmul.x          %fp1,%fp3                5818         fmul.x          %fp1,%fp3               # S(Q2+S(Q3+SQ4))
5819         fmul.x          %fp1,%fp2                5819         fmul.x          %fp1,%fp2               # S(P1+S(P2+SP3))
5820                                                  5820 
5821         fadd.x          TANQ1(%pc),%fp3          5821         fadd.x          TANQ1(%pc),%fp3         # Q1+S(Q2+S(Q3+SQ4))
5822         fmul.x          %fp0,%fp2                5822         fmul.x          %fp0,%fp2               # RS(P1+S(P2+SP3))
5823                                                  5823 
5824         fmul.x          %fp3,%fp1                5824         fmul.x          %fp3,%fp1               # S(Q1+S(Q2+S(Q3+SQ4)))
5825                                                  5825 
5826         fadd.x          %fp2,%fp0                5826         fadd.x          %fp2,%fp0               # R+RS(P1+S(P2+SP3))
5827                                                  5827 
5828         fadd.s          &0x3F800000,%fp1         5828         fadd.s          &0x3F800000,%fp1        # 1+S(Q1+...)
5829                                                  5829 
5830         fmovm.x         (%sp)+,&0x30             5830         fmovm.x         (%sp)+,&0x30            # restore fp2,fp3
5831                                                  5831 
5832         fmov.l          %d0,%fpcr                5832         fmov.l          %d0,%fpcr               # restore users round mode,prec
5833         fdiv.x          %fp1,%fp0                5833         fdiv.x          %fp1,%fp0               # last inst - possible exception set
5834         bra             t_inx2                   5834         bra             t_inx2
5835                                                  5835 
5836 NODD:                                            5836 NODD:
5837         fmov.x          %fp0,%fp1                5837         fmov.x          %fp0,%fp1
5838         fmul.x          %fp0,%fp0                5838         fmul.x          %fp0,%fp0               # S = R*R
5839                                                  5839 
5840         fmov.d          TANQ4(%pc),%fp3          5840         fmov.d          TANQ4(%pc),%fp3
5841         fmov.d          TANP3(%pc),%fp2          5841         fmov.d          TANP3(%pc),%fp2
5842                                                  5842 
5843         fmul.x          %fp0,%fp3                5843         fmul.x          %fp0,%fp3               # SQ4
5844         fmul.x          %fp0,%fp2                5844         fmul.x          %fp0,%fp2               # SP3
5845                                                  5845 
5846         fadd.d          TANQ3(%pc),%fp3          5846         fadd.d          TANQ3(%pc),%fp3         # Q3+SQ4
5847         fadd.x          TANP2(%pc),%fp2          5847         fadd.x          TANP2(%pc),%fp2         # P2+SP3
5848                                                  5848 
5849         fmul.x          %fp0,%fp3                5849         fmul.x          %fp0,%fp3               # S(Q3+SQ4)
5850         fmul.x          %fp0,%fp2                5850         fmul.x          %fp0,%fp2               # S(P2+SP3)
5851                                                  5851 
5852         fadd.x          TANQ2(%pc),%fp3          5852         fadd.x          TANQ2(%pc),%fp3         # Q2+S(Q3+SQ4)
5853         fadd.x          TANP1(%pc),%fp2          5853         fadd.x          TANP1(%pc),%fp2         # P1+S(P2+SP3)
5854                                                  5854 
5855         fmul.x          %fp0,%fp3                5855         fmul.x          %fp0,%fp3               # S(Q2+S(Q3+SQ4))
5856         fmul.x          %fp0,%fp2                5856         fmul.x          %fp0,%fp2               # S(P1+S(P2+SP3))
5857                                                  5857 
5858         fadd.x          TANQ1(%pc),%fp3          5858         fadd.x          TANQ1(%pc),%fp3         # Q1+S(Q2+S(Q3+SQ4))
5859         fmul.x          %fp1,%fp2                5859         fmul.x          %fp1,%fp2               # RS(P1+S(P2+SP3))
5860                                                  5860 
5861         fmul.x          %fp3,%fp0                5861         fmul.x          %fp3,%fp0               # S(Q1+S(Q2+S(Q3+SQ4)))
5862                                                  5862 
5863         fadd.x          %fp2,%fp1                5863         fadd.x          %fp2,%fp1               # R+RS(P1+S(P2+SP3))
5864         fadd.s          &0x3F800000,%fp0         5864         fadd.s          &0x3F800000,%fp0        # 1+S(Q1+...)
5865                                                  5865 
5866         fmovm.x         (%sp)+,&0x30             5866         fmovm.x         (%sp)+,&0x30            # restore fp2,fp3
5867                                                  5867 
5868         fmov.x          %fp1,-(%sp)              5868         fmov.x          %fp1,-(%sp)
5869         eor.l           &0x80000000,(%sp)        5869         eor.l           &0x80000000,(%sp)
5870                                                  5870 
5871         fmov.l          %d0,%fpcr                5871         fmov.l          %d0,%fpcr               # restore users round mode,prec
5872         fdiv.x          (%sp)+,%fp0              5872         fdiv.x          (%sp)+,%fp0             # last inst - possible exception set
5873         bra             t_inx2                   5873         bra             t_inx2
5874                                                  5874 
5875 TANBORS:                                         5875 TANBORS:
5876 #--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT    5876 #--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT REDUCTION.
5877 #--IF |X| < 2**(-40), RETURN X OR 1.             5877 #--IF |X| < 2**(-40), RETURN X OR 1.
5878         cmp.l           %d1,&0x3FFF8000          5878         cmp.l           %d1,&0x3FFF8000
5879         bgt.b           REDUCEX                  5879         bgt.b           REDUCEX
5880                                                  5880 
5881 TANSM:                                           5881 TANSM:
5882         fmov.x          %fp0,-(%sp)              5882         fmov.x          %fp0,-(%sp)
5883         fmov.l          %d0,%fpcr                5883         fmov.l          %d0,%fpcr               # restore users round mode,prec
5884         mov.b           &FMOV_OP,%d1             5884         mov.b           &FMOV_OP,%d1            # last inst is MOVE
5885         fmov.x          (%sp)+,%fp0              5885         fmov.x          (%sp)+,%fp0             # last inst - posibble exception set
5886         bra             t_catch                  5886         bra             t_catch
5887                                                  5887 
5888         global          stand                    5888         global          stand
5889 #--TAN(X) = X FOR DENORMALIZED X                 5889 #--TAN(X) = X FOR DENORMALIZED X
5890 stand:                                           5890 stand:
5891         bra             t_extdnrm                5891         bra             t_extdnrm
5892                                                  5892 
5893 #--WHEN REDUCEX IS USED, THE CODE WILL INEVIT    5893 #--WHEN REDUCEX IS USED, THE CODE WILL INEVITABLY BE SLOW.
5894 #--THIS REDUCTION METHOD, HOWEVER, IS MUCH FA    5894 #--THIS REDUCTION METHOD, HOWEVER, IS MUCH FASTER THAN USING
5895 #--THE REMAINDER INSTRUCTION WHICH IS NOW IN     5895 #--THE REMAINDER INSTRUCTION WHICH IS NOW IN SOFTWARE.
5896 REDUCEX:                                         5896 REDUCEX:
5897         fmovm.x         &0x3c,-(%sp)             5897         fmovm.x         &0x3c,-(%sp)            # save {fp2-fp5}
5898         mov.l           %d2,-(%sp)               5898         mov.l           %d2,-(%sp)              # save d2
5899         fmov.s          &0x00000000,%fp1         5899         fmov.s          &0x00000000,%fp1        # fp1 = 0
5900                                                  5900 
5901 #--If compact form of abs(arg) in d0=$7ffefff    5901 #--If compact form of abs(arg) in d0=$7ffeffff, argument is so large that
5902 #--there is a danger of unwanted overflow in     5902 #--there is a danger of unwanted overflow in first LOOP iteration.  In this
5903 #--case, reduce argument by one remainder ste    5903 #--case, reduce argument by one remainder step to make subsequent reduction
5904 #--safe.                                         5904 #--safe.
5905         cmp.l           %d1,&0x7ffeffff          5905         cmp.l           %d1,&0x7ffeffff         # is arg dangerously large?
5906         bne.b           LOOP                     5906         bne.b           LOOP                    # no
5907                                                  5907 
5908 # yes; create 2**16383*PI/2                      5908 # yes; create 2**16383*PI/2
5909         mov.w           &0x7ffe,FP_SCR0_EX(%a    5909         mov.w           &0x7ffe,FP_SCR0_EX(%a6)
5910         mov.l           &0xc90fdaa2,FP_SCR0_H    5910         mov.l           &0xc90fdaa2,FP_SCR0_HI(%a6)
5911         clr.l           FP_SCR0_LO(%a6)          5911         clr.l           FP_SCR0_LO(%a6)
5912                                                  5912 
5913 # create low half of 2**16383*PI/2 at FP_SCR1    5913 # create low half of 2**16383*PI/2 at FP_SCR1
5914         mov.w           &0x7fdc,FP_SCR1_EX(%a    5914         mov.w           &0x7fdc,FP_SCR1_EX(%a6)
5915         mov.l           &0x85a308d3,FP_SCR1_H    5915         mov.l           &0x85a308d3,FP_SCR1_HI(%a6)
5916         clr.l           FP_SCR1_LO(%a6)          5916         clr.l           FP_SCR1_LO(%a6)
5917                                                  5917 
5918         ftest.x         %fp0                     5918         ftest.x         %fp0                    # test sign of argument
5919         fblt.w          red_neg                  5919         fblt.w          red_neg
5920                                                  5920 
5921         or.b            &0x80,FP_SCR0_EX(%a6)    5921         or.b            &0x80,FP_SCR0_EX(%a6)   # positive arg
5922         or.b            &0x80,FP_SCR1_EX(%a6)    5922         or.b            &0x80,FP_SCR1_EX(%a6)
5923 red_neg:                                         5923 red_neg:
5924         fadd.x          FP_SCR0(%a6),%fp0        5924         fadd.x          FP_SCR0(%a6),%fp0       # high part of reduction is exact
5925         fmov.x          %fp0,%fp1                5925         fmov.x          %fp0,%fp1               # save high result in fp1
5926         fadd.x          FP_SCR1(%a6),%fp0        5926         fadd.x          FP_SCR1(%a6),%fp0       # low part of reduction
5927         fsub.x          %fp0,%fp1                5927         fsub.x          %fp0,%fp1               # determine low component of result
5928         fadd.x          FP_SCR1(%a6),%fp1        5928         fadd.x          FP_SCR1(%a6),%fp1       # fp0/fp1 are reduced argument.
5929                                                  5929 
5930 #--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X RE    5930 #--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X REM PI/2, |X| <= PI/4.
5931 #--integer quotient will be stored in N          5931 #--integer quotient will be stored in N
5932 #--Intermeditate remainder is 66-bit long; (R    5932 #--Intermeditate remainder is 66-bit long; (R,r) in (FP0,FP1)
5933 LOOP:                                            5933 LOOP:
5934         fmov.x          %fp0,INARG(%a6)          5934         fmov.x          %fp0,INARG(%a6)         # +-2**K * F, 1 <= F < 2
5935         mov.w           INARG(%a6),%d1           5935         mov.w           INARG(%a6),%d1
5936         mov.l           %d1,%a1                  5936         mov.l           %d1,%a1                 # save a copy of D0
5937         and.l           &0x00007FFF,%d1          5937         and.l           &0x00007FFF,%d1
5938         sub.l           &0x00003FFF,%d1          5938         sub.l           &0x00003FFF,%d1         # d0 = K
5939         cmp.l           %d1,&28                  5939         cmp.l           %d1,&28
5940         ble.b           LASTLOOP                 5940         ble.b           LASTLOOP
5941 CONTLOOP:                                        5941 CONTLOOP:
5942         sub.l           &27,%d1                  5942         sub.l           &27,%d1                 # d0 = L := K-27
5943         mov.b           &0,ENDFLAG(%a6)          5943         mov.b           &0,ENDFLAG(%a6)
5944         bra.b           WORK                     5944         bra.b           WORK
5945 LASTLOOP:                                        5945 LASTLOOP:
5946         clr.l           %d1                      5946         clr.l           %d1                     # d0 = L := 0
5947         mov.b           &1,ENDFLAG(%a6)          5947         mov.b           &1,ENDFLAG(%a6)
5948                                                  5948 
5949 WORK:                                            5949 WORK:
5950 #--FIND THE REMAINDER OF (R,r) W.R.T.   2**L     5950 #--FIND THE REMAINDER OF (R,r) W.R.T.   2**L * (PI/2). L IS SO CHOSEN
5951 #--THAT INT( X * (2/PI) / 2**(L) ) < 2**29.      5951 #--THAT INT( X * (2/PI) / 2**(L) ) < 2**29.
5952                                                  5952 
5953 #--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(6    5953 #--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(63),
5954 #--2**L * (PIby2_1), 2**L * (PIby2_2)            5954 #--2**L * (PIby2_1), 2**L * (PIby2_2)
5955                                                  5955 
5956         mov.l           &0x00003FFE,%d2          5956         mov.l           &0x00003FFE,%d2         # BIASED EXP OF 2/PI
5957         sub.l           %d1,%d2                  5957         sub.l           %d1,%d2                 # BIASED EXP OF 2**(-L)*(2/PI)
5958                                                  5958 
5959         mov.l           &0xA2F9836E,FP_SCR0_H    5959         mov.l           &0xA2F9836E,FP_SCR0_HI(%a6)
5960         mov.l           &0x4E44152A,FP_SCR0_L    5960         mov.l           &0x4E44152A,FP_SCR0_LO(%a6)
5961         mov.w           %d2,FP_SCR0_EX(%a6)      5961         mov.w           %d2,FP_SCR0_EX(%a6)     # FP_SCR0 = 2**(-L)*(2/PI)
5962                                                  5962 
5963         fmov.x          %fp0,%fp2                5963         fmov.x          %fp0,%fp2
5964         fmul.x          FP_SCR0(%a6),%fp2        5964         fmul.x          FP_SCR0(%a6),%fp2       # fp2 = X * 2**(-L)*(2/PI)
5965                                                  5965 
5966 #--WE MUST NOW FIND INT(FP2). SINCE WE NEED T    5966 #--WE MUST NOW FIND INT(FP2). SINCE WE NEED THIS VALUE IN
5967 #--FLOATING POINT FORMAT, THE TWO FMOVE'S        5967 #--FLOATING POINT FORMAT, THE TWO FMOVE'S       FMOVE.L FP <--> N
5968 #--WILL BE TOO INEFFICIENT. THE WAY AROUND IT    5968 #--WILL BE TOO INEFFICIENT. THE WAY AROUND IT IS THAT
5969 #--(SIGN(INARG)*2**63   +       FP2) - SIGN(I    5969 #--(SIGN(INARG)*2**63   +       FP2) - SIGN(INARG)*2**63 WILL GIVE
5970 #--US THE DESIRED VALUE IN FLOATING POINT.       5970 #--US THE DESIRED VALUE IN FLOATING POINT.
5971         mov.l           %a1,%d2                  5971         mov.l           %a1,%d2
5972         swap            %d2                      5972         swap            %d2
5973         and.l           &0x80000000,%d2          5973         and.l           &0x80000000,%d2
5974         or.l            &0x5F000000,%d2          5974         or.l            &0x5F000000,%d2         # d2 = SIGN(INARG)*2**63 IN SGL
5975         mov.l           %d2,TWOTO63(%a6)         5975         mov.l           %d2,TWOTO63(%a6)
5976         fadd.s          TWOTO63(%a6),%fp2        5976         fadd.s          TWOTO63(%a6),%fp2       # THE FRACTIONAL PART OF FP1 IS ROUNDED
5977         fsub.s          TWOTO63(%a6),%fp2        5977         fsub.s          TWOTO63(%a6),%fp2       # fp2 = N
5978 #       fintrz.x        %fp2,%fp2                5978 #       fintrz.x        %fp2,%fp2
5979                                                  5979 
5980 #--CREATING 2**(L)*Piby2_1 and 2**(L)*Piby2_2    5980 #--CREATING 2**(L)*Piby2_1 and 2**(L)*Piby2_2
5981         mov.l           %d1,%d2                  5981         mov.l           %d1,%d2                 # d2 = L
5982                                                  5982 
5983         add.l           &0x00003FFF,%d2          5983         add.l           &0x00003FFF,%d2         # BIASED EXP OF 2**L * (PI/2)
5984         mov.w           %d2,FP_SCR0_EX(%a6)      5984         mov.w           %d2,FP_SCR0_EX(%a6)
5985         mov.l           &0xC90FDAA2,FP_SCR0_H    5985         mov.l           &0xC90FDAA2,FP_SCR0_HI(%a6)
5986         clr.l           FP_SCR0_LO(%a6)          5986         clr.l           FP_SCR0_LO(%a6)         # FP_SCR0 = 2**(L) * Piby2_1
5987                                                  5987 
5988         add.l           &0x00003FDD,%d1          5988         add.l           &0x00003FDD,%d1
5989         mov.w           %d1,FP_SCR1_EX(%a6)      5989         mov.w           %d1,FP_SCR1_EX(%a6)
5990         mov.l           &0x85A308D3,FP_SCR1_H    5990         mov.l           &0x85A308D3,FP_SCR1_HI(%a6)
5991         clr.l           FP_SCR1_LO(%a6)          5991         clr.l           FP_SCR1_LO(%a6)         # FP_SCR1 = 2**(L) * Piby2_2
5992                                                  5992 
5993         mov.b           ENDFLAG(%a6),%d1         5993         mov.b           ENDFLAG(%a6),%d1
5994                                                  5994 
5995 #--We are now ready to perform (R+r) - N*P1 -    5995 #--We are now ready to perform (R+r) - N*P1 - N*P2, P1 = 2**(L) * Piby2_1 and
5996 #--P2 = 2**(L) * Piby2_2                         5996 #--P2 = 2**(L) * Piby2_2
5997         fmov.x          %fp2,%fp4                5997         fmov.x          %fp2,%fp4               # fp4 = N
5998         fmul.x          FP_SCR0(%a6),%fp4        5998         fmul.x          FP_SCR0(%a6),%fp4       # fp4 = W = N*P1
5999         fmov.x          %fp2,%fp5                5999         fmov.x          %fp2,%fp5               # fp5 = N
6000         fmul.x          FP_SCR1(%a6),%fp5        6000         fmul.x          FP_SCR1(%a6),%fp5       # fp5 = w = N*P2
6001         fmov.x          %fp4,%fp3                6001         fmov.x          %fp4,%fp3               # fp3 = W = N*P1
6002                                                  6002 
6003 #--we want P+p = W+w  but  |p| <= half ulp of    6003 #--we want P+p = W+w  but  |p| <= half ulp of P
6004 #--Then, we need to compute  A := R-P   and      6004 #--Then, we need to compute  A := R-P   and  a := r-p
6005         fadd.x          %fp5,%fp3                6005         fadd.x          %fp5,%fp3               # fp3 = P
6006         fsub.x          %fp3,%fp4                6006         fsub.x          %fp3,%fp4               # fp4 = W-P
6007                                                  6007 
6008         fsub.x          %fp3,%fp0                6008         fsub.x          %fp3,%fp0               # fp0 = A := R - P
6009         fadd.x          %fp5,%fp4                6009         fadd.x          %fp5,%fp4               # fp4 = p = (W-P)+w
6010                                                  6010 
6011         fmov.x          %fp0,%fp3                6011         fmov.x          %fp0,%fp3               # fp3 = A
6012         fsub.x          %fp4,%fp1                6012         fsub.x          %fp4,%fp1               # fp1 = a := r - p
6013                                                  6013 
6014 #--Now we need to normalize (A,a) to  "new (R    6014 #--Now we need to normalize (A,a) to  "new (R,r)" where R+r = A+a but
6015 #--|r| <= half ulp of R.                         6015 #--|r| <= half ulp of R.
6016         fadd.x          %fp1,%fp0                6016         fadd.x          %fp1,%fp0               # fp0 = R := A+a
6017 #--No need to calculate r if this is the last    6017 #--No need to calculate r if this is the last loop
6018         cmp.b           %d1,&0                   6018         cmp.b           %d1,&0
6019         bgt.w           RESTORE                  6019         bgt.w           RESTORE
6020                                                  6020 
6021 #--Need to calculate r                           6021 #--Need to calculate r
6022         fsub.x          %fp0,%fp3                6022         fsub.x          %fp0,%fp3               # fp3 = A-R
6023         fadd.x          %fp3,%fp1                6023         fadd.x          %fp3,%fp1               # fp1 = r := (A-R)+a
6024         bra.w           LOOP                     6024         bra.w           LOOP
6025                                                  6025 
6026 RESTORE:                                         6026 RESTORE:
6027         fmov.l          %fp2,INT(%a6)            6027         fmov.l          %fp2,INT(%a6)
6028         mov.l           (%sp)+,%d2               6028         mov.l           (%sp)+,%d2              # restore d2
6029         fmovm.x         (%sp)+,&0x3c             6029         fmovm.x         (%sp)+,&0x3c            # restore {fp2-fp5}
6030                                                  6030 
6031         mov.l           INT(%a6),%d1             6031         mov.l           INT(%a6),%d1
6032         ror.l           &1,%d1                   6032         ror.l           &1,%d1
6033                                                  6033 
6034         bra.w           TANCONT                  6034         bra.w           TANCONT
6035                                                  6035 
6036 #############################################    6036 #########################################################################
6037 # satan():  computes the arctangent of a norm    6037 # satan():  computes the arctangent of a normalized number              #
6038 # satand(): computes the arctangent of a deno    6038 # satand(): computes the arctangent of a denormalized number            #
6039 #                                                6039 #                                                                       #
6040 # INPUT *************************************    6040 # INPUT *************************************************************** #
6041 #       a0 = pointer to extended precision in    6041 #       a0 = pointer to extended precision input                        #
6042 #       d0 = round precision,mode                6042 #       d0 = round precision,mode                                       #
6043 #                                                6043 #                                                                       #
6044 # OUTPUT ************************************    6044 # OUTPUT ************************************************************** #
6045 #       fp0 = arctan(X)                          6045 #       fp0 = arctan(X)                                                 #
6046 #                                                6046 #                                                                       #
6047 # ACCURACY and MONOTONICITY *****************    6047 # ACCURACY and MONOTONICITY ******************************************* #
6048 #       The returned result is within 2 ulps     6048 #       The returned result is within 2 ulps in 64 significant bit,     #
6049 #       i.e. within 0.5001 ulp to 53 bits if     6049 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
6050 #       rounded to double precision. The resu    6050 #       rounded to double precision. The result is provably monotonic   #
6051 #       in double precision.                     6051 #       in double precision.                                            #
6052 #                                                6052 #                                                                       #
6053 # ALGORITHM *********************************    6053 # ALGORITHM *********************************************************** #
6054 #       Step 1. If |X| >= 16 or |X| < 1/16, g    6054 #       Step 1. If |X| >= 16 or |X| < 1/16, go to Step 5.               #
6055 #                                                6055 #                                                                       #
6056 #       Step 2. Let X = sgn * 2**k * 1.xxxxxx    6056 #       Step 2. Let X = sgn * 2**k * 1.xxxxxxxx...x.                    #
6057 #               Note that k = -4, -3,..., or     6057 #               Note that k = -4, -3,..., or 3.                         #
6058 #               Define F = sgn * 2**k * 1.xxx    6058 #               Define F = sgn * 2**k * 1.xxxx1, i.e. the first 5       #
6059 #               significant bits of X with a     6059 #               significant bits of X with a bit-1 attached at the 6-th #
6060 #               bit position. Define u to be     6060 #               bit position. Define u to be u = (X-F) / (1 + X*F).     #
6061 #                                                6061 #                                                                       #
6062 #       Step 3. Approximate arctan(u) by a po    6062 #       Step 3. Approximate arctan(u) by a polynomial poly.             #
6063 #                                                6063 #                                                                       #
6064 #       Step 4. Return arctan(F) + poly, arct    6064 #       Step 4. Return arctan(F) + poly, arctan(F) is fetched from a    #
6065 #               table of values calculated be    6065 #               table of values calculated beforehand. Exit.            #
6066 #                                                6066 #                                                                       #
6067 #       Step 5. If |X| >= 16, go to Step 7.      6067 #       Step 5. If |X| >= 16, go to Step 7.                             #
6068 #                                                6068 #                                                                       #
6069 #       Step 6. Approximate arctan(X) by an o    6069 #       Step 6. Approximate arctan(X) by an odd polynomial in X. Exit.  #
6070 #                                                6070 #                                                                       #
6071 #       Step 7. Define X' = -1/X. Approximate    6071 #       Step 7. Define X' = -1/X. Approximate arctan(X') by an odd      #
6072 #               polynomial in X'.                6072 #               polynomial in X'.                                       #
6073 #               Arctan(X) = sign(X)*Pi/2 + ar    6073 #               Arctan(X) = sign(X)*Pi/2 + arctan(X'). Exit.            #
6074 #                                                6074 #                                                                       #
6075 #############################################    6075 #########################################################################
6076                                                  6076 
6077 ATANA3: long            0xBFF6687E,0x314987D8    6077 ATANA3: long            0xBFF6687E,0x314987D8
6078 ATANA2: long            0x4002AC69,0x34A26DB3    6078 ATANA2: long            0x4002AC69,0x34A26DB3
6079 ATANA1: long            0xBFC2476F,0x4E1DA28E    6079 ATANA1: long            0xBFC2476F,0x4E1DA28E
6080                                                  6080 
6081 ATANB6: long            0x3FB34444,0x7F876989    6081 ATANB6: long            0x3FB34444,0x7F876989
6082 ATANB5: long            0xBFB744EE,0x7FAF45DB    6082 ATANB5: long            0xBFB744EE,0x7FAF45DB
6083 ATANB4: long            0x3FBC71C6,0x46940220    6083 ATANB4: long            0x3FBC71C6,0x46940220
6084 ATANB3: long            0xBFC24924,0x921872F9    6084 ATANB3: long            0xBFC24924,0x921872F9
6085 ATANB2: long            0x3FC99999,0x99998FA9    6085 ATANB2: long            0x3FC99999,0x99998FA9
6086 ATANB1: long            0xBFD55555,0x55555555    6086 ATANB1: long            0xBFD55555,0x55555555
6087                                                  6087 
6088 ATANC5: long            0xBFB70BF3,0x98539E6A    6088 ATANC5: long            0xBFB70BF3,0x98539E6A
6089 ATANC4: long            0x3FBC7187,0x962D1D7D    6089 ATANC4: long            0x3FBC7187,0x962D1D7D
6090 ATANC3: long            0xBFC24924,0x827107B8    6090 ATANC3: long            0xBFC24924,0x827107B8
6091 ATANC2: long            0x3FC99999,0x9996263E    6091 ATANC2: long            0x3FC99999,0x9996263E
6092 ATANC1: long            0xBFD55555,0x55555536    6092 ATANC1: long            0xBFD55555,0x55555536
6093                                                  6093 
6094 PPIBY2: long            0x3FFF0000,0xC90FDAA2    6094 PPIBY2: long            0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
6095 NPIBY2: long            0xBFFF0000,0xC90FDAA2    6095 NPIBY2: long            0xBFFF0000,0xC90FDAA2,0x2168C235,0x00000000
6096                                                  6096 
6097 PTINY:  long            0x00010000,0x80000000    6097 PTINY:  long            0x00010000,0x80000000,0x00000000,0x00000000
6098 NTINY:  long            0x80010000,0x80000000    6098 NTINY:  long            0x80010000,0x80000000,0x00000000,0x00000000
6099                                                  6099 
6100 ATANTBL:                                         6100 ATANTBL:
6101         long            0x3FFB0000,0x83D152C5    6101         long            0x3FFB0000,0x83D152C5,0x060B7A51,0x00000000
6102         long            0x3FFB0000,0x8BC85445    6102         long            0x3FFB0000,0x8BC85445,0x65498B8B,0x00000000
6103         long            0x3FFB0000,0x93BE4060    6103         long            0x3FFB0000,0x93BE4060,0x17626B0D,0x00000000
6104         long            0x3FFB0000,0x9BB3078D    6104         long            0x3FFB0000,0x9BB3078D,0x35AEC202,0x00000000
6105         long            0x3FFB0000,0xA3A69A52    6105         long            0x3FFB0000,0xA3A69A52,0x5DDCE7DE,0x00000000
6106         long            0x3FFB0000,0xAB98E943    6106         long            0x3FFB0000,0xAB98E943,0x62765619,0x00000000
6107         long            0x3FFB0000,0xB389E502    6107         long            0x3FFB0000,0xB389E502,0xF9C59862,0x00000000
6108         long            0x3FFB0000,0xBB797E43    6108         long            0x3FFB0000,0xBB797E43,0x6B09E6FB,0x00000000
6109         long            0x3FFB0000,0xC367A5C7    6109         long            0x3FFB0000,0xC367A5C7,0x39E5F446,0x00000000
6110         long            0x3FFB0000,0xCB544C61    6110         long            0x3FFB0000,0xCB544C61,0xCFF7D5C6,0x00000000
6111         long            0x3FFB0000,0xD33F62F8    6111         long            0x3FFB0000,0xD33F62F8,0x2488533E,0x00000000
6112         long            0x3FFB0000,0xDB28DA81    6112         long            0x3FFB0000,0xDB28DA81,0x62404C77,0x00000000
6113         long            0x3FFB0000,0xE310A407    6113         long            0x3FFB0000,0xE310A407,0x8AD34F18,0x00000000
6114         long            0x3FFB0000,0xEAF6B0A8    6114         long            0x3FFB0000,0xEAF6B0A8,0x188EE1EB,0x00000000
6115         long            0x3FFB0000,0xF2DAF194    6115         long            0x3FFB0000,0xF2DAF194,0x9DBE79D5,0x00000000
6116         long            0x3FFB0000,0xFABD5813    6116         long            0x3FFB0000,0xFABD5813,0x61D47E3E,0x00000000
6117         long            0x3FFC0000,0x8346AC21    6117         long            0x3FFC0000,0x8346AC21,0x0959ECC4,0x00000000
6118         long            0x3FFC0000,0x8B232A08    6118         long            0x3FFC0000,0x8B232A08,0x304282D8,0x00000000
6119         long            0x3FFC0000,0x92FB70B8    6119         long            0x3FFC0000,0x92FB70B8,0xD29AE2F9,0x00000000
6120         long            0x3FFC0000,0x9ACF476F    6120         long            0x3FFC0000,0x9ACF476F,0x5CCD1CB4,0x00000000
6121         long            0x3FFC0000,0xA29E7630    6121         long            0x3FFC0000,0xA29E7630,0x4954F23F,0x00000000
6122         long            0x3FFC0000,0xAA68C5D0    6122         long            0x3FFC0000,0xAA68C5D0,0x8AB85230,0x00000000
6123         long            0x3FFC0000,0xB22DFFFD    6123         long            0x3FFC0000,0xB22DFFFD,0x9D539F83,0x00000000
6124         long            0x3FFC0000,0xB9EDEF45    6124         long            0x3FFC0000,0xB9EDEF45,0x3E900EA5,0x00000000
6125         long            0x3FFC0000,0xC1A85F1C    6125         long            0x3FFC0000,0xC1A85F1C,0xC75E3EA5,0x00000000
6126         long            0x3FFC0000,0xC95D1BE8    6126         long            0x3FFC0000,0xC95D1BE8,0x28138DE6,0x00000000
6127         long            0x3FFC0000,0xD10BF300    6127         long            0x3FFC0000,0xD10BF300,0x840D2DE4,0x00000000
6128         long            0x3FFC0000,0xD8B4B2BA    6128         long            0x3FFC0000,0xD8B4B2BA,0x6BC05E7A,0x00000000
6129         long            0x3FFC0000,0xE0572A6B    6129         long            0x3FFC0000,0xE0572A6B,0xB42335F6,0x00000000
6130         long            0x3FFC0000,0xE7F32A70    6130         long            0x3FFC0000,0xE7F32A70,0xEA9CAA8F,0x00000000
6131         long            0x3FFC0000,0xEF888432    6131         long            0x3FFC0000,0xEF888432,0x64ECEFAA,0x00000000
6132         long            0x3FFC0000,0xF7170A28    6132         long            0x3FFC0000,0xF7170A28,0xECC06666,0x00000000
6133         long            0x3FFD0000,0x812FD288    6133         long            0x3FFD0000,0x812FD288,0x332DAD32,0x00000000
6134         long            0x3FFD0000,0x88A8D1B1    6134         long            0x3FFD0000,0x88A8D1B1,0x218E4D64,0x00000000
6135         long            0x3FFD0000,0x9012AB3F    6135         long            0x3FFD0000,0x9012AB3F,0x23E4AEE8,0x00000000
6136         long            0x3FFD0000,0x976CC3D4    6136         long            0x3FFD0000,0x976CC3D4,0x11E7F1B9,0x00000000
6137         long            0x3FFD0000,0x9EB68949    6137         long            0x3FFD0000,0x9EB68949,0x3889A227,0x00000000
6138         long            0x3FFD0000,0xA5EF72C3    6138         long            0x3FFD0000,0xA5EF72C3,0x4487361B,0x00000000
6139         long            0x3FFD0000,0xAD1700BA    6139         long            0x3FFD0000,0xAD1700BA,0xF07A7227,0x00000000
6140         long            0x3FFD0000,0xB42CBCFA    6140         long            0x3FFD0000,0xB42CBCFA,0xFD37EFB7,0x00000000
6141         long            0x3FFD0000,0xBB303A94    6141         long            0x3FFD0000,0xBB303A94,0x0BA80F89,0x00000000
6142         long            0x3FFD0000,0xC22115C6    6142         long            0x3FFD0000,0xC22115C6,0xFCAEBBAF,0x00000000
6143         long            0x3FFD0000,0xC8FEF3E6    6143         long            0x3FFD0000,0xC8FEF3E6,0x86331221,0x00000000
6144         long            0x3FFD0000,0xCFC98330    6144         long            0x3FFD0000,0xCFC98330,0xB4000C70,0x00000000
6145         long            0x3FFD0000,0xD6807AA1    6145         long            0x3FFD0000,0xD6807AA1,0x102C5BF9,0x00000000
6146         long            0x3FFD0000,0xDD2399BC    6146         long            0x3FFD0000,0xDD2399BC,0x31252AA3,0x00000000
6147         long            0x3FFD0000,0xE3B2A855    6147         long            0x3FFD0000,0xE3B2A855,0x6B8FC517,0x00000000
6148         long            0x3FFD0000,0xEA2D764F    6148         long            0x3FFD0000,0xEA2D764F,0x64315989,0x00000000
6149         long            0x3FFD0000,0xF3BF5BF8    6149         long            0x3FFD0000,0xF3BF5BF8,0xBAD1A21D,0x00000000
6150         long            0x3FFE0000,0x801CE39E    6150         long            0x3FFE0000,0x801CE39E,0x0D205C9A,0x00000000
6151         long            0x3FFE0000,0x8630A2DA    6151         long            0x3FFE0000,0x8630A2DA,0xDA1ED066,0x00000000
6152         long            0x3FFE0000,0x8C1AD445    6152         long            0x3FFE0000,0x8C1AD445,0xF3E09B8C,0x00000000
6153         long            0x3FFE0000,0x91DB8F16    6153         long            0x3FFE0000,0x91DB8F16,0x64F350E2,0x00000000
6154         long            0x3FFE0000,0x97731420    6154         long            0x3FFE0000,0x97731420,0x365E538C,0x00000000
6155         long            0x3FFE0000,0x9CE1C8E6    6155         long            0x3FFE0000,0x9CE1C8E6,0xA0B8CDBA,0x00000000
6156         long            0x3FFE0000,0xA22832DB    6156         long            0x3FFE0000,0xA22832DB,0xCADAAE09,0x00000000
6157         long            0x3FFE0000,0xA746F2DD    6157         long            0x3FFE0000,0xA746F2DD,0xB7602294,0x00000000
6158         long            0x3FFE0000,0xAC3EC0FB    6158         long            0x3FFE0000,0xAC3EC0FB,0x997DD6A2,0x00000000
6159         long            0x3FFE0000,0xB110688A    6159         long            0x3FFE0000,0xB110688A,0xEBDC6F6A,0x00000000
6160         long            0x3FFE0000,0xB5BCC490    6160         long            0x3FFE0000,0xB5BCC490,0x59ECC4B0,0x00000000
6161         long            0x3FFE0000,0xBA44BC7D    6161         long            0x3FFE0000,0xBA44BC7D,0xD470782F,0x00000000
6162         long            0x3FFE0000,0xBEA94144    6162         long            0x3FFE0000,0xBEA94144,0xFD049AAC,0x00000000
6163         long            0x3FFE0000,0xC2EB4ABB    6163         long            0x3FFE0000,0xC2EB4ABB,0x661628B6,0x00000000
6164         long            0x3FFE0000,0xC70BD54C    6164         long            0x3FFE0000,0xC70BD54C,0xE602EE14,0x00000000
6165         long            0x3FFE0000,0xCD000549    6165         long            0x3FFE0000,0xCD000549,0xADEC7159,0x00000000
6166         long            0x3FFE0000,0xD48457D2    6166         long            0x3FFE0000,0xD48457D2,0xD8EA4EA3,0x00000000
6167         long            0x3FFE0000,0xDB948DA7    6167         long            0x3FFE0000,0xDB948DA7,0x12DECE3B,0x00000000
6168         long            0x3FFE0000,0xE23855F9    6168         long            0x3FFE0000,0xE23855F9,0x69E8096A,0x00000000
6169         long            0x3FFE0000,0xE8771129    6169         long            0x3FFE0000,0xE8771129,0xC4353259,0x00000000
6170         long            0x3FFE0000,0xEE57C16E    6170         long            0x3FFE0000,0xEE57C16E,0x0D379C0D,0x00000000
6171         long            0x3FFE0000,0xF3E10211    6171         long            0x3FFE0000,0xF3E10211,0xA87C3779,0x00000000
6172         long            0x3FFE0000,0xF919039D    6172         long            0x3FFE0000,0xF919039D,0x758B8D41,0x00000000
6173         long            0x3FFE0000,0xFE058B8F    6173         long            0x3FFE0000,0xFE058B8F,0x64935FB3,0x00000000
6174         long            0x3FFF0000,0x8155FB49    6174         long            0x3FFF0000,0x8155FB49,0x7B685D04,0x00000000
6175         long            0x3FFF0000,0x83889E35    6175         long            0x3FFF0000,0x83889E35,0x49D108E1,0x00000000
6176         long            0x3FFF0000,0x859CFA76    6176         long            0x3FFF0000,0x859CFA76,0x511D724B,0x00000000
6177         long            0x3FFF0000,0x87952ECF    6177         long            0x3FFF0000,0x87952ECF,0xFF8131E7,0x00000000
6178         long            0x3FFF0000,0x89732FD1    6178         long            0x3FFF0000,0x89732FD1,0x9557641B,0x00000000
6179         long            0x3FFF0000,0x8B38CAD1    6179         long            0x3FFF0000,0x8B38CAD1,0x01932A35,0x00000000
6180         long            0x3FFF0000,0x8CE7A8D8    6180         long            0x3FFF0000,0x8CE7A8D8,0x301EE6B5,0x00000000
6181         long            0x3FFF0000,0x8F46A39E    6181         long            0x3FFF0000,0x8F46A39E,0x2EAE5281,0x00000000
6182         long            0x3FFF0000,0x922DA7D7    6182         long            0x3FFF0000,0x922DA7D7,0x91888487,0x00000000
6183         long            0x3FFF0000,0x94D19FCB    6183         long            0x3FFF0000,0x94D19FCB,0xDEDF5241,0x00000000
6184         long            0x3FFF0000,0x973AB944    6184         long            0x3FFF0000,0x973AB944,0x19D2A08B,0x00000000
6185         long            0x3FFF0000,0x996FF00E    6185         long            0x3FFF0000,0x996FF00E,0x08E10B96,0x00000000
6186         long            0x3FFF0000,0x9B773F95    6186         long            0x3FFF0000,0x9B773F95,0x12321DA7,0x00000000
6187         long            0x3FFF0000,0x9D55CC32    6187         long            0x3FFF0000,0x9D55CC32,0x0F935624,0x00000000
6188         long            0x3FFF0000,0x9F100575    6188         long            0x3FFF0000,0x9F100575,0x006CC571,0x00000000
6189         long            0x3FFF0000,0xA0A9C290    6189         long            0x3FFF0000,0xA0A9C290,0xD97CC06C,0x00000000
6190         long            0x3FFF0000,0xA22659EB    6190         long            0x3FFF0000,0xA22659EB,0xEBC0630A,0x00000000
6191         long            0x3FFF0000,0xA388B4AF    6191         long            0x3FFF0000,0xA388B4AF,0xF6EF0EC9,0x00000000
6192         long            0x3FFF0000,0xA4D35F10    6192         long            0x3FFF0000,0xA4D35F10,0x61D292C4,0x00000000
6193         long            0x3FFF0000,0xA60895DC    6193         long            0x3FFF0000,0xA60895DC,0xFBE3187E,0x00000000
6194         long            0x3FFF0000,0xA72A51DC    6194         long            0x3FFF0000,0xA72A51DC,0x7367BEAC,0x00000000
6195         long            0x3FFF0000,0xA83A5153    6195         long            0x3FFF0000,0xA83A5153,0x0956168F,0x00000000
6196         long            0x3FFF0000,0xA93A2007    6196         long            0x3FFF0000,0xA93A2007,0x7539546E,0x00000000
6197         long            0x3FFF0000,0xAA9E7245    6197         long            0x3FFF0000,0xAA9E7245,0x023B2605,0x00000000
6198         long            0x3FFF0000,0xAC4C84BA    6198         long            0x3FFF0000,0xAC4C84BA,0x6FE4D58F,0x00000000
6199         long            0x3FFF0000,0xADCE4A4A    6199         long            0x3FFF0000,0xADCE4A4A,0x606B9712,0x00000000
6200         long            0x3FFF0000,0xAF2A2DCD    6200         long            0x3FFF0000,0xAF2A2DCD,0x8D263C9C,0x00000000
6201         long            0x3FFF0000,0xB0656F81    6201         long            0x3FFF0000,0xB0656F81,0xF22265C7,0x00000000
6202         long            0x3FFF0000,0xB1846515    6202         long            0x3FFF0000,0xB1846515,0x0F71496A,0x00000000
6203         long            0x3FFF0000,0xB28AAA15    6203         long            0x3FFF0000,0xB28AAA15,0x6F9ADA35,0x00000000
6204         long            0x3FFF0000,0xB37B44FF    6204         long            0x3FFF0000,0xB37B44FF,0x3766B895,0x00000000
6205         long            0x3FFF0000,0xB458C3DC    6205         long            0x3FFF0000,0xB458C3DC,0xE9630433,0x00000000
6206         long            0x3FFF0000,0xB525529D    6206         long            0x3FFF0000,0xB525529D,0x562246BD,0x00000000
6207         long            0x3FFF0000,0xB5E2CCA9    6207         long            0x3FFF0000,0xB5E2CCA9,0x5F9D88CC,0x00000000
6208         long            0x3FFF0000,0xB692CADA    6208         long            0x3FFF0000,0xB692CADA,0x7ACA1ADA,0x00000000
6209         long            0x3FFF0000,0xB736AEA7    6209         long            0x3FFF0000,0xB736AEA7,0xA6925838,0x00000000
6210         long            0x3FFF0000,0xB7CFAB28    6210         long            0x3FFF0000,0xB7CFAB28,0x7E9F7B36,0x00000000
6211         long            0x3FFF0000,0xB85ECC66    6211         long            0x3FFF0000,0xB85ECC66,0xCB219835,0x00000000
6212         long            0x3FFF0000,0xB8E4FD5A    6212         long            0x3FFF0000,0xB8E4FD5A,0x20A593DA,0x00000000
6213         long            0x3FFF0000,0xB99F41F6    6213         long            0x3FFF0000,0xB99F41F6,0x4AFF9BB5,0x00000000
6214         long            0x3FFF0000,0xBA7F1E17    6214         long            0x3FFF0000,0xBA7F1E17,0x842BBE7B,0x00000000
6215         long            0x3FFF0000,0xBB471285    6215         long            0x3FFF0000,0xBB471285,0x7637E17D,0x00000000
6216         long            0x3FFF0000,0xBBFABE8A    6216         long            0x3FFF0000,0xBBFABE8A,0x4788DF6F,0x00000000
6217         long            0x3FFF0000,0xBC9D0FAD    6217         long            0x3FFF0000,0xBC9D0FAD,0x2B689D79,0x00000000
6218         long            0x3FFF0000,0xBD306A39    6218         long            0x3FFF0000,0xBD306A39,0x471ECD86,0x00000000
6219         long            0x3FFF0000,0xBDB6C731    6219         long            0x3FFF0000,0xBDB6C731,0x856AF18A,0x00000000
6220         long            0x3FFF0000,0xBE31CAC5    6220         long            0x3FFF0000,0xBE31CAC5,0x02E80D70,0x00000000
6221         long            0x3FFF0000,0xBEA2D55C    6221         long            0x3FFF0000,0xBEA2D55C,0xE33194E2,0x00000000
6222         long            0x3FFF0000,0xBF0B10B7    6222         long            0x3FFF0000,0xBF0B10B7,0xC03128F0,0x00000000
6223         long            0x3FFF0000,0xBF6B7A18    6223         long            0x3FFF0000,0xBF6B7A18,0xDACB778D,0x00000000
6224         long            0x3FFF0000,0xBFC4EA46    6224         long            0x3FFF0000,0xBFC4EA46,0x63FA18F6,0x00000000
6225         long            0x3FFF0000,0xC0181BDE    6225         long            0x3FFF0000,0xC0181BDE,0x8B89A454,0x00000000
6226         long            0x3FFF0000,0xC065B066    6226         long            0x3FFF0000,0xC065B066,0xCFBF6439,0x00000000
6227         long            0x3FFF0000,0xC0AE345F    6227         long            0x3FFF0000,0xC0AE345F,0x56340AE6,0x00000000
6228         long            0x3FFF0000,0xC0F22291    6228         long            0x3FFF0000,0xC0F22291,0x9CB9E6A7,0x00000000
6229                                                  6229 
6230         set             X,FP_SCR0                6230         set             X,FP_SCR0
6231         set             XDCARE,X+2               6231         set             XDCARE,X+2
6232         set             XFRAC,X+4                6232         set             XFRAC,X+4
6233         set             XFRACLO,X+8              6233         set             XFRACLO,X+8
6234                                                  6234 
6235         set             ATANF,FP_SCR1            6235         set             ATANF,FP_SCR1
6236         set             ATANFHI,ATANF+4          6236         set             ATANFHI,ATANF+4
6237         set             ATANFLO,ATANF+8          6237         set             ATANFLO,ATANF+8
6238                                                  6238 
6239         global          satan                    6239         global          satan
6240 #--ENTRY POINT FOR ATAN(X), HERE X IS FINITE,    6240 #--ENTRY POINT FOR ATAN(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
6241 satan:                                           6241 satan:
6242         fmov.x          (%a0),%fp0               6242         fmov.x          (%a0),%fp0              # LOAD INPUT
6243                                                  6243 
6244         mov.l           (%a0),%d1                6244         mov.l           (%a0),%d1
6245         mov.w           4(%a0),%d1               6245         mov.w           4(%a0),%d1
6246         fmov.x          %fp0,X(%a6)              6246         fmov.x          %fp0,X(%a6)
6247         and.l           &0x7FFFFFFF,%d1          6247         and.l           &0x7FFFFFFF,%d1
6248                                                  6248 
6249         cmp.l           %d1,&0x3FFB8000          6249         cmp.l           %d1,&0x3FFB8000         # |X| >= 1/16?
6250         bge.b           ATANOK1                  6250         bge.b           ATANOK1
6251         bra.w           ATANSM                   6251         bra.w           ATANSM
6252                                                  6252 
6253 ATANOK1:                                         6253 ATANOK1:
6254         cmp.l           %d1,&0x4002FFFF          6254         cmp.l           %d1,&0x4002FFFF         # |X| < 16 ?
6255         ble.b           ATANMAIN                 6255         ble.b           ATANMAIN
6256         bra.w           ATANBIG                  6256         bra.w           ATANBIG
6257                                                  6257 
6258 #--THE MOST LIKELY CASE, |X| IN [1/16, 16). W    6258 #--THE MOST LIKELY CASE, |X| IN [1/16, 16). WE USE TABLE TECHNIQUE
6259 #--THE IDEA IS ATAN(X) = ATAN(F) + ATAN( [X-F    6259 #--THE IDEA IS ATAN(X) = ATAN(F) + ATAN( [X-F] / [1+XF] ).
6260 #--SO IF F IS CHOSEN TO BE CLOSE TO X AND ATA    6260 #--SO IF F IS CHOSEN TO BE CLOSE TO X AND ATAN(F) IS STORED IN
6261 #--A TABLE, ALL WE NEED IS TO APPROXIMATE ATA    6261 #--A TABLE, ALL WE NEED IS TO APPROXIMATE ATAN(U) WHERE
6262 #--U = (X-F)/(1+XF) IS SMALL (REMEMBER F IS C    6262 #--U = (X-F)/(1+XF) IS SMALL (REMEMBER F IS CLOSE TO X). IT IS
6263 #--TRUE THAT A DIVIDE IS NOW NEEDED, BUT THE     6263 #--TRUE THAT A DIVIDE IS NOW NEEDED, BUT THE APPROXIMATION FOR
6264 #--ATAN(U) IS A VERY SHORT POLYNOMIAL AND THE    6264 #--ATAN(U) IS A VERY SHORT POLYNOMIAL AND THE INDEXING TO
6265 #--FETCH F AND SAVING OF REGISTERS CAN BE ALL    6265 #--FETCH F AND SAVING OF REGISTERS CAN BE ALL HIDED UNDER THE
6266 #--DIVIDE. IN THE END THIS METHOD IS MUCH FAS    6266 #--DIVIDE. IN THE END THIS METHOD IS MUCH FASTER THAN A TRADITIONAL
6267 #--ONE. NOTE ALSO THAT THE TRADITIONAL SCHEME    6267 #--ONE. NOTE ALSO THAT THE TRADITIONAL SCHEME THAT APPROXIMATE
6268 #--ATAN(X) DIRECTLY WILL NEED TO USE A RATION    6268 #--ATAN(X) DIRECTLY WILL NEED TO USE A RATIONAL APPROXIMATION
6269 #--(DIVISION NEEDED) ANYWAY BECAUSE A POLYNOM    6269 #--(DIVISION NEEDED) ANYWAY BECAUSE A POLYNOMIAL APPROXIMATION
6270 #--WILL INVOLVE A VERY LONG POLYNOMIAL.          6270 #--WILL INVOLVE A VERY LONG POLYNOMIAL.
6271                                                  6271 
6272 #--NOW WE SEE X AS +-2^K * 1.BBBBBBB....B <-     6272 #--NOW WE SEE X AS +-2^K * 1.BBBBBBB....B <- 1. + 63 BITS
6273 #--WE CHOSE F TO BE +-2^K * 1.BBBB1              6273 #--WE CHOSE F TO BE +-2^K * 1.BBBB1
6274 #--THAT IS IT MATCHES THE EXPONENT AND FIRST     6274 #--THAT IS IT MATCHES THE EXPONENT AND FIRST 5 BITS OF X, THE
6275 #--SIXTH BITS IS SET TO BE 1. SINCE K = -4, -    6275 #--SIXTH BITS IS SET TO BE 1. SINCE K = -4, -3, ..., 3, THERE
6276 #--ARE ONLY 8 TIMES 16 = 2^7 = 128 |F|'S. SIN    6276 #--ARE ONLY 8 TIMES 16 = 2^7 = 128 |F|'S. SINCE ATAN(-|F|) IS
6277 #-- -ATAN(|F|), WE NEED TO STORE ONLY ATAN(|F    6277 #-- -ATAN(|F|), WE NEED TO STORE ONLY ATAN(|F|).
6278                                                  6278 
6279 ATANMAIN:                                        6279 ATANMAIN:
6280                                                  6280 
6281         and.l           &0xF8000000,XFRAC(%a6    6281         and.l           &0xF8000000,XFRAC(%a6)  # FIRST 5 BITS
6282         or.l            &0x04000000,XFRAC(%a6    6282         or.l            &0x04000000,XFRAC(%a6)  # SET 6-TH BIT TO 1
6283         mov.l           &0x00000000,XFRACLO(%    6283         mov.l           &0x00000000,XFRACLO(%a6) # LOCATION OF X IS NOW F
6284                                                  6284 
6285         fmov.x          %fp0,%fp1                6285         fmov.x          %fp0,%fp1               # FP1 IS X
6286         fmul.x          X(%a6),%fp1              6286         fmul.x          X(%a6),%fp1             # FP1 IS X*F, NOTE THAT X*F > 0
6287         fsub.x          X(%a6),%fp0              6287         fsub.x          X(%a6),%fp0             # FP0 IS X-F
6288         fadd.s          &0x3F800000,%fp1         6288         fadd.s          &0x3F800000,%fp1        # FP1 IS 1 + X*F
6289         fdiv.x          %fp1,%fp0                6289         fdiv.x          %fp1,%fp0               # FP0 IS U = (X-F)/(1+X*F)
6290                                                  6290 
6291 #--WHILE THE DIVISION IS TAKING ITS TIME, WE     6291 #--WHILE THE DIVISION IS TAKING ITS TIME, WE FETCH ATAN(|F|)
6292 #--CREATE ATAN(F) AND STORE IT IN ATANF, AND     6292 #--CREATE ATAN(F) AND STORE IT IN ATANF, AND
6293 #--SAVE REGISTERS FP2.                           6293 #--SAVE REGISTERS FP2.
6294                                                  6294 
6295         mov.l           %d2,-(%sp)               6295         mov.l           %d2,-(%sp)              # SAVE d2 TEMPORARILY
6296         mov.l           %d1,%d2                  6296         mov.l           %d1,%d2                 # THE EXP AND 16 BITS OF X
6297         and.l           &0x00007800,%d1          6297         and.l           &0x00007800,%d1         # 4 VARYING BITS OF F'S FRACTION
6298         and.l           &0x7FFF0000,%d2          6298         and.l           &0x7FFF0000,%d2         # EXPONENT OF F
6299         sub.l           &0x3FFB0000,%d2          6299         sub.l           &0x3FFB0000,%d2         # K+4
6300         asr.l           &1,%d2                   6300         asr.l           &1,%d2
6301         add.l           %d2,%d1                  6301         add.l           %d2,%d1                 # THE 7 BITS IDENTIFYING F
6302         asr.l           &7,%d1                   6302         asr.l           &7,%d1                  # INDEX INTO TBL OF ATAN(|F|)
6303         lea             ATANTBL(%pc),%a1         6303         lea             ATANTBL(%pc),%a1
6304         add.l           %d1,%a1                  6304         add.l           %d1,%a1                 # ADDRESS OF ATAN(|F|)
6305         mov.l           (%a1)+,ATANF(%a6)        6305         mov.l           (%a1)+,ATANF(%a6)
6306         mov.l           (%a1)+,ATANFHI(%a6)      6306         mov.l           (%a1)+,ATANFHI(%a6)
6307         mov.l           (%a1)+,ATANFLO(%a6)      6307         mov.l           (%a1)+,ATANFLO(%a6)     # ATANF IS NOW ATAN(|F|)
6308         mov.l           X(%a6),%d1               6308         mov.l           X(%a6),%d1              # LOAD SIGN AND EXPO. AGAIN
6309         and.l           &0x80000000,%d1          6309         and.l           &0x80000000,%d1         # SIGN(F)
6310         or.l            %d1,ATANF(%a6)           6310         or.l            %d1,ATANF(%a6)          # ATANF IS NOW SIGN(F)*ATAN(|F|)
6311         mov.l           (%sp)+,%d2               6311         mov.l           (%sp)+,%d2              # RESTORE d2
6312                                                  6312 
6313 #--THAT'S ALL I HAVE TO DO FOR NOW,              6313 #--THAT'S ALL I HAVE TO DO FOR NOW,
6314 #--BUT ALAS, THE DIVIDE IS STILL CRANKING!       6314 #--BUT ALAS, THE DIVIDE IS STILL CRANKING!
6315                                                  6315 
6316 #--U IN FP0, WE ARE NOW READY TO COMPUTE ATAN    6316 #--U IN FP0, WE ARE NOW READY TO COMPUTE ATAN(U) AS
6317 #--U + A1*U*V*(A2 + V*(A3 + V)), V = U*U         6317 #--U + A1*U*V*(A2 + V*(A3 + V)), V = U*U
6318 #--THE POLYNOMIAL MAY LOOK STRANGE, BUT IS NE    6318 #--THE POLYNOMIAL MAY LOOK STRANGE, BUT IS NEVERTHELESS CORRECT.
6319 #--THE NATURAL FORM IS U + U*V*(A1 + V*(A2 +     6319 #--THE NATURAL FORM IS U + U*V*(A1 + V*(A2 + V*A3))
6320 #--WHAT WE HAVE HERE IS MERELY  A1 = A3, A2 =    6320 #--WHAT WE HAVE HERE IS MERELY  A1 = A3, A2 = A1/A3, A3 = A2/A3.
6321 #--THE REASON FOR THIS REARRANGEMENT IS TO MA    6321 #--THE REASON FOR THIS REARRANGEMENT IS TO MAKE THE INDEPENDENT
6322 #--PARTS A1*U*V AND (A2 + ... STUFF) MORE LOA    6322 #--PARTS A1*U*V AND (A2 + ... STUFF) MORE LOAD-BALANCED
6323                                                  6323 
6324         fmovm.x         &0x04,-(%sp)             6324         fmovm.x         &0x04,-(%sp)            # save fp2
6325                                                  6325 
6326         fmov.x          %fp0,%fp1                6326         fmov.x          %fp0,%fp1
6327         fmul.x          %fp1,%fp1                6327         fmul.x          %fp1,%fp1
6328         fmov.d          ATANA3(%pc),%fp2         6328         fmov.d          ATANA3(%pc),%fp2
6329         fadd.x          %fp1,%fp2                6329         fadd.x          %fp1,%fp2               # A3+V
6330         fmul.x          %fp1,%fp2                6330         fmul.x          %fp1,%fp2               # V*(A3+V)
6331         fmul.x          %fp0,%fp1                6331         fmul.x          %fp0,%fp1               # U*V
6332         fadd.d          ATANA2(%pc),%fp2         6332         fadd.d          ATANA2(%pc),%fp2        # A2+V*(A3+V)
6333         fmul.d          ATANA1(%pc),%fp1         6333         fmul.d          ATANA1(%pc),%fp1        # A1*U*V
6334         fmul.x          %fp2,%fp1                6334         fmul.x          %fp2,%fp1               # A1*U*V*(A2+V*(A3+V))
6335         fadd.x          %fp1,%fp0                6335         fadd.x          %fp1,%fp0               # ATAN(U), FP1 RELEASED
6336                                                  6336 
6337         fmovm.x         (%sp)+,&0x20             6337         fmovm.x         (%sp)+,&0x20            # restore fp2
6338                                                  6338 
6339         fmov.l          %d0,%fpcr                6339         fmov.l          %d0,%fpcr               # restore users rnd mode,prec
6340         fadd.x          ATANF(%a6),%fp0          6340         fadd.x          ATANF(%a6),%fp0         # ATAN(X)
6341         bra             t_inx2                   6341         bra             t_inx2
6342                                                  6342 
6343 ATANBORS:                                        6343 ATANBORS:
6344 #--|X| IS IN d0 IN COMPACT FORM. FP1, d0 SAVE    6344 #--|X| IS IN d0 IN COMPACT FORM. FP1, d0 SAVED.
6345 #--FP0 IS X AND |X| <= 1/16 OR |X| >= 16.        6345 #--FP0 IS X AND |X| <= 1/16 OR |X| >= 16.
6346         cmp.l           %d1,&0x3FFF8000          6346         cmp.l           %d1,&0x3FFF8000
6347         bgt.w           ATANBIG                  6347         bgt.w           ATANBIG                 # I.E. |X| >= 16
6348                                                  6348 
6349 ATANSM:                                          6349 ATANSM:
6350 #--|X| <= 1/16                                   6350 #--|X| <= 1/16
6351 #--IF |X| < 2^(-40), RETURN X AS ANSWER. OTHE    6351 #--IF |X| < 2^(-40), RETURN X AS ANSWER. OTHERWISE, APPROXIMATE
6352 #--ATAN(X) BY X + X*Y*(B1+Y*(B2+Y*(B3+Y*(B4+Y    6352 #--ATAN(X) BY X + X*Y*(B1+Y*(B2+Y*(B3+Y*(B4+Y*(B5+Y*B6)))))
6353 #--WHICH IS X + X*Y*( [B1+Z*(B3+Z*B5)] + [Y*(    6353 #--WHICH IS X + X*Y*( [B1+Z*(B3+Z*B5)] + [Y*(B2+Z*(B4+Z*B6)] )
6354 #--WHERE Y = X*X, AND Z = Y*Y.                   6354 #--WHERE Y = X*X, AND Z = Y*Y.
6355                                                  6355 
6356         cmp.l           %d1,&0x3FD78000          6356         cmp.l           %d1,&0x3FD78000
6357         blt.w           ATANTINY                 6357         blt.w           ATANTINY
6358                                                  6358 
6359 #--COMPUTE POLYNOMIAL                            6359 #--COMPUTE POLYNOMIAL
6360         fmovm.x         &0x0c,-(%sp)             6360         fmovm.x         &0x0c,-(%sp)            # save fp2/fp3
6361                                                  6361 
6362         fmul.x          %fp0,%fp0                6362         fmul.x          %fp0,%fp0               # FPO IS Y = X*X
6363                                                  6363 
6364         fmov.x          %fp0,%fp1                6364         fmov.x          %fp0,%fp1
6365         fmul.x          %fp1,%fp1                6365         fmul.x          %fp1,%fp1               # FP1 IS Z = Y*Y
6366                                                  6366 
6367         fmov.d          ATANB6(%pc),%fp2         6367         fmov.d          ATANB6(%pc),%fp2
6368         fmov.d          ATANB5(%pc),%fp3         6368         fmov.d          ATANB5(%pc),%fp3
6369                                                  6369 
6370         fmul.x          %fp1,%fp2                6370         fmul.x          %fp1,%fp2               # Z*B6
6371         fmul.x          %fp1,%fp3                6371         fmul.x          %fp1,%fp3               # Z*B5
6372                                                  6372 
6373         fadd.d          ATANB4(%pc),%fp2         6373         fadd.d          ATANB4(%pc),%fp2        # B4+Z*B6
6374         fadd.d          ATANB3(%pc),%fp3         6374         fadd.d          ATANB3(%pc),%fp3        # B3+Z*B5
6375                                                  6375 
6376         fmul.x          %fp1,%fp2                6376         fmul.x          %fp1,%fp2               # Z*(B4+Z*B6)
6377         fmul.x          %fp3,%fp1                6377         fmul.x          %fp3,%fp1               # Z*(B3+Z*B5)
6378                                                  6378 
6379         fadd.d          ATANB2(%pc),%fp2         6379         fadd.d          ATANB2(%pc),%fp2        # B2+Z*(B4+Z*B6)
6380         fadd.d          ATANB1(%pc),%fp1         6380         fadd.d          ATANB1(%pc),%fp1        # B1+Z*(B3+Z*B5)
6381                                                  6381 
6382         fmul.x          %fp0,%fp2                6382         fmul.x          %fp0,%fp2               # Y*(B2+Z*(B4+Z*B6))
6383         fmul.x          X(%a6),%fp0              6383         fmul.x          X(%a6),%fp0             # X*Y
6384                                                  6384 
6385         fadd.x          %fp2,%fp1                6385         fadd.x          %fp2,%fp1               # [B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))]
6386                                                  6386 
6387         fmul.x          %fp1,%fp0                6387         fmul.x          %fp1,%fp0               # X*Y*([B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))])
6388                                                  6388 
6389         fmovm.x         (%sp)+,&0x30             6389         fmovm.x         (%sp)+,&0x30            # restore fp2/fp3
6390                                                  6390 
6391         fmov.l          %d0,%fpcr                6391         fmov.l          %d0,%fpcr               # restore users rnd mode,prec
6392         fadd.x          X(%a6),%fp0              6392         fadd.x          X(%a6),%fp0
6393         bra             t_inx2                   6393         bra             t_inx2
6394                                                  6394 
6395 ATANTINY:                                        6395 ATANTINY:
6396 #--|X| < 2^(-40), ATAN(X) = X                    6396 #--|X| < 2^(-40), ATAN(X) = X
6397                                                  6397 
6398         fmov.l          %d0,%fpcr                6398         fmov.l          %d0,%fpcr               # restore users rnd mode,prec
6399         mov.b           &FMOV_OP,%d1             6399         mov.b           &FMOV_OP,%d1            # last inst is MOVE
6400         fmov.x          X(%a6),%fp0              6400         fmov.x          X(%a6),%fp0             # last inst - possible exception set
6401                                                  6401 
6402         bra             t_catch                  6402         bra             t_catch
6403                                                  6403 
6404 ATANBIG:                                         6404 ATANBIG:
6405 #--IF |X| > 2^(100), RETURN     SIGN(X)*(PI/2    6405 #--IF |X| > 2^(100), RETURN     SIGN(X)*(PI/2 - TINY). OTHERWISE,
6406 #--RETURN SIGN(X)*PI/2 + ATAN(-1/X).             6406 #--RETURN SIGN(X)*PI/2 + ATAN(-1/X).
6407         cmp.l           %d1,&0x40638000          6407         cmp.l           %d1,&0x40638000
6408         bgt.w           ATANHUGE                 6408         bgt.w           ATANHUGE
6409                                                  6409 
6410 #--APPROXIMATE ATAN(-1/X) BY                     6410 #--APPROXIMATE ATAN(-1/X) BY
6411 #--X'+X'*Y*(C1+Y*(C2+Y*(C3+Y*(C4+Y*C5)))), X'    6411 #--X'+X'*Y*(C1+Y*(C2+Y*(C3+Y*(C4+Y*C5)))), X' = -1/X, Y = X'*X'
6412 #--THIS CAN BE RE-WRITTEN AS                     6412 #--THIS CAN BE RE-WRITTEN AS
6413 #--X'+X'*Y*( [C1+Z*(C3+Z*C5)] + [Y*(C2+Z*C4)]    6413 #--X'+X'*Y*( [C1+Z*(C3+Z*C5)] + [Y*(C2+Z*C4)] ), Z = Y*Y.
6414                                                  6414 
6415         fmovm.x         &0x0c,-(%sp)             6415         fmovm.x         &0x0c,-(%sp)            # save fp2/fp3
6416                                                  6416 
6417         fmov.s          &0xBF800000,%fp1         6417         fmov.s          &0xBF800000,%fp1        # LOAD -1
6418         fdiv.x          %fp0,%fp1                6418         fdiv.x          %fp0,%fp1               # FP1 IS -1/X
6419                                                  6419 
6420 #--DIVIDE IS STILL CRANKING                      6420 #--DIVIDE IS STILL CRANKING
6421                                                  6421 
6422         fmov.x          %fp1,%fp0                6422         fmov.x          %fp1,%fp0               # FP0 IS X'
6423         fmul.x          %fp0,%fp0                6423         fmul.x          %fp0,%fp0               # FP0 IS Y = X'*X'
6424         fmov.x          %fp1,X(%a6)              6424         fmov.x          %fp1,X(%a6)             # X IS REALLY X'
6425                                                  6425 
6426         fmov.x          %fp0,%fp1                6426         fmov.x          %fp0,%fp1
6427         fmul.x          %fp1,%fp1                6427         fmul.x          %fp1,%fp1               # FP1 IS Z = Y*Y
6428                                                  6428 
6429         fmov.d          ATANC5(%pc),%fp3         6429         fmov.d          ATANC5(%pc),%fp3
6430         fmov.d          ATANC4(%pc),%fp2         6430         fmov.d          ATANC4(%pc),%fp2
6431                                                  6431 
6432         fmul.x          %fp1,%fp3                6432         fmul.x          %fp1,%fp3               # Z*C5
6433         fmul.x          %fp1,%fp2                6433         fmul.x          %fp1,%fp2               # Z*B4
6434                                                  6434 
6435         fadd.d          ATANC3(%pc),%fp3         6435         fadd.d          ATANC3(%pc),%fp3        # C3+Z*C5
6436         fadd.d          ATANC2(%pc),%fp2         6436         fadd.d          ATANC2(%pc),%fp2        # C2+Z*C4
6437                                                  6437 
6438         fmul.x          %fp3,%fp1                6438         fmul.x          %fp3,%fp1               # Z*(C3+Z*C5), FP3 RELEASED
6439         fmul.x          %fp0,%fp2                6439         fmul.x          %fp0,%fp2               # Y*(C2+Z*C4)
6440                                                  6440 
6441         fadd.d          ATANC1(%pc),%fp1         6441         fadd.d          ATANC1(%pc),%fp1        # C1+Z*(C3+Z*C5)
6442         fmul.x          X(%a6),%fp0              6442         fmul.x          X(%a6),%fp0             # X'*Y
6443                                                  6443 
6444         fadd.x          %fp2,%fp1                6444         fadd.x          %fp2,%fp1               # [Y*(C2+Z*C4)]+[C1+Z*(C3+Z*C5)]
6445                                                  6445 
6446         fmul.x          %fp1,%fp0                6446         fmul.x          %fp1,%fp0               # X'*Y*([B1+Z*(B3+Z*B5)]
6447 #                                       ...      6447 #                                       ...     +[Y*(B2+Z*(B4+Z*B6))])
6448         fadd.x          X(%a6),%fp0              6448         fadd.x          X(%a6),%fp0
6449                                                  6449 
6450         fmovm.x         (%sp)+,&0x30             6450         fmovm.x         (%sp)+,&0x30            # restore fp2/fp3
6451                                                  6451 
6452         fmov.l          %d0,%fpcr                6452         fmov.l          %d0,%fpcr               # restore users rnd mode,prec
6453         tst.b           (%a0)                    6453         tst.b           (%a0)
6454         bpl.b           pos_big                  6454         bpl.b           pos_big
6455                                                  6455 
6456 neg_big:                                         6456 neg_big:
6457         fadd.x          NPIBY2(%pc),%fp0         6457         fadd.x          NPIBY2(%pc),%fp0
6458         bra             t_minx2                  6458         bra             t_minx2
6459                                                  6459 
6460 pos_big:                                         6460 pos_big:
6461         fadd.x          PPIBY2(%pc),%fp0         6461         fadd.x          PPIBY2(%pc),%fp0
6462         bra             t_pinx2                  6462         bra             t_pinx2
6463                                                  6463 
6464 ATANHUGE:                                        6464 ATANHUGE:
6465 #--RETURN SIGN(X)*(PIBY2 - TINY) = SIGN(X)*PI    6465 #--RETURN SIGN(X)*(PIBY2 - TINY) = SIGN(X)*PIBY2 - SIGN(X)*TINY
6466         tst.b           (%a0)                    6466         tst.b           (%a0)
6467         bpl.b           pos_huge                 6467         bpl.b           pos_huge
6468                                                  6468 
6469 neg_huge:                                        6469 neg_huge:
6470         fmov.x          NPIBY2(%pc),%fp0         6470         fmov.x          NPIBY2(%pc),%fp0
6471         fmov.l          %d0,%fpcr                6471         fmov.l          %d0,%fpcr
6472         fadd.x          PTINY(%pc),%fp0          6472         fadd.x          PTINY(%pc),%fp0
6473         bra             t_minx2                  6473         bra             t_minx2
6474                                                  6474 
6475 pos_huge:                                        6475 pos_huge:
6476         fmov.x          PPIBY2(%pc),%fp0         6476         fmov.x          PPIBY2(%pc),%fp0
6477         fmov.l          %d0,%fpcr                6477         fmov.l          %d0,%fpcr
6478         fadd.x          NTINY(%pc),%fp0          6478         fadd.x          NTINY(%pc),%fp0
6479         bra             t_pinx2                  6479         bra             t_pinx2
6480                                                  6480 
6481         global          satand                   6481         global          satand
6482 #--ENTRY POINT FOR ATAN(X) FOR DENORMALIZED A    6482 #--ENTRY POINT FOR ATAN(X) FOR DENORMALIZED ARGUMENT
6483 satand:                                          6483 satand:
6484         bra             t_extdnrm                6484         bra             t_extdnrm
6485                                                  6485 
6486 #############################################    6486 #########################################################################
6487 # sasin():  computes the inverse sine of a no    6487 # sasin():  computes the inverse sine of a normalized input             #
6488 # sasind(): computes the inverse sine of a de    6488 # sasind(): computes the inverse sine of a denormalized input           #
6489 #                                                6489 #                                                                       #
6490 # INPUT *************************************    6490 # INPUT *************************************************************** #
6491 #       a0 = pointer to extended precision in    6491 #       a0 = pointer to extended precision input                        #
6492 #       d0 = round precision,mode                6492 #       d0 = round precision,mode                                       #
6493 #                                                6493 #                                                                       #
6494 # OUTPUT ************************************    6494 # OUTPUT ************************************************************** #
6495 #       fp0 = arcsin(X)                          6495 #       fp0 = arcsin(X)                                                 #
6496 #                                                6496 #                                                                       #
6497 # ACCURACY and MONOTONICITY *****************    6497 # ACCURACY and MONOTONICITY ******************************************* #
6498 #       The returned result is within 3 ulps     6498 #       The returned result is within 3 ulps in 64 significant bit,     #
6499 #       i.e. within 0.5001 ulp to 53 bits if     6499 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
6500 #       rounded to double precision. The resu    6500 #       rounded to double precision. The result is provably monotonic   #
6501 #       in double precision.                     6501 #       in double precision.                                            #
6502 #                                                6502 #                                                                       #
6503 # ALGORITHM *********************************    6503 # ALGORITHM *********************************************************** #
6504 #                                                6504 #                                                                       #
6505 #       ASIN                                     6505 #       ASIN                                                            #
6506 #       1. If |X| >= 1, go to 3.                 6506 #       1. If |X| >= 1, go to 3.                                        #
6507 #                                                6507 #                                                                       #
6508 #       2. (|X| < 1) Calculate asin(X) by        6508 #       2. (|X| < 1) Calculate asin(X) by                               #
6509 #               z := sqrt( [1-X][1+X] )          6509 #               z := sqrt( [1-X][1+X] )                                 #
6510 #               asin(X) = atan( x / z ).         6510 #               asin(X) = atan( x / z ).                                #
6511 #               Exit.                            6511 #               Exit.                                                   #
6512 #                                                6512 #                                                                       #
6513 #       3. If |X| > 1, go to 5.                  6513 #       3. If |X| > 1, go to 5.                                         #
6514 #                                                6514 #                                                                       #
6515 #       4. (|X| = 1) sgn := sign(X), return a    6515 #       4. (|X| = 1) sgn := sign(X), return asin(X) := sgn * Pi/2. Exit.#
6516 #                                                6516 #                                                                       #
6517 #       5. (|X| > 1) Generate an invalid oper    6517 #       5. (|X| > 1) Generate an invalid operation by 0 * infinity.     #
6518 #               Exit.                            6518 #               Exit.                                                   #
6519 #                                                6519 #                                                                       #
6520 #############################################    6520 #########################################################################
6521                                                  6521 
6522         global          sasin                    6522         global          sasin
6523 sasin:                                           6523 sasin:
6524         fmov.x          (%a0),%fp0               6524         fmov.x          (%a0),%fp0              # LOAD INPUT
6525                                                  6525 
6526         mov.l           (%a0),%d1                6526         mov.l           (%a0),%d1
6527         mov.w           4(%a0),%d1               6527         mov.w           4(%a0),%d1
6528         and.l           &0x7FFFFFFF,%d1          6528         and.l           &0x7FFFFFFF,%d1
6529         cmp.l           %d1,&0x3FFF8000          6529         cmp.l           %d1,&0x3FFF8000
6530         bge.b           ASINBIG                  6530         bge.b           ASINBIG
6531                                                  6531 
6532 # This catch is added here for the '060 QSP.     6532 # This catch is added here for the '060 QSP. Originally, the call to
6533 # satan() would handle this case by causing t    6533 # satan() would handle this case by causing the exception which would
6534 # not be caught until gen_except(). Now, with    6534 # not be caught until gen_except(). Now, with the exceptions being
6535 # detected inside of satan(), the exception w    6535 # detected inside of satan(), the exception would have been handled there
6536 # instead of inside sasin() as expected.         6536 # instead of inside sasin() as expected.
6537         cmp.l           %d1,&0x3FD78000          6537         cmp.l           %d1,&0x3FD78000
6538         blt.w           ASINTINY                 6538         blt.w           ASINTINY
6539                                                  6539 
6540 #--THIS IS THE USUAL CASE, |X| < 1               6540 #--THIS IS THE USUAL CASE, |X| < 1
6541 #--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) )      6541 #--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) )
6542                                                  6542 
6543 ASINMAIN:                                        6543 ASINMAIN:
6544         fmov.s          &0x3F800000,%fp1         6544         fmov.s          &0x3F800000,%fp1
6545         fsub.x          %fp0,%fp1                6545         fsub.x          %fp0,%fp1               # 1-X
6546         fmovm.x         &0x4,-(%sp)              6546         fmovm.x         &0x4,-(%sp)             #  {fp2}
6547         fmov.s          &0x3F800000,%fp2         6547         fmov.s          &0x3F800000,%fp2
6548         fadd.x          %fp0,%fp2                6548         fadd.x          %fp0,%fp2               # 1+X
6549         fmul.x          %fp2,%fp1                6549         fmul.x          %fp2,%fp1               # (1+X)(1-X)
6550         fmovm.x         (%sp)+,&0x20             6550         fmovm.x         (%sp)+,&0x20            #  {fp2}
6551         fsqrt.x         %fp1                     6551         fsqrt.x         %fp1                    # SQRT([1-X][1+X])
6552         fdiv.x          %fp1,%fp0                6552         fdiv.x          %fp1,%fp0               # X/SQRT([1-X][1+X])
6553         fmovm.x         &0x01,-(%sp)             6553         fmovm.x         &0x01,-(%sp)            # save X/SQRT(...)
6554         lea             (%sp),%a0                6554         lea             (%sp),%a0               # pass ptr to X/SQRT(...)
6555         bsr             satan                    6555         bsr             satan
6556         add.l           &0xc,%sp                 6556         add.l           &0xc,%sp                # clear X/SQRT(...) from stack
6557         bra             t_inx2                   6557         bra             t_inx2
6558                                                  6558 
6559 ASINBIG:                                         6559 ASINBIG:
6560         fabs.x          %fp0                     6560         fabs.x          %fp0                    # |X|
6561         fcmp.s          %fp0,&0x3F800000         6561         fcmp.s          %fp0,&0x3F800000
6562         fbgt            t_operr                  6562         fbgt            t_operr                 # cause an operr exception
6563                                                  6563 
6564 #--|X| = 1, ASIN(X) = +- PI/2.                   6564 #--|X| = 1, ASIN(X) = +- PI/2.
6565 ASINONE:                                         6565 ASINONE:
6566         fmov.x          PIBY2(%pc),%fp0          6566         fmov.x          PIBY2(%pc),%fp0
6567         mov.l           (%a0),%d1                6567         mov.l           (%a0),%d1
6568         and.l           &0x80000000,%d1          6568         and.l           &0x80000000,%d1         # SIGN BIT OF X
6569         or.l            &0x3F800000,%d1          6569         or.l            &0x3F800000,%d1         # +-1 IN SGL FORMAT
6570         mov.l           %d1,-(%sp)               6570         mov.l           %d1,-(%sp)              # push SIGN(X) IN SGL-FMT
6571         fmov.l          %d0,%fpcr                6571         fmov.l          %d0,%fpcr
6572         fmul.s          (%sp)+,%fp0              6572         fmul.s          (%sp)+,%fp0
6573         bra             t_inx2                   6573         bra             t_inx2
6574                                                  6574 
6575 #--|X| < 2^(-40), ATAN(X) = X                    6575 #--|X| < 2^(-40), ATAN(X) = X
6576 ASINTINY:                                        6576 ASINTINY:
6577         fmov.l          %d0,%fpcr                6577         fmov.l          %d0,%fpcr               # restore users rnd mode,prec
6578         mov.b           &FMOV_OP,%d1             6578         mov.b           &FMOV_OP,%d1            # last inst is MOVE
6579         fmov.x          (%a0),%fp0               6579         fmov.x          (%a0),%fp0              # last inst - possible exception
6580         bra             t_catch                  6580         bra             t_catch
6581                                                  6581 
6582         global          sasind                   6582         global          sasind
6583 #--ASIN(X) = X FOR DENORMALIZED X                6583 #--ASIN(X) = X FOR DENORMALIZED X
6584 sasind:                                          6584 sasind:
6585         bra             t_extdnrm                6585         bra             t_extdnrm
6586                                                  6586 
6587 #############################################    6587 #########################################################################
6588 # sacos():  computes the inverse cosine of a     6588 # sacos():  computes the inverse cosine of a normalized input           #
6589 # sacosd(): computes the inverse cosine of a     6589 # sacosd(): computes the inverse cosine of a denormalized input         #
6590 #                                                6590 #                                                                       #
6591 # INPUT *************************************    6591 # INPUT *************************************************************** #
6592 #       a0 = pointer to extended precision in    6592 #       a0 = pointer to extended precision input                        #
6593 #       d0 = round precision,mode                6593 #       d0 = round precision,mode                                       #
6594 #                                                6594 #                                                                       #
6595 # OUTPUT ************************************    6595 # OUTPUT ************************************************************** #
6596 #       fp0 = arccos(X)                          6596 #       fp0 = arccos(X)                                                 #
6597 #                                                6597 #                                                                       #
6598 # ACCURACY and MONOTONICITY *****************    6598 # ACCURACY and MONOTONICITY ******************************************* #
6599 #       The returned result is within 3 ulps     6599 #       The returned result is within 3 ulps in 64 significant bit,     #
6600 #       i.e. within 0.5001 ulp to 53 bits if     6600 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
6601 #       rounded to double precision. The resu    6601 #       rounded to double precision. The result is provably monotonic   #
6602 #       in double precision.                     6602 #       in double precision.                                            #
6603 #                                                6603 #                                                                       #
6604 # ALGORITHM *********************************    6604 # ALGORITHM *********************************************************** #
6605 #                                                6605 #                                                                       #
6606 #       ACOS                                     6606 #       ACOS                                                            #
6607 #       1. If |X| >= 1, go to 3.                 6607 #       1. If |X| >= 1, go to 3.                                        #
6608 #                                                6608 #                                                                       #
6609 #       2. (|X| < 1) Calculate acos(X) by        6609 #       2. (|X| < 1) Calculate acos(X) by                               #
6610 #               z := (1-X) / (1+X)               6610 #               z := (1-X) / (1+X)                                      #
6611 #               acos(X) = 2 * atan( sqrt(z) )    6611 #               acos(X) = 2 * atan( sqrt(z) ).                          #
6612 #               Exit.                            6612 #               Exit.                                                   #
6613 #                                                6613 #                                                                       #
6614 #       3. If |X| > 1, go to 5.                  6614 #       3. If |X| > 1, go to 5.                                         #
6615 #                                                6615 #                                                                       #
6616 #       4. (|X| = 1) If X > 0, return 0. Othe    6616 #       4. (|X| = 1) If X > 0, return 0. Otherwise, return Pi. Exit.    #
6617 #                                                6617 #                                                                       #
6618 #       5. (|X| > 1) Generate an invalid oper    6618 #       5. (|X| > 1) Generate an invalid operation by 0 * infinity.     #
6619 #               Exit.                            6619 #               Exit.                                                   #
6620 #                                                6620 #                                                                       #
6621 #############################################    6621 #########################################################################
6622                                                  6622 
6623         global          sacos                    6623         global          sacos
6624 sacos:                                           6624 sacos:
6625         fmov.x          (%a0),%fp0               6625         fmov.x          (%a0),%fp0              # LOAD INPUT
6626                                                  6626 
6627         mov.l           (%a0),%d1                6627         mov.l           (%a0),%d1               # pack exp w/ upper 16 fraction
6628         mov.w           4(%a0),%d1               6628         mov.w           4(%a0),%d1
6629         and.l           &0x7FFFFFFF,%d1          6629         and.l           &0x7FFFFFFF,%d1
6630         cmp.l           %d1,&0x3FFF8000          6630         cmp.l           %d1,&0x3FFF8000
6631         bge.b           ACOSBIG                  6631         bge.b           ACOSBIG
6632                                                  6632 
6633 #--THIS IS THE USUAL CASE, |X| < 1               6633 #--THIS IS THE USUAL CASE, |X| < 1
6634 #--ACOS(X) = 2 * ATAN(  SQRT( (1-X)/(1+X) ) )    6634 #--ACOS(X) = 2 * ATAN(  SQRT( (1-X)/(1+X) ) )
6635                                                  6635 
6636 ACOSMAIN:                                        6636 ACOSMAIN:
6637         fmov.s          &0x3F800000,%fp1         6637         fmov.s          &0x3F800000,%fp1
6638         fadd.x          %fp0,%fp1                6638         fadd.x          %fp0,%fp1               # 1+X
6639         fneg.x          %fp0                     6639         fneg.x          %fp0                    # -X
6640         fadd.s          &0x3F800000,%fp0         6640         fadd.s          &0x3F800000,%fp0        # 1-X
6641         fdiv.x          %fp1,%fp0                6641         fdiv.x          %fp1,%fp0               # (1-X)/(1+X)
6642         fsqrt.x         %fp0                     6642         fsqrt.x         %fp0                    # SQRT((1-X)/(1+X))
6643         mov.l           %d0,-(%sp)               6643         mov.l           %d0,-(%sp)              # save original users fpcr
6644         clr.l           %d0                      6644         clr.l           %d0
6645         fmovm.x         &0x01,-(%sp)             6645         fmovm.x         &0x01,-(%sp)            # save SQRT(...) to stack
6646         lea             (%sp),%a0                6646         lea             (%sp),%a0               # pass ptr to sqrt
6647         bsr             satan                    6647         bsr             satan                   # ATAN(SQRT([1-X]/[1+X]))
6648         add.l           &0xc,%sp                 6648         add.l           &0xc,%sp                # clear SQRT(...) from stack
6649                                                  6649 
6650         fmov.l          (%sp)+,%fpcr             6650         fmov.l          (%sp)+,%fpcr            # restore users round prec,mode
6651         fadd.x          %fp0,%fp0                6651         fadd.x          %fp0,%fp0               # 2 * ATAN( STUFF )
6652         bra             t_pinx2                  6652         bra             t_pinx2
6653                                                  6653 
6654 ACOSBIG:                                         6654 ACOSBIG:
6655         fabs.x          %fp0                     6655         fabs.x          %fp0
6656         fcmp.s          %fp0,&0x3F800000         6656         fcmp.s          %fp0,&0x3F800000
6657         fbgt            t_operr                  6657         fbgt            t_operr                 # cause an operr exception
6658                                                  6658 
6659 #--|X| = 1, ACOS(X) = 0 OR PI                    6659 #--|X| = 1, ACOS(X) = 0 OR PI
6660         tst.b           (%a0)                    6660         tst.b           (%a0)                   # is X positive or negative?
6661         bpl.b           ACOSP1                   6661         bpl.b           ACOSP1
6662                                                  6662 
6663 #--X = -1                                        6663 #--X = -1
6664 #Returns PI and inexact exception                6664 #Returns PI and inexact exception
6665 ACOSM1:                                          6665 ACOSM1:
6666         fmov.x          PI(%pc),%fp0             6666         fmov.x          PI(%pc),%fp0            # load PI
6667         fmov.l          %d0,%fpcr                6667         fmov.l          %d0,%fpcr               # load round mode,prec
6668         fadd.s          &0x00800000,%fp0         6668         fadd.s          &0x00800000,%fp0        # add a small value
6669         bra             t_pinx2                  6669         bra             t_pinx2
6670                                                  6670 
6671 ACOSP1:                                          6671 ACOSP1:
6672         bra             ld_pzero                 6672         bra             ld_pzero                # answer is positive zero
6673                                                  6673 
6674         global          sacosd                   6674         global          sacosd
6675 #--ACOS(X) = PI/2 FOR DENORMALIZED X             6675 #--ACOS(X) = PI/2 FOR DENORMALIZED X
6676 sacosd:                                          6676 sacosd:
6677         fmov.l          %d0,%fpcr                6677         fmov.l          %d0,%fpcr               # load user's rnd mode/prec
6678         fmov.x          PIBY2(%pc),%fp0          6678         fmov.x          PIBY2(%pc),%fp0
6679         bra             t_pinx2                  6679         bra             t_pinx2
6680                                                  6680 
6681 #############################################    6681 #########################################################################
6682 # setox():    computes the exponential for a     6682 # setox():    computes the exponential for a normalized input           #
6683 # setoxd():   computes the exponential for a     6683 # setoxd():   computes the exponential for a denormalized input         #
6684 # setoxm1():  computes the exponential minus     6684 # setoxm1():  computes the exponential minus 1 for a normalized input   #
6685 # setoxm1d(): computes the exponential minus     6685 # setoxm1d(): computes the exponential minus 1 for a denormalized input #
6686 #                                                6686 #                                                                       #
6687 # INPUT *************************************    6687 # INPUT *************************************************************** #
6688 #       a0 = pointer to extended precision in    6688 #       a0 = pointer to extended precision input                        #
6689 #       d0 = round precision,mode                6689 #       d0 = round precision,mode                                       #
6690 #                                                6690 #                                                                       #
6691 # OUTPUT ************************************    6691 # OUTPUT ************************************************************** #
6692 #       fp0 = exp(X) or exp(X)-1                 6692 #       fp0 = exp(X) or exp(X)-1                                        #
6693 #                                                6693 #                                                                       #
6694 # ACCURACY and MONOTONICITY *****************    6694 # ACCURACY and MONOTONICITY ******************************************* #
6695 #       The returned result is within 0.85 ul    6695 #       The returned result is within 0.85 ulps in 64 significant bit,  #
6696 #       i.e. within 0.5001 ulp to 53 bits if     6696 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
6697 #       rounded to double precision. The resu    6697 #       rounded to double precision. The result is provably monotonic   #
6698 #       in double precision.                     6698 #       in double precision.                                            #
6699 #                                                6699 #                                                                       #
6700 # ALGORITHM and IMPLEMENTATION **************    6700 # ALGORITHM and IMPLEMENTATION **************************************** #
6701 #                                                6701 #                                                                       #
6702 #       setoxd                                   6702 #       setoxd                                                          #
6703 #       ------                                   6703 #       ------                                                          #
6704 #       Step 1. Set ans := 1.0                   6704 #       Step 1. Set ans := 1.0                                          #
6705 #                                                6705 #                                                                       #
6706 #       Step 2. Return  ans := ans + sign(X)*    6706 #       Step 2. Return  ans := ans + sign(X)*2^(-126). Exit.            #
6707 #       Notes:  This will always generate one    6707 #       Notes:  This will always generate one exception -- inexact.     #
6708 #                                                6708 #                                                                       #
6709 #                                                6709 #                                                                       #
6710 #       setox                                    6710 #       setox                                                           #
6711 #       -----                                    6711 #       -----                                                           #
6712 #                                                6712 #                                                                       #
6713 #       Step 1. Filter out extreme cases of i    6713 #       Step 1. Filter out extreme cases of input argument.             #
6714 #               1.1     If |X| >= 2^(-65), go    6714 #               1.1     If |X| >= 2^(-65), go to Step 1.3.              #
6715 #               1.2     Go to Step 7.            6715 #               1.2     Go to Step 7.                                   #
6716 #               1.3     If |X| < 16380 log(2)    6716 #               1.3     If |X| < 16380 log(2), go to Step 2.            #
6717 #               1.4     Go to Step 8.            6717 #               1.4     Go to Step 8.                                   #
6718 #       Notes:  The usual case should take th    6718 #       Notes:  The usual case should take the branches 1.1 -> 1.3 -> 2.#
6719 #               To avoid the use of floating-    6719 #               To avoid the use of floating-point comparisons, a       #
6720 #               compact representation of |X|    6720 #               compact representation of |X| is used. This format is a #
6721 #               32-bit integer, the upper (mo    6721 #               32-bit integer, the upper (more significant) 16 bits    #
6722 #               are the sign and biased expon    6722 #               are the sign and biased exponent field of |X|; the      #
6723 #               lower 16 bits are the 16 most    6723 #               lower 16 bits are the 16 most significant fraction      #
6724 #               (including the explicit bit)     6724 #               (including the explicit bit) bits of |X|. Consequently, #
6725 #               the comparisons in Steps 1.1     6725 #               the comparisons in Steps 1.1 and 1.3 can be performed   #
6726 #               by integer comparison. Note a    6726 #               by integer comparison. Note also that the constant      #
6727 #               16380 log(2) used in Step 1.3    6727 #               16380 log(2) used in Step 1.3 is also in the compact    #
6728 #               form. Thus taking the branch     6728 #               form. Thus taking the branch to Step 2 guarantees       #
6729 #               |X| < 16380 log(2). There is     6729 #               |X| < 16380 log(2). There is no harm to have a small    #
6730 #               number of cases where |X| is     6730 #               number of cases where |X| is less than, but close to,   #
6731 #               16380 log(2) and the branch t    6731 #               16380 log(2) and the branch to Step 9 is taken.         #
6732 #                                                6732 #                                                                       #
6733 #       Step 2. Calculate N = round-to-neares    6733 #       Step 2. Calculate N = round-to-nearest-int( X * 64/log2 ).      #
6734 #               2.1     Set AdjFlag := 0 (ind    6734 #               2.1     Set AdjFlag := 0 (indicates the branch 1.3 -> 2 #
6735 #                       was taken)               6735 #                       was taken)                                      #
6736 #               2.2     N := round-to-nearest    6736 #               2.2     N := round-to-nearest-integer( X * 64/log2 ).   #
6737 #               2.3     Calculate       J = N    6737 #               2.3     Calculate       J = N mod 64; so J = 0,1,2,..., #
6738 #                       or 63.                   6738 #                       or 63.                                          #
6739 #               2.4     Calculate       M = (    6739 #               2.4     Calculate       M = (N - J)/64; so N = 64M + J. #
6740 #               2.5     Calculate the address    6740 #               2.5     Calculate the address of the stored value of    #
6741 #                       2^(J/64).                6741 #                       2^(J/64).                                       #
6742 #               2.6     Create the value Scal    6742 #               2.6     Create the value Scale = 2^M.                   #
6743 #       Notes:  The calculation in 2.2 is rea    6743 #       Notes:  The calculation in 2.2 is really performed by           #
6744 #                       Z := X * constant        6744 #                       Z := X * constant                               #
6745 #                       N := round-to-nearest    6745 #                       N := round-to-nearest-integer(Z)                #
6746 #               where                            6746 #               where                                                   #
6747 #                       constant := single-pr    6747 #                       constant := single-precision( 64/log 2 ).       #
6748 #                                                6748 #                                                                       #
6749 #               Using a single-precision cons    6749 #               Using a single-precision constant avoids memory         #
6750 #               access. Another effect of usi    6750 #               access. Another effect of using a single-precision      #
6751 #               "constant" is that the calcul    6751 #               "constant" is that the calculated value Z is            #
6752 #                                                6752 #                                                                       #
6753 #                       Z = X*(64/log2)*(1+ep    6753 #                       Z = X*(64/log2)*(1+eps), |eps| <= 2^(-24).      #
6754 #                                                6754 #                                                                       #
6755 #               This error has to be consider    6755 #               This error has to be considered later in Steps 3 and 4. #
6756 #                                                6756 #                                                                       #
6757 #       Step 3. Calculate X - N*log2/64.         6757 #       Step 3. Calculate X - N*log2/64.                                #
6758 #               3.1     R := X + N*L1,           6758 #               3.1     R := X + N*L1,                                  #
6759 #                               where L1 := s    6759 #                               where L1 := single-precision(-log2/64). #
6760 #               3.2     R := R + N*L2,           6760 #               3.2     R := R + N*L2,                                  #
6761 #                               L2 := extende    6761 #                               L2 := extended-precision(-log2/64 - L1).#
6762 #       Notes:  a) The way L1 and L2 are chos    6762 #       Notes:  a) The way L1 and L2 are chosen ensures L1+L2           #
6763 #               approximate the value -log2/6    6763 #               approximate the value -log2/64 to 88 bits of accuracy.  #
6764 #               b) N*L1 is exact because N is    6764 #               b) N*L1 is exact because N is no longer than 22 bits    #
6765 #               and L1 is no longer than 24 b    6765 #               and L1 is no longer than 24 bits.                       #
6766 #               c) The calculation X+N*L1 is     6766 #               c) The calculation X+N*L1 is also exact due to          #
6767 #               cancellation. Thus, R is prac    6767 #               cancellation. Thus, R is practically X+N(L1+L2) to full #
6768 #               64 bits.                         6768 #               64 bits.                                                #
6769 #               d) It is important to estimat    6769 #               d) It is important to estimate how large can |R| be     #
6770 #               after Step 3.2.                  6770 #               after Step 3.2.                                         #
6771 #                                                6771 #                                                                       #
6772 #               N = rnd-to-int( X*64/log2 (1+    6772 #               N = rnd-to-int( X*64/log2 (1+eps) ), |eps|<=2^(-24)     #
6773 #               X*64/log2 (1+eps)       =        6773 #               X*64/log2 (1+eps)       =       N + f,  |f| <= 0.5      #
6774 #               X*64/log2 - N   =       f - e    6774 #               X*64/log2 - N   =       f - eps*X 64/log2               #
6775 #               X - N*log2/64   =       f*log    6775 #               X - N*log2/64   =       f*log2/64 - eps*X               #
6776 #                                                6776 #                                                                       #
6777 #                                                6777 #                                                                       #
6778 #               Now |X| <= 16446 log2, thus      6778 #               Now |X| <= 16446 log2, thus                             #
6779 #                                                6779 #                                                                       #
6780 #                       |X - N*log2/64| <= (0    6780 #                       |X - N*log2/64| <= (0.5 + 16446/2^(18))*log2/64 #
6781 #                                       <= 0.    6781 #                                       <= 0.57 log2/64.                #
6782 #                This bound will be used in S    6782 #                This bound will be used in Step 4.                     #
6783 #                                                6783 #                                                                       #
6784 #       Step 4. Approximate exp(R)-1 by a pol    6784 #       Step 4. Approximate exp(R)-1 by a polynomial                    #
6785 #               p = R + R*R*(A1 + R*(A2 + R*(    6785 #               p = R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*A5))))      #
6786 #       Notes:  a) In order to reduce memory     6786 #       Notes:  a) In order to reduce memory access, the coefficients   #
6787 #               are made as "short" as possib    6787 #               are made as "short" as possible: A1 (which is 1/2), A4  #
6788 #               and A5 are single precision;     6788 #               and A5 are single precision; A2 and A3 are double       #
6789 #               precision.                       6789 #               precision.                                              #
6790 #               b) Even with the restrictions    6790 #               b) Even with the restrictions above,                    #
6791 #                  |p - (exp(R)-1)| < 2^(-68.    6791 #                  |p - (exp(R)-1)| < 2^(-68.8) for all |R| <= 0.0062.  #
6792 #               Note that 0.0062 is slightly     6792 #               Note that 0.0062 is slightly bigger than 0.57 log2/64.  #
6793 #               c) To fully utilize the pipel    6793 #               c) To fully utilize the pipeline, p is separated into   #
6794 #               two independent pieces of rou    6794 #               two independent pieces of roughly equal complexities    #
6795 #                       p = [ R + R*S*(A2 + S    6795 #                       p = [ R + R*S*(A2 + S*A4) ]     +               #
6796 #                               [ S*(A1 + S*(    6796 #                               [ S*(A1 + S*(A3 + S*A5)) ]              #
6797 #               where S = R*R.                   6797 #               where S = R*R.                                          #
6798 #                                                6798 #                                                                       #
6799 #       Step 5. Compute 2^(J/64)*exp(R) = 2^(    6799 #       Step 5. Compute 2^(J/64)*exp(R) = 2^(J/64)*(1+p) by             #
6800 #                               ans := T + (     6800 #                               ans := T + ( T*p + t)                   #
6801 #               where T and t are the stored     6801 #               where T and t are the stored values for 2^(J/64).       #
6802 #       Notes:  2^(J/64) is stored as T and t    6802 #       Notes:  2^(J/64) is stored as T and t where T+t approximates    #
6803 #               2^(J/64) to roughly 85 bits;     6803 #               2^(J/64) to roughly 85 bits; T is in extended precision #
6804 #               and t is in single precision.    6804 #               and t is in single precision. Note also that T is       #
6805 #               rounded to 62 bits so that th    6805 #               rounded to 62 bits so that the last two bits of T are   #
6806 #               zero. The reason for such a s    6806 #               zero. The reason for such a special form is that T-1,   #
6807 #               T-2, and T-8 will all be exac    6807 #               T-2, and T-8 will all be exact --- a property that will #
6808 #               give much more accurate compu    6808 #               give much more accurate computation of the function     #
6809 #               EXPM1.                           6809 #               EXPM1.                                                  #
6810 #                                                6810 #                                                                       #
6811 #       Step 6. Reconstruction of exp(X)         6811 #       Step 6. Reconstruction of exp(X)                                #
6812 #                       exp(X) = 2^M * 2^(J/6    6812 #                       exp(X) = 2^M * 2^(J/64) * exp(R).               #
6813 #               6.1     If AdjFlag = 0, go to    6813 #               6.1     If AdjFlag = 0, go to 6.3                       #
6814 #               6.2     ans := ans * AdjScale    6814 #               6.2     ans := ans * AdjScale                           #
6815 #               6.3     Restore the user FPCR    6815 #               6.3     Restore the user FPCR                           #
6816 #               6.4     Return ans := ans * S    6816 #               6.4     Return ans := ans * Scale. Exit.                #
6817 #       Notes:  If AdjFlag = 0, we have X = M    6817 #       Notes:  If AdjFlag = 0, we have X = Mlog2 + Jlog2/64 + R,       #
6818 #               |M| <= 16380, and Scale = 2^M    6818 #               |M| <= 16380, and Scale = 2^M. Moreover, exp(X) will    #
6819 #               neither overflow nor underflo    6819 #               neither overflow nor underflow. If AdjFlag = 1, that    #
6820 #               means that                       6820 #               means that                                              #
6821 #                       X = (M1+M)log2 + Jlog    6821 #                       X = (M1+M)log2 + Jlog2/64 + R, |M1+M| >= 16380. #
6822 #               Hence, exp(X) may overflow or    6822 #               Hence, exp(X) may overflow or underflow or neither.     #
6823 #               When that is the case, AdjSca    6823 #               When that is the case, AdjScale = 2^(M1) where M1 is    #
6824 #               approximately M. Thus 6.2 wil    6824 #               approximately M. Thus 6.2 will never cause              #
6825 #               over/underflow. Possible exce    6825 #               over/underflow. Possible exception in 6.4 is overflow   #
6826 #               or underflow. The inexact exc    6826 #               or underflow. The inexact exception is not generated in #
6827 #               6.4. Although one can argue t    6827 #               6.4. Although one can argue that the inexact flag       #
6828 #               should always be raised, to s    6828 #               should always be raised, to simulate that exception     #
6829 #               cost to much than the flag is    6829 #               cost to much than the flag is worth in practical uses.  #
6830 #                                                6830 #                                                                       #
6831 #       Step 7. Return 1 + X.                    6831 #       Step 7. Return 1 + X.                                           #
6832 #               7.1     ans := X                 6832 #               7.1     ans := X                                        #
6833 #               7.2     Restore user FPCR.       6833 #               7.2     Restore user FPCR.                              #
6834 #               7.3     Return ans := 1 + ans    6834 #               7.3     Return ans := 1 + ans. Exit                     #
6835 #       Notes:  For non-zero X, the inexact e    6835 #       Notes:  For non-zero X, the inexact exception will always be    #
6836 #               raised by 7.3. That is the on    6836 #               raised by 7.3. That is the only exception raised by 7.3.#
6837 #               Note also that we use the FMO    6837 #               Note also that we use the FMOVEM instruction to move X  #
6838 #               in Step 7.1 to avoid unnecess    6838 #               in Step 7.1 to avoid unnecessary trapping. (Although    #
6839 #               the FMOVEM may not seem relev    6839 #               the FMOVEM may not seem relevant since X is normalized, #
6840 #               the precaution will be useful    6840 #               the precaution will be useful in the library version of #
6841 #               this code where the separate     6841 #               this code where the separate entry for denormalized     #
6842 #               inputs will be done away with    6842 #               inputs will be done away with.)                         #
6843 #                                                6843 #                                                                       #
6844 #       Step 8. Handle exp(X) where |X| >= 16    6844 #       Step 8. Handle exp(X) where |X| >= 16380log2.                   #
6845 #               8.1     If |X| > 16480 log2,     6845 #               8.1     If |X| > 16480 log2, go to Step 9.              #
6846 #               (mimic 2.2 - 2.6)                6846 #               (mimic 2.2 - 2.6)                                       #
6847 #               8.2     N := round-to-integer    6847 #               8.2     N := round-to-integer( X * 64/log2 )            #
6848 #               8.3     Calculate J = N mod 6    6848 #               8.3     Calculate J = N mod 64, J = 0,1,...,63          #
6849 #               8.4     K := (N-J)/64, M1 :=     6849 #               8.4     K := (N-J)/64, M1 := truncate(K/2), M = K-M1,   #
6850 #                       AdjFlag := 1.            6850 #                       AdjFlag := 1.                                   #
6851 #               8.5     Calculate the address    6851 #               8.5     Calculate the address of the stored value       #
6852 #                       2^(J/64).                6852 #                       2^(J/64).                                       #
6853 #               8.6     Create the values Sca    6853 #               8.6     Create the values Scale = 2^M, AdjScale = 2^M1. #
6854 #               8.7     Go to Step 3.            6854 #               8.7     Go to Step 3.                                   #
6855 #       Notes:  Refer to notes for 2.2 - 2.6.    6855 #       Notes:  Refer to notes for 2.2 - 2.6.                           #
6856 #                                                6856 #                                                                       #
6857 #       Step 9. Handle exp(X), |X| > 16480 lo    6857 #       Step 9. Handle exp(X), |X| > 16480 log2.                        #
6858 #               9.1     If X < 0, go to 9.3      6858 #               9.1     If X < 0, go to 9.3                             #
6859 #               9.2     ans := Huge, go to 9.    6859 #               9.2     ans := Huge, go to 9.4                          #
6860 #               9.3     ans := Tiny.             6860 #               9.3     ans := Tiny.                                    #
6861 #               9.4     Restore user FPCR.       6861 #               9.4     Restore user FPCR.                              #
6862 #               9.5     Return ans := ans * a    6862 #               9.5     Return ans := ans * ans. Exit.                  #
6863 #       Notes:  Exp(X) will surely overflow o    6863 #       Notes:  Exp(X) will surely overflow or underflow, depending on  #
6864 #               X's sign. "Huge" and "Tiny" a    6864 #               X's sign. "Huge" and "Tiny" are respectively large/tiny #
6865 #               extended-precision numbers wh    6865 #               extended-precision numbers whose square over/underflow  #
6866 #               with an inexact result. Thus,    6866 #               with an inexact result. Thus, 9.5 always raises the     #
6867 #               inexact together with either     6867 #               inexact together with either overflow or underflow.     #
6868 #                                                6868 #                                                                       #
6869 #       setoxm1d                                 6869 #       setoxm1d                                                        #
6870 #       --------                                 6870 #       --------                                                        #
6871 #                                                6871 #                                                                       #
6872 #       Step 1. Set ans := 0                     6872 #       Step 1. Set ans := 0                                            #
6873 #                                                6873 #                                                                       #
6874 #       Step 2. Return  ans := X + ans. Exit.    6874 #       Step 2. Return  ans := X + ans. Exit.                           #
6875 #       Notes:  This will return X with the a    6875 #       Notes:  This will return X with the appropriate rounding        #
6876 #                precision prescribed by the     6876 #                precision prescribed by the user FPCR.                 #
6877 #                                                6877 #                                                                       #
6878 #       setoxm1                                  6878 #       setoxm1                                                         #
6879 #       -------                                  6879 #       -------                                                         #
6880 #                                                6880 #                                                                       #
6881 #       Step 1. Check |X|                        6881 #       Step 1. Check |X|                                               #
6882 #               1.1     If |X| >= 1/4, go to     6882 #               1.1     If |X| >= 1/4, go to Step 1.3.                  #
6883 #               1.2     Go to Step 7.            6883 #               1.2     Go to Step 7.                                   #
6884 #               1.3     If |X| < 70 log(2), g    6884 #               1.3     If |X| < 70 log(2), go to Step 2.               #
6885 #               1.4     Go to Step 10.           6885 #               1.4     Go to Step 10.                                  #
6886 #       Notes:  The usual case should take th    6886 #       Notes:  The usual case should take the branches 1.1 -> 1.3 -> 2.#
6887 #               However, it is conceivable |X    6887 #               However, it is conceivable |X| can be small very often  #
6888 #               because EXPM1 is intended to     6888 #               because EXPM1 is intended to evaluate exp(X)-1          #
6889 #               accurately when |X| is small.    6889 #               accurately when |X| is small. For further details on    #
6890 #               the comparisons, see the note    6890 #               the comparisons, see the notes on Step 1 of setox.      #
6891 #                                                6891 #                                                                       #
6892 #       Step 2. Calculate N = round-to-neares    6892 #       Step 2. Calculate N = round-to-nearest-int( X * 64/log2 ).      #
6893 #               2.1     N := round-to-nearest    6893 #               2.1     N := round-to-nearest-integer( X * 64/log2 ).   #
6894 #               2.2     Calculate       J = N    6894 #               2.2     Calculate       J = N mod 64; so J = 0,1,2,..., #
6895 #                       or 63.                   6895 #                       or 63.                                          #
6896 #               2.3     Calculate       M = (    6896 #               2.3     Calculate       M = (N - J)/64; so N = 64M + J. #
6897 #               2.4     Calculate the address    6897 #               2.4     Calculate the address of the stored value of    #
6898 #                       2^(J/64).                6898 #                       2^(J/64).                                       #
6899 #               2.5     Create the values Sc     6899 #               2.5     Create the values Sc = 2^M and                  #
6900 #                       OnebySc := -2^(-M).      6900 #                       OnebySc := -2^(-M).                             #
6901 #       Notes:  See the notes on Step 2 of se    6901 #       Notes:  See the notes on Step 2 of setox.                       #
6902 #                                                6902 #                                                                       #
6903 #       Step 3. Calculate X - N*log2/64.         6903 #       Step 3. Calculate X - N*log2/64.                                #
6904 #               3.1     R := X + N*L1,           6904 #               3.1     R := X + N*L1,                                  #
6905 #                               where L1 := s    6905 #                               where L1 := single-precision(-log2/64). #
6906 #               3.2     R := R + N*L2,           6906 #               3.2     R := R + N*L2,                                  #
6907 #                               L2 := extende    6907 #                               L2 := extended-precision(-log2/64 - L1).#
6908 #       Notes:  Applying the analysis of Step    6908 #       Notes:  Applying the analysis of Step 3 of setox in this case   #
6909 #               shows that |R| <= 0.0055 (not    6909 #               shows that |R| <= 0.0055 (note that |X| <= 70 log2 in   #
6910 #               this case).                      6910 #               this case).                                             #
6911 #                                                6911 #                                                                       #
6912 #       Step 4. Approximate exp(R)-1 by a pol    6912 #       Step 4. Approximate exp(R)-1 by a polynomial                    #
6913 #                       p = R+R*R*(A1+R*(A2+R    6913 #                       p = R+R*R*(A1+R*(A2+R*(A3+R*(A4+R*(A5+R*A6))))) #
6914 #       Notes:  a) In order to reduce memory     6914 #       Notes:  a) In order to reduce memory access, the coefficients   #
6915 #               are made as "short" as possib    6915 #               are made as "short" as possible: A1 (which is 1/2), A5  #
6916 #               and A6 are single precision;     6916 #               and A6 are single precision; A2, A3 and A4 are double   #
6917 #               precision.                       6917 #               precision.                                              #
6918 #               b) Even with the restriction     6918 #               b) Even with the restriction above,                     #
6919 #                       |p - (exp(R)-1)| <       6919 #                       |p - (exp(R)-1)| <      |R| * 2^(-72.7)         #
6920 #               for all |R| <= 0.0055.           6920 #               for all |R| <= 0.0055.                                  #
6921 #               c) To fully utilize the pipel    6921 #               c) To fully utilize the pipeline, p is separated into   #
6922 #               two independent pieces of rou    6922 #               two independent pieces of roughly equal complexity      #
6923 #                       p = [ R*S*(A2 + S*(A4    6923 #                       p = [ R*S*(A2 + S*(A4 + S*A6)) ]        +       #
6924 #                               [ R + S*(A1 +    6924 #                               [ R + S*(A1 + S*(A3 + S*A5)) ]          #
6925 #               where S = R*R.                   6925 #               where S = R*R.                                          #
6926 #                                                6926 #                                                                       #
6927 #       Step 5. Compute 2^(J/64)*p by            6927 #       Step 5. Compute 2^(J/64)*p by                                   #
6928 #                               p := T*p         6928 #                               p := T*p                                #
6929 #               where T and t are the stored     6929 #               where T and t are the stored values for 2^(J/64).       #
6930 #       Notes:  2^(J/64) is stored as T and t    6930 #       Notes:  2^(J/64) is stored as T and t where T+t approximates    #
6931 #               2^(J/64) to roughly 85 bits;     6931 #               2^(J/64) to roughly 85 bits; T is in extended precision #
6932 #               and t is in single precision.    6932 #               and t is in single precision. Note also that T is       #
6933 #               rounded to 62 bits so that th    6933 #               rounded to 62 bits so that the last two bits of T are   #
6934 #               zero. The reason for such a s    6934 #               zero. The reason for such a special form is that T-1,   #
6935 #               T-2, and T-8 will all be exac    6935 #               T-2, and T-8 will all be exact --- a property that will #
6936 #               be exploited in Step 6 below.    6936 #               be exploited in Step 6 below. The total relative error  #
6937 #               in p is no bigger than 2^(-67    6937 #               in p is no bigger than 2^(-67.7) compared to the final  #
6938 #               result.                          6938 #               result.                                                 #
6939 #                                                6939 #                                                                       #
6940 #       Step 6. Reconstruction of exp(X)-1       6940 #       Step 6. Reconstruction of exp(X)-1                              #
6941 #                       exp(X)-1 = 2^M * ( 2^    6941 #                       exp(X)-1 = 2^M * ( 2^(J/64) + p - 2^(-M) ).     #
6942 #               6.1     If M <= 63, go to Ste    6942 #               6.1     If M <= 63, go to Step 6.3.                     #
6943 #               6.2     ans := T + (p + (t +     6943 #               6.2     ans := T + (p + (t + OnebySc)). Go to 6.6       #
6944 #               6.3     If M >= -3, go to 6.5    6944 #               6.3     If M >= -3, go to 6.5.                          #
6945 #               6.4     ans := (T + (p + t))     6945 #               6.4     ans := (T + (p + t)) + OnebySc. Go to 6.6       #
6946 #               6.5     ans := (T + OnebySc)     6946 #               6.5     ans := (T + OnebySc) + (p + t).                 #
6947 #               6.6     Restore user FPCR.       6947 #               6.6     Restore user FPCR.                              #
6948 #               6.7     Return ans := Sc * an    6948 #               6.7     Return ans := Sc * ans. Exit.                   #
6949 #       Notes:  The various arrangements of t    6949 #       Notes:  The various arrangements of the expressions give        #
6950 #               accurate evaluations.            6950 #               accurate evaluations.                                   #
6951 #                                                6951 #                                                                       #
6952 #       Step 7. exp(X)-1 for |X| < 1/4.          6952 #       Step 7. exp(X)-1 for |X| < 1/4.                                 #
6953 #               7.1     If |X| >= 2^(-65), go    6953 #               7.1     If |X| >= 2^(-65), go to Step 9.                #
6954 #               7.2     Go to Step 8.            6954 #               7.2     Go to Step 8.                                   #
6955 #                                                6955 #                                                                       #
6956 #       Step 8. Calculate exp(X)-1, |X| < 2^(    6956 #       Step 8. Calculate exp(X)-1, |X| < 2^(-65).                      #
6957 #               8.1     If |X| < 2^(-16312),     6957 #               8.1     If |X| < 2^(-16312), goto 8.3                   #
6958 #               8.2     Restore FPCR; return     6958 #               8.2     Restore FPCR; return ans := X - 2^(-16382).     #
6959 #                       Exit.                    6959 #                       Exit.                                           #
6960 #               8.3     X := X * 2^(140).        6960 #               8.3     X := X * 2^(140).                               #
6961 #               8.4     Restore FPCR; ans :=     6961 #               8.4     Restore FPCR; ans := ans - 2^(-16382).          #
6962 #                Return ans := ans*2^(140). E    6962 #                Return ans := ans*2^(140). Exit                        #
6963 #       Notes:  The idea is to return "X - ti    6963 #       Notes:  The idea is to return "X - tiny" under the user         #
6964 #               precision and rounding modes.    6964 #               precision and rounding modes. To avoid unnecessary      #
6965 #               inefficiency, we stay away fr    6965 #               inefficiency, we stay away from denormalized numbers    #
6966 #               the best we can. For |X| >= 2    6966 #               the best we can. For |X| >= 2^(-16312), the             #
6967 #               straightforward 8.2 generates    6967 #               straightforward 8.2 generates the inexact exception as  #
6968 #               the case warrants.               6968 #               the case warrants.                                      #
6969 #                                                6969 #                                                                       #
6970 #       Step 9. Calculate exp(X)-1, |X| < 1/4    6970 #       Step 9. Calculate exp(X)-1, |X| < 1/4, by a polynomial          #
6971 #                       p = X + X*X*(B1 + X*(    6971 #                       p = X + X*X*(B1 + X*(B2 + ... + X*B12))         #
6972 #       Notes:  a) In order to reduce memory     6972 #       Notes:  a) In order to reduce memory access, the coefficients   #
6973 #               are made as "short" as possib    6973 #               are made as "short" as possible: B1 (which is 1/2), B9  #
6974 #               to B12 are single precision;     6974 #               to B12 are single precision; B3 to B8 are double        #
6975 #               precision; and B2 is double e    6975 #               precision; and B2 is double extended.                   #
6976 #               b) Even with the restriction     6976 #               b) Even with the restriction above,                     #
6977 #                       |p - (exp(X)-1)| < |X    6977 #                       |p - (exp(X)-1)| < |X| 2^(-70.6)                #
6978 #               for all |X| <= 0.251.            6978 #               for all |X| <= 0.251.                                   #
6979 #               Note that 0.251 is slightly b    6979 #               Note that 0.251 is slightly bigger than 1/4.            #
6980 #               c) To fully preserve accuracy    6980 #               c) To fully preserve accuracy, the polynomial is        #
6981 #               computed as                      6981 #               computed as                                             #
6982 #                       X + ( S*B1 +    Q ) w    6982 #                       X + ( S*B1 +    Q ) where S = X*X and           #
6983 #                       Q       =       X*S*(    6983 #                       Q       =       X*S*(B2 + X*(B3 + ... + X*B12)) #
6984 #               d) To fully utilize the pipel    6984 #               d) To fully utilize the pipeline, Q is separated into   #
6985 #               two independent pieces of rou    6985 #               two independent pieces of roughly equal complexity      #
6986 #                       Q = [ X*S*(B2 + S*(B4    6986 #                       Q = [ X*S*(B2 + S*(B4 + ... + S*B12)) ] +       #
6987 #                               [ S*S*(B3 + S    6987 #                               [ S*S*(B3 + S*(B5 + ... + S*B11)) ]     #
6988 #                                                6988 #                                                                       #
6989 #       Step 10. Calculate exp(X)-1 for |X| >    6989 #       Step 10. Calculate exp(X)-1 for |X| >= 70 log 2.                #
6990 #               10.1 If X >= 70log2 , exp(X)     6990 #               10.1 If X >= 70log2 , exp(X) - 1 = exp(X) for all       #
6991 #               practical purposes. Therefore    6991 #               practical purposes. Therefore, go to Step 1 of setox.   #
6992 #               10.2 If X <= -70log2, exp(X)     6992 #               10.2 If X <= -70log2, exp(X) - 1 = -1 for all practical #
6993 #               purposes.                        6993 #               purposes.                                               #
6994 #               ans := -1                        6994 #               ans := -1                                               #
6995 #               Restore user FPCR                6995 #               Restore user FPCR                                       #
6996 #               Return ans := ans + 2^(-126).    6996 #               Return ans := ans + 2^(-126). Exit.                     #
6997 #       Notes:  10.2 will always create an in    6997 #       Notes:  10.2 will always create an inexact and return -1 + tiny #
6998 #               in the user rounding precisio    6998 #               in the user rounding precision and mode.                #
6999 #                                                6999 #                                                                       #
7000 #############################################    7000 #########################################################################
7001                                                  7001 
7002 L2:     long            0x3FDC0000,0x82E30865    7002 L2:     long            0x3FDC0000,0x82E30865,0x4361C4C6,0x00000000
7003                                                  7003 
7004 EEXPA3: long            0x3FA55555,0x55554CC1    7004 EEXPA3: long            0x3FA55555,0x55554CC1
7005 EEXPA2: long            0x3FC55555,0x55554A54    7005 EEXPA2: long            0x3FC55555,0x55554A54
7006                                                  7006 
7007 EM1A4:  long            0x3F811111,0x11174385    7007 EM1A4:  long            0x3F811111,0x11174385
7008 EM1A3:  long            0x3FA55555,0x55554F5A    7008 EM1A3:  long            0x3FA55555,0x55554F5A
7009                                                  7009 
7010 EM1A2:  long            0x3FC55555,0x55555555    7010 EM1A2:  long            0x3FC55555,0x55555555,0x00000000,0x00000000
7011                                                  7011 
7012 EM1B8:  long            0x3EC71DE3,0xA5774682    7012 EM1B8:  long            0x3EC71DE3,0xA5774682
7013 EM1B7:  long            0x3EFA01A0,0x19D7CB68    7013 EM1B7:  long            0x3EFA01A0,0x19D7CB68
7014                                                  7014 
7015 EM1B6:  long            0x3F2A01A0,0x1A019DF3    7015 EM1B6:  long            0x3F2A01A0,0x1A019DF3
7016 EM1B5:  long            0x3F56C16C,0x16C170E2    7016 EM1B5:  long            0x3F56C16C,0x16C170E2
7017                                                  7017 
7018 EM1B4:  long            0x3F811111,0x11111111    7018 EM1B4:  long            0x3F811111,0x11111111
7019 EM1B3:  long            0x3FA55555,0x55555555    7019 EM1B3:  long            0x3FA55555,0x55555555
7020                                                  7020 
7021 EM1B2:  long            0x3FFC0000,0xAAAAAAAA    7021 EM1B2:  long            0x3FFC0000,0xAAAAAAAA,0xAAAAAAAB
7022         long            0x00000000               7022         long            0x00000000
7023                                                  7023 
7024 TWO140: long            0x48B00000,0x00000000    7024 TWO140: long            0x48B00000,0x00000000
7025 TWON140:                                         7025 TWON140:
7026         long            0x37300000,0x00000000    7026         long            0x37300000,0x00000000
7027                                                  7027 
7028 EEXPTBL:                                         7028 EEXPTBL:
7029         long            0x3FFF0000,0x80000000    7029         long            0x3FFF0000,0x80000000,0x00000000,0x00000000
7030         long            0x3FFF0000,0x8164D1F3    7030         long            0x3FFF0000,0x8164D1F3,0xBC030774,0x9F841A9B
7031         long            0x3FFF0000,0x82CD8698    7031         long            0x3FFF0000,0x82CD8698,0xAC2BA1D8,0x9FC1D5B9
7032         long            0x3FFF0000,0x843A28C3    7032         long            0x3FFF0000,0x843A28C3,0xACDE4048,0xA0728369
7033         long            0x3FFF0000,0x85AAC367    7033         long            0x3FFF0000,0x85AAC367,0xCC487B14,0x1FC5C95C
7034         long            0x3FFF0000,0x871F6196    7034         long            0x3FFF0000,0x871F6196,0x9E8D1010,0x1EE85C9F
7035         long            0x3FFF0000,0x88980E80    7035         long            0x3FFF0000,0x88980E80,0x92DA8528,0x9FA20729
7036         long            0x3FFF0000,0x8A14D575    7036         long            0x3FFF0000,0x8A14D575,0x496EFD9C,0xA07BF9AF
7037         long            0x3FFF0000,0x8B95C1E3    7037         long            0x3FFF0000,0x8B95C1E3,0xEA8BD6E8,0xA0020DCF
7038         long            0x3FFF0000,0x8D1ADF5B    7038         long            0x3FFF0000,0x8D1ADF5B,0x7E5BA9E4,0x205A63DA
7039         long            0x3FFF0000,0x8EA4398B    7039         long            0x3FFF0000,0x8EA4398B,0x45CD53C0,0x1EB70051
7040         long            0x3FFF0000,0x9031DC43    7040         long            0x3FFF0000,0x9031DC43,0x1466B1DC,0x1F6EB029
7041         long            0x3FFF0000,0x91C3D373    7041         long            0x3FFF0000,0x91C3D373,0xAB11C338,0xA0781494
7042         long            0x3FFF0000,0x935A2B2F    7042         long            0x3FFF0000,0x935A2B2F,0x13E6E92C,0x9EB319B0
7043         long            0x3FFF0000,0x94F4EFA8    7043         long            0x3FFF0000,0x94F4EFA8,0xFEF70960,0x2017457D
7044         long            0x3FFF0000,0x96942D37    7044         long            0x3FFF0000,0x96942D37,0x20185A00,0x1F11D537
7045         long            0x3FFF0000,0x9837F051    7045         long            0x3FFF0000,0x9837F051,0x8DB8A970,0x9FB952DD
7046         long            0x3FFF0000,0x99E04593    7046         long            0x3FFF0000,0x99E04593,0x20B7FA64,0x1FE43087
7047         long            0x3FFF0000,0x9B8D39B9    7047         long            0x3FFF0000,0x9B8D39B9,0xD54E5538,0x1FA2A818
7048         long            0x3FFF0000,0x9D3ED9A7    7048         long            0x3FFF0000,0x9D3ED9A7,0x2CFFB750,0x1FDE494D
7049         long            0x3FFF0000,0x9EF53260    7049         long            0x3FFF0000,0x9EF53260,0x91A111AC,0x20504890
7050         long            0x3FFF0000,0xA0B0510F    7050         long            0x3FFF0000,0xA0B0510F,0xB9714FC4,0xA073691C
7051         long            0x3FFF0000,0xA2704303    7051         long            0x3FFF0000,0xA2704303,0x0C496818,0x1F9B7A05
7052         long            0x3FFF0000,0xA43515AE    7052         long            0x3FFF0000,0xA43515AE,0x09E680A0,0xA0797126
7053         long            0x3FFF0000,0xA5FED6A9    7053         long            0x3FFF0000,0xA5FED6A9,0xB15138EC,0xA071A140
7054         long            0x3FFF0000,0xA7CD93B4    7054         long            0x3FFF0000,0xA7CD93B4,0xE9653568,0x204F62DA
7055         long            0x3FFF0000,0xA9A15AB4    7055         long            0x3FFF0000,0xA9A15AB4,0xEA7C0EF8,0x1F283C4A
7056         long            0x3FFF0000,0xAB7A39B5    7056         long            0x3FFF0000,0xAB7A39B5,0xA93ED338,0x9F9A7FDC
7057         long            0x3FFF0000,0xAD583EEA    7057         long            0x3FFF0000,0xAD583EEA,0x42A14AC8,0xA05B3FAC
7058         long            0x3FFF0000,0xAF3B78AD    7058         long            0x3FFF0000,0xAF3B78AD,0x690A4374,0x1FDF2610
7059         long            0x3FFF0000,0xB123F581    7059         long            0x3FFF0000,0xB123F581,0xD2AC2590,0x9F705F90
7060         long            0x3FFF0000,0xB311C412    7060         long            0x3FFF0000,0xB311C412,0xA9112488,0x201F678A
7061         long            0x3FFF0000,0xB504F333    7061         long            0x3FFF0000,0xB504F333,0xF9DE6484,0x1F32FB13
7062         long            0x3FFF0000,0xB6FD91E3    7062         long            0x3FFF0000,0xB6FD91E3,0x28D17790,0x20038B30
7063         long            0x3FFF0000,0xB8FBAF47    7063         long            0x3FFF0000,0xB8FBAF47,0x62FB9EE8,0x200DC3CC
7064         long            0x3FFF0000,0xBAFF5AB2    7064         long            0x3FFF0000,0xBAFF5AB2,0x133E45FC,0x9F8B2AE6
7065         long            0x3FFF0000,0xBD08A39F    7065         long            0x3FFF0000,0xBD08A39F,0x580C36C0,0xA02BBF70
7066         long            0x3FFF0000,0xBF1799B6    7066         long            0x3FFF0000,0xBF1799B6,0x7A731084,0xA00BF518
7067         long            0x3FFF0000,0xC12C4CCA    7067         long            0x3FFF0000,0xC12C4CCA,0x66709458,0xA041DD41
7068         long            0x3FFF0000,0xC346CCDA    7068         long            0x3FFF0000,0xC346CCDA,0x24976408,0x9FDF137B
7069         long            0x3FFF0000,0xC5672A11    7069         long            0x3FFF0000,0xC5672A11,0x5506DADC,0x201F1568
7070         long            0x3FFF0000,0xC78D74C8    7070         long            0x3FFF0000,0xC78D74C8,0xABB9B15C,0x1FC13A2E
7071         long            0x3FFF0000,0xC9B9BD86    7071         long            0x3FFF0000,0xC9B9BD86,0x6E2F27A4,0xA03F8F03
7072         long            0x3FFF0000,0xCBEC14FE    7072         long            0x3FFF0000,0xCBEC14FE,0xF2727C5C,0x1FF4907D
7073         long            0x3FFF0000,0xCE248C15    7073         long            0x3FFF0000,0xCE248C15,0x1F8480E4,0x9E6E53E4
7074         long            0x3FFF0000,0xD06333DA    7074         long            0x3FFF0000,0xD06333DA,0xEF2B2594,0x1FD6D45C
7075         long            0x3FFF0000,0xD2A81D91    7075         long            0x3FFF0000,0xD2A81D91,0xF12AE45C,0xA076EDB9
7076         long            0x3FFF0000,0xD4F35AAB    7076         long            0x3FFF0000,0xD4F35AAB,0xCFEDFA20,0x9FA6DE21
7077         long            0x3FFF0000,0xD744FCCA    7077         long            0x3FFF0000,0xD744FCCA,0xD69D6AF4,0x1EE69A2F
7078         long            0x3FFF0000,0xD99D15C2    7078         long            0x3FFF0000,0xD99D15C2,0x78AFD7B4,0x207F439F
7079         long            0x3FFF0000,0xDBFBB797    7079         long            0x3FFF0000,0xDBFBB797,0xDAF23754,0x201EC207
7080         long            0x3FFF0000,0xDE60F482    7080         long            0x3FFF0000,0xDE60F482,0x5E0E9124,0x9E8BE175
7081         long            0x3FFF0000,0xE0CCDEEC    7081         long            0x3FFF0000,0xE0CCDEEC,0x2A94E110,0x20032C4B
7082         long            0x3FFF0000,0xE33F8972    7082         long            0x3FFF0000,0xE33F8972,0xBE8A5A50,0x2004DFF5
7083         long            0x3FFF0000,0xE5B906E7    7083         long            0x3FFF0000,0xE5B906E7,0x7C8348A8,0x1E72F47A
7084         long            0x3FFF0000,0xE8396A50    7084         long            0x3FFF0000,0xE8396A50,0x3C4BDC68,0x1F722F22
7085         long            0x3FFF0000,0xEAC0C6E7    7085         long            0x3FFF0000,0xEAC0C6E7,0xDD243930,0xA017E945
7086         long            0x3FFF0000,0xED4F301E    7086         long            0x3FFF0000,0xED4F301E,0xD9942B84,0x1F401A5B
7087         long            0x3FFF0000,0xEFE4B99B    7087         long            0x3FFF0000,0xEFE4B99B,0xDCDAF5CC,0x9FB9A9E3
7088         long            0x3FFF0000,0xF281773C    7088         long            0x3FFF0000,0xF281773C,0x59FFB138,0x20744C05
7089         long            0x3FFF0000,0xF5257D15    7089         long            0x3FFF0000,0xF5257D15,0x2486CC2C,0x1F773A19
7090         long            0x3FFF0000,0xF7D0DF73    7090         long            0x3FFF0000,0xF7D0DF73,0x0AD13BB8,0x1FFE90D5
7091         long            0x3FFF0000,0xFA83B2DB    7091         long            0x3FFF0000,0xFA83B2DB,0x722A033C,0xA041ED22
7092         long            0x3FFF0000,0xFD3E0C0C    7092         long            0x3FFF0000,0xFD3E0C0C,0xF486C174,0x1F853F3A
7093                                                  7093 
7094         set             ADJFLAG,L_SCR2           7094         set             ADJFLAG,L_SCR2
7095         set             SCALE,FP_SCR0            7095         set             SCALE,FP_SCR0
7096         set             ADJSCALE,FP_SCR1         7096         set             ADJSCALE,FP_SCR1
7097         set             SC,FP_SCR0               7097         set             SC,FP_SCR0
7098         set             ONEBYSC,FP_SCR1          7098         set             ONEBYSC,FP_SCR1
7099                                                  7099 
7100         global          setox                    7100         global          setox
7101 setox:                                           7101 setox:
7102 #--entry point for EXP(X), here X is finite,     7102 #--entry point for EXP(X), here X is finite, non-zero, and not NaN's
7103                                                  7103 
7104 #--Step 1.                                       7104 #--Step 1.
7105         mov.l           (%a0),%d1                7105         mov.l           (%a0),%d1               # load part of input X
7106         and.l           &0x7FFF0000,%d1          7106         and.l           &0x7FFF0000,%d1         # biased expo. of X
7107         cmp.l           %d1,&0x3FBE0000          7107         cmp.l           %d1,&0x3FBE0000         # 2^(-65)
7108         bge.b           EXPC1                    7108         bge.b           EXPC1                   # normal case
7109         bra             EXPSM                    7109         bra             EXPSM
7110                                                  7110 
7111 EXPC1:                                           7111 EXPC1:
7112 #--The case |X| >= 2^(-65)                       7112 #--The case |X| >= 2^(-65)
7113         mov.w           4(%a0),%d1               7113         mov.w           4(%a0),%d1              # expo. and partial sig. of |X|
7114         cmp.l           %d1,&0x400CB167          7114         cmp.l           %d1,&0x400CB167         # 16380 log2 trunc. 16 bits
7115         blt.b           EXPMAIN                  7115         blt.b           EXPMAIN                 # normal case
7116         bra             EEXPBIG                  7116         bra             EEXPBIG
7117                                                  7117 
7118 EXPMAIN:                                         7118 EXPMAIN:
7119 #--Step 2.                                       7119 #--Step 2.
7120 #--This is the normal branch:   2^(-65) <= |X    7120 #--This is the normal branch:   2^(-65) <= |X| < 16380 log2.
7121         fmov.x          (%a0),%fp0               7121         fmov.x          (%a0),%fp0              # load input from (a0)
7122                                                  7122 
7123         fmov.x          %fp0,%fp1                7123         fmov.x          %fp0,%fp1
7124         fmul.s          &0x42B8AA3B,%fp0         7124         fmul.s          &0x42B8AA3B,%fp0        # 64/log2 * X
7125         fmovm.x         &0xc,-(%sp)              7125         fmovm.x         &0xc,-(%sp)             # save fp2 {%fp2/%fp3}
7126         mov.l           &0,ADJFLAG(%a6)          7126         mov.l           &0,ADJFLAG(%a6)
7127         fmov.l          %fp0,%d1                 7127         fmov.l          %fp0,%d1                # N = int( X * 64/log2 )
7128         lea             EEXPTBL(%pc),%a1         7128         lea             EEXPTBL(%pc),%a1
7129         fmov.l          %d1,%fp0                 7129         fmov.l          %d1,%fp0                # convert to floating-format
7130                                                  7130 
7131         mov.l           %d1,L_SCR1(%a6)          7131         mov.l           %d1,L_SCR1(%a6)         # save N temporarily
7132         and.l           &0x3F,%d1                7132         and.l           &0x3F,%d1               # D0 is J = N mod 64
7133         lsl.l           &4,%d1                   7133         lsl.l           &4,%d1
7134         add.l           %d1,%a1                  7134         add.l           %d1,%a1                 # address of 2^(J/64)
7135         mov.l           L_SCR1(%a6),%d1          7135         mov.l           L_SCR1(%a6),%d1
7136         asr.l           &6,%d1                   7136         asr.l           &6,%d1                  # D0 is M
7137         add.w           &0x3FFF,%d1              7137         add.w           &0x3FFF,%d1             # biased expo. of 2^(M)
7138         mov.w           L2(%pc),L_SCR1(%a6)      7138         mov.w           L2(%pc),L_SCR1(%a6)     # prefetch L2, no need in CB
7139                                                  7139 
7140 EXPCONT1:                                        7140 EXPCONT1:
7141 #--Step 3.                                       7141 #--Step 3.
7142 #--fp1,fp2 saved on the stack. fp0 is N, fp1     7142 #--fp1,fp2 saved on the stack. fp0 is N, fp1 is X,
7143 #--a0 points to 2^(J/64), D0 is biased expo.     7143 #--a0 points to 2^(J/64), D0 is biased expo. of 2^(M)
7144         fmov.x          %fp0,%fp2                7144         fmov.x          %fp0,%fp2
7145         fmul.s          &0xBC317218,%fp0         7145         fmul.s          &0xBC317218,%fp0        # N * L1, L1 = lead(-log2/64)
7146         fmul.x          L2(%pc),%fp2             7146         fmul.x          L2(%pc),%fp2            # N * L2, L1+L2 = -log2/64
7147         fadd.x          %fp1,%fp0                7147         fadd.x          %fp1,%fp0               # X + N*L1
7148         fadd.x          %fp2,%fp0                7148         fadd.x          %fp2,%fp0               # fp0 is R, reduced arg.
7149                                                  7149 
7150 #--Step 4.                                       7150 #--Step 4.
7151 #--WE NOW COMPUTE EXP(R)-1 BY A POLYNOMIAL       7151 #--WE NOW COMPUTE EXP(R)-1 BY A POLYNOMIAL
7152 #-- R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*A    7152 #-- R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*A5))))
7153 #--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE     7153 #--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE S = R*R
7154 #--[R+R*S*(A2+S*A4)] + [S*(A1+S*(A3+S*A5))]      7154 #--[R+R*S*(A2+S*A4)] + [S*(A1+S*(A3+S*A5))]
7155                                                  7155 
7156         fmov.x          %fp0,%fp1                7156         fmov.x          %fp0,%fp1
7157         fmul.x          %fp1,%fp1                7157         fmul.x          %fp1,%fp1               # fp1 IS S = R*R
7158                                                  7158 
7159         fmov.s          &0x3AB60B70,%fp2         7159         fmov.s          &0x3AB60B70,%fp2        # fp2 IS A5
7160                                                  7160 
7161         fmul.x          %fp1,%fp2                7161         fmul.x          %fp1,%fp2               # fp2 IS S*A5
7162         fmov.x          %fp1,%fp3                7162         fmov.x          %fp1,%fp3
7163         fmul.s          &0x3C088895,%fp3         7163         fmul.s          &0x3C088895,%fp3        # fp3 IS S*A4
7164                                                  7164 
7165         fadd.d          EEXPA3(%pc),%fp2         7165         fadd.d          EEXPA3(%pc),%fp2        # fp2 IS A3+S*A5
7166         fadd.d          EEXPA2(%pc),%fp3         7166         fadd.d          EEXPA2(%pc),%fp3        # fp3 IS A2+S*A4
7167                                                  7167 
7168         fmul.x          %fp1,%fp2                7168         fmul.x          %fp1,%fp2               # fp2 IS S*(A3+S*A5)
7169         mov.w           %d1,SCALE(%a6)           7169         mov.w           %d1,SCALE(%a6)          # SCALE is 2^(M) in extended
7170         mov.l           &0x80000000,SCALE+4(%    7170         mov.l           &0x80000000,SCALE+4(%a6)
7171         clr.l           SCALE+8(%a6)             7171         clr.l           SCALE+8(%a6)
7172                                                  7172 
7173         fmul.x          %fp1,%fp3                7173         fmul.x          %fp1,%fp3               # fp3 IS S*(A2+S*A4)
7174                                                  7174 
7175         fadd.s          &0x3F000000,%fp2         7175         fadd.s          &0x3F000000,%fp2        # fp2 IS A1+S*(A3+S*A5)
7176         fmul.x          %fp0,%fp3                7176         fmul.x          %fp0,%fp3               # fp3 IS R*S*(A2+S*A4)
7177                                                  7177 
7178         fmul.x          %fp1,%fp2                7178         fmul.x          %fp1,%fp2               # fp2 IS S*(A1+S*(A3+S*A5))
7179         fadd.x          %fp3,%fp0                7179         fadd.x          %fp3,%fp0               # fp0 IS R+R*S*(A2+S*A4),
7180                                                  7180 
7181         fmov.x          (%a1)+,%fp1              7181         fmov.x          (%a1)+,%fp1             # fp1 is lead. pt. of 2^(J/64)
7182         fadd.x          %fp2,%fp0                7182         fadd.x          %fp2,%fp0               # fp0 is EXP(R) - 1
7183                                                  7183 
7184 #--Step 5                                        7184 #--Step 5
7185 #--final reconstruction process                  7185 #--final reconstruction process
7186 #--EXP(X) = 2^M * ( 2^(J/64) + 2^(J/64)*(EXP(    7186 #--EXP(X) = 2^M * ( 2^(J/64) + 2^(J/64)*(EXP(R)-1) )
7187                                                  7187 
7188         fmul.x          %fp1,%fp0                7188         fmul.x          %fp1,%fp0               # 2^(J/64)*(Exp(R)-1)
7189         fmovm.x         (%sp)+,&0x30             7189         fmovm.x         (%sp)+,&0x30            # fp2 restored {%fp2/%fp3}
7190         fadd.s          (%a1),%fp0               7190         fadd.s          (%a1),%fp0              # accurate 2^(J/64)
7191                                                  7191 
7192         fadd.x          %fp1,%fp0                7192         fadd.x          %fp1,%fp0               # 2^(J/64) + 2^(J/64)*...
7193         mov.l           ADJFLAG(%a6),%d1         7193         mov.l           ADJFLAG(%a6),%d1
7194                                                  7194 
7195 #--Step 6                                        7195 #--Step 6
7196         tst.l           %d1                      7196         tst.l           %d1
7197         beq.b           NORMAL                   7197         beq.b           NORMAL
7198 ADJUST:                                          7198 ADJUST:
7199         fmul.x          ADJSCALE(%a6),%fp0       7199         fmul.x          ADJSCALE(%a6),%fp0
7200 NORMAL:                                          7200 NORMAL:
7201         fmov.l          %d0,%fpcr                7201         fmov.l          %d0,%fpcr               # restore user FPCR
7202         mov.b           &FMUL_OP,%d1             7202         mov.b           &FMUL_OP,%d1            # last inst is MUL
7203         fmul.x          SCALE(%a6),%fp0          7203         fmul.x          SCALE(%a6),%fp0         # multiply 2^(M)
7204         bra             t_catch                  7204         bra             t_catch
7205                                                  7205 
7206 EXPSM:                                           7206 EXPSM:
7207 #--Step 7                                        7207 #--Step 7
7208         fmovm.x         (%a0),&0x80              7208         fmovm.x         (%a0),&0x80             # load X
7209         fmov.l          %d0,%fpcr                7209         fmov.l          %d0,%fpcr
7210         fadd.s          &0x3F800000,%fp0         7210         fadd.s          &0x3F800000,%fp0        # 1+X in user mode
7211         bra             t_pinx2                  7211         bra             t_pinx2
7212                                                  7212 
7213 EEXPBIG:                                         7213 EEXPBIG:
7214 #--Step 8                                        7214 #--Step 8
7215         cmp.l           %d1,&0x400CB27C          7215         cmp.l           %d1,&0x400CB27C         # 16480 log2
7216         bgt.b           EXP2BIG                  7216         bgt.b           EXP2BIG
7217 #--Steps 8.2 -- 8.6                              7217 #--Steps 8.2 -- 8.6
7218         fmov.x          (%a0),%fp0               7218         fmov.x          (%a0),%fp0              # load input from (a0)
7219                                                  7219 
7220         fmov.x          %fp0,%fp1                7220         fmov.x          %fp0,%fp1
7221         fmul.s          &0x42B8AA3B,%fp0         7221         fmul.s          &0x42B8AA3B,%fp0        # 64/log2 * X
7222         fmovm.x         &0xc,-(%sp)              7222         fmovm.x         &0xc,-(%sp)             # save fp2 {%fp2/%fp3}
7223         mov.l           &1,ADJFLAG(%a6)          7223         mov.l           &1,ADJFLAG(%a6)
7224         fmov.l          %fp0,%d1                 7224         fmov.l          %fp0,%d1                # N = int( X * 64/log2 )
7225         lea             EEXPTBL(%pc),%a1         7225         lea             EEXPTBL(%pc),%a1
7226         fmov.l          %d1,%fp0                 7226         fmov.l          %d1,%fp0                # convert to floating-format
7227         mov.l           %d1,L_SCR1(%a6)          7227         mov.l           %d1,L_SCR1(%a6)         # save N temporarily
7228         and.l           &0x3F,%d1                7228         and.l           &0x3F,%d1               # D0 is J = N mod 64
7229         lsl.l           &4,%d1                   7229         lsl.l           &4,%d1
7230         add.l           %d1,%a1                  7230         add.l           %d1,%a1                 # address of 2^(J/64)
7231         mov.l           L_SCR1(%a6),%d1          7231         mov.l           L_SCR1(%a6),%d1
7232         asr.l           &6,%d1                   7232         asr.l           &6,%d1                  # D0 is K
7233         mov.l           %d1,L_SCR1(%a6)          7233         mov.l           %d1,L_SCR1(%a6)         # save K temporarily
7234         asr.l           &1,%d1                   7234         asr.l           &1,%d1                  # D0 is M1
7235         sub.l           %d1,L_SCR1(%a6)          7235         sub.l           %d1,L_SCR1(%a6)         # a1 is M
7236         add.w           &0x3FFF,%d1              7236         add.w           &0x3FFF,%d1             # biased expo. of 2^(M1)
7237         mov.w           %d1,ADJSCALE(%a6)        7237         mov.w           %d1,ADJSCALE(%a6)       # ADJSCALE := 2^(M1)
7238         mov.l           &0x80000000,ADJSCALE+    7238         mov.l           &0x80000000,ADJSCALE+4(%a6)
7239         clr.l           ADJSCALE+8(%a6)          7239         clr.l           ADJSCALE+8(%a6)
7240         mov.l           L_SCR1(%a6),%d1          7240         mov.l           L_SCR1(%a6),%d1         # D0 is M
7241         add.w           &0x3FFF,%d1              7241         add.w           &0x3FFF,%d1             # biased expo. of 2^(M)
7242         bra.w           EXPCONT1                 7242         bra.w           EXPCONT1                # go back to Step 3
7243                                                  7243 
7244 EXP2BIG:                                         7244 EXP2BIG:
7245 #--Step 9                                        7245 #--Step 9
7246         tst.b           (%a0)                    7246         tst.b           (%a0)                   # is X positive or negative?
7247         bmi             t_unfl2                  7247         bmi             t_unfl2
7248         bra             t_ovfl2                  7248         bra             t_ovfl2
7249                                                  7249 
7250         global          setoxd                   7250         global          setoxd
7251 setoxd:                                          7251 setoxd:
7252 #--entry point for EXP(X), X is denormalized     7252 #--entry point for EXP(X), X is denormalized
7253         mov.l           (%a0),-(%sp)             7253         mov.l           (%a0),-(%sp)
7254         andi.l          &0x80000000,(%sp)        7254         andi.l          &0x80000000,(%sp)
7255         ori.l           &0x00800000,(%sp)        7255         ori.l           &0x00800000,(%sp)       # sign(X)*2^(-126)
7256                                                  7256 
7257         fmov.s          &0x3F800000,%fp0         7257         fmov.s          &0x3F800000,%fp0
7258                                                  7258 
7259         fmov.l          %d0,%fpcr                7259         fmov.l          %d0,%fpcr
7260         fadd.s          (%sp)+,%fp0              7260         fadd.s          (%sp)+,%fp0
7261         bra             t_pinx2                  7261         bra             t_pinx2
7262                                                  7262 
7263         global          setoxm1                  7263         global          setoxm1
7264 setoxm1:                                         7264 setoxm1:
7265 #--entry point for EXPM1(X), here X is finite    7265 #--entry point for EXPM1(X), here X is finite, non-zero, non-NaN
7266                                                  7266 
7267 #--Step 1.                                       7267 #--Step 1.
7268 #--Step 1.1                                      7268 #--Step 1.1
7269         mov.l           (%a0),%d1                7269         mov.l           (%a0),%d1               # load part of input X
7270         and.l           &0x7FFF0000,%d1          7270         and.l           &0x7FFF0000,%d1         # biased expo. of X
7271         cmp.l           %d1,&0x3FFD0000          7271         cmp.l           %d1,&0x3FFD0000         # 1/4
7272         bge.b           EM1CON1                  7272         bge.b           EM1CON1                 # |X| >= 1/4
7273         bra             EM1SM                    7273         bra             EM1SM
7274                                                  7274 
7275 EM1CON1:                                         7275 EM1CON1:
7276 #--Step 1.3                                      7276 #--Step 1.3
7277 #--The case |X| >= 1/4                           7277 #--The case |X| >= 1/4
7278         mov.w           4(%a0),%d1               7278         mov.w           4(%a0),%d1              # expo. and partial sig. of |X|
7279         cmp.l           %d1,&0x4004C215          7279         cmp.l           %d1,&0x4004C215         # 70log2 rounded up to 16 bits
7280         ble.b           EM1MAIN                  7280         ble.b           EM1MAIN                 # 1/4 <= |X| <= 70log2
7281         bra             EM1BIG                   7281         bra             EM1BIG
7282                                                  7282 
7283 EM1MAIN:                                         7283 EM1MAIN:
7284 #--Step 2.                                       7284 #--Step 2.
7285 #--This is the case:    1/4 <= |X| <= 70 log2    7285 #--This is the case:    1/4 <= |X| <= 70 log2.
7286         fmov.x          (%a0),%fp0               7286         fmov.x          (%a0),%fp0              # load input from (a0)
7287                                                  7287 
7288         fmov.x          %fp0,%fp1                7288         fmov.x          %fp0,%fp1
7289         fmul.s          &0x42B8AA3B,%fp0         7289         fmul.s          &0x42B8AA3B,%fp0        # 64/log2 * X
7290         fmovm.x         &0xc,-(%sp)              7290         fmovm.x         &0xc,-(%sp)             # save fp2 {%fp2/%fp3}
7291         fmov.l          %fp0,%d1                 7291         fmov.l          %fp0,%d1                # N = int( X * 64/log2 )
7292         lea             EEXPTBL(%pc),%a1         7292         lea             EEXPTBL(%pc),%a1
7293         fmov.l          %d1,%fp0                 7293         fmov.l          %d1,%fp0                # convert to floating-format
7294                                                  7294 
7295         mov.l           %d1,L_SCR1(%a6)          7295         mov.l           %d1,L_SCR1(%a6)         # save N temporarily
7296         and.l           &0x3F,%d1                7296         and.l           &0x3F,%d1               # D0 is J = N mod 64
7297         lsl.l           &4,%d1                   7297         lsl.l           &4,%d1
7298         add.l           %d1,%a1                  7298         add.l           %d1,%a1                 # address of 2^(J/64)
7299         mov.l           L_SCR1(%a6),%d1          7299         mov.l           L_SCR1(%a6),%d1
7300         asr.l           &6,%d1                   7300         asr.l           &6,%d1                  # D0 is M
7301         mov.l           %d1,L_SCR1(%a6)          7301         mov.l           %d1,L_SCR1(%a6)         # save a copy of M
7302                                                  7302 
7303 #--Step 3.                                       7303 #--Step 3.
7304 #--fp1,fp2 saved on the stack. fp0 is N, fp1     7304 #--fp1,fp2 saved on the stack. fp0 is N, fp1 is X,
7305 #--a0 points to 2^(J/64), D0 and a1 both cont    7305 #--a0 points to 2^(J/64), D0 and a1 both contain M
7306         fmov.x          %fp0,%fp2                7306         fmov.x          %fp0,%fp2
7307         fmul.s          &0xBC317218,%fp0         7307         fmul.s          &0xBC317218,%fp0        # N * L1, L1 = lead(-log2/64)
7308         fmul.x          L2(%pc),%fp2             7308         fmul.x          L2(%pc),%fp2            # N * L2, L1+L2 = -log2/64
7309         fadd.x          %fp1,%fp0                7309         fadd.x          %fp1,%fp0               # X + N*L1
7310         fadd.x          %fp2,%fp0                7310         fadd.x          %fp2,%fp0               # fp0 is R, reduced arg.
7311         add.w           &0x3FFF,%d1              7311         add.w           &0x3FFF,%d1             # D0 is biased expo. of 2^M
7312                                                  7312 
7313 #--Step 4.                                       7313 #--Step 4.
7314 #--WE NOW COMPUTE EXP(R)-1 BY A POLYNOMIAL       7314 #--WE NOW COMPUTE EXP(R)-1 BY A POLYNOMIAL
7315 #-- R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*(    7315 #-- R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*(A5 + R*A6)))))
7316 #--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE     7316 #--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE S = R*R
7317 #--[R*S*(A2+S*(A4+S*A6))] + [R+S*(A1+S*(A3+S*    7317 #--[R*S*(A2+S*(A4+S*A6))] + [R+S*(A1+S*(A3+S*A5))]
7318                                                  7318 
7319         fmov.x          %fp0,%fp1                7319         fmov.x          %fp0,%fp1
7320         fmul.x          %fp1,%fp1                7320         fmul.x          %fp1,%fp1               # fp1 IS S = R*R
7321                                                  7321 
7322         fmov.s          &0x3950097B,%fp2         7322         fmov.s          &0x3950097B,%fp2        # fp2 IS a6
7323                                                  7323 
7324         fmul.x          %fp1,%fp2                7324         fmul.x          %fp1,%fp2               # fp2 IS S*A6
7325         fmov.x          %fp1,%fp3                7325         fmov.x          %fp1,%fp3
7326         fmul.s          &0x3AB60B6A,%fp3         7326         fmul.s          &0x3AB60B6A,%fp3        # fp3 IS S*A5
7327                                                  7327 
7328         fadd.d          EM1A4(%pc),%fp2          7328         fadd.d          EM1A4(%pc),%fp2         # fp2 IS A4+S*A6
7329         fadd.d          EM1A3(%pc),%fp3          7329         fadd.d          EM1A3(%pc),%fp3         # fp3 IS A3+S*A5
7330         mov.w           %d1,SC(%a6)              7330         mov.w           %d1,SC(%a6)             # SC is 2^(M) in extended
7331         mov.l           &0x80000000,SC+4(%a6)    7331         mov.l           &0x80000000,SC+4(%a6)
7332         clr.l           SC+8(%a6)                7332         clr.l           SC+8(%a6)
7333                                                  7333 
7334         fmul.x          %fp1,%fp2                7334         fmul.x          %fp1,%fp2               # fp2 IS S*(A4+S*A6)
7335         mov.l           L_SCR1(%a6),%d1          7335         mov.l           L_SCR1(%a6),%d1         # D0 is M
7336         neg.w           %d1                      7336         neg.w           %d1                     # D0 is -M
7337         fmul.x          %fp1,%fp3                7337         fmul.x          %fp1,%fp3               # fp3 IS S*(A3+S*A5)
7338         add.w           &0x3FFF,%d1              7338         add.w           &0x3FFF,%d1             # biased expo. of 2^(-M)
7339         fadd.d          EM1A2(%pc),%fp2          7339         fadd.d          EM1A2(%pc),%fp2         # fp2 IS A2+S*(A4+S*A6)
7340         fadd.s          &0x3F000000,%fp3         7340         fadd.s          &0x3F000000,%fp3        # fp3 IS A1+S*(A3+S*A5)
7341                                                  7341 
7342         fmul.x          %fp1,%fp2                7342         fmul.x          %fp1,%fp2               # fp2 IS S*(A2+S*(A4+S*A6))
7343         or.w            &0x8000,%d1              7343         or.w            &0x8000,%d1             # signed/expo. of -2^(-M)
7344         mov.w           %d1,ONEBYSC(%a6)         7344         mov.w           %d1,ONEBYSC(%a6)        # OnebySc is -2^(-M)
7345         mov.l           &0x80000000,ONEBYSC+4    7345         mov.l           &0x80000000,ONEBYSC+4(%a6)
7346         clr.l           ONEBYSC+8(%a6)           7346         clr.l           ONEBYSC+8(%a6)
7347         fmul.x          %fp3,%fp1                7347         fmul.x          %fp3,%fp1               # fp1 IS S*(A1+S*(A3+S*A5))
7348                                                  7348 
7349         fmul.x          %fp0,%fp2                7349         fmul.x          %fp0,%fp2               # fp2 IS R*S*(A2+S*(A4+S*A6))
7350         fadd.x          %fp1,%fp0                7350         fadd.x          %fp1,%fp0               # fp0 IS R+S*(A1+S*(A3+S*A5))
7351                                                  7351 
7352         fadd.x          %fp2,%fp0                7352         fadd.x          %fp2,%fp0               # fp0 IS EXP(R)-1
7353                                                  7353 
7354         fmovm.x         (%sp)+,&0x30             7354         fmovm.x         (%sp)+,&0x30            # fp2 restored {%fp2/%fp3}
7355                                                  7355 
7356 #--Step 5                                        7356 #--Step 5
7357 #--Compute 2^(J/64)*p                            7357 #--Compute 2^(J/64)*p
7358                                                  7358 
7359         fmul.x          (%a1),%fp0               7359         fmul.x          (%a1),%fp0              # 2^(J/64)*(Exp(R)-1)
7360                                                  7360 
7361 #--Step 6                                        7361 #--Step 6
7362 #--Step 6.1                                      7362 #--Step 6.1
7363         mov.l           L_SCR1(%a6),%d1          7363         mov.l           L_SCR1(%a6),%d1         # retrieve M
7364         cmp.l           %d1,&63                  7364         cmp.l           %d1,&63
7365         ble.b           MLE63                    7365         ble.b           MLE63
7366 #--Step 6.2     M >= 64                          7366 #--Step 6.2     M >= 64
7367         fmov.s          12(%a1),%fp1             7367         fmov.s          12(%a1),%fp1            # fp1 is t
7368         fadd.x          ONEBYSC(%a6),%fp1        7368         fadd.x          ONEBYSC(%a6),%fp1       # fp1 is t+OnebySc
7369         fadd.x          %fp1,%fp0                7369         fadd.x          %fp1,%fp0               # p+(t+OnebySc), fp1 released
7370         fadd.x          (%a1),%fp0               7370         fadd.x          (%a1),%fp0              # T+(p+(t+OnebySc))
7371         bra             EM1SCALE                 7371         bra             EM1SCALE
7372 MLE63:                                           7372 MLE63:
7373 #--Step 6.3     M <= 63                          7373 #--Step 6.3     M <= 63
7374         cmp.l           %d1,&-3                  7374         cmp.l           %d1,&-3
7375         bge.b           MGEN3                    7375         bge.b           MGEN3
7376 MLTN3:                                           7376 MLTN3:
7377 #--Step 6.4     M <= -4                          7377 #--Step 6.4     M <= -4
7378         fadd.s          12(%a1),%fp0             7378         fadd.s          12(%a1),%fp0            # p+t
7379         fadd.x          (%a1),%fp0               7379         fadd.x          (%a1),%fp0              # T+(p+t)
7380         fadd.x          ONEBYSC(%a6),%fp0        7380         fadd.x          ONEBYSC(%a6),%fp0       # OnebySc + (T+(p+t))
7381         bra             EM1SCALE                 7381         bra             EM1SCALE
7382 MGEN3:                                           7382 MGEN3:
7383 #--Step 6.5     -3 <= M <= 63                    7383 #--Step 6.5     -3 <= M <= 63
7384         fmov.x          (%a1)+,%fp1              7384         fmov.x          (%a1)+,%fp1             # fp1 is T
7385         fadd.s          (%a1),%fp0               7385         fadd.s          (%a1),%fp0              # fp0 is p+t
7386         fadd.x          ONEBYSC(%a6),%fp1        7386         fadd.x          ONEBYSC(%a6),%fp1       # fp1 is T+OnebySc
7387         fadd.x          %fp1,%fp0                7387         fadd.x          %fp1,%fp0               # (T+OnebySc)+(p+t)
7388                                                  7388 
7389 EM1SCALE:                                        7389 EM1SCALE:
7390 #--Step 6.6                                      7390 #--Step 6.6
7391         fmov.l          %d0,%fpcr                7391         fmov.l          %d0,%fpcr
7392         fmul.x          SC(%a6),%fp0             7392         fmul.x          SC(%a6),%fp0
7393         bra             t_inx2                   7393         bra             t_inx2
7394                                                  7394 
7395 EM1SM:                                           7395 EM1SM:
7396 #--Step 7       |X| < 1/4.                       7396 #--Step 7       |X| < 1/4.
7397         cmp.l           %d1,&0x3FBE0000          7397         cmp.l           %d1,&0x3FBE0000         # 2^(-65)
7398         bge.b           EM1POLY                  7398         bge.b           EM1POLY
7399                                                  7399 
7400 EM1TINY:                                         7400 EM1TINY:
7401 #--Step 8       |X| < 2^(-65)                    7401 #--Step 8       |X| < 2^(-65)
7402         cmp.l           %d1,&0x00330000          7402         cmp.l           %d1,&0x00330000         # 2^(-16312)
7403         blt.b           EM12TINY                 7403         blt.b           EM12TINY
7404 #--Step 8.2                                      7404 #--Step 8.2
7405         mov.l           &0x80010000,SC(%a6)      7405         mov.l           &0x80010000,SC(%a6)     # SC is -2^(-16382)
7406         mov.l           &0x80000000,SC+4(%a6)    7406         mov.l           &0x80000000,SC+4(%a6)
7407         clr.l           SC+8(%a6)                7407         clr.l           SC+8(%a6)
7408         fmov.x          (%a0),%fp0               7408         fmov.x          (%a0),%fp0
7409         fmov.l          %d0,%fpcr                7409         fmov.l          %d0,%fpcr
7410         mov.b           &FADD_OP,%d1             7410         mov.b           &FADD_OP,%d1            # last inst is ADD
7411         fadd.x          SC(%a6),%fp0             7411         fadd.x          SC(%a6),%fp0
7412         bra             t_catch                  7412         bra             t_catch
7413                                                  7413 
7414 EM12TINY:                                        7414 EM12TINY:
7415 #--Step 8.3                                      7415 #--Step 8.3
7416         fmov.x          (%a0),%fp0               7416         fmov.x          (%a0),%fp0
7417         fmul.d          TWO140(%pc),%fp0         7417         fmul.d          TWO140(%pc),%fp0
7418         mov.l           &0x80010000,SC(%a6)      7418         mov.l           &0x80010000,SC(%a6)
7419         mov.l           &0x80000000,SC+4(%a6)    7419         mov.l           &0x80000000,SC+4(%a6)
7420         clr.l           SC+8(%a6)                7420         clr.l           SC+8(%a6)
7421         fadd.x          SC(%a6),%fp0             7421         fadd.x          SC(%a6),%fp0
7422         fmov.l          %d0,%fpcr                7422         fmov.l          %d0,%fpcr
7423         mov.b           &FMUL_OP,%d1             7423         mov.b           &FMUL_OP,%d1            # last inst is MUL
7424         fmul.d          TWON140(%pc),%fp0        7424         fmul.d          TWON140(%pc),%fp0
7425         bra             t_catch                  7425         bra             t_catch
7426                                                  7426 
7427 EM1POLY:                                         7427 EM1POLY:
7428 #--Step 9       exp(X)-1 by a simple polynomi    7428 #--Step 9       exp(X)-1 by a simple polynomial
7429         fmov.x          (%a0),%fp0               7429         fmov.x          (%a0),%fp0              # fp0 is X
7430         fmul.x          %fp0,%fp0                7430         fmul.x          %fp0,%fp0               # fp0 is S := X*X
7431         fmovm.x         &0xc,-(%sp)              7431         fmovm.x         &0xc,-(%sp)             # save fp2 {%fp2/%fp3}
7432         fmov.s          &0x2F30CAA8,%fp1         7432         fmov.s          &0x2F30CAA8,%fp1        # fp1 is B12
7433         fmul.x          %fp0,%fp1                7433         fmul.x          %fp0,%fp1               # fp1 is S*B12
7434         fmov.s          &0x310F8290,%fp2         7434         fmov.s          &0x310F8290,%fp2        # fp2 is B11
7435         fadd.s          &0x32D73220,%fp1         7435         fadd.s          &0x32D73220,%fp1        # fp1 is B10+S*B12
7436                                                  7436 
7437         fmul.x          %fp0,%fp2                7437         fmul.x          %fp0,%fp2               # fp2 is S*B11
7438         fmul.x          %fp0,%fp1                7438         fmul.x          %fp0,%fp1               # fp1 is S*(B10 + ...
7439                                                  7439 
7440         fadd.s          &0x3493F281,%fp2         7440         fadd.s          &0x3493F281,%fp2        # fp2 is B9+S*...
7441         fadd.d          EM1B8(%pc),%fp1          7441         fadd.d          EM1B8(%pc),%fp1         # fp1 is B8+S*...
7442                                                  7442 
7443         fmul.x          %fp0,%fp2                7443         fmul.x          %fp0,%fp2               # fp2 is S*(B9+...
7444         fmul.x          %fp0,%fp1                7444         fmul.x          %fp0,%fp1               # fp1 is S*(B8+...
7445                                                  7445 
7446         fadd.d          EM1B7(%pc),%fp2          7446         fadd.d          EM1B7(%pc),%fp2         # fp2 is B7+S*...
7447         fadd.d          EM1B6(%pc),%fp1          7447         fadd.d          EM1B6(%pc),%fp1         # fp1 is B6+S*...
7448                                                  7448 
7449         fmul.x          %fp0,%fp2                7449         fmul.x          %fp0,%fp2               # fp2 is S*(B7+...
7450         fmul.x          %fp0,%fp1                7450         fmul.x          %fp0,%fp1               # fp1 is S*(B6+...
7451                                                  7451 
7452         fadd.d          EM1B5(%pc),%fp2          7452         fadd.d          EM1B5(%pc),%fp2         # fp2 is B5+S*...
7453         fadd.d          EM1B4(%pc),%fp1          7453         fadd.d          EM1B4(%pc),%fp1         # fp1 is B4+S*...
7454                                                  7454 
7455         fmul.x          %fp0,%fp2                7455         fmul.x          %fp0,%fp2               # fp2 is S*(B5+...
7456         fmul.x          %fp0,%fp1                7456         fmul.x          %fp0,%fp1               # fp1 is S*(B4+...
7457                                                  7457 
7458         fadd.d          EM1B3(%pc),%fp2          7458         fadd.d          EM1B3(%pc),%fp2         # fp2 is B3+S*...
7459         fadd.x          EM1B2(%pc),%fp1          7459         fadd.x          EM1B2(%pc),%fp1         # fp1 is B2+S*...
7460                                                  7460 
7461         fmul.x          %fp0,%fp2                7461         fmul.x          %fp0,%fp2               # fp2 is S*(B3+...
7462         fmul.x          %fp0,%fp1                7462         fmul.x          %fp0,%fp1               # fp1 is S*(B2+...
7463                                                  7463 
7464         fmul.x          %fp0,%fp2                7464         fmul.x          %fp0,%fp2               # fp2 is S*S*(B3+...)
7465         fmul.x          (%a0),%fp1               7465         fmul.x          (%a0),%fp1              # fp1 is X*S*(B2...
7466                                                  7466 
7467         fmul.s          &0x3F000000,%fp0         7467         fmul.s          &0x3F000000,%fp0        # fp0 is S*B1
7468         fadd.x          %fp2,%fp1                7468         fadd.x          %fp2,%fp1               # fp1 is Q
7469                                                  7469 
7470         fmovm.x         (%sp)+,&0x30             7470         fmovm.x         (%sp)+,&0x30            # fp2 restored {%fp2/%fp3}
7471                                                  7471 
7472         fadd.x          %fp1,%fp0                7472         fadd.x          %fp1,%fp0               # fp0 is S*B1+Q
7473                                                  7473 
7474         fmov.l          %d0,%fpcr                7474         fmov.l          %d0,%fpcr
7475         fadd.x          (%a0),%fp0               7475         fadd.x          (%a0),%fp0
7476         bra             t_inx2                   7476         bra             t_inx2
7477                                                  7477 
7478 EM1BIG:                                          7478 EM1BIG:
7479 #--Step 10      |X| > 70 log2                    7479 #--Step 10      |X| > 70 log2
7480         mov.l           (%a0),%d1                7480         mov.l           (%a0),%d1
7481         cmp.l           %d1,&0                   7481         cmp.l           %d1,&0
7482         bgt.w           EXPC1                    7482         bgt.w           EXPC1
7483 #--Step 10.2                                     7483 #--Step 10.2
7484         fmov.s          &0xBF800000,%fp0         7484         fmov.s          &0xBF800000,%fp0        # fp0 is -1
7485         fmov.l          %d0,%fpcr                7485         fmov.l          %d0,%fpcr
7486         fadd.s          &0x00800000,%fp0         7486         fadd.s          &0x00800000,%fp0        # -1 + 2^(-126)
7487         bra             t_minx2                  7487         bra             t_minx2
7488                                                  7488 
7489         global          setoxm1d                 7489         global          setoxm1d
7490 setoxm1d:                                        7490 setoxm1d:
7491 #--entry point for EXPM1(X), here X is denorm    7491 #--entry point for EXPM1(X), here X is denormalized
7492 #--Step 0.                                       7492 #--Step 0.
7493         bra             t_extdnrm                7493         bra             t_extdnrm
7494                                                  7494 
7495 #############################################    7495 #########################################################################
7496 # sgetexp():  returns the exponent portion of    7496 # sgetexp():  returns the exponent portion of the input argument.       #
7497 #             The exponent bias is removed an    7497 #             The exponent bias is removed and the exponent value is    #
7498 #             returned as an extended precisi    7498 #             returned as an extended precision number in fp0.          #
7499 # sgetexpd(): handles denormalized numbers.      7499 # sgetexpd(): handles denormalized numbers.                             #
7500 #                                                7500 #                                                                       #
7501 # sgetman():  extracts the mantissa of the in    7501 # sgetman():  extracts the mantissa of the input argument. The          #
7502 #             mantissa is converted to an ext    7502 #             mantissa is converted to an extended precision number w/  #
7503 #             an exponent of $3fff and is ret    7503 #             an exponent of $3fff and is returned in fp0. The range of #
7504 #             the result is [1.0 - 2.0).         7504 #             the result is [1.0 - 2.0).                                #
7505 # sgetmand(): handles denormalized numbers.      7505 # sgetmand(): handles denormalized numbers.                             #
7506 #                                                7506 #                                                                       #
7507 # INPUT *************************************    7507 # INPUT *************************************************************** #
7508 #       a0  = pointer to extended precision i    7508 #       a0  = pointer to extended precision input                       #
7509 #                                                7509 #                                                                       #
7510 # OUTPUT ************************************    7510 # OUTPUT ************************************************************** #
7511 #       fp0 = exponent(X) or mantissa(X)         7511 #       fp0 = exponent(X) or mantissa(X)                                #
7512 #                                                7512 #                                                                       #
7513 #############################################    7513 #########################################################################
7514                                                  7514 
7515         global          sgetexp                  7515         global          sgetexp
7516 sgetexp:                                         7516 sgetexp:
7517         mov.w           SRC_EX(%a0),%d0          7517         mov.w           SRC_EX(%a0),%d0         # get the exponent
7518         bclr            &0xf,%d0                 7518         bclr            &0xf,%d0                # clear the sign bit
7519         subi.w          &0x3fff,%d0              7519         subi.w          &0x3fff,%d0             # subtract off the bias
7520         fmov.w          %d0,%fp0                 7520         fmov.w          %d0,%fp0                # return exp in fp0
7521         blt.b           sgetexpn                 7521         blt.b           sgetexpn                # it's negative
7522         rts                                      7522         rts
7523                                                  7523 
7524 sgetexpn:                                        7524 sgetexpn:
7525         mov.b           &neg_bmask,FPSR_CC(%a    7525         mov.b           &neg_bmask,FPSR_CC(%a6) # set 'N' ccode bit
7526         rts                                      7526         rts
7527                                                  7527 
7528         global          sgetexpd                 7528         global          sgetexpd
7529 sgetexpd:                                        7529 sgetexpd:
7530         bsr.l           norm                     7530         bsr.l           norm                    # normalize
7531         neg.w           %d0                      7531         neg.w           %d0                     # new exp = -(shft amt)
7532         subi.w          &0x3fff,%d0              7532         subi.w          &0x3fff,%d0             # subtract off the bias
7533         fmov.w          %d0,%fp0                 7533         fmov.w          %d0,%fp0                # return exp in fp0
7534         mov.b           &neg_bmask,FPSR_CC(%a    7534         mov.b           &neg_bmask,FPSR_CC(%a6) # set 'N' ccode bit
7535         rts                                      7535         rts
7536                                                  7536 
7537         global          sgetman                  7537         global          sgetman
7538 sgetman:                                         7538 sgetman:
7539         mov.w           SRC_EX(%a0),%d0          7539         mov.w           SRC_EX(%a0),%d0         # get the exp
7540         ori.w           &0x7fff,%d0              7540         ori.w           &0x7fff,%d0             # clear old exp
7541         bclr            &0xe,%d0                 7541         bclr            &0xe,%d0                # make it the new exp +-3fff
7542                                                  7542 
7543 # here, we build the result in a tmp location    7543 # here, we build the result in a tmp location so as not to disturb the input
7544         mov.l           SRC_HI(%a0),FP_SCR0_H    7544         mov.l           SRC_HI(%a0),FP_SCR0_HI(%a6) # copy to tmp loc
7545         mov.l           SRC_LO(%a0),FP_SCR0_L    7545         mov.l           SRC_LO(%a0),FP_SCR0_LO(%a6) # copy to tmp loc
7546         mov.w           %d0,FP_SCR0_EX(%a6)      7546         mov.w           %d0,FP_SCR0_EX(%a6)     # insert new exponent
7547         fmov.x          FP_SCR0(%a6),%fp0        7547         fmov.x          FP_SCR0(%a6),%fp0       # put new value back in fp0
7548         bmi.b           sgetmann                 7548         bmi.b           sgetmann                # it's negative
7549         rts                                      7549         rts
7550                                                  7550 
7551 sgetmann:                                        7551 sgetmann:
7552         mov.b           &neg_bmask,FPSR_CC(%a    7552         mov.b           &neg_bmask,FPSR_CC(%a6) # set 'N' ccode bit
7553         rts                                      7553         rts
7554                                                  7554 
7555 #                                                7555 #
7556 # For denormalized numbers, shift the mantiss    7556 # For denormalized numbers, shift the mantissa until the j-bit = 1,
7557 # then load the exponent with +/1 $3fff.         7557 # then load the exponent with +/1 $3fff.
7558 #                                                7558 #
7559         global          sgetmand                 7559         global          sgetmand
7560 sgetmand:                                        7560 sgetmand:
7561         bsr.l           norm                     7561         bsr.l           norm                    # normalize exponent
7562         bra.b           sgetman                  7562         bra.b           sgetman
7563                                                  7563 
7564 #############################################    7564 #########################################################################
7565 # scosh():  computes the hyperbolic cosine of    7565 # scosh():  computes the hyperbolic cosine of a normalized input        #
7566 # scoshd(): computes the hyperbolic cosine of    7566 # scoshd(): computes the hyperbolic cosine of a denormalized input      #
7567 #                                                7567 #                                                                       #
7568 # INPUT *************************************    7568 # INPUT *************************************************************** #
7569 #       a0 = pointer to extended precision in    7569 #       a0 = pointer to extended precision input                        #
7570 #       d0 = round precision,mode                7570 #       d0 = round precision,mode                                       #
7571 #                                                7571 #                                                                       #
7572 # OUTPUT ************************************    7572 # OUTPUT ************************************************************** #
7573 #       fp0 = cosh(X)                            7573 #       fp0 = cosh(X)                                                   #
7574 #                                                7574 #                                                                       #
7575 # ACCURACY and MONOTONICITY *****************    7575 # ACCURACY and MONOTONICITY ******************************************* #
7576 #       The returned result is within 3 ulps     7576 #       The returned result is within 3 ulps in 64 significant bit,     #
7577 #       i.e. within 0.5001 ulp to 53 bits if     7577 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
7578 #       rounded to double precision. The resu    7578 #       rounded to double precision. The result is provably monotonic   #
7579 #       in double precision.                     7579 #       in double precision.                                            #
7580 #                                                7580 #                                                                       #
7581 # ALGORITHM *********************************    7581 # ALGORITHM *********************************************************** #
7582 #                                                7582 #                                                                       #
7583 #       COSH                                     7583 #       COSH                                                            #
7584 #       1. If |X| > 16380 log2, go to 3.         7584 #       1. If |X| > 16380 log2, go to 3.                                #
7585 #                                                7585 #                                                                       #
7586 #       2. (|X| <= 16380 log2) Cosh(X) is obt    7586 #       2. (|X| <= 16380 log2) Cosh(X) is obtained by the formulae      #
7587 #               y = |X|, z = exp(Y), and         7587 #               y = |X|, z = exp(Y), and                                #
7588 #               cosh(X) = (1/2)*( z + 1/z ).     7588 #               cosh(X) = (1/2)*( z + 1/z ).                            #
7589 #               Exit.                            7589 #               Exit.                                                   #
7590 #                                                7590 #                                                                       #
7591 #       3. (|X| > 16380 log2). If |X| > 16480    7591 #       3. (|X| > 16380 log2). If |X| > 16480 log2, go to 5.            #
7592 #                                                7592 #                                                                       #
7593 #       4. (16380 log2 < |X| <= 16480 log2)      7593 #       4. (16380 log2 < |X| <= 16480 log2)                             #
7594 #               cosh(X) = sign(X) * exp(|X|)/    7594 #               cosh(X) = sign(X) * exp(|X|)/2.                         #
7595 #               However, invoking exp(|X|) ma    7595 #               However, invoking exp(|X|) may cause premature          #
7596 #               overflow. Thus, we calculate     7596 #               overflow. Thus, we calculate sinh(X) as follows:        #
7597 #               Y       := |X|                   7597 #               Y       := |X|                                          #
7598 #               Fact    :=      2**(16380)       7598 #               Fact    :=      2**(16380)                              #
7599 #               Y'      := Y - 16381 log2        7599 #               Y'      := Y - 16381 log2                               #
7600 #               cosh(X) := Fact * exp(Y').       7600 #               cosh(X) := Fact * exp(Y').                              #
7601 #               Exit.                            7601 #               Exit.                                                   #
7602 #                                                7602 #                                                                       #
7603 #       5. (|X| > 16480 log2) sinh(X) must ov    7603 #       5. (|X| > 16480 log2) sinh(X) must overflow. Return             #
7604 #               Huge*Huge to generate overflo    7604 #               Huge*Huge to generate overflow and an infinity with     #
7605 #               the appropriate sign. Huge is    7605 #               the appropriate sign. Huge is the largest finite number #
7606 #               in extended format. Exit.        7606 #               in extended format. Exit.                               #
7607 #                                                7607 #                                                                       #
7608 #############################################    7608 #########################################################################
7609                                                  7609 
7610 TWO16380:                                        7610 TWO16380:
7611         long            0x7FFB0000,0x80000000    7611         long            0x7FFB0000,0x80000000,0x00000000,0x00000000
7612                                                  7612 
7613         global          scosh                    7613         global          scosh
7614 scosh:                                           7614 scosh:
7615         fmov.x          (%a0),%fp0               7615         fmov.x          (%a0),%fp0              # LOAD INPUT
7616                                                  7616 
7617         mov.l           (%a0),%d1                7617         mov.l           (%a0),%d1
7618         mov.w           4(%a0),%d1               7618         mov.w           4(%a0),%d1
7619         and.l           &0x7FFFFFFF,%d1          7619         and.l           &0x7FFFFFFF,%d1
7620         cmp.l           %d1,&0x400CB167          7620         cmp.l           %d1,&0x400CB167
7621         bgt.b           COSHBIG                  7621         bgt.b           COSHBIG
7622                                                  7622 
7623 #--THIS IS THE USUAL CASE, |X| < 16380 LOG2      7623 #--THIS IS THE USUAL CASE, |X| < 16380 LOG2
7624 #--COSH(X) = (1/2) * ( EXP(X) + 1/EXP(X) )       7624 #--COSH(X) = (1/2) * ( EXP(X) + 1/EXP(X) )
7625                                                  7625 
7626         fabs.x          %fp0                     7626         fabs.x          %fp0                    # |X|
7627                                                  7627 
7628         mov.l           %d0,-(%sp)               7628         mov.l           %d0,-(%sp)
7629         clr.l           %d0                      7629         clr.l           %d0
7630         fmovm.x         &0x01,-(%sp)             7630         fmovm.x         &0x01,-(%sp)            # save |X| to stack
7631         lea             (%sp),%a0                7631         lea             (%sp),%a0               # pass ptr to |X|
7632         bsr             setox                    7632         bsr             setox                   # FP0 IS EXP(|X|)
7633         add.l           &0xc,%sp                 7633         add.l           &0xc,%sp                # erase |X| from stack
7634         fmul.s          &0x3F000000,%fp0         7634         fmul.s          &0x3F000000,%fp0        # (1/2)EXP(|X|)
7635         mov.l           (%sp)+,%d0               7635         mov.l           (%sp)+,%d0
7636                                                  7636 
7637         fmov.s          &0x3E800000,%fp1         7637         fmov.s          &0x3E800000,%fp1        # (1/4)
7638         fdiv.x          %fp0,%fp1                7638         fdiv.x          %fp0,%fp1               # 1/(2 EXP(|X|))
7639                                                  7639 
7640         fmov.l          %d0,%fpcr                7640         fmov.l          %d0,%fpcr
7641         mov.b           &FADD_OP,%d1             7641         mov.b           &FADD_OP,%d1            # last inst is ADD
7642         fadd.x          %fp1,%fp0                7642         fadd.x          %fp1,%fp0
7643         bra             t_catch                  7643         bra             t_catch
7644                                                  7644 
7645 COSHBIG:                                         7645 COSHBIG:
7646         cmp.l           %d1,&0x400CB2B3          7646         cmp.l           %d1,&0x400CB2B3
7647         bgt.b           COSHHUGE                 7647         bgt.b           COSHHUGE
7648                                                  7648 
7649         fabs.x          %fp0                     7649         fabs.x          %fp0
7650         fsub.d          T1(%pc),%fp0             7650         fsub.d          T1(%pc),%fp0            # (|X|-16381LOG2_LEAD)
7651         fsub.d          T2(%pc),%fp0             7651         fsub.d          T2(%pc),%fp0            # |X| - 16381 LOG2, ACCURATE
7652                                                  7652 
7653         mov.l           %d0,-(%sp)               7653         mov.l           %d0,-(%sp)
7654         clr.l           %d0                      7654         clr.l           %d0
7655         fmovm.x         &0x01,-(%sp)             7655         fmovm.x         &0x01,-(%sp)            # save fp0 to stack
7656         lea             (%sp),%a0                7656         lea             (%sp),%a0               # pass ptr to fp0
7657         bsr             setox                    7657         bsr             setox
7658         add.l           &0xc,%sp                 7658         add.l           &0xc,%sp                # clear fp0 from stack
7659         mov.l           (%sp)+,%d0               7659         mov.l           (%sp)+,%d0
7660                                                  7660 
7661         fmov.l          %d0,%fpcr                7661         fmov.l          %d0,%fpcr
7662         mov.b           &FMUL_OP,%d1             7662         mov.b           &FMUL_OP,%d1            # last inst is MUL
7663         fmul.x          TWO16380(%pc),%fp0       7663         fmul.x          TWO16380(%pc),%fp0
7664         bra             t_catch                  7664         bra             t_catch
7665                                                  7665 
7666 COSHHUGE:                                        7666 COSHHUGE:
7667         bra             t_ovfl2                  7667         bra             t_ovfl2
7668                                                  7668 
7669         global          scoshd                   7669         global          scoshd
7670 #--COSH(X) = 1 FOR DENORMALIZED X                7670 #--COSH(X) = 1 FOR DENORMALIZED X
7671 scoshd:                                          7671 scoshd:
7672         fmov.s          &0x3F800000,%fp0         7672         fmov.s          &0x3F800000,%fp0
7673                                                  7673 
7674         fmov.l          %d0,%fpcr                7674         fmov.l          %d0,%fpcr
7675         fadd.s          &0x00800000,%fp0         7675         fadd.s          &0x00800000,%fp0
7676         bra             t_pinx2                  7676         bra             t_pinx2
7677                                                  7677 
7678 #############################################    7678 #########################################################################
7679 # ssinh():  computes the hyperbolic sine of a    7679 # ssinh():  computes the hyperbolic sine of a normalized input          #
7680 # ssinhd(): computes the hyperbolic sine of a    7680 # ssinhd(): computes the hyperbolic sine of a denormalized input        #
7681 #                                                7681 #                                                                       #
7682 # INPUT *************************************    7682 # INPUT *************************************************************** #
7683 #       a0 = pointer to extended precision in    7683 #       a0 = pointer to extended precision input                        #
7684 #       d0 = round precision,mode                7684 #       d0 = round precision,mode                                       #
7685 #                                                7685 #                                                                       #
7686 # OUTPUT ************************************    7686 # OUTPUT ************************************************************** #
7687 #       fp0 = sinh(X)                            7687 #       fp0 = sinh(X)                                                   #
7688 #                                                7688 #                                                                       #
7689 # ACCURACY and MONOTONICITY *****************    7689 # ACCURACY and MONOTONICITY ******************************************* #
7690 #       The returned result is within 3 ulps     7690 #       The returned result is within 3 ulps in 64 significant bit,     #
7691 #       i.e. within 0.5001 ulp to 53 bits if     7691 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
7692 #       rounded to double precision. The resu    7692 #       rounded to double precision. The result is provably monotonic   #
7693 #       in double precision.                     7693 #       in double precision.                                            #
7694 #                                                7694 #                                                                       #
7695 # ALGORITHM *********************************    7695 # ALGORITHM *********************************************************** #
7696 #                                                7696 #                                                                       #
7697 #       SINH                                     7697 #       SINH                                                            #
7698 #       1. If |X| > 16380 log2, go to 3.         7698 #       1. If |X| > 16380 log2, go to 3.                                #
7699 #                                                7699 #                                                                       #
7700 #       2. (|X| <= 16380 log2) Sinh(X) is obt    7700 #       2. (|X| <= 16380 log2) Sinh(X) is obtained by the formula       #
7701 #               y = |X|, sgn = sign(X), and z    7701 #               y = |X|, sgn = sign(X), and z = expm1(Y),               #
7702 #               sinh(X) = sgn*(1/2)*( z + z/(    7702 #               sinh(X) = sgn*(1/2)*( z + z/(1+z) ).                    #
7703 #          Exit.                                 7703 #          Exit.                                                        #
7704 #                                                7704 #                                                                       #
7705 #       3. If |X| > 16480 log2, go to 5.         7705 #       3. If |X| > 16480 log2, go to 5.                                #
7706 #                                                7706 #                                                                       #
7707 #       4. (16380 log2 < |X| <= 16480 log2)      7707 #       4. (16380 log2 < |X| <= 16480 log2)                             #
7708 #               sinh(X) = sign(X) * exp(|X|)/    7708 #               sinh(X) = sign(X) * exp(|X|)/2.                         #
7709 #          However, invoking exp(|X|) may cau    7709 #          However, invoking exp(|X|) may cause premature overflow.     #
7710 #          Thus, we calculate sinh(X) as foll    7710 #          Thus, we calculate sinh(X) as follows:                       #
7711 #             Y       := |X|                     7711 #             Y       := |X|                                            #
7712 #             sgn     := sign(X)                 7712 #             sgn     := sign(X)                                        #
7713 #             sgnFact := sgn * 2**(16380)        7713 #             sgnFact := sgn * 2**(16380)                               #
7714 #             Y'      := Y - 16381 log2          7714 #             Y'      := Y - 16381 log2                                 #
7715 #             sinh(X) := sgnFact * exp(Y').      7715 #             sinh(X) := sgnFact * exp(Y').                             #
7716 #          Exit.                                 7716 #          Exit.                                                        #
7717 #                                                7717 #                                                                       #
7718 #       5. (|X| > 16480 log2) sinh(X) must ov    7718 #       5. (|X| > 16480 log2) sinh(X) must overflow. Return             #
7719 #          sign(X)*Huge*Huge to generate over    7719 #          sign(X)*Huge*Huge to generate overflow and an infinity with  #
7720 #          the appropriate sign. Huge is the     7720 #          the appropriate sign. Huge is the largest finite number in   #
7721 #          extended format. Exit.                7721 #          extended format. Exit.                                       #
7722 #                                                7722 #                                                                       #
7723 #############################################    7723 #########################################################################
7724                                                  7724 
7725         global          ssinh                    7725         global          ssinh
7726 ssinh:                                           7726 ssinh:
7727         fmov.x          (%a0),%fp0               7727         fmov.x          (%a0),%fp0              # LOAD INPUT
7728                                                  7728 
7729         mov.l           (%a0),%d1                7729         mov.l           (%a0),%d1
7730         mov.w           4(%a0),%d1               7730         mov.w           4(%a0),%d1
7731         mov.l           %d1,%a1                  7731         mov.l           %d1,%a1                 # save (compacted) operand
7732         and.l           &0x7FFFFFFF,%d1          7732         and.l           &0x7FFFFFFF,%d1
7733         cmp.l           %d1,&0x400CB167          7733         cmp.l           %d1,&0x400CB167
7734         bgt.b           SINHBIG                  7734         bgt.b           SINHBIG
7735                                                  7735 
7736 #--THIS IS THE USUAL CASE, |X| < 16380 LOG2      7736 #--THIS IS THE USUAL CASE, |X| < 16380 LOG2
7737 #--Y = |X|, Z = EXPM1(Y), SINH(X) = SIGN(X)*(    7737 #--Y = |X|, Z = EXPM1(Y), SINH(X) = SIGN(X)*(1/2)*( Z + Z/(1+Z) )
7738                                                  7738 
7739         fabs.x          %fp0                     7739         fabs.x          %fp0                    # Y = |X|
7740                                                  7740 
7741         movm.l          &0x8040,-(%sp)           7741         movm.l          &0x8040,-(%sp)          # {a1/d0}
7742         fmovm.x         &0x01,-(%sp)             7742         fmovm.x         &0x01,-(%sp)            # save Y on stack
7743         lea             (%sp),%a0                7743         lea             (%sp),%a0               # pass ptr to Y
7744         clr.l           %d0                      7744         clr.l           %d0
7745         bsr             setoxm1                  7745         bsr             setoxm1                 # FP0 IS Z = EXPM1(Y)
7746         add.l           &0xc,%sp                 7746         add.l           &0xc,%sp                # clear Y from stack
7747         fmov.l          &0,%fpcr                 7747         fmov.l          &0,%fpcr
7748         movm.l          (%sp)+,&0x0201           7748         movm.l          (%sp)+,&0x0201          # {a1/d0}
7749                                                  7749 
7750         fmov.x          %fp0,%fp1                7750         fmov.x          %fp0,%fp1
7751         fadd.s          &0x3F800000,%fp1         7751         fadd.s          &0x3F800000,%fp1        # 1+Z
7752         fmov.x          %fp0,-(%sp)              7752         fmov.x          %fp0,-(%sp)
7753         fdiv.x          %fp1,%fp0                7753         fdiv.x          %fp1,%fp0               # Z/(1+Z)
7754         mov.l           %a1,%d1                  7754         mov.l           %a1,%d1
7755         and.l           &0x80000000,%d1          7755         and.l           &0x80000000,%d1
7756         or.l            &0x3F000000,%d1          7756         or.l            &0x3F000000,%d1
7757         fadd.x          (%sp)+,%fp0              7757         fadd.x          (%sp)+,%fp0
7758         mov.l           %d1,-(%sp)               7758         mov.l           %d1,-(%sp)
7759                                                  7759 
7760         fmov.l          %d0,%fpcr                7760         fmov.l          %d0,%fpcr
7761         mov.b           &FMUL_OP,%d1             7761         mov.b           &FMUL_OP,%d1            # last inst is MUL
7762         fmul.s          (%sp)+,%fp0              7762         fmul.s          (%sp)+,%fp0             # last fp inst - possible exceptions set
7763         bra             t_catch                  7763         bra             t_catch
7764                                                  7764 
7765 SINHBIG:                                         7765 SINHBIG:
7766         cmp.l           %d1,&0x400CB2B3          7766         cmp.l           %d1,&0x400CB2B3
7767         bgt             t_ovfl                   7767         bgt             t_ovfl
7768         fabs.x          %fp0                     7768         fabs.x          %fp0
7769         fsub.d          T1(%pc),%fp0             7769         fsub.d          T1(%pc),%fp0            # (|X|-16381LOG2_LEAD)
7770         mov.l           &0,-(%sp)                7770         mov.l           &0,-(%sp)
7771         mov.l           &0x80000000,-(%sp)       7771         mov.l           &0x80000000,-(%sp)
7772         mov.l           %a1,%d1                  7772         mov.l           %a1,%d1
7773         and.l           &0x80000000,%d1          7773         and.l           &0x80000000,%d1
7774         or.l            &0x7FFB0000,%d1          7774         or.l            &0x7FFB0000,%d1
7775         mov.l           %d1,-(%sp)               7775         mov.l           %d1,-(%sp)              # EXTENDED FMT
7776         fsub.d          T2(%pc),%fp0             7776         fsub.d          T2(%pc),%fp0            # |X| - 16381 LOG2, ACCURATE
7777                                                  7777 
7778         mov.l           %d0,-(%sp)               7778         mov.l           %d0,-(%sp)
7779         clr.l           %d0                      7779         clr.l           %d0
7780         fmovm.x         &0x01,-(%sp)             7780         fmovm.x         &0x01,-(%sp)            # save fp0 on stack
7781         lea             (%sp),%a0                7781         lea             (%sp),%a0               # pass ptr to fp0
7782         bsr             setox                    7782         bsr             setox
7783         add.l           &0xc,%sp                 7783         add.l           &0xc,%sp                # clear fp0 from stack
7784                                                  7784 
7785         mov.l           (%sp)+,%d0               7785         mov.l           (%sp)+,%d0
7786         fmov.l          %d0,%fpcr                7786         fmov.l          %d0,%fpcr
7787         mov.b           &FMUL_OP,%d1             7787         mov.b           &FMUL_OP,%d1            # last inst is MUL
7788         fmul.x          (%sp)+,%fp0              7788         fmul.x          (%sp)+,%fp0             # possible exception
7789         bra             t_catch                  7789         bra             t_catch
7790                                                  7790 
7791         global          ssinhd                   7791         global          ssinhd
7792 #--SINH(X) = X FOR DENORMALIZED X                7792 #--SINH(X) = X FOR DENORMALIZED X
7793 ssinhd:                                          7793 ssinhd:
7794         bra             t_extdnrm                7794         bra             t_extdnrm
7795                                                  7795 
7796 #############################################    7796 #########################################################################
7797 # stanh():  computes the hyperbolic tangent o    7797 # stanh():  computes the hyperbolic tangent of a normalized input       #
7798 # stanhd(): computes the hyperbolic tangent o    7798 # stanhd(): computes the hyperbolic tangent of a denormalized input     #
7799 #                                                7799 #                                                                       #
7800 # INPUT *************************************    7800 # INPUT *************************************************************** #
7801 #       a0 = pointer to extended precision in    7801 #       a0 = pointer to extended precision input                        #
7802 #       d0 = round precision,mode                7802 #       d0 = round precision,mode                                       #
7803 #                                                7803 #                                                                       #
7804 # OUTPUT ************************************    7804 # OUTPUT ************************************************************** #
7805 #       fp0 = tanh(X)                            7805 #       fp0 = tanh(X)                                                   #
7806 #                                                7806 #                                                                       #
7807 # ACCURACY and MONOTONICITY *****************    7807 # ACCURACY and MONOTONICITY ******************************************* #
7808 #       The returned result is within 3 ulps     7808 #       The returned result is within 3 ulps in 64 significant bit,     #
7809 #       i.e. within 0.5001 ulp to 53 bits if     7809 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
7810 #       rounded to double precision. The resu    7810 #       rounded to double precision. The result is provably monotonic   #
7811 #       in double precision.                     7811 #       in double precision.                                            #
7812 #                                                7812 #                                                                       #
7813 # ALGORITHM *********************************    7813 # ALGORITHM *********************************************************** #
7814 #                                                7814 #                                                                       #
7815 #       TANH                                     7815 #       TANH                                                            #
7816 #       1. If |X| >= (5/2) log2 or |X| <= 2**    7816 #       1. If |X| >= (5/2) log2 or |X| <= 2**(-40), go to 3.            #
7817 #                                                7817 #                                                                       #
7818 #       2. (2**(-40) < |X| < (5/2) log2) Calc    7818 #       2. (2**(-40) < |X| < (5/2) log2) Calculate tanh(X) by           #
7819 #               sgn := sign(X), y := 2|X|, z     7819 #               sgn := sign(X), y := 2|X|, z := expm1(Y), and           #
7820 #               tanh(X) = sgn*( z/(2+z) ).       7820 #               tanh(X) = sgn*( z/(2+z) ).                              #
7821 #               Exit.                            7821 #               Exit.                                                   #
7822 #                                                7822 #                                                                       #
7823 #       3. (|X| <= 2**(-40) or |X| >= (5/2) l    7823 #       3. (|X| <= 2**(-40) or |X| >= (5/2) log2). If |X| < 1,          #
7824 #               go to 7.                         7824 #               go to 7.                                                #
7825 #                                                7825 #                                                                       #
7826 #       4. (|X| >= (5/2) log2) If |X| >= 50 l    7826 #       4. (|X| >= (5/2) log2) If |X| >= 50 log2, go to 6.              #
7827 #                                                7827 #                                                                       #
7828 #       5. ((5/2) log2 <= |X| < 50 log2) Calc    7828 #       5. ((5/2) log2 <= |X| < 50 log2) Calculate tanh(X) by           #
7829 #               sgn := sign(X), y := 2|X|, z     7829 #               sgn := sign(X), y := 2|X|, z := exp(Y),                 #
7830 #               tanh(X) = sgn - [ sgn*2/(1+z)    7830 #               tanh(X) = sgn - [ sgn*2/(1+z) ].                        #
7831 #               Exit.                            7831 #               Exit.                                                   #
7832 #                                                7832 #                                                                       #
7833 #       6. (|X| >= 50 log2) Tanh(X) = +-1 (ro    7833 #       6. (|X| >= 50 log2) Tanh(X) = +-1 (round to nearest). Thus, we  #
7834 #               calculate Tanh(X) by             7834 #               calculate Tanh(X) by                                    #
7835 #               sgn := sign(X), Tiny := 2**(-    7835 #               sgn := sign(X), Tiny := 2**(-126),                      #
7836 #               tanh(X) := sgn - sgn*Tiny.       7836 #               tanh(X) := sgn - sgn*Tiny.                              #
7837 #               Exit.                            7837 #               Exit.                                                   #
7838 #                                                7838 #                                                                       #
7839 #       7. (|X| < 2**(-40)). Tanh(X) = X.        7839 #       7. (|X| < 2**(-40)). Tanh(X) = X.       Exit.                   #
7840 #                                                7840 #                                                                       #
7841 #############################################    7841 #########################################################################
7842                                                  7842 
7843         set             X,FP_SCR0                7843         set             X,FP_SCR0
7844         set             XFRAC,X+4                7844         set             XFRAC,X+4
7845                                                  7845 
7846         set             SGN,L_SCR3               7846         set             SGN,L_SCR3
7847                                                  7847 
7848         set             V,FP_SCR0                7848         set             V,FP_SCR0
7849                                                  7849 
7850         global          stanh                    7850         global          stanh
7851 stanh:                                           7851 stanh:
7852         fmov.x          (%a0),%fp0               7852         fmov.x          (%a0),%fp0              # LOAD INPUT
7853                                                  7853 
7854         fmov.x          %fp0,X(%a6)              7854         fmov.x          %fp0,X(%a6)
7855         mov.l           (%a0),%d1                7855         mov.l           (%a0),%d1
7856         mov.w           4(%a0),%d1               7856         mov.w           4(%a0),%d1
7857         mov.l           %d1,X(%a6)               7857         mov.l           %d1,X(%a6)
7858         and.l           &0x7FFFFFFF,%d1          7858         and.l           &0x7FFFFFFF,%d1
7859         cmp.l           %d1, &0x3fd78000         7859         cmp.l           %d1, &0x3fd78000        # is |X| < 2^(-40)?
7860         blt.w           TANHBORS                 7860         blt.w           TANHBORS                # yes
7861         cmp.l           %d1, &0x3fffddce         7861         cmp.l           %d1, &0x3fffddce        # is |X| > (5/2)LOG2?
7862         bgt.w           TANHBORS                 7862         bgt.w           TANHBORS                # yes
7863                                                  7863 
7864 #--THIS IS THE USUAL CASE                        7864 #--THIS IS THE USUAL CASE
7865 #--Y = 2|X|, Z = EXPM1(Y), TANH(X) = SIGN(X)     7865 #--Y = 2|X|, Z = EXPM1(Y), TANH(X) = SIGN(X) * Z / (Z+2).
7866                                                  7866 
7867         mov.l           X(%a6),%d1               7867         mov.l           X(%a6),%d1
7868         mov.l           %d1,SGN(%a6)             7868         mov.l           %d1,SGN(%a6)
7869         and.l           &0x7FFF0000,%d1          7869         and.l           &0x7FFF0000,%d1
7870         add.l           &0x00010000,%d1          7870         add.l           &0x00010000,%d1         # EXPONENT OF 2|X|
7871         mov.l           %d1,X(%a6)               7871         mov.l           %d1,X(%a6)
7872         and.l           &0x80000000,SGN(%a6)     7872         and.l           &0x80000000,SGN(%a6)
7873         fmov.x          X(%a6),%fp0              7873         fmov.x          X(%a6),%fp0             # FP0 IS Y = 2|X|
7874                                                  7874 
7875         mov.l           %d0,-(%sp)               7875         mov.l           %d0,-(%sp)
7876         clr.l           %d0                      7876         clr.l           %d0
7877         fmovm.x         &0x1,-(%sp)              7877         fmovm.x         &0x1,-(%sp)             # save Y on stack
7878         lea             (%sp),%a0                7878         lea             (%sp),%a0               # pass ptr to Y
7879         bsr             setoxm1                  7879         bsr             setoxm1                 # FP0 IS Z = EXPM1(Y)
7880         add.l           &0xc,%sp                 7880         add.l           &0xc,%sp                # clear Y from stack
7881         mov.l           (%sp)+,%d0               7881         mov.l           (%sp)+,%d0
7882                                                  7882 
7883         fmov.x          %fp0,%fp1                7883         fmov.x          %fp0,%fp1
7884         fadd.s          &0x40000000,%fp1         7884         fadd.s          &0x40000000,%fp1        # Z+2
7885         mov.l           SGN(%a6),%d1             7885         mov.l           SGN(%a6),%d1
7886         fmov.x          %fp1,V(%a6)              7886         fmov.x          %fp1,V(%a6)
7887         eor.l           %d1,V(%a6)               7887         eor.l           %d1,V(%a6)
7888                                                  7888 
7889         fmov.l          %d0,%fpcr                7889         fmov.l          %d0,%fpcr               # restore users round prec,mode
7890         fdiv.x          V(%a6),%fp0              7890         fdiv.x          V(%a6),%fp0
7891         bra             t_inx2                   7891         bra             t_inx2
7892                                                  7892 
7893 TANHBORS:                                        7893 TANHBORS:
7894         cmp.l           %d1,&0x3FFF8000          7894         cmp.l           %d1,&0x3FFF8000
7895         blt.w           TANHSM                   7895         blt.w           TANHSM
7896                                                  7896 
7897         cmp.l           %d1,&0x40048AA1          7897         cmp.l           %d1,&0x40048AA1
7898         bgt.w           TANHHUGE                 7898         bgt.w           TANHHUGE
7899                                                  7899 
7900 #-- (5/2) LOG2 < |X| < 50 LOG2,                  7900 #-- (5/2) LOG2 < |X| < 50 LOG2,
7901 #--TANH(X) = 1 - (2/[EXP(2X)+1]). LET Y = 2|X    7901 #--TANH(X) = 1 - (2/[EXP(2X)+1]). LET Y = 2|X|, SGN = SIGN(X),
7902 #--TANH(X) = SGN -      SGN*2/[EXP(Y)+1].        7902 #--TANH(X) = SGN -      SGN*2/[EXP(Y)+1].
7903                                                  7903 
7904         mov.l           X(%a6),%d1               7904         mov.l           X(%a6),%d1
7905         mov.l           %d1,SGN(%a6)             7905         mov.l           %d1,SGN(%a6)
7906         and.l           &0x7FFF0000,%d1          7906         and.l           &0x7FFF0000,%d1
7907         add.l           &0x00010000,%d1          7907         add.l           &0x00010000,%d1         # EXPO OF 2|X|
7908         mov.l           %d1,X(%a6)               7908         mov.l           %d1,X(%a6)              # Y = 2|X|
7909         and.l           &0x80000000,SGN(%a6)     7909         and.l           &0x80000000,SGN(%a6)
7910         mov.l           SGN(%a6),%d1             7910         mov.l           SGN(%a6),%d1
7911         fmov.x          X(%a6),%fp0              7911         fmov.x          X(%a6),%fp0             # Y = 2|X|
7912                                                  7912 
7913         mov.l           %d0,-(%sp)               7913         mov.l           %d0,-(%sp)
7914         clr.l           %d0                      7914         clr.l           %d0
7915         fmovm.x         &0x01,-(%sp)             7915         fmovm.x         &0x01,-(%sp)            # save Y on stack
7916         lea             (%sp),%a0                7916         lea             (%sp),%a0               # pass ptr to Y
7917         bsr             setox                    7917         bsr             setox                   # FP0 IS EXP(Y)
7918         add.l           &0xc,%sp                 7918         add.l           &0xc,%sp                # clear Y from stack
7919         mov.l           (%sp)+,%d0               7919         mov.l           (%sp)+,%d0
7920         mov.l           SGN(%a6),%d1             7920         mov.l           SGN(%a6),%d1
7921         fadd.s          &0x3F800000,%fp0         7921         fadd.s          &0x3F800000,%fp0        # EXP(Y)+1
7922                                                  7922 
7923         eor.l           &0xC0000000,%d1          7923         eor.l           &0xC0000000,%d1         # -SIGN(X)*2
7924         fmov.s          %d1,%fp1                 7924         fmov.s          %d1,%fp1                # -SIGN(X)*2 IN SGL FMT
7925         fdiv.x          %fp0,%fp1                7925         fdiv.x          %fp0,%fp1               # -SIGN(X)2 / [EXP(Y)+1 ]
7926                                                  7926 
7927         mov.l           SGN(%a6),%d1             7927         mov.l           SGN(%a6),%d1
7928         or.l            &0x3F800000,%d1          7928         or.l            &0x3F800000,%d1         # SGN
7929         fmov.s          %d1,%fp0                 7929         fmov.s          %d1,%fp0                # SGN IN SGL FMT
7930                                                  7930 
7931         fmov.l          %d0,%fpcr                7931         fmov.l          %d0,%fpcr               # restore users round prec,mode
7932         mov.b           &FADD_OP,%d1             7932         mov.b           &FADD_OP,%d1            # last inst is ADD
7933         fadd.x          %fp1,%fp0                7933         fadd.x          %fp1,%fp0
7934         bra             t_inx2                   7934         bra             t_inx2
7935                                                  7935 
7936 TANHSM:                                          7936 TANHSM:
7937         fmov.l          %d0,%fpcr                7937         fmov.l          %d0,%fpcr               # restore users round prec,mode
7938         mov.b           &FMOV_OP,%d1             7938         mov.b           &FMOV_OP,%d1            # last inst is MOVE
7939         fmov.x          X(%a6),%fp0              7939         fmov.x          X(%a6),%fp0             # last inst - possible exception set
7940         bra             t_catch                  7940         bra             t_catch
7941                                                  7941 
7942 #---RETURN SGN(X) - SGN(X)EPS                    7942 #---RETURN SGN(X) - SGN(X)EPS
7943 TANHHUGE:                                        7943 TANHHUGE:
7944         mov.l           X(%a6),%d1               7944         mov.l           X(%a6),%d1
7945         and.l           &0x80000000,%d1          7945         and.l           &0x80000000,%d1
7946         or.l            &0x3F800000,%d1          7946         or.l            &0x3F800000,%d1
7947         fmov.s          %d1,%fp0                 7947         fmov.s          %d1,%fp0
7948         and.l           &0x80000000,%d1          7948         and.l           &0x80000000,%d1
7949         eor.l           &0x80800000,%d1          7949         eor.l           &0x80800000,%d1         # -SIGN(X)*EPS
7950                                                  7950 
7951         fmov.l          %d0,%fpcr                7951         fmov.l          %d0,%fpcr               # restore users round prec,mode
7952         fadd.s          %d1,%fp0                 7952         fadd.s          %d1,%fp0
7953         bra             t_inx2                   7953         bra             t_inx2
7954                                                  7954 
7955         global          stanhd                   7955         global          stanhd
7956 #--TANH(X) = X FOR DENORMALIZED X                7956 #--TANH(X) = X FOR DENORMALIZED X
7957 stanhd:                                          7957 stanhd:
7958         bra             t_extdnrm                7958         bra             t_extdnrm
7959                                                  7959 
7960 #############################################    7960 #########################################################################
7961 # slogn():    computes the natural logarithm     7961 # slogn():    computes the natural logarithm of a normalized input      #
7962 # slognd():   computes the natural logarithm     7962 # slognd():   computes the natural logarithm of a denormalized input    #
7963 # slognp1():  computes the log(1+X) of a norm    7963 # slognp1():  computes the log(1+X) of a normalized input               #
7964 # slognp1d(): computes the log(1+X) of a deno    7964 # slognp1d(): computes the log(1+X) of a denormalized input             #
7965 #                                                7965 #                                                                       #
7966 # INPUT *************************************    7966 # INPUT *************************************************************** #
7967 #       a0 = pointer to extended precision in    7967 #       a0 = pointer to extended precision input                        #
7968 #       d0 = round precision,mode                7968 #       d0 = round precision,mode                                       #
7969 #                                                7969 #                                                                       #
7970 # OUTPUT ************************************    7970 # OUTPUT ************************************************************** #
7971 #       fp0 = log(X) or log(1+X)                 7971 #       fp0 = log(X) or log(1+X)                                        #
7972 #                                                7972 #                                                                       #
7973 # ACCURACY and MONOTONICITY *****************    7973 # ACCURACY and MONOTONICITY ******************************************* #
7974 #       The returned result is within 2 ulps     7974 #       The returned result is within 2 ulps in 64 significant bit,     #
7975 #       i.e. within 0.5001 ulp to 53 bits if     7975 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
7976 #       rounded to double precision. The resu    7976 #       rounded to double precision. The result is provably monotonic   #
7977 #       in double precision.                     7977 #       in double precision.                                            #
7978 #                                                7978 #                                                                       #
7979 # ALGORITHM *********************************    7979 # ALGORITHM *********************************************************** #
7980 #       LOGN:                                    7980 #       LOGN:                                                           #
7981 #       Step 1. If |X-1| < 1/16, approximate     7981 #       Step 1. If |X-1| < 1/16, approximate log(X) by an odd           #
7982 #               polynomial in u, where u = 2(    7982 #               polynomial in u, where u = 2(X-1)/(X+1). Otherwise,     #
7983 #               move on to Step 2.               7983 #               move on to Step 2.                                      #
7984 #                                                7984 #                                                                       #
7985 #       Step 2. X = 2**k * Y where 1 <= Y < 2    7985 #       Step 2. X = 2**k * Y where 1 <= Y < 2. Define F to be the first #
7986 #               seven significant bits of Y p    7986 #               seven significant bits of Y plus 2**(-7), i.e.          #
7987 #               F = 1.xxxxxx1 in base 2 where    7987 #               F = 1.xxxxxx1 in base 2 where the six "x" match those   #
7988 #               of Y. Note that |Y-F| <= 2**(    7988 #               of Y. Note that |Y-F| <= 2**(-7).                       #
7989 #                                                7989 #                                                                       #
7990 #       Step 3. Define u = (Y-F)/F. Approxima    7990 #       Step 3. Define u = (Y-F)/F. Approximate log(1+u) by a           #
7991 #               polynomial in u, log(1+u) = p    7991 #               polynomial in u, log(1+u) = poly.                       #
7992 #                                                7992 #                                                                       #
7993 #       Step 4. Reconstruct                      7993 #       Step 4. Reconstruct                                             #
7994 #               log(X) = log( 2**k * Y ) = k*    7994 #               log(X) = log( 2**k * Y ) = k*log(2) + log(F) + log(1+u) #
7995 #               by k*log(2) + (log(F) + poly)    7995 #               by k*log(2) + (log(F) + poly). The values of log(F) are #
7996 #               calculated beforehand and sto    7996 #               calculated beforehand and stored in the program.        #
7997 #                                                7997 #                                                                       #
7998 #       lognp1:                                  7998 #       lognp1:                                                         #
7999 #       Step 1: If |X| < 1/16, approximate lo    7999 #       Step 1: If |X| < 1/16, approximate log(1+X) by an odd           #
8000 #               polynomial in u where u = 2X/    8000 #               polynomial in u where u = 2X/(2+X). Otherwise, move on  #
8001 #               to Step 2.                       8001 #               to Step 2.                                              #
8002 #                                                8002 #                                                                       #
8003 #       Step 2: Let 1+X = 2**k * Y, where 1 <    8003 #       Step 2: Let 1+X = 2**k * Y, where 1 <= Y < 2. Define F as done  #
8004 #               in Step 2 of the algorithm fo    8004 #               in Step 2 of the algorithm for LOGN and compute         #
8005 #               log(1+X) as k*log(2) + log(F)    8005 #               log(1+X) as k*log(2) + log(F) + poly where poly         #
8006 #               approximates log(1+u), u = (Y    8006 #               approximates log(1+u), u = (Y-F)/F.                     #
8007 #                                                8007 #                                                                       #
8008 #       Implementation Notes:                    8008 #       Implementation Notes:                                           #
8009 #       Note 1. There are 64 different possib    8009 #       Note 1. There are 64 different possible values for F, thus 64   #
8010 #               log(F)'s need to be tabulated    8010 #               log(F)'s need to be tabulated. Moreover, the values of  #
8011 #               1/F are also tabulated so tha    8011 #               1/F are also tabulated so that the division in (Y-F)/F  #
8012 #               can be performed by a multipl    8012 #               can be performed by a multiplication.                   #
8013 #                                                8013 #                                                                       #
8014 #       Note 2. In Step 2 of lognp1, in order    8014 #       Note 2. In Step 2 of lognp1, in order to preserved accuracy,    #
8015 #               the value Y-F has to be calcu    8015 #               the value Y-F has to be calculated carefully when       #
8016 #               1/2 <= X < 3/2.                  8016 #               1/2 <= X < 3/2.                                         #
8017 #                                                8017 #                                                                       #
8018 #       Note 3. To fully exploit the pipeline    8018 #       Note 3. To fully exploit the pipeline, polynomials are usually  #
8019 #               separated into two parts eval    8019 #               separated into two parts evaluated independently before #
8020 #               being added up.                  8020 #               being added up.                                         #
8021 #                                                8021 #                                                                       #
8022 #############################################    8022 #########################################################################
8023 LOGOF2:                                          8023 LOGOF2:
8024         long            0x3FFE0000,0xB17217F7    8024         long            0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
8025                                                  8025 
8026 one:                                             8026 one:
8027         long            0x3F800000               8027         long            0x3F800000
8028 zero:                                            8028 zero:
8029         long            0x00000000               8029         long            0x00000000
8030 infty:                                           8030 infty:
8031         long            0x7F800000               8031         long            0x7F800000
8032 negone:                                          8032 negone:
8033         long            0xBF800000               8033         long            0xBF800000
8034                                                  8034 
8035 LOGA6:                                           8035 LOGA6:
8036         long            0x3FC2499A,0xB5E4040B    8036         long            0x3FC2499A,0xB5E4040B
8037 LOGA5:                                           8037 LOGA5:
8038         long            0xBFC555B5,0x848CB7DB    8038         long            0xBFC555B5,0x848CB7DB
8039                                                  8039 
8040 LOGA4:                                           8040 LOGA4:
8041         long            0x3FC99999,0x987D8730    8041         long            0x3FC99999,0x987D8730
8042 LOGA3:                                           8042 LOGA3:
8043         long            0xBFCFFFFF,0xFF6F7E97    8043         long            0xBFCFFFFF,0xFF6F7E97
8044                                                  8044 
8045 LOGA2:                                           8045 LOGA2:
8046         long            0x3FD55555,0x555555A4    8046         long            0x3FD55555,0x555555A4
8047 LOGA1:                                           8047 LOGA1:
8048         long            0xBFE00000,0x00000008    8048         long            0xBFE00000,0x00000008
8049                                                  8049 
8050 LOGB5:                                           8050 LOGB5:
8051         long            0x3F175496,0xADD7DAD6    8051         long            0x3F175496,0xADD7DAD6
8052 LOGB4:                                           8052 LOGB4:
8053         long            0x3F3C71C2,0xFE80C7E0    8053         long            0x3F3C71C2,0xFE80C7E0
8054                                                  8054 
8055 LOGB3:                                           8055 LOGB3:
8056         long            0x3F624924,0x928BCCFF    8056         long            0x3F624924,0x928BCCFF
8057 LOGB2:                                           8057 LOGB2:
8058         long            0x3F899999,0x999995EC    8058         long            0x3F899999,0x999995EC
8059                                                  8059 
8060 LOGB1:                                           8060 LOGB1:
8061         long            0x3FB55555,0x55555555    8061         long            0x3FB55555,0x55555555
8062 TWO:                                             8062 TWO:
8063         long            0x40000000,0x00000000    8063         long            0x40000000,0x00000000
8064                                                  8064 
8065 LTHOLD:                                          8065 LTHOLD:
8066         long            0x3f990000,0x80000000    8066         long            0x3f990000,0x80000000,0x00000000,0x00000000
8067                                                  8067 
8068 LOGTBL:                                          8068 LOGTBL:
8069         long            0x3FFE0000,0xFE03F80F    8069         long            0x3FFE0000,0xFE03F80F,0xE03F80FE,0x00000000
8070         long            0x3FF70000,0xFF015358    8070         long            0x3FF70000,0xFF015358,0x833C47E2,0x00000000
8071         long            0x3FFE0000,0xFA232CF2    8071         long            0x3FFE0000,0xFA232CF2,0x52138AC0,0x00000000
8072         long            0x3FF90000,0xBDC8D83E    8072         long            0x3FF90000,0xBDC8D83E,0xAD88D549,0x00000000
8073         long            0x3FFE0000,0xF6603D98    8073         long            0x3FFE0000,0xF6603D98,0x0F6603DA,0x00000000
8074         long            0x3FFA0000,0x9CF43DCF    8074         long            0x3FFA0000,0x9CF43DCF,0xF5EAFD48,0x00000000
8075         long            0x3FFE0000,0xF2B9D648    8075         long            0x3FFE0000,0xF2B9D648,0x0F2B9D65,0x00000000
8076         long            0x3FFA0000,0xDA16EB88    8076         long            0x3FFA0000,0xDA16EB88,0xCB8DF614,0x00000000
8077         long            0x3FFE0000,0xEF2EB71F    8077         long            0x3FFE0000,0xEF2EB71F,0xC4345238,0x00000000
8078         long            0x3FFB0000,0x8B29B775    8078         long            0x3FFB0000,0x8B29B775,0x1BD70743,0x00000000
8079         long            0x3FFE0000,0xEBBDB2A5    8079         long            0x3FFE0000,0xEBBDB2A5,0xC1619C8C,0x00000000
8080         long            0x3FFB0000,0xA8D839F8    8080         long            0x3FFB0000,0xA8D839F8,0x30C1FB49,0x00000000
8081         long            0x3FFE0000,0xE865AC7B    8081         long            0x3FFE0000,0xE865AC7B,0x7603A197,0x00000000
8082         long            0x3FFB0000,0xC61A2EB1    8082         long            0x3FFB0000,0xC61A2EB1,0x8CD907AD,0x00000000
8083         long            0x3FFE0000,0xE525982A    8083         long            0x3FFE0000,0xE525982A,0xF70C880E,0x00000000
8084         long            0x3FFB0000,0xE2F2A47A    8084         long            0x3FFB0000,0xE2F2A47A,0xDE3A18AF,0x00000000
8085         long            0x3FFE0000,0xE1FC780E    8085         long            0x3FFE0000,0xE1FC780E,0x1FC780E2,0x00000000
8086         long            0x3FFB0000,0xFF64898E    8086         long            0x3FFB0000,0xFF64898E,0xDF55D551,0x00000000
8087         long            0x3FFE0000,0xDEE95C4C    8087         long            0x3FFE0000,0xDEE95C4C,0xA037BA57,0x00000000
8088         long            0x3FFC0000,0x8DB956A9    8088         long            0x3FFC0000,0x8DB956A9,0x7B3D0148,0x00000000
8089         long            0x3FFE0000,0xDBEB61EE    8089         long            0x3FFE0000,0xDBEB61EE,0xD19C5958,0x00000000
8090         long            0x3FFC0000,0x9B8FE100    8090         long            0x3FFC0000,0x9B8FE100,0xF47BA1DE,0x00000000
8091         long            0x3FFE0000,0xD901B203    8091         long            0x3FFE0000,0xD901B203,0x6406C80E,0x00000000
8092         long            0x3FFC0000,0xA9372F1D    8092         long            0x3FFC0000,0xA9372F1D,0x0DA1BD17,0x00000000
8093         long            0x3FFE0000,0xD62B80D6    8093         long            0x3FFE0000,0xD62B80D6,0x2B80D62C,0x00000000
8094         long            0x3FFC0000,0xB6B07F38    8094         long            0x3FFC0000,0xB6B07F38,0xCE90E46B,0x00000000
8095         long            0x3FFE0000,0xD3680D36    8095         long            0x3FFE0000,0xD3680D36,0x80D3680D,0x00000000
8096         long            0x3FFC0000,0xC3FD0329    8096         long            0x3FFC0000,0xC3FD0329,0x06488481,0x00000000
8097         long            0x3FFE0000,0xD0B69FCB    8097         long            0x3FFE0000,0xD0B69FCB,0xD2580D0B,0x00000000
8098         long            0x3FFC0000,0xD11DE0FF    8098         long            0x3FFC0000,0xD11DE0FF,0x15AB18CA,0x00000000
8099         long            0x3FFE0000,0xCE168A77    8099         long            0x3FFE0000,0xCE168A77,0x25080CE1,0x00000000
8100         long            0x3FFC0000,0xDE1433A1    8100         long            0x3FFC0000,0xDE1433A1,0x6C66B150,0x00000000
8101         long            0x3FFE0000,0xCB8727C0    8101         long            0x3FFE0000,0xCB8727C0,0x65C393E0,0x00000000
8102         long            0x3FFC0000,0xEAE10B5A    8102         long            0x3FFC0000,0xEAE10B5A,0x7DDC8ADD,0x00000000
8103         long            0x3FFE0000,0xC907DA4E    8103         long            0x3FFE0000,0xC907DA4E,0x871146AD,0x00000000
8104         long            0x3FFC0000,0xF7856E5E    8104         long            0x3FFC0000,0xF7856E5E,0xE2C9B291,0x00000000
8105         long            0x3FFE0000,0xC6980C69    8105         long            0x3FFE0000,0xC6980C69,0x80C6980C,0x00000000
8106         long            0x3FFD0000,0x82012CA5    8106         long            0x3FFD0000,0x82012CA5,0xA68206D7,0x00000000
8107         long            0x3FFE0000,0xC4372F85    8107         long            0x3FFE0000,0xC4372F85,0x5D824CA6,0x00000000
8108         long            0x3FFD0000,0x882C5FCD    8108         long            0x3FFD0000,0x882C5FCD,0x7256A8C5,0x00000000
8109         long            0x3FFE0000,0xC1E4BBD5    8109         long            0x3FFE0000,0xC1E4BBD5,0x95F6E947,0x00000000
8110         long            0x3FFD0000,0x8E44C60B    8110         long            0x3FFD0000,0x8E44C60B,0x4CCFD7DE,0x00000000
8111         long            0x3FFE0000,0xBFA02FE8    8111         long            0x3FFE0000,0xBFA02FE8,0x0BFA02FF,0x00000000
8112         long            0x3FFD0000,0x944AD09E    8112         long            0x3FFD0000,0x944AD09E,0xF4351AF6,0x00000000
8113         long            0x3FFE0000,0xBD691047    8113         long            0x3FFE0000,0xBD691047,0x07661AA3,0x00000000
8114         long            0x3FFD0000,0x9A3EECD4    8114         long            0x3FFD0000,0x9A3EECD4,0xC3EAA6B2,0x00000000
8115         long            0x3FFE0000,0xBB3EE721    8115         long            0x3FFE0000,0xBB3EE721,0xA54D880C,0x00000000
8116         long            0x3FFD0000,0xA0218434    8116         long            0x3FFD0000,0xA0218434,0x353F1DE8,0x00000000
8117         long            0x3FFE0000,0xB92143FA    8117         long            0x3FFE0000,0xB92143FA,0x36F5E02E,0x00000000
8118         long            0x3FFD0000,0xA5F2FCAB    8118         long            0x3FFD0000,0xA5F2FCAB,0xBBC506DA,0x00000000
8119         long            0x3FFE0000,0xB70FBB5A    8119         long            0x3FFE0000,0xB70FBB5A,0x19BE3659,0x00000000
8120         long            0x3FFD0000,0xABB3B8BA    8120         long            0x3FFD0000,0xABB3B8BA,0x2AD362A5,0x00000000
8121         long            0x3FFE0000,0xB509E68A    8121         long            0x3FFE0000,0xB509E68A,0x9B94821F,0x00000000
8122         long            0x3FFD0000,0xB1641795    8122         long            0x3FFD0000,0xB1641795,0xCE3CA97B,0x00000000
8123         long            0x3FFE0000,0xB30F6352    8123         long            0x3FFE0000,0xB30F6352,0x8917C80B,0x00000000
8124         long            0x3FFD0000,0xB7047551    8124         long            0x3FFD0000,0xB7047551,0x5D0F1C61,0x00000000
8125         long            0x3FFE0000,0xB11FD3B8    8125         long            0x3FFE0000,0xB11FD3B8,0x0B11FD3C,0x00000000
8126         long            0x3FFD0000,0xBC952AFE    8126         long            0x3FFD0000,0xBC952AFE,0xEA3D13E1,0x00000000
8127         long            0x3FFE0000,0xAF3ADDC6    8127         long            0x3FFE0000,0xAF3ADDC6,0x80AF3ADE,0x00000000
8128         long            0x3FFD0000,0xC2168ED0    8128         long            0x3FFD0000,0xC2168ED0,0xF458BA4A,0x00000000
8129         long            0x3FFE0000,0xAD602B58    8129         long            0x3FFE0000,0xAD602B58,0x0AD602B6,0x00000000
8130         long            0x3FFD0000,0xC788F439    8130         long            0x3FFD0000,0xC788F439,0xB3163BF1,0x00000000
8131         long            0x3FFE0000,0xAB8F69E2    8131         long            0x3FFE0000,0xAB8F69E2,0x8359CD11,0x00000000
8132         long            0x3FFD0000,0xCCECAC08    8132         long            0x3FFD0000,0xCCECAC08,0xBF04565D,0x00000000
8133         long            0x3FFE0000,0xA9C84A47    8133         long            0x3FFE0000,0xA9C84A47,0xA07F5638,0x00000000
8134         long            0x3FFD0000,0xD2420487    8134         long            0x3FFD0000,0xD2420487,0x2DD85160,0x00000000
8135         long            0x3FFE0000,0xA80A80A8    8135         long            0x3FFE0000,0xA80A80A8,0x0A80A80B,0x00000000
8136         long            0x3FFD0000,0xD7894992    8136         long            0x3FFD0000,0xD7894992,0x3BC3588A,0x00000000
8137         long            0x3FFE0000,0xA655C439    8137         long            0x3FFE0000,0xA655C439,0x2D7B73A8,0x00000000
8138         long            0x3FFD0000,0xDCC2C4B4    8138         long            0x3FFD0000,0xDCC2C4B4,0x9887DACC,0x00000000
8139         long            0x3FFE0000,0xA4A9CF1D    8139         long            0x3FFE0000,0xA4A9CF1D,0x96833751,0x00000000
8140         long            0x3FFD0000,0xE1EEBD3E    8140         long            0x3FFD0000,0xE1EEBD3E,0x6D6A6B9E,0x00000000
8141         long            0x3FFE0000,0xA3065E3F    8141         long            0x3FFE0000,0xA3065E3F,0xAE7CD0E0,0x00000000
8142         long            0x3FFD0000,0xE70D785C    8142         long            0x3FFD0000,0xE70D785C,0x2F9F5BDC,0x00000000
8143         long            0x3FFE0000,0xA16B312E    8143         long            0x3FFE0000,0xA16B312E,0xA8FC377D,0x00000000
8144         long            0x3FFD0000,0xEC1F392C    8144         long            0x3FFD0000,0xEC1F392C,0x5179F283,0x00000000
8145         long            0x3FFE0000,0x9FD809FD    8145         long            0x3FFE0000,0x9FD809FD,0x809FD80A,0x00000000
8146         long            0x3FFD0000,0xF12440D3    8146         long            0x3FFD0000,0xF12440D3,0xE36130E6,0x00000000
8147         long            0x3FFE0000,0x9E4CAD23    8147         long            0x3FFE0000,0x9E4CAD23,0xDD5F3A20,0x00000000
8148         long            0x3FFD0000,0xF61CCE92    8148         long            0x3FFD0000,0xF61CCE92,0x346600BB,0x00000000
8149         long            0x3FFE0000,0x9CC8E160    8149         long            0x3FFE0000,0x9CC8E160,0xC3FB19B9,0x00000000
8150         long            0x3FFD0000,0xFB091FD3    8150         long            0x3FFD0000,0xFB091FD3,0x8145630A,0x00000000
8151         long            0x3FFE0000,0x9B4C6F9E    8151         long            0x3FFE0000,0x9B4C6F9E,0xF03A3CAA,0x00000000
8152         long            0x3FFD0000,0xFFE97042    8152         long            0x3FFD0000,0xFFE97042,0xBFA4C2AD,0x00000000
8153         long            0x3FFE0000,0x99D722DA    8153         long            0x3FFE0000,0x99D722DA,0xBDE58F06,0x00000000
8154         long            0x3FFE0000,0x825EFCED    8154         long            0x3FFE0000,0x825EFCED,0x49369330,0x00000000
8155         long            0x3FFE0000,0x9868C809    8155         long            0x3FFE0000,0x9868C809,0x868C8098,0x00000000
8156         long            0x3FFE0000,0x84C37A7A    8156         long            0x3FFE0000,0x84C37A7A,0xB9A905C9,0x00000000
8157         long            0x3FFE0000,0x97012E02    8157         long            0x3FFE0000,0x97012E02,0x5C04B809,0x00000000
8158         long            0x3FFE0000,0x87224C2E    8158         long            0x3FFE0000,0x87224C2E,0x8E645FB7,0x00000000
8159         long            0x3FFE0000,0x95A02568    8159         long            0x3FFE0000,0x95A02568,0x095A0257,0x00000000
8160         long            0x3FFE0000,0x897B8CAC    8160         long            0x3FFE0000,0x897B8CAC,0x9F7DE298,0x00000000
8161         long            0x3FFE0000,0x94458094    8161         long            0x3FFE0000,0x94458094,0x45809446,0x00000000
8162         long            0x3FFE0000,0x8BCF55DE    8162         long            0x3FFE0000,0x8BCF55DE,0xC4CD05FE,0x00000000
8163         long            0x3FFE0000,0x92F11384    8163         long            0x3FFE0000,0x92F11384,0x0497889C,0x00000000
8164         long            0x3FFE0000,0x8E1DC0FB    8164         long            0x3FFE0000,0x8E1DC0FB,0x89E125E5,0x00000000
8165         long            0x3FFE0000,0x91A2B3C4    8165         long            0x3FFE0000,0x91A2B3C4,0xD5E6F809,0x00000000
8166         long            0x3FFE0000,0x9066E68C    8166         long            0x3FFE0000,0x9066E68C,0x955B6C9B,0x00000000
8167         long            0x3FFE0000,0x905A3863    8167         long            0x3FFE0000,0x905A3863,0x3E06C43B,0x00000000
8168         long            0x3FFE0000,0x92AADE74    8168         long            0x3FFE0000,0x92AADE74,0xC7BE59E0,0x00000000
8169         long            0x3FFE0000,0x8F1779D9    8169         long            0x3FFE0000,0x8F1779D9,0xFDC3A219,0x00000000
8170         long            0x3FFE0000,0x94E9BFF6    8170         long            0x3FFE0000,0x94E9BFF6,0x15845643,0x00000000
8171         long            0x3FFE0000,0x8DDA5202    8171         long            0x3FFE0000,0x8DDA5202,0x37694809,0x00000000
8172         long            0x3FFE0000,0x9723A1B7    8172         long            0x3FFE0000,0x9723A1B7,0x20134203,0x00000000
8173         long            0x3FFE0000,0x8CA29C04    8173         long            0x3FFE0000,0x8CA29C04,0x6514E023,0x00000000
8174         long            0x3FFE0000,0x995899C8    8174         long            0x3FFE0000,0x995899C8,0x90EB8990,0x00000000
8175         long            0x3FFE0000,0x8B70344A    8175         long            0x3FFE0000,0x8B70344A,0x139BC75A,0x00000000
8176         long            0x3FFE0000,0x9B88BDAA    8176         long            0x3FFE0000,0x9B88BDAA,0x3A3DAE2F,0x00000000
8177         long            0x3FFE0000,0x8A42F870    8177         long            0x3FFE0000,0x8A42F870,0x5669DB46,0x00000000
8178         long            0x3FFE0000,0x9DB4224F    8178         long            0x3FFE0000,0x9DB4224F,0xFFE1157C,0x00000000
8179         long            0x3FFE0000,0x891AC73A    8179         long            0x3FFE0000,0x891AC73A,0xE9819B50,0x00000000
8180         long            0x3FFE0000,0x9FDADC26    8180         long            0x3FFE0000,0x9FDADC26,0x8B7A12DA,0x00000000
8181         long            0x3FFE0000,0x87F78087    8181         long            0x3FFE0000,0x87F78087,0xF78087F8,0x00000000
8182         long            0x3FFE0000,0xA1FCFF17    8182         long            0x3FFE0000,0xA1FCFF17,0xCE733BD4,0x00000000
8183         long            0x3FFE0000,0x86D90544    8183         long            0x3FFE0000,0x86D90544,0x7A34ACC6,0x00000000
8184         long            0x3FFE0000,0xA41A9E8F    8184         long            0x3FFE0000,0xA41A9E8F,0x5446FB9F,0x00000000
8185         long            0x3FFE0000,0x85BF3761    8185         long            0x3FFE0000,0x85BF3761,0x2CEE3C9B,0x00000000
8186         long            0x3FFE0000,0xA633CD7E    8186         long            0x3FFE0000,0xA633CD7E,0x6771CD8B,0x00000000
8187         long            0x3FFE0000,0x84A9F9C8    8187         long            0x3FFE0000,0x84A9F9C8,0x084A9F9D,0x00000000
8188         long            0x3FFE0000,0xA8489E60    8188         long            0x3FFE0000,0xA8489E60,0x0B435A5E,0x00000000
8189         long            0x3FFE0000,0x83993052    8189         long            0x3FFE0000,0x83993052,0x3FBE3368,0x00000000
8190         long            0x3FFE0000,0xAA59233C    8190         long            0x3FFE0000,0xAA59233C,0xCCA4BD49,0x00000000
8191         long            0x3FFE0000,0x828CBFBE    8191         long            0x3FFE0000,0x828CBFBE,0xB9A020A3,0x00000000
8192         long            0x3FFE0000,0xAC656DAE    8192         long            0x3FFE0000,0xAC656DAE,0x6BCC4985,0x00000000
8193         long            0x3FFE0000,0x81848DA8    8193         long            0x3FFE0000,0x81848DA8,0xFAF0D277,0x00000000
8194         long            0x3FFE0000,0xAE6D8EE3    8194         long            0x3FFE0000,0xAE6D8EE3,0x60BB2468,0x00000000
8195         long            0x3FFE0000,0x80808080    8195         long            0x3FFE0000,0x80808080,0x80808081,0x00000000
8196         long            0x3FFE0000,0xB07197A2    8196         long            0x3FFE0000,0xB07197A2,0x3C46C654,0x00000000
8197                                                  8197 
8198         set             ADJK,L_SCR1              8198         set             ADJK,L_SCR1
8199                                                  8199 
8200         set             X,FP_SCR0                8200         set             X,FP_SCR0
8201         set             XDCARE,X+2               8201         set             XDCARE,X+2
8202         set             XFRAC,X+4                8202         set             XFRAC,X+4
8203                                                  8203 
8204         set             F,FP_SCR1                8204         set             F,FP_SCR1
8205         set             FFRAC,F+4                8205         set             FFRAC,F+4
8206                                                  8206 
8207         set             KLOG2,FP_SCR0            8207         set             KLOG2,FP_SCR0
8208                                                  8208 
8209         set             SAVEU,FP_SCR0            8209         set             SAVEU,FP_SCR0
8210                                                  8210 
8211         global          slogn                    8211         global          slogn
8212 #--ENTRY POINT FOR LOG(X) FOR X FINITE, NON-Z    8212 #--ENTRY POINT FOR LOG(X) FOR X FINITE, NON-ZERO, NOT NAN'S
8213 slogn:                                           8213 slogn:
8214         fmov.x          (%a0),%fp0               8214         fmov.x          (%a0),%fp0              # LOAD INPUT
8215         mov.l           &0x00000000,ADJK(%a6)    8215         mov.l           &0x00000000,ADJK(%a6)
8216                                                  8216 
8217 LOGBGN:                                          8217 LOGBGN:
8218 #--FPCR SAVED AND CLEARED, INPUT IS 2^(ADJK)*    8218 #--FPCR SAVED AND CLEARED, INPUT IS 2^(ADJK)*FP0, FP0 CONTAINS
8219 #--A FINITE, NON-ZERO, NORMALIZED NUMBER.        8219 #--A FINITE, NON-ZERO, NORMALIZED NUMBER.
8220                                                  8220 
8221         mov.l           (%a0),%d1                8221         mov.l           (%a0),%d1
8222         mov.w           4(%a0),%d1               8222         mov.w           4(%a0),%d1
8223                                                  8223 
8224         mov.l           (%a0),X(%a6)             8224         mov.l           (%a0),X(%a6)
8225         mov.l           4(%a0),X+4(%a6)          8225         mov.l           4(%a0),X+4(%a6)
8226         mov.l           8(%a0),X+8(%a6)          8226         mov.l           8(%a0),X+8(%a6)
8227                                                  8227 
8228         cmp.l           %d1,&0                   8228         cmp.l           %d1,&0                  # CHECK IF X IS NEGATIVE
8229         blt.w           LOGNEG                   8229         blt.w           LOGNEG                  # LOG OF NEGATIVE ARGUMENT IS INVALID
8230 # X IS POSITIVE, CHECK IF X IS NEAR 1            8230 # X IS POSITIVE, CHECK IF X IS NEAR 1
8231         cmp.l           %d1,&0x3ffef07d          8231         cmp.l           %d1,&0x3ffef07d         # IS X < 15/16?
8232         blt.b           LOGMAIN                  8232         blt.b           LOGMAIN                 # YES
8233         cmp.l           %d1,&0x3fff8841          8233         cmp.l           %d1,&0x3fff8841         # IS X > 17/16?
8234         ble.w           LOGNEAR1                 8234         ble.w           LOGNEAR1                # NO
8235                                                  8235 
8236 LOGMAIN:                                         8236 LOGMAIN:
8237 #--THIS SHOULD BE THE USUAL CASE, X NOT VERY     8237 #--THIS SHOULD BE THE USUAL CASE, X NOT VERY CLOSE TO 1
8238                                                  8238 
8239 #--X = 2^(K) * Y, 1 <= Y < 2. THUS, Y = 1.XXX    8239 #--X = 2^(K) * Y, 1 <= Y < 2. THUS, Y = 1.XXXXXXXX....XX IN BINARY.
8240 #--WE DEFINE F = 1.XXXXXX1, I.E. FIRST 7 BITS    8240 #--WE DEFINE F = 1.XXXXXX1, I.E. FIRST 7 BITS OF Y AND ATTACH A 1.
8241 #--THE IDEA IS THAT LOG(X) = K*LOG2 + LOG(Y)     8241 #--THE IDEA IS THAT LOG(X) = K*LOG2 + LOG(Y)
8242 #--                      = K*LOG2 + LOG(F) +     8242 #--                      = K*LOG2 + LOG(F) + LOG(1 + (Y-F)/F).
8243 #--NOTE THAT U = (Y-F)/F IS VERY SMALL AND TH    8243 #--NOTE THAT U = (Y-F)/F IS VERY SMALL AND THUS APPROXIMATING
8244 #--LOG(1+U) CAN BE VERY EFFICIENT.               8244 #--LOG(1+U) CAN BE VERY EFFICIENT.
8245 #--ALSO NOTE THAT THE VALUE 1/F IS STORED IN     8245 #--ALSO NOTE THAT THE VALUE 1/F IS STORED IN A TABLE SO THAT NO
8246 #--DIVISION IS NEEDED TO CALCULATE (Y-F)/F.      8246 #--DIVISION IS NEEDED TO CALCULATE (Y-F)/F.
8247                                                  8247 
8248 #--GET K, Y, F, AND ADDRESS OF 1/F.              8248 #--GET K, Y, F, AND ADDRESS OF 1/F.
8249         asr.l           &8,%d1                   8249         asr.l           &8,%d1
8250         asr.l           &8,%d1                   8250         asr.l           &8,%d1                  # SHIFTED 16 BITS, BIASED EXPO. OF X
8251         sub.l           &0x3FFF,%d1              8251         sub.l           &0x3FFF,%d1             # THIS IS K
8252         add.l           ADJK(%a6),%d1            8252         add.l           ADJK(%a6),%d1           # ADJUST K, ORIGINAL INPUT MAY BE  DENORM.
8253         lea             LOGTBL(%pc),%a0          8253         lea             LOGTBL(%pc),%a0         # BASE ADDRESS OF 1/F AND LOG(F)
8254         fmov.l          %d1,%fp1                 8254         fmov.l          %d1,%fp1                # CONVERT K TO FLOATING-POINT FORMAT
8255                                                  8255 
8256 #--WHILE THE CONVERSION IS GOING ON, WE GET F    8256 #--WHILE THE CONVERSION IS GOING ON, WE GET F AND ADDRESS OF 1/F
8257         mov.l           &0x3FFF0000,X(%a6)       8257         mov.l           &0x3FFF0000,X(%a6)      # X IS NOW Y, I.E. 2^(-K)*X
8258         mov.l           XFRAC(%a6),FFRAC(%a6)    8258         mov.l           XFRAC(%a6),FFRAC(%a6)
8259         and.l           &0xFE000000,FFRAC(%a6    8259         and.l           &0xFE000000,FFRAC(%a6)  # FIRST 7 BITS OF Y
8260         or.l            &0x01000000,FFRAC(%a6    8260         or.l            &0x01000000,FFRAC(%a6)  # GET F: ATTACH A 1 AT THE EIGHTH BIT
8261         mov.l           FFRAC(%a6),%d1  # REA    8261         mov.l           FFRAC(%a6),%d1  # READY TO GET ADDRESS OF 1/F
8262         and.l           &0x7E000000,%d1          8262         and.l           &0x7E000000,%d1
8263         asr.l           &8,%d1                   8263         asr.l           &8,%d1
8264         asr.l           &8,%d1                   8264         asr.l           &8,%d1
8265         asr.l           &4,%d1                   8265         asr.l           &4,%d1                  # SHIFTED 20, D0 IS THE DISPLACEMENT
8266         add.l           %d1,%a0                  8266         add.l           %d1,%a0                 # A0 IS THE ADDRESS FOR 1/F
8267                                                  8267 
8268         fmov.x          X(%a6),%fp0              8268         fmov.x          X(%a6),%fp0
8269         mov.l           &0x3fff0000,F(%a6)       8269         mov.l           &0x3fff0000,F(%a6)
8270         clr.l           F+8(%a6)                 8270         clr.l           F+8(%a6)
8271         fsub.x          F(%a6),%fp0              8271         fsub.x          F(%a6),%fp0             # Y-F
8272         fmovm.x         &0xc,-(%sp)              8272         fmovm.x         &0xc,-(%sp)             # SAVE FP2-3 WHILE FP0 IS NOT READY
8273 #--SUMMARY: FP0 IS Y-F, A0 IS ADDRESS OF 1/F,    8273 #--SUMMARY: FP0 IS Y-F, A0 IS ADDRESS OF 1/F, FP1 IS K
8274 #--REGISTERS SAVED: FPCR, FP1, FP2               8274 #--REGISTERS SAVED: FPCR, FP1, FP2
8275                                                  8275 
8276 LP1CONT1:                                        8276 LP1CONT1:
8277 #--AN RE-ENTRY POINT FOR LOGNP1                  8277 #--AN RE-ENTRY POINT FOR LOGNP1
8278         fmul.x          (%a0),%fp0               8278         fmul.x          (%a0),%fp0              # FP0 IS U = (Y-F)/F
8279         fmul.x          LOGOF2(%pc),%fp1         8279         fmul.x          LOGOF2(%pc),%fp1        # GET K*LOG2 WHILE FP0 IS NOT READY
8280         fmov.x          %fp0,%fp2                8280         fmov.x          %fp0,%fp2
8281         fmul.x          %fp2,%fp2                8281         fmul.x          %fp2,%fp2               # FP2 IS V=U*U
8282         fmov.x          %fp1,KLOG2(%a6)          8282         fmov.x          %fp1,KLOG2(%a6)         # PUT K*LOG2 IN MEMEORY, FREE FP1
8283                                                  8283 
8284 #--LOG(1+U) IS APPROXIMATED BY                   8284 #--LOG(1+U) IS APPROXIMATED BY
8285 #--U + V*(A1+U*(A2+U*(A3+U*(A4+U*(A5+U*A6))))    8285 #--U + V*(A1+U*(A2+U*(A3+U*(A4+U*(A5+U*A6))))) WHICH IS
8286 #--[U + V*(A1+V*(A3+V*A5))]  +  [U*V*(A2+V*(A    8286 #--[U + V*(A1+V*(A3+V*A5))]  +  [U*V*(A2+V*(A4+V*A6))]
8287                                                  8287 
8288         fmov.x          %fp2,%fp3                8288         fmov.x          %fp2,%fp3
8289         fmov.x          %fp2,%fp1                8289         fmov.x          %fp2,%fp1
8290                                                  8290 
8291         fmul.d          LOGA6(%pc),%fp1          8291         fmul.d          LOGA6(%pc),%fp1         # V*A6
8292         fmul.d          LOGA5(%pc),%fp2          8292         fmul.d          LOGA5(%pc),%fp2         # V*A5
8293                                                  8293 
8294         fadd.d          LOGA4(%pc),%fp1          8294         fadd.d          LOGA4(%pc),%fp1         # A4+V*A6
8295         fadd.d          LOGA3(%pc),%fp2          8295         fadd.d          LOGA3(%pc),%fp2         # A3+V*A5
8296                                                  8296 
8297         fmul.x          %fp3,%fp1                8297         fmul.x          %fp3,%fp1               # V*(A4+V*A6)
8298         fmul.x          %fp3,%fp2                8298         fmul.x          %fp3,%fp2               # V*(A3+V*A5)
8299                                                  8299 
8300         fadd.d          LOGA2(%pc),%fp1          8300         fadd.d          LOGA2(%pc),%fp1         # A2+V*(A4+V*A6)
8301         fadd.d          LOGA1(%pc),%fp2          8301         fadd.d          LOGA1(%pc),%fp2         # A1+V*(A3+V*A5)
8302                                                  8302 
8303         fmul.x          %fp3,%fp1                8303         fmul.x          %fp3,%fp1               # V*(A2+V*(A4+V*A6))
8304         add.l           &16,%a0                  8304         add.l           &16,%a0                 # ADDRESS OF LOG(F)
8305         fmul.x          %fp3,%fp2                8305         fmul.x          %fp3,%fp2               # V*(A1+V*(A3+V*A5))
8306                                                  8306 
8307         fmul.x          %fp0,%fp1                8307         fmul.x          %fp0,%fp1               # U*V*(A2+V*(A4+V*A6))
8308         fadd.x          %fp2,%fp0                8308         fadd.x          %fp2,%fp0               # U+V*(A1+V*(A3+V*A5))
8309                                                  8309 
8310         fadd.x          (%a0),%fp1               8310         fadd.x          (%a0),%fp1              # LOG(F)+U*V*(A2+V*(A4+V*A6))
8311         fmovm.x         (%sp)+,&0x30             8311         fmovm.x         (%sp)+,&0x30            # RESTORE FP2-3
8312         fadd.x          %fp1,%fp0                8312         fadd.x          %fp1,%fp0               # FP0 IS LOG(F) + LOG(1+U)
8313                                                  8313 
8314         fmov.l          %d0,%fpcr                8314         fmov.l          %d0,%fpcr
8315         fadd.x          KLOG2(%a6),%fp0          8315         fadd.x          KLOG2(%a6),%fp0         # FINAL ADD
8316         bra             t_inx2                   8316         bra             t_inx2
8317                                                  8317 
8318                                                  8318 
8319 LOGNEAR1:                                        8319 LOGNEAR1:
8320                                                  8320 
8321 # if the input is exactly equal to one, then     8321 # if the input is exactly equal to one, then exit through ld_pzero.
8322 # if these 2 lines weren't here, the correct     8322 # if these 2 lines weren't here, the correct answer would be returned
8323 # but the INEX2 bit would be set.                8323 # but the INEX2 bit would be set.
8324         fcmp.b          %fp0,&0x1                8324         fcmp.b          %fp0,&0x1               # is it equal to one?
8325         fbeq.l          ld_pzero                 8325         fbeq.l          ld_pzero                # yes
8326                                                  8326 
8327 #--REGISTERS SAVED: FPCR, FP1. FP0 CONTAINS T    8327 #--REGISTERS SAVED: FPCR, FP1. FP0 CONTAINS THE INPUT.
8328         fmov.x          %fp0,%fp1                8328         fmov.x          %fp0,%fp1
8329         fsub.s          one(%pc),%fp1            8329         fsub.s          one(%pc),%fp1           # FP1 IS X-1
8330         fadd.s          one(%pc),%fp0            8330         fadd.s          one(%pc),%fp0           # FP0 IS X+1
8331         fadd.x          %fp1,%fp1                8331         fadd.x          %fp1,%fp1               # FP1 IS 2(X-1)
8332 #--LOG(X) = LOG(1+U/2)-LOG(1-U/2) WHICH IS AN    8332 #--LOG(X) = LOG(1+U/2)-LOG(1-U/2) WHICH IS AN ODD POLYNOMIAL
8333 #--IN U, U = 2(X-1)/(X+1) = FP1/FP0              8333 #--IN U, U = 2(X-1)/(X+1) = FP1/FP0
8334                                                  8334 
8335 LP1CONT2:                                        8335 LP1CONT2:
8336 #--THIS IS AN RE-ENTRY POINT FOR LOGNP1          8336 #--THIS IS AN RE-ENTRY POINT FOR LOGNP1
8337         fdiv.x          %fp0,%fp1                8337         fdiv.x          %fp0,%fp1               # FP1 IS U
8338         fmovm.x         &0xc,-(%sp)              8338         fmovm.x         &0xc,-(%sp)             # SAVE FP2-3
8339 #--REGISTERS SAVED ARE NOW FPCR,FP1,FP2,FP3      8339 #--REGISTERS SAVED ARE NOW FPCR,FP1,FP2,FP3
8340 #--LET V=U*U, W=V*V, CALCULATE                   8340 #--LET V=U*U, W=V*V, CALCULATE
8341 #--U + U*V*(B1 + V*(B2 + V*(B3 + V*(B4 + V*B5    8341 #--U + U*V*(B1 + V*(B2 + V*(B3 + V*(B4 + V*B5)))) BY
8342 #--U + U*V*(  [B1 + W*(B3 + W*B5)]  +  [V*(B2    8342 #--U + U*V*(  [B1 + W*(B3 + W*B5)]  +  [V*(B2 + W*B4)]  )
8343         fmov.x          %fp1,%fp0                8343         fmov.x          %fp1,%fp0
8344         fmul.x          %fp0,%fp0                8344         fmul.x          %fp0,%fp0               # FP0 IS V
8345         fmov.x          %fp1,SAVEU(%a6)          8345         fmov.x          %fp1,SAVEU(%a6)         # STORE U IN MEMORY, FREE FP1
8346         fmov.x          %fp0,%fp1                8346         fmov.x          %fp0,%fp1
8347         fmul.x          %fp1,%fp1                8347         fmul.x          %fp1,%fp1               # FP1 IS W
8348                                                  8348 
8349         fmov.d          LOGB5(%pc),%fp3          8349         fmov.d          LOGB5(%pc),%fp3
8350         fmov.d          LOGB4(%pc),%fp2          8350         fmov.d          LOGB4(%pc),%fp2
8351                                                  8351 
8352         fmul.x          %fp1,%fp3                8352         fmul.x          %fp1,%fp3               # W*B5
8353         fmul.x          %fp1,%fp2                8353         fmul.x          %fp1,%fp2               # W*B4
8354                                                  8354 
8355         fadd.d          LOGB3(%pc),%fp3          8355         fadd.d          LOGB3(%pc),%fp3         # B3+W*B5
8356         fadd.d          LOGB2(%pc),%fp2          8356         fadd.d          LOGB2(%pc),%fp2         # B2+W*B4
8357                                                  8357 
8358         fmul.x          %fp3,%fp1                8358         fmul.x          %fp3,%fp1               # W*(B3+W*B5), FP3 RELEASED
8359                                                  8359 
8360         fmul.x          %fp0,%fp2                8360         fmul.x          %fp0,%fp2               # V*(B2+W*B4)
8361                                                  8361 
8362         fadd.d          LOGB1(%pc),%fp1          8362         fadd.d          LOGB1(%pc),%fp1         # B1+W*(B3+W*B5)
8363         fmul.x          SAVEU(%a6),%fp0          8363         fmul.x          SAVEU(%a6),%fp0         # FP0 IS U*V
8364                                                  8364 
8365         fadd.x          %fp2,%fp1                8365         fadd.x          %fp2,%fp1               # B1+W*(B3+W*B5) + V*(B2+W*B4), FP2 RELEASED
8366         fmovm.x         (%sp)+,&0x30             8366         fmovm.x         (%sp)+,&0x30            # FP2-3 RESTORED
8367                                                  8367 
8368         fmul.x          %fp1,%fp0                8368         fmul.x          %fp1,%fp0               # U*V*( [B1+W*(B3+W*B5)] + [V*(B2+W*B4)] )
8369                                                  8369 
8370         fmov.l          %d0,%fpcr                8370         fmov.l          %d0,%fpcr
8371         fadd.x          SAVEU(%a6),%fp0          8371         fadd.x          SAVEU(%a6),%fp0
8372         bra             t_inx2                   8372         bra             t_inx2
8373                                                  8373 
8374 #--REGISTERS SAVED FPCR. LOG(-VE) IS INVALID     8374 #--REGISTERS SAVED FPCR. LOG(-VE) IS INVALID
8375 LOGNEG:                                          8375 LOGNEG:
8376         bra             t_operr                  8376         bra             t_operr
8377                                                  8377 
8378         global          slognd                   8378         global          slognd
8379 slognd:                                          8379 slognd:
8380 #--ENTRY POINT FOR LOG(X) FOR DENORMALIZED IN    8380 #--ENTRY POINT FOR LOG(X) FOR DENORMALIZED INPUT
8381                                                  8381 
8382         mov.l           &-100,ADJK(%a6)          8382         mov.l           &-100,ADJK(%a6)         # INPUT = 2^(ADJK) * FP0
8383                                                  8383 
8384 #----normalize the input value by left shifti    8384 #----normalize the input value by left shifting k bits (k to be determined
8385 #----below), adjusting exponent and storing -    8385 #----below), adjusting exponent and storing -k to  ADJK
8386 #----the value TWOTO100 is no longer needed.     8386 #----the value TWOTO100 is no longer needed.
8387 #----Note that this code assumes the denormal    8387 #----Note that this code assumes the denormalized input is NON-ZERO.
8388                                                  8388 
8389         movm.l          &0x3f00,-(%sp)           8389         movm.l          &0x3f00,-(%sp)          # save some registers  {d2-d7}
8390         mov.l           (%a0),%d3                8390         mov.l           (%a0),%d3               # D3 is exponent of smallest norm. #
8391         mov.l           4(%a0),%d4               8391         mov.l           4(%a0),%d4
8392         mov.l           8(%a0),%d5               8392         mov.l           8(%a0),%d5              # (D4,D5) is (Hi_X,Lo_X)
8393         clr.l           %d2                      8393         clr.l           %d2                     # D2 used for holding K
8394                                                  8394 
8395         tst.l           %d4                      8395         tst.l           %d4
8396         bne.b           Hi_not0                  8396         bne.b           Hi_not0
8397                                                  8397 
8398 Hi_0:                                            8398 Hi_0:
8399         mov.l           %d5,%d4                  8399         mov.l           %d5,%d4
8400         clr.l           %d5                      8400         clr.l           %d5
8401         mov.l           &32,%d2                  8401         mov.l           &32,%d2
8402         clr.l           %d6                      8402         clr.l           %d6
8403         bfffo           %d4{&0:&32},%d6          8403         bfffo           %d4{&0:&32},%d6
8404         lsl.l           %d6,%d4                  8404         lsl.l           %d6,%d4
8405         add.l           %d6,%d2                  8405         add.l           %d6,%d2                 # (D3,D4,D5) is normalized
8406                                                  8406 
8407         mov.l           %d3,X(%a6)               8407         mov.l           %d3,X(%a6)
8408         mov.l           %d4,XFRAC(%a6)           8408         mov.l           %d4,XFRAC(%a6)
8409         mov.l           %d5,XFRAC+4(%a6)         8409         mov.l           %d5,XFRAC+4(%a6)
8410         neg.l           %d2                      8410         neg.l           %d2
8411         mov.l           %d2,ADJK(%a6)            8411         mov.l           %d2,ADJK(%a6)
8412         fmov.x          X(%a6),%fp0              8412         fmov.x          X(%a6),%fp0
8413         movm.l          (%sp)+,&0xfc             8413         movm.l          (%sp)+,&0xfc            # restore registers {d2-d7}
8414         lea             X(%a6),%a0               8414         lea             X(%a6),%a0
8415         bra.w           LOGBGN                   8415         bra.w           LOGBGN                  # begin regular log(X)
8416                                                  8416 
8417 Hi_not0:                                         8417 Hi_not0:
8418         clr.l           %d6                      8418         clr.l           %d6
8419         bfffo           %d4{&0:&32},%d6          8419         bfffo           %d4{&0:&32},%d6         # find first 1
8420         mov.l           %d6,%d2                  8420         mov.l           %d6,%d2                 # get k
8421         lsl.l           %d6,%d4                  8421         lsl.l           %d6,%d4
8422         mov.l           %d5,%d7                  8422         mov.l           %d5,%d7                 # a copy of D5
8423         lsl.l           %d6,%d5                  8423         lsl.l           %d6,%d5
8424         neg.l           %d6                      8424         neg.l           %d6
8425         add.l           &32,%d6                  8425         add.l           &32,%d6
8426         lsr.l           %d6,%d7                  8426         lsr.l           %d6,%d7
8427         or.l            %d7,%d4                  8427         or.l            %d7,%d4                 # (D3,D4,D5) normalized
8428                                                  8428 
8429         mov.l           %d3,X(%a6)               8429         mov.l           %d3,X(%a6)
8430         mov.l           %d4,XFRAC(%a6)           8430         mov.l           %d4,XFRAC(%a6)
8431         mov.l           %d5,XFRAC+4(%a6)         8431         mov.l           %d5,XFRAC+4(%a6)
8432         neg.l           %d2                      8432         neg.l           %d2
8433         mov.l           %d2,ADJK(%a6)            8433         mov.l           %d2,ADJK(%a6)
8434         fmov.x          X(%a6),%fp0              8434         fmov.x          X(%a6),%fp0
8435         movm.l          (%sp)+,&0xfc             8435         movm.l          (%sp)+,&0xfc            # restore registers {d2-d7}
8436         lea             X(%a6),%a0               8436         lea             X(%a6),%a0
8437         bra.w           LOGBGN                   8437         bra.w           LOGBGN                  # begin regular log(X)
8438                                                  8438 
8439         global          slognp1                  8439         global          slognp1
8440 #--ENTRY POINT FOR LOG(1+X) FOR X FINITE, NON    8440 #--ENTRY POINT FOR LOG(1+X) FOR X FINITE, NON-ZERO, NOT NAN'S
8441 slognp1:                                         8441 slognp1:
8442         fmov.x          (%a0),%fp0               8442         fmov.x          (%a0),%fp0              # LOAD INPUT
8443         fabs.x          %fp0                     8443         fabs.x          %fp0                    # test magnitude
8444         fcmp.x          %fp0,LTHOLD(%pc)         8444         fcmp.x          %fp0,LTHOLD(%pc)        # compare with min threshold
8445         fbgt.w          LP1REAL                  8445         fbgt.w          LP1REAL                 # if greater, continue
8446         fmov.l          %d0,%fpcr                8446         fmov.l          %d0,%fpcr
8447         mov.b           &FMOV_OP,%d1             8447         mov.b           &FMOV_OP,%d1            # last inst is MOVE
8448         fmov.x          (%a0),%fp0               8448         fmov.x          (%a0),%fp0              # return signed argument
8449         bra             t_catch                  8449         bra             t_catch
8450                                                  8450 
8451 LP1REAL:                                         8451 LP1REAL:
8452         fmov.x          (%a0),%fp0               8452         fmov.x          (%a0),%fp0              # LOAD INPUT
8453         mov.l           &0x00000000,ADJK(%a6)    8453         mov.l           &0x00000000,ADJK(%a6)
8454         fmov.x          %fp0,%fp1                8454         fmov.x          %fp0,%fp1               # FP1 IS INPUT Z
8455         fadd.s          one(%pc),%fp0            8455         fadd.s          one(%pc),%fp0           # X := ROUND(1+Z)
8456         fmov.x          %fp0,X(%a6)              8456         fmov.x          %fp0,X(%a6)
8457         mov.w           XFRAC(%a6),XDCARE(%a6    8457         mov.w           XFRAC(%a6),XDCARE(%a6)
8458         mov.l           X(%a6),%d1               8458         mov.l           X(%a6),%d1
8459         cmp.l           %d1,&0                   8459         cmp.l           %d1,&0
8460         ble.w           LP1NEG0                  8460         ble.w           LP1NEG0                 # LOG OF ZERO OR -VE
8461         cmp.l           %d1,&0x3ffe8000          8461         cmp.l           %d1,&0x3ffe8000         # IS BOUNDS [1/2,3/2]?
8462         blt.w           LOGMAIN                  8462         blt.w           LOGMAIN
8463         cmp.l           %d1,&0x3fffc000          8463         cmp.l           %d1,&0x3fffc000
8464         bgt.w           LOGMAIN                  8464         bgt.w           LOGMAIN
8465 #--IF 1+Z > 3/2 OR 1+Z < 1/2, THEN X, WHICH I    8465 #--IF 1+Z > 3/2 OR 1+Z < 1/2, THEN X, WHICH IS ROUNDING 1+Z,
8466 #--CONTAINS AT LEAST 63 BITS OF INFORMATION O    8466 #--CONTAINS AT LEAST 63 BITS OF INFORMATION OF Z. IN THAT CASE,
8467 #--SIMPLY INVOKE LOG(X) FOR LOG(1+Z).            8467 #--SIMPLY INVOKE LOG(X) FOR LOG(1+Z).
8468                                                  8468 
8469 LP1NEAR1:                                        8469 LP1NEAR1:
8470 #--NEXT SEE IF EXP(-1/16) < X < EXP(1/16)        8470 #--NEXT SEE IF EXP(-1/16) < X < EXP(1/16)
8471         cmp.l           %d1,&0x3ffef07d          8471         cmp.l           %d1,&0x3ffef07d
8472         blt.w           LP1CARE                  8472         blt.w           LP1CARE
8473         cmp.l           %d1,&0x3fff8841          8473         cmp.l           %d1,&0x3fff8841
8474         bgt.w           LP1CARE                  8474         bgt.w           LP1CARE
8475                                                  8475 
8476 LP1ONE16:                                        8476 LP1ONE16:
8477 #--EXP(-1/16) < X < EXP(1/16). LOG(1+Z) = LOG    8477 #--EXP(-1/16) < X < EXP(1/16). LOG(1+Z) = LOG(1+U/2) - LOG(1-U/2)
8478 #--WHERE U = 2Z/(2+Z) = 2Z/(1+X).                8478 #--WHERE U = 2Z/(2+Z) = 2Z/(1+X).
8479         fadd.x          %fp1,%fp1                8479         fadd.x          %fp1,%fp1               # FP1 IS 2Z
8480         fadd.s          one(%pc),%fp0            8480         fadd.s          one(%pc),%fp0           # FP0 IS 1+X
8481 #--U = FP1/FP0                                   8481 #--U = FP1/FP0
8482         bra.w           LP1CONT2                 8482         bra.w           LP1CONT2
8483                                                  8483 
8484 LP1CARE:                                         8484 LP1CARE:
8485 #--HERE WE USE THE USUAL TABLE DRIVEN APPROAC    8485 #--HERE WE USE THE USUAL TABLE DRIVEN APPROACH. CARE HAS TO BE
8486 #--TAKEN BECAUSE 1+Z CAN HAVE 67 BITS OF INFO    8486 #--TAKEN BECAUSE 1+Z CAN HAVE 67 BITS OF INFORMATION AND WE MUST
8487 #--PRESERVE ALL THE INFORMATION. BECAUSE 1+Z     8487 #--PRESERVE ALL THE INFORMATION. BECAUSE 1+Z IS IN [1/2,3/2],
8488 #--THERE ARE ONLY TWO CASES.                     8488 #--THERE ARE ONLY TWO CASES.
8489 #--CASE 1: 1+Z < 1, THEN K = -1 AND Y-F = (2-    8489 #--CASE 1: 1+Z < 1, THEN K = -1 AND Y-F = (2-F) + 2Z
8490 #--CASE 2: 1+Z > 1, THEN K = 0  AND Y-F = (1-    8490 #--CASE 2: 1+Z > 1, THEN K = 0  AND Y-F = (1-F) + Z
8491 #--ON RETURNING TO LP1CONT1, WE MUST HAVE K I    8491 #--ON RETURNING TO LP1CONT1, WE MUST HAVE K IN FP1, ADDRESS OF
8492 #--(1/F) IN A0, Y-F IN FP0, AND FP2 SAVED.       8492 #--(1/F) IN A0, Y-F IN FP0, AND FP2 SAVED.
8493                                                  8493 
8494         mov.l           XFRAC(%a6),FFRAC(%a6)    8494         mov.l           XFRAC(%a6),FFRAC(%a6)
8495         and.l           &0xFE000000,FFRAC(%a6    8495         and.l           &0xFE000000,FFRAC(%a6)
8496         or.l            &0x01000000,FFRAC(%a6    8496         or.l            &0x01000000,FFRAC(%a6)  # F OBTAINED
8497         cmp.l           %d1,&0x3FFF8000          8497         cmp.l           %d1,&0x3FFF8000         # SEE IF 1+Z > 1
8498         bge.b           KISZERO                  8498         bge.b           KISZERO
8499                                                  8499 
8500 KISNEG1:                                         8500 KISNEG1:
8501         fmov.s          TWO(%pc),%fp0            8501         fmov.s          TWO(%pc),%fp0
8502         mov.l           &0x3fff0000,F(%a6)       8502         mov.l           &0x3fff0000,F(%a6)
8503         clr.l           F+8(%a6)                 8503         clr.l           F+8(%a6)
8504         fsub.x          F(%a6),%fp0              8504         fsub.x          F(%a6),%fp0             # 2-F
8505         mov.l           FFRAC(%a6),%d1           8505         mov.l           FFRAC(%a6),%d1
8506         and.l           &0x7E000000,%d1          8506         and.l           &0x7E000000,%d1
8507         asr.l           &8,%d1                   8507         asr.l           &8,%d1
8508         asr.l           &8,%d1                   8508         asr.l           &8,%d1
8509         asr.l           &4,%d1                   8509         asr.l           &4,%d1                  # D0 CONTAINS DISPLACEMENT FOR 1/F
8510         fadd.x          %fp1,%fp1                8510         fadd.x          %fp1,%fp1               # GET 2Z
8511         fmovm.x         &0xc,-(%sp)              8511         fmovm.x         &0xc,-(%sp)             # SAVE FP2  {%fp2/%fp3}
8512         fadd.x          %fp1,%fp0                8512         fadd.x          %fp1,%fp0               # FP0 IS Y-F = (2-F)+2Z
8513         lea             LOGTBL(%pc),%a0          8513         lea             LOGTBL(%pc),%a0         # A0 IS ADDRESS OF 1/F
8514         add.l           %d1,%a0                  8514         add.l           %d1,%a0
8515         fmov.s          negone(%pc),%fp1         8515         fmov.s          negone(%pc),%fp1        # FP1 IS K = -1
8516         bra.w           LP1CONT1                 8516         bra.w           LP1CONT1
8517                                                  8517 
8518 KISZERO:                                         8518 KISZERO:
8519         fmov.s          one(%pc),%fp0            8519         fmov.s          one(%pc),%fp0
8520         mov.l           &0x3fff0000,F(%a6)       8520         mov.l           &0x3fff0000,F(%a6)
8521         clr.l           F+8(%a6)                 8521         clr.l           F+8(%a6)
8522         fsub.x          F(%a6),%fp0              8522         fsub.x          F(%a6),%fp0             # 1-F
8523         mov.l           FFRAC(%a6),%d1           8523         mov.l           FFRAC(%a6),%d1
8524         and.l           &0x7E000000,%d1          8524         and.l           &0x7E000000,%d1
8525         asr.l           &8,%d1                   8525         asr.l           &8,%d1
8526         asr.l           &8,%d1                   8526         asr.l           &8,%d1
8527         asr.l           &4,%d1                   8527         asr.l           &4,%d1
8528         fadd.x          %fp1,%fp0                8528         fadd.x          %fp1,%fp0               # FP0 IS Y-F
8529         fmovm.x         &0xc,-(%sp)              8529         fmovm.x         &0xc,-(%sp)             # FP2 SAVED {%fp2/%fp3}
8530         lea             LOGTBL(%pc),%a0          8530         lea             LOGTBL(%pc),%a0
8531         add.l           %d1,%a0                  8531         add.l           %d1,%a0                 # A0 IS ADDRESS OF 1/F
8532         fmov.s          zero(%pc),%fp1           8532         fmov.s          zero(%pc),%fp1          # FP1 IS K = 0
8533         bra.w           LP1CONT1                 8533         bra.w           LP1CONT1
8534                                                  8534 
8535 LP1NEG0:                                         8535 LP1NEG0:
8536 #--FPCR SAVED. D0 IS X IN COMPACT FORM.          8536 #--FPCR SAVED. D0 IS X IN COMPACT FORM.
8537         cmp.l           %d1,&0                   8537         cmp.l           %d1,&0
8538         blt.b           LP1NEG                   8538         blt.b           LP1NEG
8539 LP1ZERO:                                         8539 LP1ZERO:
8540         fmov.s          negone(%pc),%fp0         8540         fmov.s          negone(%pc),%fp0
8541                                                  8541 
8542         fmov.l          %d0,%fpcr                8542         fmov.l          %d0,%fpcr
8543         bra             t_dz                     8543         bra             t_dz
8544                                                  8544 
8545 LP1NEG:                                          8545 LP1NEG:
8546         fmov.s          zero(%pc),%fp0           8546         fmov.s          zero(%pc),%fp0
8547                                                  8547 
8548         fmov.l          %d0,%fpcr                8548         fmov.l          %d0,%fpcr
8549         bra             t_operr                  8549         bra             t_operr
8550                                                  8550 
8551         global          slognp1d                 8551         global          slognp1d
8552 #--ENTRY POINT FOR LOG(1+Z) FOR DENORMALIZED     8552 #--ENTRY POINT FOR LOG(1+Z) FOR DENORMALIZED INPUT
8553 # Simply return the denorm                       8553 # Simply return the denorm
8554 slognp1d:                                        8554 slognp1d:
8555         bra             t_extdnrm                8555         bra             t_extdnrm
8556                                                  8556 
8557 #############################################    8557 #########################################################################
8558 # satanh():  computes the inverse hyperbolic     8558 # satanh():  computes the inverse hyperbolic tangent of a norm input    #
8559 # satanhd(): computes the inverse hyperbolic     8559 # satanhd(): computes the inverse hyperbolic tangent of a denorm input  #
8560 #                                                8560 #                                                                       #
8561 # INPUT *************************************    8561 # INPUT *************************************************************** #
8562 #       a0 = pointer to extended precision in    8562 #       a0 = pointer to extended precision input                        #
8563 #       d0 = round precision,mode                8563 #       d0 = round precision,mode                                       #
8564 #                                                8564 #                                                                       #
8565 # OUTPUT ************************************    8565 # OUTPUT ************************************************************** #
8566 #       fp0 = arctanh(X)                         8566 #       fp0 = arctanh(X)                                                #
8567 #                                                8567 #                                                                       #
8568 # ACCURACY and MONOTONICITY *****************    8568 # ACCURACY and MONOTONICITY ******************************************* #
8569 #       The returned result is within 3 ulps     8569 #       The returned result is within 3 ulps in 64 significant bit,     #
8570 #       i.e. within 0.5001 ulp to 53 bits if     8570 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
8571 #       rounded to double precision. The resu    8571 #       rounded to double precision. The result is provably monotonic   #
8572 #       in double precision.                     8572 #       in double precision.                                            #
8573 #                                                8573 #                                                                       #
8574 # ALGORITHM *********************************    8574 # ALGORITHM *********************************************************** #
8575 #                                                8575 #                                                                       #
8576 #       ATANH                                    8576 #       ATANH                                                           #
8577 #       1. If |X| >= 1, go to 3.                 8577 #       1. If |X| >= 1, go to 3.                                        #
8578 #                                                8578 #                                                                       #
8579 #       2. (|X| < 1) Calculate atanh(X) by       8579 #       2. (|X| < 1) Calculate atanh(X) by                              #
8580 #               sgn := sign(X)                   8580 #               sgn := sign(X)                                          #
8581 #               y := |X|                         8581 #               y := |X|                                                #
8582 #               z := 2y/(1-y)                    8582 #               z := 2y/(1-y)                                           #
8583 #               atanh(X) := sgn * (1/2) * log    8583 #               atanh(X) := sgn * (1/2) * logp1(z)                      #
8584 #               Exit.                            8584 #               Exit.                                                   #
8585 #                                                8585 #                                                                       #
8586 #       3. If |X| > 1, go to 5.                  8586 #       3. If |X| > 1, go to 5.                                         #
8587 #                                                8587 #                                                                       #
8588 #       4. (|X| = 1) Generate infinity with a    8588 #       4. (|X| = 1) Generate infinity with an appropriate sign and     #
8589 #               divide-by-zero by                8589 #               divide-by-zero by                                       #
8590 #               sgn := sign(X)                   8590 #               sgn := sign(X)                                          #
8591 #               atan(X) := sgn / (+0).           8591 #               atan(X) := sgn / (+0).                                  #
8592 #               Exit.                            8592 #               Exit.                                                   #
8593 #                                                8593 #                                                                       #
8594 #       5. (|X| > 1) Generate an invalid oper    8594 #       5. (|X| > 1) Generate an invalid operation by 0 * infinity.     #
8595 #               Exit.                            8595 #               Exit.                                                   #
8596 #                                                8596 #                                                                       #
8597 #############################################    8597 #########################################################################
8598                                                  8598 
8599         global          satanh                   8599         global          satanh
8600 satanh:                                          8600 satanh:
8601         mov.l           (%a0),%d1                8601         mov.l           (%a0),%d1
8602         mov.w           4(%a0),%d1               8602         mov.w           4(%a0),%d1
8603         and.l           &0x7FFFFFFF,%d1          8603         and.l           &0x7FFFFFFF,%d1
8604         cmp.l           %d1,&0x3FFF8000          8604         cmp.l           %d1,&0x3FFF8000
8605         bge.b           ATANHBIG                 8605         bge.b           ATANHBIG
8606                                                  8606 
8607 #--THIS IS THE USUAL CASE, |X| < 1               8607 #--THIS IS THE USUAL CASE, |X| < 1
8608 #--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X)     8608 #--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z).
8609                                                  8609 
8610         fabs.x          (%a0),%fp0               8610         fabs.x          (%a0),%fp0              # Y = |X|
8611         fmov.x          %fp0,%fp1                8611         fmov.x          %fp0,%fp1
8612         fneg.x          %fp1                     8612         fneg.x          %fp1                    # -Y
8613         fadd.x          %fp0,%fp0                8613         fadd.x          %fp0,%fp0               # 2Y
8614         fadd.s          &0x3F800000,%fp1         8614         fadd.s          &0x3F800000,%fp1        # 1-Y
8615         fdiv.x          %fp1,%fp0                8615         fdiv.x          %fp1,%fp0               # 2Y/(1-Y)
8616         mov.l           (%a0),%d1                8616         mov.l           (%a0),%d1
8617         and.l           &0x80000000,%d1          8617         and.l           &0x80000000,%d1
8618         or.l            &0x3F000000,%d1          8618         or.l            &0x3F000000,%d1         # SIGN(X)*HALF
8619         mov.l           %d1,-(%sp)               8619         mov.l           %d1,-(%sp)
8620                                                  8620 
8621         mov.l           %d0,-(%sp)               8621         mov.l           %d0,-(%sp)              # save rnd prec,mode
8622         clr.l           %d0                      8622         clr.l           %d0                     # pass ext prec,RN
8623         fmovm.x         &0x01,-(%sp)             8623         fmovm.x         &0x01,-(%sp)            # save Z on stack
8624         lea             (%sp),%a0                8624         lea             (%sp),%a0               # pass ptr to Z
8625         bsr             slognp1                  8625         bsr             slognp1                 # LOG1P(Z)
8626         add.l           &0xc,%sp                 8626         add.l           &0xc,%sp                # clear Z from stack
8627                                                  8627 
8628         mov.l           (%sp)+,%d0               8628         mov.l           (%sp)+,%d0              # fetch old prec,mode
8629         fmov.l          %d0,%fpcr                8629         fmov.l          %d0,%fpcr               # load it
8630         mov.b           &FMUL_OP,%d1             8630         mov.b           &FMUL_OP,%d1            # last inst is MUL
8631         fmul.s          (%sp)+,%fp0              8631         fmul.s          (%sp)+,%fp0
8632         bra             t_catch                  8632         bra             t_catch
8633                                                  8633 
8634 ATANHBIG:                                        8634 ATANHBIG:
8635         fabs.x          (%a0),%fp0               8635         fabs.x          (%a0),%fp0              # |X|
8636         fcmp.s          %fp0,&0x3F800000         8636         fcmp.s          %fp0,&0x3F800000
8637         fbgt            t_operr                  8637         fbgt            t_operr
8638         bra             t_dz                     8638         bra             t_dz
8639                                                  8639 
8640         global          satanhd                  8640         global          satanhd
8641 #--ATANH(X) = X FOR DENORMALIZED X               8641 #--ATANH(X) = X FOR DENORMALIZED X
8642 satanhd:                                         8642 satanhd:
8643         bra             t_extdnrm                8643         bra             t_extdnrm
8644                                                  8644 
8645 #############################################    8645 #########################################################################
8646 # slog10():  computes the base-10 logarithm o    8646 # slog10():  computes the base-10 logarithm of a normalized input       #
8647 # slog10d(): computes the base-10 logarithm o    8647 # slog10d(): computes the base-10 logarithm of a denormalized input     #
8648 # slog2():   computes the base-2 logarithm of    8648 # slog2():   computes the base-2 logarithm of a normalized input        #
8649 # slog2d():  computes the base-2 logarithm of    8649 # slog2d():  computes the base-2 logarithm of a denormalized input      #
8650 #                                                8650 #                                                                       #
8651 # INPUT *************************************    8651 # INPUT *************************************************************** #
8652 #       a0 = pointer to extended precision in    8652 #       a0 = pointer to extended precision input                        #
8653 #       d0 = round precision,mode                8653 #       d0 = round precision,mode                                       #
8654 #                                                8654 #                                                                       #
8655 # OUTPUT ************************************    8655 # OUTPUT ************************************************************** #
8656 #       fp0 = log_10(X) or log_2(X)              8656 #       fp0 = log_10(X) or log_2(X)                                     #
8657 #                                                8657 #                                                                       #
8658 # ACCURACY and MONOTONICITY *****************    8658 # ACCURACY and MONOTONICITY ******************************************* #
8659 #       The returned result is within 1.7 ulp    8659 #       The returned result is within 1.7 ulps in 64 significant bit,   #
8660 #       i.e. within 0.5003 ulp to 53 bits if     8660 #       i.e. within 0.5003 ulp to 53 bits if the result is subsequently #
8661 #       rounded to double precision. The resu    8661 #       rounded to double precision. The result is provably monotonic   #
8662 #       in double precision.                     8662 #       in double precision.                                            #
8663 #                                                8663 #                                                                       #
8664 # ALGORITHM *********************************    8664 # ALGORITHM *********************************************************** #
8665 #                                                8665 #                                                                       #
8666 #       slog10d:                                 8666 #       slog10d:                                                        #
8667 #                                                8667 #                                                                       #
8668 #       Step 0. If X < 0, create a NaN and ra    8668 #       Step 0. If X < 0, create a NaN and raise the invalid operation  #
8669 #               flag. Otherwise, save FPCR in    8669 #               flag. Otherwise, save FPCR in D1; set FpCR to default.  #
8670 #       Notes:  Default means round-to-neares    8670 #       Notes:  Default means round-to-nearest mode, no floating-point  #
8671 #               traps, and precision control     8671 #               traps, and precision control = double extended.         #
8672 #                                                8672 #                                                                       #
8673 #       Step 1. Call slognd to obtain Y = log    8673 #       Step 1. Call slognd to obtain Y = log(X), the natural log of X. #
8674 #       Notes:  Even if X is denormalized, lo    8674 #       Notes:  Even if X is denormalized, log(X) is always normalized. #
8675 #                                                8675 #                                                                       #
8676 #       Step 2.  Compute log_10(X) = log(X) *    8676 #       Step 2.  Compute log_10(X) = log(X) * (1/log(10)).              #
8677 #            2.1 Restore the user FPCR           8677 #            2.1 Restore the user FPCR                                  #
8678 #            2.2 Return ans := Y * INV_L10.      8678 #            2.2 Return ans := Y * INV_L10.                             #
8679 #                                                8679 #                                                                       #
8680 #       slog10:                                  8680 #       slog10:                                                         #
8681 #                                                8681 #                                                                       #
8682 #       Step 0. If X < 0, create a NaN and ra    8682 #       Step 0. If X < 0, create a NaN and raise the invalid operation  #
8683 #               flag. Otherwise, save FPCR in    8683 #               flag. Otherwise, save FPCR in D1; set FpCR to default.  #
8684 #       Notes:  Default means round-to-neares    8684 #       Notes:  Default means round-to-nearest mode, no floating-point  #
8685 #               traps, and precision control     8685 #               traps, and precision control = double extended.         #
8686 #                                                8686 #                                                                       #
8687 #       Step 1. Call sLogN to obtain Y = log(    8687 #       Step 1. Call sLogN to obtain Y = log(X), the natural log of X.  #
8688 #                                                8688 #                                                                       #
8689 #       Step 2.   Compute log_10(X) = log(X)     8689 #       Step 2.   Compute log_10(X) = log(X) * (1/log(10)).             #
8690 #            2.1  Restore the user FPCR          8690 #            2.1  Restore the user FPCR                                 #
8691 #            2.2  Return ans := Y * INV_L10.     8691 #            2.2  Return ans := Y * INV_L10.                            #
8692 #                                                8692 #                                                                       #
8693 #       sLog2d:                                  8693 #       sLog2d:                                                         #
8694 #                                                8694 #                                                                       #
8695 #       Step 0. If X < 0, create a NaN and ra    8695 #       Step 0. If X < 0, create a NaN and raise the invalid operation  #
8696 #               flag. Otherwise, save FPCR in    8696 #               flag. Otherwise, save FPCR in D1; set FpCR to default.  #
8697 #       Notes:  Default means round-to-neares    8697 #       Notes:  Default means round-to-nearest mode, no floating-point  #
8698 #               traps, and precision control     8698 #               traps, and precision control = double extended.         #
8699 #                                                8699 #                                                                       #
8700 #       Step 1. Call slognd to obtain Y = log    8700 #       Step 1. Call slognd to obtain Y = log(X), the natural log of X. #
8701 #       Notes:  Even if X is denormalized, lo    8701 #       Notes:  Even if X is denormalized, log(X) is always normalized. #
8702 #                                                8702 #                                                                       #
8703 #       Step 2.   Compute log_10(X) = log(X)     8703 #       Step 2.   Compute log_10(X) = log(X) * (1/log(2)).              #
8704 #            2.1  Restore the user FPCR          8704 #            2.1  Restore the user FPCR                                 #
8705 #            2.2  Return ans := Y * INV_L2.      8705 #            2.2  Return ans := Y * INV_L2.                             #
8706 #                                                8706 #                                                                       #
8707 #       sLog2:                                   8707 #       sLog2:                                                          #
8708 #                                                8708 #                                                                       #
8709 #       Step 0. If X < 0, create a NaN and ra    8709 #       Step 0. If X < 0, create a NaN and raise the invalid operation  #
8710 #               flag. Otherwise, save FPCR in    8710 #               flag. Otherwise, save FPCR in D1; set FpCR to default.  #
8711 #       Notes:  Default means round-to-neares    8711 #       Notes:  Default means round-to-nearest mode, no floating-point  #
8712 #               traps, and precision control     8712 #               traps, and precision control = double extended.         #
8713 #                                                8713 #                                                                       #
8714 #       Step 1. If X is not an integer power     8714 #       Step 1. If X is not an integer power of two, i.e., X != 2^k,    #
8715 #               go to Step 3.                    8715 #               go to Step 3.                                           #
8716 #                                                8716 #                                                                       #
8717 #       Step 2.   Return k.                      8717 #       Step 2.   Return k.                                             #
8718 #            2.1  Get integer k, X = 2^k.        8718 #            2.1  Get integer k, X = 2^k.                               #
8719 #            2.2  Restore the user FPCR.         8719 #            2.2  Restore the user FPCR.                                #
8720 #            2.3  Return ans := convert-to-do    8720 #            2.3  Return ans := convert-to-double-extended(k).          #
8721 #                                                8721 #                                                                       #
8722 #       Step 3. Call sLogN to obtain Y = log(    8722 #       Step 3. Call sLogN to obtain Y = log(X), the natural log of X.  #
8723 #                                                8723 #                                                                       #
8724 #       Step 4.   Compute log_2(X) = log(X) *    8724 #       Step 4.   Compute log_2(X) = log(X) * (1/log(2)).               #
8725 #            4.1  Restore the user FPCR          8725 #            4.1  Restore the user FPCR                                 #
8726 #            4.2  Return ans := Y * INV_L2.      8726 #            4.2  Return ans := Y * INV_L2.                             #
8727 #                                                8727 #                                                                       #
8728 #############################################    8728 #########################################################################
8729                                                  8729 
8730 INV_L10:                                         8730 INV_L10:
8731         long            0x3FFD0000,0xDE5BD8A9    8731         long            0x3FFD0000,0xDE5BD8A9,0x37287195,0x00000000
8732                                                  8732 
8733 INV_L2:                                          8733 INV_L2:
8734         long            0x3FFF0000,0xB8AA3B29    8734         long            0x3FFF0000,0xB8AA3B29,0x5C17F0BC,0x00000000
8735                                                  8735 
8736         global          slog10                   8736         global          slog10
8737 #--entry point for Log10(X), X is normalized     8737 #--entry point for Log10(X), X is normalized
8738 slog10:                                          8738 slog10:
8739         fmov.b          &0x1,%fp0                8739         fmov.b          &0x1,%fp0
8740         fcmp.x          %fp0,(%a0)               8740         fcmp.x          %fp0,(%a0)              # if operand == 1,
8741         fbeq.l          ld_pzero                 8741         fbeq.l          ld_pzero                # return an EXACT zero
8742                                                  8742 
8743         mov.l           (%a0),%d1                8743         mov.l           (%a0),%d1
8744         blt.w           invalid                  8744         blt.w           invalid
8745         mov.l           %d0,-(%sp)               8745         mov.l           %d0,-(%sp)
8746         clr.l           %d0                      8746         clr.l           %d0
8747         bsr             slogn                    8747         bsr             slogn                   # log(X), X normal.
8748         fmov.l          (%sp)+,%fpcr             8748         fmov.l          (%sp)+,%fpcr
8749         fmul.x          INV_L10(%pc),%fp0        8749         fmul.x          INV_L10(%pc),%fp0
8750         bra             t_inx2                   8750         bra             t_inx2
8751                                                  8751 
8752         global          slog10d                  8752         global          slog10d
8753 #--entry point for Log10(X), X is denormalize    8753 #--entry point for Log10(X), X is denormalized
8754 slog10d:                                         8754 slog10d:
8755         mov.l           (%a0),%d1                8755         mov.l           (%a0),%d1
8756         blt.w           invalid                  8756         blt.w           invalid
8757         mov.l           %d0,-(%sp)               8757         mov.l           %d0,-(%sp)
8758         clr.l           %d0                      8758         clr.l           %d0
8759         bsr             slognd                   8759         bsr             slognd                  # log(X), X denorm.
8760         fmov.l          (%sp)+,%fpcr             8760         fmov.l          (%sp)+,%fpcr
8761         fmul.x          INV_L10(%pc),%fp0        8761         fmul.x          INV_L10(%pc),%fp0
8762         bra             t_minx2                  8762         bra             t_minx2
8763                                                  8763 
8764         global          slog2                    8764         global          slog2
8765 #--entry point for Log2(X), X is normalized      8765 #--entry point for Log2(X), X is normalized
8766 slog2:                                           8766 slog2:
8767         mov.l           (%a0),%d1                8767         mov.l           (%a0),%d1
8768         blt.w           invalid                  8768         blt.w           invalid
8769                                                  8769 
8770         mov.l           8(%a0),%d1               8770         mov.l           8(%a0),%d1
8771         bne.b           continue                 8771         bne.b           continue                # X is not 2^k
8772                                                  8772 
8773         mov.l           4(%a0),%d1               8773         mov.l           4(%a0),%d1
8774         and.l           &0x7FFFFFFF,%d1          8774         and.l           &0x7FFFFFFF,%d1
8775         bne.b           continue                 8775         bne.b           continue
8776                                                  8776 
8777 #--X = 2^k.                                      8777 #--X = 2^k.
8778         mov.w           (%a0),%d1                8778         mov.w           (%a0),%d1
8779         and.l           &0x00007FFF,%d1          8779         and.l           &0x00007FFF,%d1
8780         sub.l           &0x3FFF,%d1              8780         sub.l           &0x3FFF,%d1
8781         beq.l           ld_pzero                 8781         beq.l           ld_pzero
8782         fmov.l          %d0,%fpcr                8782         fmov.l          %d0,%fpcr
8783         fmov.l          %d1,%fp0                 8783         fmov.l          %d1,%fp0
8784         bra             t_inx2                   8784         bra             t_inx2
8785                                                  8785 
8786 continue:                                        8786 continue:
8787         mov.l           %d0,-(%sp)               8787         mov.l           %d0,-(%sp)
8788         clr.l           %d0                      8788         clr.l           %d0
8789         bsr             slogn                    8789         bsr             slogn                   # log(X), X normal.
8790         fmov.l          (%sp)+,%fpcr             8790         fmov.l          (%sp)+,%fpcr
8791         fmul.x          INV_L2(%pc),%fp0         8791         fmul.x          INV_L2(%pc),%fp0
8792         bra             t_inx2                   8792         bra             t_inx2
8793                                                  8793 
8794 invalid:                                         8794 invalid:
8795         bra             t_operr                  8795         bra             t_operr
8796                                                  8796 
8797         global          slog2d                   8797         global          slog2d
8798 #--entry point for Log2(X), X is denormalized    8798 #--entry point for Log2(X), X is denormalized
8799 slog2d:                                          8799 slog2d:
8800         mov.l           (%a0),%d1                8800         mov.l           (%a0),%d1
8801         blt.w           invalid                  8801         blt.w           invalid
8802         mov.l           %d0,-(%sp)               8802         mov.l           %d0,-(%sp)
8803         clr.l           %d0                      8803         clr.l           %d0
8804         bsr             slognd                   8804         bsr             slognd                  # log(X), X denorm.
8805         fmov.l          (%sp)+,%fpcr             8805         fmov.l          (%sp)+,%fpcr
8806         fmul.x          INV_L2(%pc),%fp0         8806         fmul.x          INV_L2(%pc),%fp0
8807         bra             t_minx2                  8807         bra             t_minx2
8808                                                  8808 
8809 #############################################    8809 #########################################################################
8810 # stwotox():  computes 2**X for a normalized     8810 # stwotox():  computes 2**X for a normalized input                      #
8811 # stwotoxd(): computes 2**X for a denormalize    8811 # stwotoxd(): computes 2**X for a denormalized input                    #
8812 # stentox():  computes 10**X for a normalized    8812 # stentox():  computes 10**X for a normalized input                     #
8813 # stentoxd(): computes 10**X for a denormaliz    8813 # stentoxd(): computes 10**X for a denormalized input                   #
8814 #                                                8814 #                                                                       #
8815 # INPUT *************************************    8815 # INPUT *************************************************************** #
8816 #       a0 = pointer to extended precision in    8816 #       a0 = pointer to extended precision input                        #
8817 #       d0 = round precision,mode                8817 #       d0 = round precision,mode                                       #
8818 #                                                8818 #                                                                       #
8819 # OUTPUT ************************************    8819 # OUTPUT ************************************************************** #
8820 #       fp0 = 2**X or 10**X                      8820 #       fp0 = 2**X or 10**X                                             #
8821 #                                                8821 #                                                                       #
8822 # ACCURACY and MONOTONICITY *****************    8822 # ACCURACY and MONOTONICITY ******************************************* #
8823 #       The returned result is within 2 ulps     8823 #       The returned result is within 2 ulps in 64 significant bit,     #
8824 #       i.e. within 0.5001 ulp to 53 bits if     8824 #       i.e. within 0.5001 ulp to 53 bits if the result is subsequently #
8825 #       rounded to double precision. The resu    8825 #       rounded to double precision. The result is provably monotonic   #
8826 #       in double precision.                     8826 #       in double precision.                                            #
8827 #                                                8827 #                                                                       #
8828 # ALGORITHM *********************************    8828 # ALGORITHM *********************************************************** #
8829 #                                                8829 #                                                                       #
8830 #       twotox                                   8830 #       twotox                                                          #
8831 #       1. If |X| > 16480, go to ExpBig.         8831 #       1. If |X| > 16480, go to ExpBig.                                #
8832 #                                                8832 #                                                                       #
8833 #       2. If |X| < 2**(-70), go to ExpSm.       8833 #       2. If |X| < 2**(-70), go to ExpSm.                              #
8834 #                                                8834 #                                                                       #
8835 #       3. Decompose X as X = N/64 + r where     8835 #       3. Decompose X as X = N/64 + r where |r| <= 1/128. Furthermore  #
8836 #               decompose N as                   8836 #               decompose N as                                          #
8837 #                N = 64(M + M') + j,  j = 0,1    8837 #                N = 64(M + M') + j,  j = 0,1,2,...,63.                 #
8838 #                                                8838 #                                                                       #
8839 #       4. Overwrite r := r * log2. Then         8839 #       4. Overwrite r := r * log2. Then                                #
8840 #               2**X = 2**(M') * 2**(M) * 2**    8840 #               2**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).           #
8841 #               Go to expr to compute that ex    8841 #               Go to expr to compute that expression.                  #
8842 #                                                8842 #                                                                       #
8843 #       tentox                                   8843 #       tentox                                                          #
8844 #       1. If |X| > 16480*log_10(2) (base 10     8844 #       1. If |X| > 16480*log_10(2) (base 10 log of 2), go to ExpBig.   #
8845 #                                                8845 #                                                                       #
8846 #       2. If |X| < 2**(-70), go to ExpSm.       8846 #       2. If |X| < 2**(-70), go to ExpSm.                              #
8847 #                                                8847 #                                                                       #
8848 #       3. Set y := X*log_2(10)*64 (base 2 lo    8848 #       3. Set y := X*log_2(10)*64 (base 2 log of 10). Set              #
8849 #               N := round-to-int(y). Decompo    8849 #               N := round-to-int(y). Decompose N as                    #
8850 #                N = 64(M + M') + j,  j = 0,1    8850 #                N = 64(M + M') + j,  j = 0,1,2,...,63.                 #
8851 #                                                8851 #                                                                       #
8852 #       4. Define r as                           8852 #       4. Define r as                                                  #
8853 #               r := ((X - N*L1)-N*L2) * L10     8853 #               r := ((X - N*L1)-N*L2) * L10                            #
8854 #               where L1, L2 are the leading     8854 #               where L1, L2 are the leading and trailing parts of      #
8855 #               log_10(2)/64 and L10 is the n    8855 #               log_10(2)/64 and L10 is the natural log of 10. Then     #
8856 #               10**X = 2**(M') * 2**(M) * 2*    8856 #               10**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).          #
8857 #               Go to expr to compute that ex    8857 #               Go to expr to compute that expression.                  #
8858 #                                                8858 #                                                                       #
8859 #       expr                                     8859 #       expr                                                            #
8860 #       1. Fetch 2**(j/64) from table as Fact    8860 #       1. Fetch 2**(j/64) from table as Fact1 and Fact2.               #
8861 #                                                8861 #                                                                       #
8862 #       2. Overwrite Fact1 and Fact2 by          8862 #       2. Overwrite Fact1 and Fact2 by                                 #
8863 #               Fact1 := 2**(M) * Fact1          8863 #               Fact1 := 2**(M) * Fact1                                 #
8864 #               Fact2 := 2**(M) * Fact2          8864 #               Fact2 := 2**(M) * Fact2                                 #
8865 #               Thus Fact1 + Fact2 = 2**(M) *    8865 #               Thus Fact1 + Fact2 = 2**(M) * 2**(j/64).                #
8866 #                                                8866 #                                                                       #
8867 #       3. Calculate P where 1 + P approximat    8867 #       3. Calculate P where 1 + P approximates exp(r):                 #
8868 #               P = r + r*r*(A1+r*(A2+...+r*A    8868 #               P = r + r*r*(A1+r*(A2+...+r*A5)).                       #
8869 #                                                8869 #                                                                       #
8870 #       4. Let AdjFact := 2**(M'). Return        8870 #       4. Let AdjFact := 2**(M'). Return                               #
8871 #               AdjFact * ( Fact1 + ((Fact1*P    8871 #               AdjFact * ( Fact1 + ((Fact1*P) + Fact2) ).              #
8872 #               Exit.                            8872 #               Exit.                                                   #
8873 #                                                8873 #                                                                       #
8874 #       ExpBig                                   8874 #       ExpBig                                                          #
8875 #       1. Generate overflow by Huge * Huge i    8875 #       1. Generate overflow by Huge * Huge if X > 0; otherwise,        #
8876 #               generate underflow by Tiny *     8876 #               generate underflow by Tiny * Tiny.                      #
8877 #                                                8877 #                                                                       #
8878 #       ExpSm                                    8878 #       ExpSm                                                           #
8879 #       1. Return 1 + X.                         8879 #       1. Return 1 + X.                                                #
8880 #                                                8880 #                                                                       #
8881 #############################################    8881 #########################################################################
8882                                                  8882 
8883 L2TEN64:                                         8883 L2TEN64:
8884         long            0x406A934F,0x0979A371    8884         long            0x406A934F,0x0979A371   # 64LOG10/LOG2
8885 L10TWO1:                                         8885 L10TWO1:
8886         long            0x3F734413,0x509F8000    8886         long            0x3F734413,0x509F8000   # LOG2/64LOG10
8887                                                  8887 
8888 L10TWO2:                                         8888 L10TWO2:
8889         long            0xBFCD0000,0xC0219DC1    8889         long            0xBFCD0000,0xC0219DC1,0xDA994FD2,0x00000000
8890                                                  8890 
8891 LOG10:  long            0x40000000,0x935D8DDD    8891 LOG10:  long            0x40000000,0x935D8DDD,0xAAA8AC17,0x00000000
8892                                                  8892 
8893 LOG2:   long            0x3FFE0000,0xB17217F7    8893 LOG2:   long            0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
8894                                                  8894 
8895 EXPA5:  long            0x3F56C16D,0x6F7BD0B2    8895 EXPA5:  long            0x3F56C16D,0x6F7BD0B2
8896 EXPA4:  long            0x3F811112,0x302C712C    8896 EXPA4:  long            0x3F811112,0x302C712C
8897 EXPA3:  long            0x3FA55555,0x55554CC1    8897 EXPA3:  long            0x3FA55555,0x55554CC1
8898 EXPA2:  long            0x3FC55555,0x55554A54    8898 EXPA2:  long            0x3FC55555,0x55554A54
8899 EXPA1:  long            0x3FE00000,0x00000000    8899 EXPA1:  long            0x3FE00000,0x00000000,0x00000000,0x00000000
8900                                                  8900 
8901 TEXPTBL:                                         8901 TEXPTBL:
8902         long            0x3FFF0000,0x80000000    8902         long            0x3FFF0000,0x80000000,0x00000000,0x3F738000
8903         long            0x3FFF0000,0x8164D1F3    8903         long            0x3FFF0000,0x8164D1F3,0xBC030773,0x3FBEF7CA
8904         long            0x3FFF0000,0x82CD8698    8904         long            0x3FFF0000,0x82CD8698,0xAC2BA1D7,0x3FBDF8A9
8905         long            0x3FFF0000,0x843A28C3    8905         long            0x3FFF0000,0x843A28C3,0xACDE4046,0x3FBCD7C9
8906         long            0x3FFF0000,0x85AAC367    8906         long            0x3FFF0000,0x85AAC367,0xCC487B15,0xBFBDE8DA
8907         long            0x3FFF0000,0x871F6196    8907         long            0x3FFF0000,0x871F6196,0x9E8D1010,0x3FBDE85C
8908         long            0x3FFF0000,0x88980E80    8908         long            0x3FFF0000,0x88980E80,0x92DA8527,0x3FBEBBF1
8909         long            0x3FFF0000,0x8A14D575    8909         long            0x3FFF0000,0x8A14D575,0x496EFD9A,0x3FBB80CA
8910         long            0x3FFF0000,0x8B95C1E3    8910         long            0x3FFF0000,0x8B95C1E3,0xEA8BD6E7,0xBFBA8373
8911         long            0x3FFF0000,0x8D1ADF5B    8911         long            0x3FFF0000,0x8D1ADF5B,0x7E5BA9E6,0xBFBE9670
8912         long            0x3FFF0000,0x8EA4398B    8912         long            0x3FFF0000,0x8EA4398B,0x45CD53C0,0x3FBDB700
8913         long            0x3FFF0000,0x9031DC43    8913         long            0x3FFF0000,0x9031DC43,0x1466B1DC,0x3FBEEEB0
8914         long            0x3FFF0000,0x91C3D373    8914         long            0x3FFF0000,0x91C3D373,0xAB11C336,0x3FBBFD6D
8915         long            0x3FFF0000,0x935A2B2F    8915         long            0x3FFF0000,0x935A2B2F,0x13E6E92C,0xBFBDB319
8916         long            0x3FFF0000,0x94F4EFA8    8916         long            0x3FFF0000,0x94F4EFA8,0xFEF70961,0x3FBDBA2B
8917         long            0x3FFF0000,0x96942D37    8917         long            0x3FFF0000,0x96942D37,0x20185A00,0x3FBE91D5
8918         long            0x3FFF0000,0x9837F051    8918         long            0x3FFF0000,0x9837F051,0x8DB8A96F,0x3FBE8D5A
8919         long            0x3FFF0000,0x99E04593    8919         long            0x3FFF0000,0x99E04593,0x20B7FA65,0xBFBCDE7B
8920         long            0x3FFF0000,0x9B8D39B9    8920         long            0x3FFF0000,0x9B8D39B9,0xD54E5539,0xBFBEBAAF
8921         long            0x3FFF0000,0x9D3ED9A7    8921         long            0x3FFF0000,0x9D3ED9A7,0x2CFFB751,0xBFBD86DA
8922         long            0x3FFF0000,0x9EF53260    8922         long            0x3FFF0000,0x9EF53260,0x91A111AE,0xBFBEBEDD
8923         long            0x3FFF0000,0xA0B0510F    8923         long            0x3FFF0000,0xA0B0510F,0xB9714FC2,0x3FBCC96E
8924         long            0x3FFF0000,0xA2704303    8924         long            0x3FFF0000,0xA2704303,0x0C496819,0xBFBEC90B
8925         long            0x3FFF0000,0xA43515AE    8925         long            0x3FFF0000,0xA43515AE,0x09E6809E,0x3FBBD1DB
8926         long            0x3FFF0000,0xA5FED6A9    8926         long            0x3FFF0000,0xA5FED6A9,0xB15138EA,0x3FBCE5EB
8927         long            0x3FFF0000,0xA7CD93B4    8927         long            0x3FFF0000,0xA7CD93B4,0xE965356A,0xBFBEC274
8928         long            0x3FFF0000,0xA9A15AB4    8928         long            0x3FFF0000,0xA9A15AB4,0xEA7C0EF8,0x3FBEA83C
8929         long            0x3FFF0000,0xAB7A39B5    8929         long            0x3FFF0000,0xAB7A39B5,0xA93ED337,0x3FBECB00
8930         long            0x3FFF0000,0xAD583EEA    8930         long            0x3FFF0000,0xAD583EEA,0x42A14AC6,0x3FBE9301
8931         long            0x3FFF0000,0xAF3B78AD    8931         long            0x3FFF0000,0xAF3B78AD,0x690A4375,0xBFBD8367
8932         long            0x3FFF0000,0xB123F581    8932         long            0x3FFF0000,0xB123F581,0xD2AC2590,0xBFBEF05F
8933         long            0x3FFF0000,0xB311C412    8933         long            0x3FFF0000,0xB311C412,0xA9112489,0x3FBDFB3C
8934         long            0x3FFF0000,0xB504F333    8934         long            0x3FFF0000,0xB504F333,0xF9DE6484,0x3FBEB2FB
8935         long            0x3FFF0000,0xB6FD91E3    8935         long            0x3FFF0000,0xB6FD91E3,0x28D17791,0x3FBAE2CB
8936         long            0x3FFF0000,0xB8FBAF47    8936         long            0x3FFF0000,0xB8FBAF47,0x62FB9EE9,0x3FBCDC3C
8937         long            0x3FFF0000,0xBAFF5AB2    8937         long            0x3FFF0000,0xBAFF5AB2,0x133E45FB,0x3FBEE9AA
8938         long            0x3FFF0000,0xBD08A39F    8938         long            0x3FFF0000,0xBD08A39F,0x580C36BF,0xBFBEAEFD
8939         long            0x3FFF0000,0xBF1799B6    8939         long            0x3FFF0000,0xBF1799B6,0x7A731083,0xBFBCBF51
8940         long            0x3FFF0000,0xC12C4CCA    8940         long            0x3FFF0000,0xC12C4CCA,0x66709456,0x3FBEF88A
8941         long            0x3FFF0000,0xC346CCDA    8941         long            0x3FFF0000,0xC346CCDA,0x24976407,0x3FBD83B2
8942         long            0x3FFF0000,0xC5672A11    8942         long            0x3FFF0000,0xC5672A11,0x5506DADD,0x3FBDF8AB
8943         long            0x3FFF0000,0xC78D74C8    8943         long            0x3FFF0000,0xC78D74C8,0xABB9B15D,0xBFBDFB17
8944         long            0x3FFF0000,0xC9B9BD86    8944         long            0x3FFF0000,0xC9B9BD86,0x6E2F27A3,0xBFBEFE3C
8945         long            0x3FFF0000,0xCBEC14FE    8945         long            0x3FFF0000,0xCBEC14FE,0xF2727C5D,0xBFBBB6F8
8946         long            0x3FFF0000,0xCE248C15    8946         long            0x3FFF0000,0xCE248C15,0x1F8480E4,0xBFBCEE53
8947         long            0x3FFF0000,0xD06333DA    8947         long            0x3FFF0000,0xD06333DA,0xEF2B2595,0xBFBDA4AE
8948         long            0x3FFF0000,0xD2A81D91    8948         long            0x3FFF0000,0xD2A81D91,0xF12AE45A,0x3FBC9124
8949         long            0x3FFF0000,0xD4F35AAB    8949         long            0x3FFF0000,0xD4F35AAB,0xCFEDFA1F,0x3FBEB243
8950         long            0x3FFF0000,0xD744FCCA    8950         long            0x3FFF0000,0xD744FCCA,0xD69D6AF4,0x3FBDE69A
8951         long            0x3FFF0000,0xD99D15C2    8951         long            0x3FFF0000,0xD99D15C2,0x78AFD7B6,0xBFB8BC61
8952         long            0x3FFF0000,0xDBFBB797    8952         long            0x3FFF0000,0xDBFBB797,0xDAF23755,0x3FBDF610
8953         long            0x3FFF0000,0xDE60F482    8953         long            0x3FFF0000,0xDE60F482,0x5E0E9124,0xBFBD8BE1
8954         long            0x3FFF0000,0xE0CCDEEC    8954         long            0x3FFF0000,0xE0CCDEEC,0x2A94E111,0x3FBACB12
8955         long            0x3FFF0000,0xE33F8972    8955         long            0x3FFF0000,0xE33F8972,0xBE8A5A51,0x3FBB9BFE
8956         long            0x3FFF0000,0xE5B906E7    8956         long            0x3FFF0000,0xE5B906E7,0x7C8348A8,0x3FBCF2F4
8957         long            0x3FFF0000,0xE8396A50    8957         long            0x3FFF0000,0xE8396A50,0x3C4BDC68,0x3FBEF22F
8958         long            0x3FFF0000,0xEAC0C6E7    8958         long            0x3FFF0000,0xEAC0C6E7,0xDD24392F,0xBFBDBF4A
8959         long            0x3FFF0000,0xED4F301E    8959         long            0x3FFF0000,0xED4F301E,0xD9942B84,0x3FBEC01A
8960         long            0x3FFF0000,0xEFE4B99B    8960         long            0x3FFF0000,0xEFE4B99B,0xDCDAF5CB,0x3FBE8CAC
8961         long            0x3FFF0000,0xF281773C    8961         long            0x3FFF0000,0xF281773C,0x59FFB13A,0xBFBCBB3F
8962         long            0x3FFF0000,0xF5257D15    8962         long            0x3FFF0000,0xF5257D15,0x2486CC2C,0x3FBEF73A
8963         long            0x3FFF0000,0xF7D0DF73    8963         long            0x3FFF0000,0xF7D0DF73,0x0AD13BB9,0xBFB8B795
8964         long            0x3FFF0000,0xFA83B2DB    8964         long            0x3FFF0000,0xFA83B2DB,0x722A033A,0x3FBEF84B
8965         long            0x3FFF0000,0xFD3E0C0C    8965         long            0x3FFF0000,0xFD3E0C0C,0xF486C175,0xBFBEF581
8966                                                  8966 
8967         set             INT,L_SCR1               8967         set             INT,L_SCR1
8968                                                  8968 
8969         set             X,FP_SCR0                8969         set             X,FP_SCR0
8970         set             XDCARE,X+2               8970         set             XDCARE,X+2
8971         set             XFRAC,X+4                8971         set             XFRAC,X+4
8972                                                  8972 
8973         set             ADJFACT,FP_SCR0          8973         set             ADJFACT,FP_SCR0
8974                                                  8974 
8975         set             FACT1,FP_SCR0            8975         set             FACT1,FP_SCR0
8976         set             FACT1HI,FACT1+4          8976         set             FACT1HI,FACT1+4
8977         set             FACT1LOW,FACT1+8         8977         set             FACT1LOW,FACT1+8
8978                                                  8978 
8979         set             FACT2,FP_SCR1            8979         set             FACT2,FP_SCR1
8980         set             FACT2HI,FACT2+4          8980         set             FACT2HI,FACT2+4
8981         set             FACT2LOW,FACT2+8         8981         set             FACT2LOW,FACT2+8
8982                                                  8982 
8983         global          stwotox                  8983         global          stwotox
8984 #--ENTRY POINT FOR 2**(X), HERE X IS FINITE,     8984 #--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
8985 stwotox:                                         8985 stwotox:
8986         fmovm.x         (%a0),&0x80              8986         fmovm.x         (%a0),&0x80             # LOAD INPUT
8987                                                  8987 
8988         mov.l           (%a0),%d1                8988         mov.l           (%a0),%d1
8989         mov.w           4(%a0),%d1               8989         mov.w           4(%a0),%d1
8990         fmov.x          %fp0,X(%a6)              8990         fmov.x          %fp0,X(%a6)
8991         and.l           &0x7FFFFFFF,%d1          8991         and.l           &0x7FFFFFFF,%d1
8992                                                  8992 
8993         cmp.l           %d1,&0x3FB98000          8993         cmp.l           %d1,&0x3FB98000         # |X| >= 2**(-70)?
8994         bge.b           TWOOK1                   8994         bge.b           TWOOK1
8995         bra.w           EXPBORS                  8995         bra.w           EXPBORS
8996                                                  8996 
8997 TWOOK1:                                          8997 TWOOK1:
8998         cmp.l           %d1,&0x400D80C0          8998         cmp.l           %d1,&0x400D80C0         # |X| > 16480?
8999         ble.b           TWOMAIN                  8999         ble.b           TWOMAIN
9000         bra.w           EXPBORS                  9000         bra.w           EXPBORS
9001                                                  9001 
9002 TWOMAIN:                                         9002 TWOMAIN:
9003 #--USUAL CASE, 2^(-70) <= |X| <= 16480           9003 #--USUAL CASE, 2^(-70) <= |X| <= 16480
9004                                                  9004 
9005         fmov.x          %fp0,%fp1                9005         fmov.x          %fp0,%fp1
9006         fmul.s          &0x42800000,%fp1         9006         fmul.s          &0x42800000,%fp1        # 64 * X
9007         fmov.l          %fp1,INT(%a6)            9007         fmov.l          %fp1,INT(%a6)           # N = ROUND-TO-INT(64 X)
9008         mov.l           %d2,-(%sp)               9008         mov.l           %d2,-(%sp)
9009         lea             TEXPTBL(%pc),%a1         9009         lea             TEXPTBL(%pc),%a1        # LOAD ADDRESS OF TABLE OF 2^(J/64)
9010         fmov.l          INT(%a6),%fp1            9010         fmov.l          INT(%a6),%fp1           # N --> FLOATING FMT
9011         mov.l           INT(%a6),%d1             9011         mov.l           INT(%a6),%d1
9012         mov.l           %d1,%d2                  9012         mov.l           %d1,%d2
9013         and.l           &0x3F,%d1                9013         and.l           &0x3F,%d1               # D0 IS J
9014         asl.l           &4,%d1                   9014         asl.l           &4,%d1                  # DISPLACEMENT FOR 2^(J/64)
9015         add.l           %d1,%a1                  9015         add.l           %d1,%a1                 # ADDRESS FOR 2^(J/64)
9016         asr.l           &6,%d2                   9016         asr.l           &6,%d2                  # d2 IS L, N = 64L + J
9017         mov.l           %d2,%d1                  9017         mov.l           %d2,%d1
9018         asr.l           &1,%d1                   9018         asr.l           &1,%d1                  # D0 IS M
9019         sub.l           %d1,%d2                  9019         sub.l           %d1,%d2                 # d2 IS M', N = 64(M+M') + J
9020         add.l           &0x3FFF,%d2              9020         add.l           &0x3FFF,%d2
9021                                                  9021 
9022 #--SUMMARY: a1 IS ADDRESS FOR THE LEADING POR    9022 #--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
9023 #--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT     9023 #--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
9024 #--ADJFACT = 2^(M').                             9024 #--ADJFACT = 2^(M').
9025 #--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR    9025 #--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
9026                                                  9026 
9027         fmovm.x         &0x0c,-(%sp)             9027         fmovm.x         &0x0c,-(%sp)            # save fp2/fp3
9028                                                  9028 
9029         fmul.s          &0x3C800000,%fp1         9029         fmul.s          &0x3C800000,%fp1        # (1/64)*N
9030         mov.l           (%a1)+,FACT1(%a6)        9030         mov.l           (%a1)+,FACT1(%a6)
9031         mov.l           (%a1)+,FACT1HI(%a6)      9031         mov.l           (%a1)+,FACT1HI(%a6)
9032         mov.l           (%a1)+,FACT1LOW(%a6)     9032         mov.l           (%a1)+,FACT1LOW(%a6)
9033         mov.w           (%a1)+,FACT2(%a6)        9033         mov.w           (%a1)+,FACT2(%a6)
9034                                                  9034 
9035         fsub.x          %fp1,%fp0                9035         fsub.x          %fp1,%fp0               # X - (1/64)*INT(64 X)
9036                                                  9036 
9037         mov.w           (%a1)+,FACT2HI(%a6)      9037         mov.w           (%a1)+,FACT2HI(%a6)
9038         clr.w           FACT2HI+2(%a6)           9038         clr.w           FACT2HI+2(%a6)
9039         clr.l           FACT2LOW(%a6)            9039         clr.l           FACT2LOW(%a6)
9040         add.w           %d1,FACT1(%a6)           9040         add.w           %d1,FACT1(%a6)
9041         fmul.x          LOG2(%pc),%fp0           9041         fmul.x          LOG2(%pc),%fp0          # FP0 IS R
9042         add.w           %d1,FACT2(%a6)           9042         add.w           %d1,FACT2(%a6)
9043                                                  9043 
9044         bra.w           expr                     9044         bra.w           expr
9045                                                  9045 
9046 EXPBORS:                                         9046 EXPBORS:
9047 #--FPCR, D0 SAVED                                9047 #--FPCR, D0 SAVED
9048         cmp.l           %d1,&0x3FFF8000          9048         cmp.l           %d1,&0x3FFF8000
9049         bgt.b           TEXPBIG                  9049         bgt.b           TEXPBIG
9050                                                  9050 
9051 #--|X| IS SMALL, RETURN 1 + X                    9051 #--|X| IS SMALL, RETURN 1 + X
9052                                                  9052 
9053         fmov.l          %d0,%fpcr                9053         fmov.l          %d0,%fpcr               # restore users round prec,mode
9054         fadd.s          &0x3F800000,%fp0         9054         fadd.s          &0x3F800000,%fp0        # RETURN 1 + X
9055         bra             t_pinx2                  9055         bra             t_pinx2
9056                                                  9056 
9057 TEXPBIG:                                         9057 TEXPBIG:
9058 #--|X| IS LARGE, GENERATE OVERFLOW IF X > 0;     9058 #--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; ELSE GENERATE UNDERFLOW
9059 #--REGISTERS SAVE SO FAR ARE FPCR AND  D0        9059 #--REGISTERS SAVE SO FAR ARE FPCR AND  D0
9060         mov.l           X(%a6),%d1               9060         mov.l           X(%a6),%d1
9061         cmp.l           %d1,&0                   9061         cmp.l           %d1,&0
9062         blt.b           EXPNEG                   9062         blt.b           EXPNEG
9063                                                  9063 
9064         bra             t_ovfl2                  9064         bra             t_ovfl2                 # t_ovfl expects positive value
9065                                                  9065 
9066 EXPNEG:                                          9066 EXPNEG:
9067         bra             t_unfl2                  9067         bra             t_unfl2                 # t_unfl expects positive value
9068                                                  9068 
9069         global          stwotoxd                 9069         global          stwotoxd
9070 stwotoxd:                                        9070 stwotoxd:
9071 #--ENTRY POINT FOR 2**(X) FOR DENORMALIZED AR    9071 #--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT
9072                                                  9072 
9073         fmov.l          %d0,%fpcr                9073         fmov.l          %d0,%fpcr               # set user's rounding mode/precision
9074         fmov.s          &0x3F800000,%fp0         9074         fmov.s          &0x3F800000,%fp0        # RETURN 1 + X
9075         mov.l           (%a0),%d1                9075         mov.l           (%a0),%d1
9076         or.l            &0x00800001,%d1          9076         or.l            &0x00800001,%d1
9077         fadd.s          %d1,%fp0                 9077         fadd.s          %d1,%fp0
9078         bra             t_pinx2                  9078         bra             t_pinx2
9079                                                  9079 
9080         global          stentox                  9080         global          stentox
9081 #--ENTRY POINT FOR 10**(X), HERE X IS FINITE,    9081 #--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
9082 stentox:                                         9082 stentox:
9083         fmovm.x         (%a0),&0x80              9083         fmovm.x         (%a0),&0x80             # LOAD INPUT
9084                                                  9084 
9085         mov.l           (%a0),%d1                9085         mov.l           (%a0),%d1
9086         mov.w           4(%a0),%d1               9086         mov.w           4(%a0),%d1
9087         fmov.x          %fp0,X(%a6)              9087         fmov.x          %fp0,X(%a6)
9088         and.l           &0x7FFFFFFF,%d1          9088         and.l           &0x7FFFFFFF,%d1
9089                                                  9089 
9090         cmp.l           %d1,&0x3FB98000          9090         cmp.l           %d1,&0x3FB98000         # |X| >= 2**(-70)?
9091         bge.b           TENOK1                   9091         bge.b           TENOK1
9092         bra.w           EXPBORS                  9092         bra.w           EXPBORS
9093                                                  9093 
9094 TENOK1:                                          9094 TENOK1:
9095         cmp.l           %d1,&0x400B9B07          9095         cmp.l           %d1,&0x400B9B07         # |X| <= 16480*log2/log10 ?
9096         ble.b           TENMAIN                  9096         ble.b           TENMAIN
9097         bra.w           EXPBORS                  9097         bra.w           EXPBORS
9098                                                  9098 
9099 TENMAIN:                                         9099 TENMAIN:
9100 #--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2     9100 #--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10
9101                                                  9101 
9102         fmov.x          %fp0,%fp1                9102         fmov.x          %fp0,%fp1
9103         fmul.d          L2TEN64(%pc),%fp1        9103         fmul.d          L2TEN64(%pc),%fp1       # X*64*LOG10/LOG2
9104         fmov.l          %fp1,INT(%a6)            9104         fmov.l          %fp1,INT(%a6)           # N=INT(X*64*LOG10/LOG2)
9105         mov.l           %d2,-(%sp)               9105         mov.l           %d2,-(%sp)
9106         lea             TEXPTBL(%pc),%a1         9106         lea             TEXPTBL(%pc),%a1        # LOAD ADDRESS OF TABLE OF 2^(J/64)
9107         fmov.l          INT(%a6),%fp1            9107         fmov.l          INT(%a6),%fp1           # N --> FLOATING FMT
9108         mov.l           INT(%a6),%d1             9108         mov.l           INT(%a6),%d1
9109         mov.l           %d1,%d2                  9109         mov.l           %d1,%d2
9110         and.l           &0x3F,%d1                9110         and.l           &0x3F,%d1               # D0 IS J
9111         asl.l           &4,%d1                   9111         asl.l           &4,%d1                  # DISPLACEMENT FOR 2^(J/64)
9112         add.l           %d1,%a1                  9112         add.l           %d1,%a1                 # ADDRESS FOR 2^(J/64)
9113         asr.l           &6,%d2                   9113         asr.l           &6,%d2                  # d2 IS L, N = 64L + J
9114         mov.l           %d2,%d1                  9114         mov.l           %d2,%d1
9115         asr.l           &1,%d1                   9115         asr.l           &1,%d1                  # D0 IS M
9116         sub.l           %d1,%d2                  9116         sub.l           %d1,%d2                 # d2 IS M', N = 64(M+M') + J
9117         add.l           &0x3FFF,%d2              9117         add.l           &0x3FFF,%d2
9118                                                  9118 
9119 #--SUMMARY: a1 IS ADDRESS FOR THE LEADING POR    9119 #--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
9120 #--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT     9120 #--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
9121 #--ADJFACT = 2^(M').                             9121 #--ADJFACT = 2^(M').
9122 #--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR    9122 #--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
9123         fmovm.x         &0x0c,-(%sp)             9123         fmovm.x         &0x0c,-(%sp)            # save fp2/fp3
9124                                                  9124 
9125         fmov.x          %fp1,%fp2                9125         fmov.x          %fp1,%fp2
9126                                                  9126 
9127         fmul.d          L10TWO1(%pc),%fp1        9127         fmul.d          L10TWO1(%pc),%fp1       # N*(LOG2/64LOG10)_LEAD
9128         mov.l           (%a1)+,FACT1(%a6)        9128         mov.l           (%a1)+,FACT1(%a6)
9129                                                  9129 
9130         fmul.x          L10TWO2(%pc),%fp2        9130         fmul.x          L10TWO2(%pc),%fp2       # N*(LOG2/64LOG10)_TRAIL
9131                                                  9131 
9132         mov.l           (%a1)+,FACT1HI(%a6)      9132         mov.l           (%a1)+,FACT1HI(%a6)
9133         mov.l           (%a1)+,FACT1LOW(%a6)     9133         mov.l           (%a1)+,FACT1LOW(%a6)
9134         fsub.x          %fp1,%fp0                9134         fsub.x          %fp1,%fp0               # X - N L_LEAD
9135         mov.w           (%a1)+,FACT2(%a6)        9135         mov.w           (%a1)+,FACT2(%a6)
9136                                                  9136 
9137         fsub.x          %fp2,%fp0                9137         fsub.x          %fp2,%fp0               # X - N L_TRAIL
9138                                                  9138 
9139         mov.w           (%a1)+,FACT2HI(%a6)      9139         mov.w           (%a1)+,FACT2HI(%a6)
9140         clr.w           FACT2HI+2(%a6)           9140         clr.w           FACT2HI+2(%a6)
9141         clr.l           FACT2LOW(%a6)            9141         clr.l           FACT2LOW(%a6)
9142                                                  9142 
9143         fmul.x          LOG10(%pc),%fp0          9143         fmul.x          LOG10(%pc),%fp0         # FP0 IS R
9144         add.w           %d1,FACT1(%a6)           9144         add.w           %d1,FACT1(%a6)
9145         add.w           %d1,FACT2(%a6)           9145         add.w           %d1,FACT2(%a6)
9146                                                  9146 
9147 expr:                                            9147 expr:
9148 #--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN    9148 #--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN.
9149 #--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 =     9149 #--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64).
9150 #--FP0 IS R. THE FOLLOWING CODE COMPUTES         9150 #--FP0 IS R. THE FOLLOWING CODE COMPUTES
9151 #--     2**(M'+M) * 2**(J/64) * EXP(R)           9151 #--     2**(M'+M) * 2**(J/64) * EXP(R)
9152                                                  9152 
9153         fmov.x          %fp0,%fp1                9153         fmov.x          %fp0,%fp1
9154         fmul.x          %fp1,%fp1                9154         fmul.x          %fp1,%fp1               # FP1 IS S = R*R
9155                                                  9155 
9156         fmov.d          EXPA5(%pc),%fp2          9156         fmov.d          EXPA5(%pc),%fp2         # FP2 IS A5
9157         fmov.d          EXPA4(%pc),%fp3          9157         fmov.d          EXPA4(%pc),%fp3         # FP3 IS A4
9158                                                  9158 
9159         fmul.x          %fp1,%fp2                9159         fmul.x          %fp1,%fp2               # FP2 IS S*A5
9160         fmul.x          %fp1,%fp3                9160         fmul.x          %fp1,%fp3               # FP3 IS S*A4
9161                                                  9161 
9162         fadd.d          EXPA3(%pc),%fp2          9162         fadd.d          EXPA3(%pc),%fp2         # FP2 IS A3+S*A5
9163         fadd.d          EXPA2(%pc),%fp3          9163         fadd.d          EXPA2(%pc),%fp3         # FP3 IS A2+S*A4
9164                                                  9164 
9165         fmul.x          %fp1,%fp2                9165         fmul.x          %fp1,%fp2               # FP2 IS S*(A3+S*A5)
9166         fmul.x          %fp1,%fp3                9166         fmul.x          %fp1,%fp3               # FP3 IS S*(A2+S*A4)
9167                                                  9167 
9168         fadd.d          EXPA1(%pc),%fp2          9168         fadd.d          EXPA1(%pc),%fp2         # FP2 IS A1+S*(A3+S*A5)
9169         fmul.x          %fp0,%fp3                9169         fmul.x          %fp0,%fp3               # FP3 IS R*S*(A2+S*A4)
9170                                                  9170 
9171         fmul.x          %fp1,%fp2                9171         fmul.x          %fp1,%fp2               # FP2 IS S*(A1+S*(A3+S*A5))
9172         fadd.x          %fp3,%fp0                9172         fadd.x          %fp3,%fp0               # FP0 IS R+R*S*(A2+S*A4)
9173         fadd.x          %fp2,%fp0                9173         fadd.x          %fp2,%fp0               # FP0 IS EXP(R) - 1
9174                                                  9174 
9175         fmovm.x         (%sp)+,&0x30             9175         fmovm.x         (%sp)+,&0x30            # restore fp2/fp3
9176                                                  9176 
9177 #--FINAL RECONSTRUCTION PROCESS                  9177 #--FINAL RECONSTRUCTION PROCESS
9178 #--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(    9178 #--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1)  -  (1 OR 0)
9179                                                  9179 
9180         fmul.x          FACT1(%a6),%fp0          9180         fmul.x          FACT1(%a6),%fp0
9181         fadd.x          FACT2(%a6),%fp0          9181         fadd.x          FACT2(%a6),%fp0
9182         fadd.x          FACT1(%a6),%fp0          9182         fadd.x          FACT1(%a6),%fp0
9183                                                  9183 
9184         fmov.l          %d0,%fpcr                9184         fmov.l          %d0,%fpcr               # restore users round prec,mode
9185         mov.w           %d2,ADJFACT(%a6)         9185         mov.w           %d2,ADJFACT(%a6)        # INSERT EXPONENT
9186         mov.l           (%sp)+,%d2               9186         mov.l           (%sp)+,%d2
9187         mov.l           &0x80000000,ADJFACT+4    9187         mov.l           &0x80000000,ADJFACT+4(%a6)
9188         clr.l           ADJFACT+8(%a6)           9188         clr.l           ADJFACT+8(%a6)
9189         mov.b           &FMUL_OP,%d1             9189         mov.b           &FMUL_OP,%d1            # last inst is MUL
9190         fmul.x          ADJFACT(%a6),%fp0        9190         fmul.x          ADJFACT(%a6),%fp0       # FINAL ADJUSTMENT
9191         bra             t_catch                  9191         bra             t_catch
9192                                                  9192 
9193         global          stentoxd                 9193         global          stentoxd
9194 stentoxd:                                        9194 stentoxd:
9195 #--ENTRY POINT FOR 10**(X) FOR DENORMALIZED A    9195 #--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT
9196                                                  9196 
9197         fmov.l          %d0,%fpcr                9197         fmov.l          %d0,%fpcr               # set user's rounding mode/precision
9198         fmov.s          &0x3F800000,%fp0         9198         fmov.s          &0x3F800000,%fp0        # RETURN 1 + X
9199         mov.l           (%a0),%d1                9199         mov.l           (%a0),%d1
9200         or.l            &0x00800001,%d1          9200         or.l            &0x00800001,%d1
9201         fadd.s          %d1,%fp0                 9201         fadd.s          %d1,%fp0
9202         bra             t_pinx2                  9202         bra             t_pinx2
9203                                                  9203 
9204 #############################################    9204 #########################################################################
9205 # sscale(): computes the destination operand     9205 # sscale(): computes the destination operand scaled by the source       #
9206 #           operand. If the absoulute value o    9206 #           operand. If the absoulute value of the source operand is    #
9207 #           >= 2^14, an overflow or underflow    9207 #           >= 2^14, an overflow or underflow is returned.              #
9208 #                                                9208 #                                                                       #
9209 # INPUT *************************************    9209 # INPUT *************************************************************** #
9210 #       a0  = pointer to double-extended sour    9210 #       a0  = pointer to double-extended source operand X               #
9211 #       a1  = pointer to double-extended dest    9211 #       a1  = pointer to double-extended destination operand Y          #
9212 #                                                9212 #                                                                       #
9213 # OUTPUT ************************************    9213 # OUTPUT ************************************************************** #
9214 #       fp0 =  scale(X,Y)                        9214 #       fp0 =  scale(X,Y)                                               #
9215 #                                                9215 #                                                                       #
9216 #############################################    9216 #########################################################################
9217                                                  9217 
9218 set     SIGN,           L_SCR1                   9218 set     SIGN,           L_SCR1
9219                                                  9219 
9220         global          sscale                   9220         global          sscale
9221 sscale:                                          9221 sscale:
9222         mov.l           %d0,-(%sp)               9222         mov.l           %d0,-(%sp)              # store off ctrl bits for now
9223                                                  9223 
9224         mov.w           DST_EX(%a1),%d1          9224         mov.w           DST_EX(%a1),%d1         # get dst exponent
9225         smi.b           SIGN(%a6)                9225         smi.b           SIGN(%a6)               # use SIGN to hold dst sign
9226         andi.l          &0x00007fff,%d1          9226         andi.l          &0x00007fff,%d1         # strip sign from dst exp
9227                                                  9227 
9228         mov.w           SRC_EX(%a0),%d0          9228         mov.w           SRC_EX(%a0),%d0         # check src bounds
9229         andi.w          &0x7fff,%d0              9229         andi.w          &0x7fff,%d0             # clr src sign bit
9230         cmpi.w          %d0,&0x3fff              9230         cmpi.w          %d0,&0x3fff             # is src ~ ZERO?
9231         blt.w           src_small                9231         blt.w           src_small               # yes
9232         cmpi.w          %d0,&0x400c              9232         cmpi.w          %d0,&0x400c             # no; is src too big?
9233         bgt.w           src_out                  9233         bgt.w           src_out                 # yes
9234                                                  9234 
9235 #                                                9235 #
9236 # Source is within 2^14 range.                   9236 # Source is within 2^14 range.
9237 #                                                9237 #
9238 src_ok:                                          9238 src_ok:
9239         fintrz.x        SRC(%a0),%fp0            9239         fintrz.x        SRC(%a0),%fp0           # calc int of src
9240         fmov.l          %fp0,%d0                 9240         fmov.l          %fp0,%d0                # int src to d0
9241 # don't want any accrued bits from the fintrz    9241 # don't want any accrued bits from the fintrz showing up later since
9242 # we may need to read the fpsr for the last f    9242 # we may need to read the fpsr for the last fp op in t_catch2().
9243         fmov.l          &0x0,%fpsr               9243         fmov.l          &0x0,%fpsr
9244                                                  9244 
9245         tst.b           DST_HI(%a1)              9245         tst.b           DST_HI(%a1)             # is dst denormalized?
9246         bmi.b           sok_norm                 9246         bmi.b           sok_norm
9247                                                  9247 
9248 # the dst is a DENORM. normalize the DENORM a    9248 # the dst is a DENORM. normalize the DENORM and add the adjustment to
9249 # the src value. then, jump to the norm part     9249 # the src value. then, jump to the norm part of the routine.
9250 sok_dnrm:                                        9250 sok_dnrm:
9251         mov.l           %d0,-(%sp)               9251         mov.l           %d0,-(%sp)              # save src for now
9252                                                  9252 
9253         mov.w           DST_EX(%a1),FP_SCR0_E    9253         mov.w           DST_EX(%a1),FP_SCR0_EX(%a6) # make a copy
9254         mov.l           DST_HI(%a1),FP_SCR0_H    9254         mov.l           DST_HI(%a1),FP_SCR0_HI(%a6)
9255         mov.l           DST_LO(%a1),FP_SCR0_L    9255         mov.l           DST_LO(%a1),FP_SCR0_LO(%a6)
9256                                                  9256 
9257         lea             FP_SCR0(%a6),%a0         9257         lea             FP_SCR0(%a6),%a0        # pass ptr to DENORM
9258         bsr.l           norm                     9258         bsr.l           norm                    # normalize the DENORM
9259         neg.l           %d0                      9259         neg.l           %d0
9260         add.l           (%sp)+,%d0               9260         add.l           (%sp)+,%d0              # add adjustment to src
9261                                                  9261 
9262         fmovm.x         FP_SCR0(%a6),&0x80       9262         fmovm.x         FP_SCR0(%a6),&0x80      # load normalized DENORM
9263                                                  9263 
9264         cmpi.w          %d0,&-0x3fff             9264         cmpi.w          %d0,&-0x3fff            # is the shft amt really low?
9265         bge.b           sok_norm2                9265         bge.b           sok_norm2               # thank goodness no
9266                                                  9266 
9267 # the multiply factor that we're trying to cr    9267 # the multiply factor that we're trying to create should be a denorm
9268 # for the multiply to work. therefore, we're     9268 # for the multiply to work. therefore, we're going to actually do a
9269 # multiply with a denorm which will cause an     9269 # multiply with a denorm which will cause an unimplemented data type
9270 # exception to be put into the machine which     9270 # exception to be put into the machine which will be caught and corrected
9271 # later. we don't do this with the DENORMs ab    9271 # later. we don't do this with the DENORMs above because this method
9272 # is slower. but, don't fret, I don't see it     9272 # is slower. but, don't fret, I don't see it being used much either.
9273         fmov.l          (%sp)+,%fpcr             9273         fmov.l          (%sp)+,%fpcr            # restore user fpcr
9274         mov.l           &0x80000000,%d1          9274         mov.l           &0x80000000,%d1         # load normalized mantissa
9275         subi.l          &-0x3fff,%d0             9275         subi.l          &-0x3fff,%d0            # how many should we shift?
9276         neg.l           %d0                      9276         neg.l           %d0                     # make it positive
9277         cmpi.b          %d0,&0x20                9277         cmpi.b          %d0,&0x20               # is it > 32?
9278         bge.b           sok_dnrm_32              9278         bge.b           sok_dnrm_32             # yes
9279         lsr.l           %d0,%d1                  9279         lsr.l           %d0,%d1                 # no; bit stays in upper lw
9280         clr.l           -(%sp)                   9280         clr.l           -(%sp)                  # insert zero low mantissa
9281         mov.l           %d1,-(%sp)               9281         mov.l           %d1,-(%sp)              # insert new high mantissa
9282         clr.l           -(%sp)                   9282         clr.l           -(%sp)                  # make zero exponent
9283         bra.b           sok_norm_cont            9283         bra.b           sok_norm_cont
9284 sok_dnrm_32:                                     9284 sok_dnrm_32:
9285         subi.b          &0x20,%d0                9285         subi.b          &0x20,%d0               # get shift count
9286         lsr.l           %d0,%d1                  9286         lsr.l           %d0,%d1                 # make low mantissa longword
9287         mov.l           %d1,-(%sp)               9287         mov.l           %d1,-(%sp)              # insert new low mantissa
9288         clr.l           -(%sp)                   9288         clr.l           -(%sp)                  # insert zero high mantissa
9289         clr.l           -(%sp)                   9289         clr.l           -(%sp)                  # make zero exponent
9290         bra.b           sok_norm_cont            9290         bra.b           sok_norm_cont
9291                                                  9291 
9292 # the src will force the dst to a DENORM valu    9292 # the src will force the dst to a DENORM value or worse. so, let's
9293 # create an fp multiply that will create the     9293 # create an fp multiply that will create the result.
9294 sok_norm:                                        9294 sok_norm:
9295         fmovm.x         DST(%a1),&0x80           9295         fmovm.x         DST(%a1),&0x80          # load fp0 with normalized src
9296 sok_norm2:                                       9296 sok_norm2:
9297         fmov.l          (%sp)+,%fpcr             9297         fmov.l          (%sp)+,%fpcr            # restore user fpcr
9298                                                  9298 
9299         addi.w          &0x3fff,%d0              9299         addi.w          &0x3fff,%d0             # turn src amt into exp value
9300         swap            %d0                      9300         swap            %d0                     # put exponent in high word
9301         clr.l           -(%sp)                   9301         clr.l           -(%sp)                  # insert new exponent
9302         mov.l           &0x80000000,-(%sp)       9302         mov.l           &0x80000000,-(%sp)      # insert new high mantissa
9303         mov.l           %d0,-(%sp)               9303         mov.l           %d0,-(%sp)              # insert new lo mantissa
9304                                                  9304 
9305 sok_norm_cont:                                   9305 sok_norm_cont:
9306         fmov.l          %fpcr,%d0                9306         fmov.l          %fpcr,%d0               # d0 needs fpcr for t_catch2
9307         mov.b           &FMUL_OP,%d1             9307         mov.b           &FMUL_OP,%d1            # last inst is MUL
9308         fmul.x          (%sp)+,%fp0              9308         fmul.x          (%sp)+,%fp0             # do the multiply
9309         bra             t_catch2                 9309         bra             t_catch2                # catch any exceptions
9310                                                  9310 
9311 #                                                9311 #
9312 # Source is outside of 2^14 range.  Test the     9312 # Source is outside of 2^14 range.  Test the sign and branch
9313 # to the appropriate exception handler.          9313 # to the appropriate exception handler.
9314 #                                                9314 #
9315 src_out:                                         9315 src_out:
9316         mov.l           (%sp)+,%d0               9316         mov.l           (%sp)+,%d0              # restore ctrl bits
9317         exg             %a0,%a1                  9317         exg             %a0,%a1                 # swap src,dst ptrs
9318         tst.b           SRC_EX(%a1)              9318         tst.b           SRC_EX(%a1)             # is src negative?
9319         bmi             t_unfl                   9319         bmi             t_unfl                  # yes; underflow
9320         bra             t_ovfl_sc                9320         bra             t_ovfl_sc               # no; overflow
9321                                                  9321 
9322 #                                                9322 #
9323 # The source input is below 1, so we check fo    9323 # The source input is below 1, so we check for denormalized numbers
9324 # and set unfl.                                  9324 # and set unfl.
9325 #                                                9325 #
9326 src_small:                                       9326 src_small:
9327         tst.b           DST_HI(%a1)              9327         tst.b           DST_HI(%a1)             # is dst denormalized?
9328         bpl.b           ssmall_done              9328         bpl.b           ssmall_done             # yes
9329                                                  9329 
9330         mov.l           (%sp)+,%d0               9330         mov.l           (%sp)+,%d0
9331         fmov.l          %d0,%fpcr                9331         fmov.l          %d0,%fpcr               # no; load control bits
9332         mov.b           &FMOV_OP,%d1             9332         mov.b           &FMOV_OP,%d1            # last inst is MOVE
9333         fmov.x          DST(%a1),%fp0            9333         fmov.x          DST(%a1),%fp0           # simply return dest
9334         bra             t_catch2                 9334         bra             t_catch2
9335 ssmall_done:                                     9335 ssmall_done:
9336         mov.l           (%sp)+,%d0               9336         mov.l           (%sp)+,%d0              # load control bits into d1
9337         mov.l           %a1,%a0                  9337         mov.l           %a1,%a0                 # pass ptr to dst
9338         bra             t_resdnrm                9338         bra             t_resdnrm
9339                                                  9339 
9340 #############################################    9340 #########################################################################
9341 # smod(): computes the fp MOD of the input va    9341 # smod(): computes the fp MOD of the input values X,Y.                  #
9342 # srem(): computes the fp (IEEE) REM of the i    9342 # srem(): computes the fp (IEEE) REM of the input values X,Y.           #
9343 #                                                9343 #                                                                       #
9344 # INPUT *************************************    9344 # INPUT *************************************************************** #
9345 #       a0 = pointer to extended precision in    9345 #       a0 = pointer to extended precision input X                      #
9346 #       a1 = pointer to extended precision in    9346 #       a1 = pointer to extended precision input Y                      #
9347 #       d0 = round precision,mode                9347 #       d0 = round precision,mode                                       #
9348 #                                                9348 #                                                                       #
9349 #       The input operands X and Y can be eit    9349 #       The input operands X and Y can be either normalized or          #
9350 #       denormalized.                            9350 #       denormalized.                                                   #
9351 #                                                9351 #                                                                       #
9352 # OUTPUT ************************************    9352 # OUTPUT ************************************************************** #
9353 #      fp0 = FREM(X,Y) or FMOD(X,Y)              9353 #      fp0 = FREM(X,Y) or FMOD(X,Y)                                     #
9354 #                                                9354 #                                                                       #
9355 # ALGORITHM *********************************    9355 # ALGORITHM *********************************************************** #
9356 #                                                9356 #                                                                       #
9357 #       Step 1.  Save and strip signs of X an    9357 #       Step 1.  Save and strip signs of X and Y: signX := sign(X),     #
9358 #                signY := sign(Y), X := |X|,     9358 #                signY := sign(Y), X := |X|, Y := |Y|,                  #
9359 #                signQ := signX EOR signY. Re    9359 #                signQ := signX EOR signY. Record whether MOD or REM    #
9360 #                is requested.                   9360 #                is requested.                                          #
9361 #                                                9361 #                                                                       #
9362 #       Step 2.  Set L := expo(X)-expo(Y), k     9362 #       Step 2.  Set L := expo(X)-expo(Y), k := 0, Q := 0.              #
9363 #                If (L < 0) then                 9363 #                If (L < 0) then                                        #
9364 #                   R := X, go to Step 4.        9364 #                   R := X, go to Step 4.                               #
9365 #                else                            9365 #                else                                                   #
9366 #                   R := 2^(-L)X, j := L.        9366 #                   R := 2^(-L)X, j := L.                               #
9367 #                endif                           9367 #                endif                                                  #
9368 #                                                9368 #                                                                       #
9369 #       Step 3.  Perform MOD(X,Y)                9369 #       Step 3.  Perform MOD(X,Y)                                       #
9370 #            3.1 If R = Y, go to Step 9.         9370 #            3.1 If R = Y, go to Step 9.                                #
9371 #            3.2 If R > Y, then { R := R - Y,    9371 #            3.2 If R > Y, then { R := R - Y, Q := Q + 1}               #
9372 #            3.3 If j = 0, go to Step 4.         9372 #            3.3 If j = 0, go to Step 4.                                #
9373 #            3.4 k := k + 1, j := j - 1, Q :=    9373 #            3.4 k := k + 1, j := j - 1, Q := 2Q, R := 2R. Go to        #
9374 #                Step 3.1.                       9374 #                Step 3.1.                                              #
9375 #                                                9375 #                                                                       #
9376 #       Step 4.  At this point, R = X - QY =     9376 #       Step 4.  At this point, R = X - QY = MOD(X,Y). Set              #
9377 #                Last_Subtract := false (used    9377 #                Last_Subtract := false (used in Step 7 below). If      #
9378 #                MOD is requested, go to Step    9378 #                MOD is requested, go to Step 6.                        #
9379 #                                                9379 #                                                                       #
9380 #       Step 5.  R = MOD(X,Y), but REM(X,Y) i    9380 #       Step 5.  R = MOD(X,Y), but REM(X,Y) is requested.               #
9381 #            5.1 If R < Y/2, then R = MOD(X,Y    9381 #            5.1 If R < Y/2, then R = MOD(X,Y) = REM(X,Y). Go to        #
9382 #                Step 6.                         9382 #                Step 6.                                                #
9383 #            5.2 If R > Y/2, then { set Last_    9383 #            5.2 If R > Y/2, then { set Last_Subtract := true,          #
9384 #                Q := Q + 1, Y := signY*Y }.     9384 #                Q := Q + 1, Y := signY*Y }. Go to Step 6.              #
9385 #            5.3 This is the tricky case of R    9385 #            5.3 This is the tricky case of R = Y/2. If Q is odd,       #
9386 #                then { Q := Q + 1, signX :=     9386 #                then { Q := Q + 1, signX := -signX }.                  #
9387 #                                                9387 #                                                                       #
9388 #       Step 6.  R := signX*R.                   9388 #       Step 6.  R := signX*R.                                          #
9389 #                                                9389 #                                                                       #
9390 #       Step 7.  If Last_Subtract = true, R :    9390 #       Step 7.  If Last_Subtract = true, R := R - Y.                   #
9391 #                                                9391 #                                                                       #
9392 #       Step 8.  Return signQ, last 7 bits of    9392 #       Step 8.  Return signQ, last 7 bits of Q, and R as required.     #
9393 #                                                9393 #                                                                       #
9394 #       Step 9.  At this point, R = 2^(-j)*X     9394 #       Step 9.  At this point, R = 2^(-j)*X - Q Y = Y. Thus,           #
9395 #                X = 2^(j)*(Q+1)Y. set Q := 2    9395 #                X = 2^(j)*(Q+1)Y. set Q := 2^(j)*(Q+1),                #
9396 #                R := 0. Return signQ, last 7    9396 #                R := 0. Return signQ, last 7 bits of Q, and R.         #
9397 #                                                9397 #                                                                       #
9398 #############################################    9398 #########################################################################
9399                                                  9399 
9400         set             Mod_Flag,L_SCR3          9400         set             Mod_Flag,L_SCR3
9401         set             Sc_Flag,L_SCR3+1         9401         set             Sc_Flag,L_SCR3+1
9402                                                  9402 
9403         set             SignY,L_SCR2             9403         set             SignY,L_SCR2
9404         set             SignX,L_SCR2+2           9404         set             SignX,L_SCR2+2
9405         set             SignQ,L_SCR3+2           9405         set             SignQ,L_SCR3+2
9406                                                  9406 
9407         set             Y,FP_SCR0                9407         set             Y,FP_SCR0
9408         set             Y_Hi,Y+4                 9408         set             Y_Hi,Y+4
9409         set             Y_Lo,Y+8                 9409         set             Y_Lo,Y+8
9410                                                  9410 
9411         set             R,FP_SCR1                9411         set             R,FP_SCR1
9412         set             R_Hi,R+4                 9412         set             R_Hi,R+4
9413         set             R_Lo,R+8                 9413         set             R_Lo,R+8
9414                                                  9414 
9415 Scale:                                           9415 Scale:
9416         long            0x00010000,0x80000000    9416         long            0x00010000,0x80000000,0x00000000,0x00000000
9417                                                  9417 
9418         global          smod                     9418         global          smod
9419 smod:                                            9419 smod:
9420         clr.b           FPSR_QBYTE(%a6)          9420         clr.b           FPSR_QBYTE(%a6)
9421         mov.l           %d0,-(%sp)               9421         mov.l           %d0,-(%sp)              # save ctrl bits
9422         clr.b           Mod_Flag(%a6)            9422         clr.b           Mod_Flag(%a6)
9423         bra.b           Mod_Rem                  9423         bra.b           Mod_Rem
9424                                                  9424 
9425         global          srem                     9425         global          srem
9426 srem:                                            9426 srem:
9427         clr.b           FPSR_QBYTE(%a6)          9427         clr.b           FPSR_QBYTE(%a6)
9428         mov.l           %d0,-(%sp)               9428         mov.l           %d0,-(%sp)              # save ctrl bits
9429         mov.b           &0x1,Mod_Flag(%a6)       9429         mov.b           &0x1,Mod_Flag(%a6)
9430                                                  9430 
9431 Mod_Rem:                                         9431 Mod_Rem:
9432 #..Save sign of X and Y                          9432 #..Save sign of X and Y
9433         movm.l          &0x3f00,-(%sp)           9433         movm.l          &0x3f00,-(%sp)          # save data registers
9434         mov.w           SRC_EX(%a0),%d3          9434         mov.w           SRC_EX(%a0),%d3
9435         mov.w           %d3,SignY(%a6)           9435         mov.w           %d3,SignY(%a6)
9436         and.l           &0x00007FFF,%d3          9436         and.l           &0x00007FFF,%d3         # Y := |Y|
9437                                                  9437 
9438 #                                                9438 #
9439         mov.l           SRC_HI(%a0),%d4          9439         mov.l           SRC_HI(%a0),%d4
9440         mov.l           SRC_LO(%a0),%d5          9440         mov.l           SRC_LO(%a0),%d5         # (D3,D4,D5) is |Y|
9441                                                  9441 
9442         tst.l           %d3                      9442         tst.l           %d3
9443         bne.b           Y_Normal                 9443         bne.b           Y_Normal
9444                                                  9444 
9445         mov.l           &0x00003FFE,%d3          9445         mov.l           &0x00003FFE,%d3         # $3FFD + 1
9446         tst.l           %d4                      9446         tst.l           %d4
9447         bne.b           HiY_not0                 9447         bne.b           HiY_not0
9448                                                  9448 
9449 HiY_0:                                           9449 HiY_0:
9450         mov.l           %d5,%d4                  9450         mov.l           %d5,%d4
9451         clr.l           %d5                      9451         clr.l           %d5
9452         sub.l           &32,%d3                  9452         sub.l           &32,%d3
9453         clr.l           %d6                      9453         clr.l           %d6
9454         bfffo           %d4{&0:&32},%d6          9454         bfffo           %d4{&0:&32},%d6
9455         lsl.l           %d6,%d4                  9455         lsl.l           %d6,%d4
9456         sub.l           %d6,%d3                  9456         sub.l           %d6,%d3                 # (D3,D4,D5) is normalized
9457 #                                                9457 #                                               ...with bias $7FFD
9458         bra.b           Chk_X                    9458         bra.b           Chk_X
9459                                                  9459 
9460 HiY_not0:                                        9460 HiY_not0:
9461         clr.l           %d6                      9461         clr.l           %d6
9462         bfffo           %d4{&0:&32},%d6          9462         bfffo           %d4{&0:&32},%d6
9463         sub.l           %d6,%d3                  9463         sub.l           %d6,%d3
9464         lsl.l           %d6,%d4                  9464         lsl.l           %d6,%d4
9465         mov.l           %d5,%d7                  9465         mov.l           %d5,%d7                 # a copy of D5
9466         lsl.l           %d6,%d5                  9466         lsl.l           %d6,%d5
9467         neg.l           %d6                      9467         neg.l           %d6
9468         add.l           &32,%d6                  9468         add.l           &32,%d6
9469         lsr.l           %d6,%d7                  9469         lsr.l           %d6,%d7
9470         or.l            %d7,%d4                  9470         or.l            %d7,%d4                 # (D3,D4,D5) normalized
9471 #                                       ...wi    9471 #                                       ...with bias $7FFD
9472         bra.b           Chk_X                    9472         bra.b           Chk_X
9473                                                  9473 
9474 Y_Normal:                                        9474 Y_Normal:
9475         add.l           &0x00003FFE,%d3          9475         add.l           &0x00003FFE,%d3         # (D3,D4,D5) normalized
9476 #                                       ...wi    9476 #                                       ...with bias $7FFD
9477                                                  9477 
9478 Chk_X:                                           9478 Chk_X:
9479         mov.w           DST_EX(%a1),%d0          9479         mov.w           DST_EX(%a1),%d0
9480         mov.w           %d0,SignX(%a6)           9480         mov.w           %d0,SignX(%a6)
9481         mov.w           SignY(%a6),%d1           9481         mov.w           SignY(%a6),%d1
9482         eor.l           %d0,%d1                  9482         eor.l           %d0,%d1
9483         and.l           &0x00008000,%d1          9483         and.l           &0x00008000,%d1
9484         mov.w           %d1,SignQ(%a6)           9484         mov.w           %d1,SignQ(%a6)          # sign(Q) obtained
9485         and.l           &0x00007FFF,%d0          9485         and.l           &0x00007FFF,%d0
9486         mov.l           DST_HI(%a1),%d1          9486         mov.l           DST_HI(%a1),%d1
9487         mov.l           DST_LO(%a1),%d2          9487         mov.l           DST_LO(%a1),%d2         # (D0,D1,D2) is |X|
9488         tst.l           %d0                      9488         tst.l           %d0
9489         bne.b           X_Normal                 9489         bne.b           X_Normal
9490         mov.l           &0x00003FFE,%d0          9490         mov.l           &0x00003FFE,%d0
9491         tst.l           %d1                      9491         tst.l           %d1
9492         bne.b           HiX_not0                 9492         bne.b           HiX_not0
9493                                                  9493 
9494 HiX_0:                                           9494 HiX_0:
9495         mov.l           %d2,%d1                  9495         mov.l           %d2,%d1
9496         clr.l           %d2                      9496         clr.l           %d2
9497         sub.l           &32,%d0                  9497         sub.l           &32,%d0
9498         clr.l           %d6                      9498         clr.l           %d6
9499         bfffo           %d1{&0:&32},%d6          9499         bfffo           %d1{&0:&32},%d6
9500         lsl.l           %d6,%d1                  9500         lsl.l           %d6,%d1
9501         sub.l           %d6,%d0                  9501         sub.l           %d6,%d0                 # (D0,D1,D2) is normalized
9502 #                                       ...wi    9502 #                                       ...with bias $7FFD
9503         bra.b           Init                     9503         bra.b           Init
9504                                                  9504 
9505 HiX_not0:                                        9505 HiX_not0:
9506         clr.l           %d6                      9506         clr.l           %d6
9507         bfffo           %d1{&0:&32},%d6          9507         bfffo           %d1{&0:&32},%d6
9508         sub.l           %d6,%d0                  9508         sub.l           %d6,%d0
9509         lsl.l           %d6,%d1                  9509         lsl.l           %d6,%d1
9510         mov.l           %d2,%d7                  9510         mov.l           %d2,%d7                 # a copy of D2
9511         lsl.l           %d6,%d2                  9511         lsl.l           %d6,%d2
9512         neg.l           %d6                      9512         neg.l           %d6
9513         add.l           &32,%d6                  9513         add.l           &32,%d6
9514         lsr.l           %d6,%d7                  9514         lsr.l           %d6,%d7
9515         or.l            %d7,%d1                  9515         or.l            %d7,%d1                 # (D0,D1,D2) normalized
9516 #                                       ...wi    9516 #                                       ...with bias $7FFD
9517         bra.b           Init                     9517         bra.b           Init
9518                                                  9518 
9519 X_Normal:                                        9519 X_Normal:
9520         add.l           &0x00003FFE,%d0          9520         add.l           &0x00003FFE,%d0         # (D0,D1,D2) normalized
9521 #                                       ...wi    9521 #                                       ...with bias $7FFD
9522                                                  9522 
9523 Init:                                            9523 Init:
9524 #                                                9524 #
9525         mov.l           %d3,L_SCR1(%a6)          9525         mov.l           %d3,L_SCR1(%a6)         # save biased exp(Y)
9526         mov.l           %d0,-(%sp)               9526         mov.l           %d0,-(%sp)              # save biased exp(X)
9527         sub.l           %d3,%d0                  9527         sub.l           %d3,%d0                 # L := expo(X)-expo(Y)
9528                                                  9528 
9529         clr.l           %d6                      9529         clr.l           %d6                     # D6 := carry <- 0
9530         clr.l           %d3                      9530         clr.l           %d3                     # D3 is Q
9531         mov.l           &0,%a1                   9531         mov.l           &0,%a1                  # A1 is k; j+k=L, Q=0
9532                                                  9532 
9533 #..(Carry,D1,D2) is R                            9533 #..(Carry,D1,D2) is R
9534         tst.l           %d0                      9534         tst.l           %d0
9535         bge.b           Mod_Loop_pre             9535         bge.b           Mod_Loop_pre
9536                                                  9536 
9537 #..expo(X) < expo(Y). Thus X = mod(X,Y)          9537 #..expo(X) < expo(Y). Thus X = mod(X,Y)
9538 #                                                9538 #
9539         mov.l           (%sp)+,%d0               9539         mov.l           (%sp)+,%d0              # restore d0
9540         bra.w           Get_Mod                  9540         bra.w           Get_Mod
9541                                                  9541 
9542 Mod_Loop_pre:                                    9542 Mod_Loop_pre:
9543         addq.l          &0x4,%sp                 9543         addq.l          &0x4,%sp                # erase exp(X)
9544 #..At this point  R = 2^(-L)X; Q = 0; k = 0;     9544 #..At this point  R = 2^(-L)X; Q = 0; k = 0; and  k+j = L
9545 Mod_Loop:                                        9545 Mod_Loop:
9546         tst.l           %d6                      9546         tst.l           %d6                     # test carry bit
9547         bgt.b           R_GT_Y                   9547         bgt.b           R_GT_Y
9548                                                  9548 
9549 #..At this point carry = 0, R = (D1,D2), Y =     9549 #..At this point carry = 0, R = (D1,D2), Y = (D4,D5)
9550         cmp.l           %d1,%d4                  9550         cmp.l           %d1,%d4                 # compare hi(R) and hi(Y)
9551         bne.b           R_NE_Y                   9551         bne.b           R_NE_Y
9552         cmp.l           %d2,%d5                  9552         cmp.l           %d2,%d5                 # compare lo(R) and lo(Y)
9553         bne.b           R_NE_Y                   9553         bne.b           R_NE_Y
9554                                                  9554 
9555 #..At this point, R = Y                          9555 #..At this point, R = Y
9556         bra.w           Rem_is_0                 9556         bra.w           Rem_is_0
9557                                                  9557 
9558 R_NE_Y:                                          9558 R_NE_Y:
9559 #..use the borrow of the previous compare        9559 #..use the borrow of the previous compare
9560         bcs.b           R_LT_Y                   9560         bcs.b           R_LT_Y                  # borrow is set iff R < Y
9561                                                  9561 
9562 R_GT_Y:                                          9562 R_GT_Y:
9563 #..If Carry is set, then Y < (Carry,D1,D2) <     9563 #..If Carry is set, then Y < (Carry,D1,D2) < 2Y. Otherwise, Carry = 0
9564 #..and Y < (D1,D2) < 2Y. Either way, perform     9564 #..and Y < (D1,D2) < 2Y. Either way, perform R - Y
9565         sub.l           %d5,%d2                  9565         sub.l           %d5,%d2                 # lo(R) - lo(Y)
9566         subx.l          %d4,%d1                  9566         subx.l          %d4,%d1                 # hi(R) - hi(Y)
9567         clr.l           %d6                      9567         clr.l           %d6                     # clear carry
9568         addq.l          &1,%d3                   9568         addq.l          &1,%d3                  # Q := Q + 1
9569                                                  9569 
9570 R_LT_Y:                                          9570 R_LT_Y:
9571 #..At this point, Carry=0, R < Y. R = 2^(k-L)    9571 #..At this point, Carry=0, R < Y. R = 2^(k-L)X - QY; k+j = L; j >= 0.
9572         tst.l           %d0                      9572         tst.l           %d0                     # see if j = 0.
9573         beq.b           PostLoop                 9573         beq.b           PostLoop
9574                                                  9574 
9575         add.l           %d3,%d3                  9575         add.l           %d3,%d3                 # Q := 2Q
9576         add.l           %d2,%d2                  9576         add.l           %d2,%d2                 # lo(R) = 2lo(R)
9577         roxl.l          &1,%d1                   9577         roxl.l          &1,%d1                  # hi(R) = 2hi(R) + carry
9578         scs             %d6                      9578         scs             %d6                     # set Carry if 2(R) overflows
9579         addq.l          &1,%a1                   9579         addq.l          &1,%a1                  # k := k+1
9580         subq.l          &1,%d0                   9580         subq.l          &1,%d0                  # j := j - 1
9581 #..At this point, R=(Carry,D1,D2) = 2^(k-L)X     9581 #..At this point, R=(Carry,D1,D2) = 2^(k-L)X - QY, j+k=L, j >= 0, R < 2Y.
9582                                                  9582 
9583         bra.b           Mod_Loop                 9583         bra.b           Mod_Loop
9584                                                  9584 
9585 PostLoop:                                        9585 PostLoop:
9586 #..k = L, j = 0, Carry = 0, R = (D1,D2) = X -    9586 #..k = L, j = 0, Carry = 0, R = (D1,D2) = X - QY, R < Y.
9587                                                  9587 
9588 #..normalize R.                                  9588 #..normalize R.
9589         mov.l           L_SCR1(%a6),%d0          9589         mov.l           L_SCR1(%a6),%d0         # new biased expo of R
9590         tst.l           %d1                      9590         tst.l           %d1
9591         bne.b           HiR_not0                 9591         bne.b           HiR_not0
9592                                                  9592 
9593 HiR_0:                                           9593 HiR_0:
9594         mov.l           %d2,%d1                  9594         mov.l           %d2,%d1
9595         clr.l           %d2                      9595         clr.l           %d2
9596         sub.l           &32,%d0                  9596         sub.l           &32,%d0
9597         clr.l           %d6                      9597         clr.l           %d6
9598         bfffo           %d1{&0:&32},%d6          9598         bfffo           %d1{&0:&32},%d6
9599         lsl.l           %d6,%d1                  9599         lsl.l           %d6,%d1
9600         sub.l           %d6,%d0                  9600         sub.l           %d6,%d0                 # (D0,D1,D2) is normalized
9601 #                                       ...wi    9601 #                                       ...with bias $7FFD
9602         bra.b           Get_Mod                  9602         bra.b           Get_Mod
9603                                                  9603 
9604 HiR_not0:                                        9604 HiR_not0:
9605         clr.l           %d6                      9605         clr.l           %d6
9606         bfffo           %d1{&0:&32},%d6          9606         bfffo           %d1{&0:&32},%d6
9607         bmi.b           Get_Mod                  9607         bmi.b           Get_Mod                 # already normalized
9608         sub.l           %d6,%d0                  9608         sub.l           %d6,%d0
9609         lsl.l           %d6,%d1                  9609         lsl.l           %d6,%d1
9610         mov.l           %d2,%d7                  9610         mov.l           %d2,%d7                 # a copy of D2
9611         lsl.l           %d6,%d2                  9611         lsl.l           %d6,%d2
9612         neg.l           %d6                      9612         neg.l           %d6
9613         add.l           &32,%d6                  9613         add.l           &32,%d6
9614         lsr.l           %d6,%d7                  9614         lsr.l           %d6,%d7
9615         or.l            %d7,%d1                  9615         or.l            %d7,%d1                 # (D0,D1,D2) normalized
9616                                                  9616 
9617 #                                                9617 #
9618 Get_Mod:                                         9618 Get_Mod:
9619         cmp.l           %d0,&0x000041FE          9619         cmp.l           %d0,&0x000041FE
9620         bge.b           No_Scale                 9620         bge.b           No_Scale
9621 Do_Scale:                                        9621 Do_Scale:
9622         mov.w           %d0,R(%a6)               9622         mov.w           %d0,R(%a6)
9623         mov.l           %d1,R_Hi(%a6)            9623         mov.l           %d1,R_Hi(%a6)
9624         mov.l           %d2,R_Lo(%a6)            9624         mov.l           %d2,R_Lo(%a6)
9625         mov.l           L_SCR1(%a6),%d6          9625         mov.l           L_SCR1(%a6),%d6
9626         mov.w           %d6,Y(%a6)               9626         mov.w           %d6,Y(%a6)
9627         mov.l           %d4,Y_Hi(%a6)            9627         mov.l           %d4,Y_Hi(%a6)
9628         mov.l           %d5,Y_Lo(%a6)            9628         mov.l           %d5,Y_Lo(%a6)
9629         fmov.x          R(%a6),%fp0              9629         fmov.x          R(%a6),%fp0             # no exception
9630         mov.b           &1,Sc_Flag(%a6)          9630         mov.b           &1,Sc_Flag(%a6)
9631         bra.b           ModOrRem                 9631         bra.b           ModOrRem
9632 No_Scale:                                        9632 No_Scale:
9633         mov.l           %d1,R_Hi(%a6)            9633         mov.l           %d1,R_Hi(%a6)
9634         mov.l           %d2,R_Lo(%a6)            9634         mov.l           %d2,R_Lo(%a6)
9635         sub.l           &0x3FFE,%d0              9635         sub.l           &0x3FFE,%d0
9636         mov.w           %d0,R(%a6)               9636         mov.w           %d0,R(%a6)
9637         mov.l           L_SCR1(%a6),%d6          9637         mov.l           L_SCR1(%a6),%d6
9638         sub.l           &0x3FFE,%d6              9638         sub.l           &0x3FFE,%d6
9639         mov.l           %d6,L_SCR1(%a6)          9639         mov.l           %d6,L_SCR1(%a6)
9640         fmov.x          R(%a6),%fp0              9640         fmov.x          R(%a6),%fp0
9641         mov.w           %d6,Y(%a6)               9641         mov.w           %d6,Y(%a6)
9642         mov.l           %d4,Y_Hi(%a6)            9642         mov.l           %d4,Y_Hi(%a6)
9643         mov.l           %d5,Y_Lo(%a6)            9643         mov.l           %d5,Y_Lo(%a6)
9644         clr.b           Sc_Flag(%a6)             9644         clr.b           Sc_Flag(%a6)
9645                                                  9645 
9646 #                                                9646 #
9647 ModOrRem:                                        9647 ModOrRem:
9648         tst.b           Mod_Flag(%a6)            9648         tst.b           Mod_Flag(%a6)
9649         beq.b           Fix_Sign                 9649         beq.b           Fix_Sign
9650                                                  9650 
9651         mov.l           L_SCR1(%a6),%d6          9651         mov.l           L_SCR1(%a6),%d6         # new biased expo(Y)
9652         subq.l          &1,%d6                   9652         subq.l          &1,%d6                  # biased expo(Y/2)
9653         cmp.l           %d0,%d6                  9653         cmp.l           %d0,%d6
9654         blt.b           Fix_Sign                 9654         blt.b           Fix_Sign
9655         bgt.b           Last_Sub                 9655         bgt.b           Last_Sub
9656                                                  9656 
9657         cmp.l           %d1,%d4                  9657         cmp.l           %d1,%d4
9658         bne.b           Not_EQ                   9658         bne.b           Not_EQ
9659         cmp.l           %d2,%d5                  9659         cmp.l           %d2,%d5
9660         bne.b           Not_EQ                   9660         bne.b           Not_EQ
9661         bra.w           Tie_Case                 9661         bra.w           Tie_Case
9662                                                  9662 
9663 Not_EQ:                                          9663 Not_EQ:
9664         bcs.b           Fix_Sign                 9664         bcs.b           Fix_Sign
9665                                                  9665 
9666 Last_Sub:                                        9666 Last_Sub:
9667 #                                                9667 #
9668         fsub.x          Y(%a6),%fp0              9668         fsub.x          Y(%a6),%fp0             # no exceptions
9669         addq.l          &1,%d3                   9669         addq.l          &1,%d3                  # Q := Q + 1
9670                                                  9670 
9671 #                                                9671 #
9672 Fix_Sign:                                        9672 Fix_Sign:
9673 #..Get sign of X                                 9673 #..Get sign of X
9674         mov.w           SignX(%a6),%d6           9674         mov.w           SignX(%a6),%d6
9675         bge.b           Get_Q                    9675         bge.b           Get_Q
9676         fneg.x          %fp0                     9676         fneg.x          %fp0
9677                                                  9677 
9678 #..Get Q                                         9678 #..Get Q
9679 #                                                9679 #
9680 Get_Q:                                           9680 Get_Q:
9681         clr.l           %d6                      9681         clr.l           %d6
9682         mov.w           SignQ(%a6),%d6           9682         mov.w           SignQ(%a6),%d6          # D6 is sign(Q)
9683         mov.l           &8,%d7                   9683         mov.l           &8,%d7
9684         lsr.l           %d7,%d6                  9684         lsr.l           %d7,%d6
9685         and.l           &0x0000007F,%d3          9685         and.l           &0x0000007F,%d3         # 7 bits of Q
9686         or.l            %d6,%d3                  9686         or.l            %d6,%d3                 # sign and bits of Q
9687 #       swap            %d3                      9687 #       swap            %d3
9688 #       fmov.l          %fpsr,%d6                9688 #       fmov.l          %fpsr,%d6
9689 #       and.l           &0xFF00FFFF,%d6          9689 #       and.l           &0xFF00FFFF,%d6
9690 #       or.l            %d3,%d6                  9690 #       or.l            %d3,%d6
9691 #       fmov.l          %d6,%fpsr                9691 #       fmov.l          %d6,%fpsr               # put Q in fpsr
9692         mov.b           %d3,FPSR_QBYTE(%a6)      9692         mov.b           %d3,FPSR_QBYTE(%a6)     # put Q in fpsr
9693                                                  9693 
9694 #                                                9694 #
9695 Restore:                                         9695 Restore:
9696         movm.l          (%sp)+,&0xfc             9696         movm.l          (%sp)+,&0xfc            #  {%d2-%d7}
9697         mov.l           (%sp)+,%d0               9697         mov.l           (%sp)+,%d0
9698         fmov.l          %d0,%fpcr                9698         fmov.l          %d0,%fpcr
9699         tst.b           Sc_Flag(%a6)             9699         tst.b           Sc_Flag(%a6)
9700         beq.b           Finish                   9700         beq.b           Finish
9701         mov.b           &FMUL_OP,%d1             9701         mov.b           &FMUL_OP,%d1            # last inst is MUL
9702         fmul.x          Scale(%pc),%fp0          9702         fmul.x          Scale(%pc),%fp0         # may cause underflow
9703         bra             t_catch2                 9703         bra             t_catch2
9704 # the '040 package did this apparently to see    9704 # the '040 package did this apparently to see if the dst operand for the
9705 # preceding fmul was a denorm. but, it better    9705 # preceding fmul was a denorm. but, it better not have been since the
9706 # algorithm just got done playing with fp0 an    9706 # algorithm just got done playing with fp0 and expected no exceptions
9707 # as a result. trust me...                       9707 # as a result. trust me...
9708 #       bra             t_avoid_unsupp           9708 #       bra             t_avoid_unsupp          # check for denorm as a
9709 #                                                9709 #                                               ;result of the scaling
9710                                                  9710 
9711 Finish:                                          9711 Finish:
9712         mov.b           &FMOV_OP,%d1             9712         mov.b           &FMOV_OP,%d1            # last inst is MOVE
9713         fmov.x          %fp0,%fp0                9713         fmov.x          %fp0,%fp0               # capture exceptions & round
9714         bra             t_catch2                 9714         bra             t_catch2
9715                                                  9715 
9716 Rem_is_0:                                        9716 Rem_is_0:
9717 #..R = 2^(-j)X - Q Y = Y, thus R = 0 and quot    9717 #..R = 2^(-j)X - Q Y = Y, thus R = 0 and quotient = 2^j (Q+1)
9718         addq.l          &1,%d3                   9718         addq.l          &1,%d3
9719         cmp.l           %d0,&8                   9719         cmp.l           %d0,&8                  # D0 is j
9720         bge.b           Q_Big                    9720         bge.b           Q_Big
9721                                                  9721 
9722         lsl.l           %d0,%d3                  9722         lsl.l           %d0,%d3
9723         bra.b           Set_R_0                  9723         bra.b           Set_R_0
9724                                                  9724 
9725 Q_Big:                                           9725 Q_Big:
9726         clr.l           %d3                      9726         clr.l           %d3
9727                                                  9727 
9728 Set_R_0:                                         9728 Set_R_0:
9729         fmov.s          &0x00000000,%fp0         9729         fmov.s          &0x00000000,%fp0
9730         clr.b           Sc_Flag(%a6)             9730         clr.b           Sc_Flag(%a6)
9731         bra.w           Fix_Sign                 9731         bra.w           Fix_Sign
9732                                                  9732 
9733 Tie_Case:                                        9733 Tie_Case:
9734 #..Check parity of Q                             9734 #..Check parity of Q
9735         mov.l           %d3,%d6                  9735         mov.l           %d3,%d6
9736         and.l           &0x00000001,%d6          9736         and.l           &0x00000001,%d6
9737         tst.l           %d6                      9737         tst.l           %d6
9738         beq.w           Fix_Sign                 9738         beq.w           Fix_Sign                # Q is even
9739                                                  9739 
9740 #..Q is odd, Q := Q + 1, signX := -signX         9740 #..Q is odd, Q := Q + 1, signX := -signX
9741         addq.l          &1,%d3                   9741         addq.l          &1,%d3
9742         mov.w           SignX(%a6),%d6           9742         mov.w           SignX(%a6),%d6
9743         eor.l           &0x00008000,%d6          9743         eor.l           &0x00008000,%d6
9744         mov.w           %d6,SignX(%a6)           9744         mov.w           %d6,SignX(%a6)
9745         bra.w           Fix_Sign                 9745         bra.w           Fix_Sign
9746                                                  9746 
9747 #############################################    9747 #########################################################################
9748 # XDEF **************************************    9748 # XDEF **************************************************************** #
9749 #       tag(): return the optype of the input    9749 #       tag(): return the optype of the input ext fp number             #
9750 #                                                9750 #                                                                       #
9751 #       This routine is used by the 060FPLSP.    9751 #       This routine is used by the 060FPLSP.                           #
9752 #                                                9752 #                                                                       #
9753 # XREF **************************************    9753 # XREF **************************************************************** #
9754 #       None                                     9754 #       None                                                            #
9755 #                                                9755 #                                                                       #
9756 # INPUT *************************************    9756 # INPUT *************************************************************** #
9757 #       a0 = pointer to extended precision op    9757 #       a0 = pointer to extended precision operand                      #
9758 #                                                9758 #                                                                       #
9759 # OUTPUT ************************************    9759 # OUTPUT ************************************************************** #
9760 #       d0 = value of type tag                   9760 #       d0 = value of type tag                                          #
9761 #               one of: NORM, INF, QNAN, SNAN    9761 #               one of: NORM, INF, QNAN, SNAN, DENORM, ZERO             #
9762 #                                                9762 #                                                                       #
9763 # ALGORITHM *********************************    9763 # ALGORITHM *********************************************************** #
9764 #       Simply test the exponent, j-bit, and     9764 #       Simply test the exponent, j-bit, and mantissa values to         #
9765 # determine the type of operand.                 9765 # determine the type of operand.                                        #
9766 #       If it's an unnormalized zero, alter t    9766 #       If it's an unnormalized zero, alter the operand and force it    #
9767 # to be a normal zero.                           9767 # to be a normal zero.                                                  #
9768 #                                                9768 #                                                                       #
9769 #############################################    9769 #########################################################################
9770                                                  9770 
9771         global          tag                      9771         global          tag
9772 tag:                                             9772 tag:
9773         mov.w           FTEMP_EX(%a0), %d0       9773         mov.w           FTEMP_EX(%a0), %d0      # extract exponent
9774         andi.w          &0x7fff, %d0             9774         andi.w          &0x7fff, %d0            # strip off sign
9775         cmpi.w          %d0, &0x7fff             9775         cmpi.w          %d0, &0x7fff            # is (EXP == MAX)?
9776         beq.b           inf_or_nan_x             9776         beq.b           inf_or_nan_x
9777 not_inf_or_nan_x:                                9777 not_inf_or_nan_x:
9778         btst            &0x7,FTEMP_HI(%a0)       9778         btst            &0x7,FTEMP_HI(%a0)
9779         beq.b           not_norm_x               9779         beq.b           not_norm_x
9780 is_norm_x:                                       9780 is_norm_x:
9781         mov.b           &NORM, %d0               9781         mov.b           &NORM, %d0
9782         rts                                      9782         rts
9783 not_norm_x:                                      9783 not_norm_x:
9784         tst.w           %d0                      9784         tst.w           %d0                     # is exponent = 0?
9785         bne.b           is_unnorm_x              9785         bne.b           is_unnorm_x
9786 not_unnorm_x:                                    9786 not_unnorm_x:
9787         tst.l           FTEMP_HI(%a0)            9787         tst.l           FTEMP_HI(%a0)
9788         bne.b           is_denorm_x              9788         bne.b           is_denorm_x
9789         tst.l           FTEMP_LO(%a0)            9789         tst.l           FTEMP_LO(%a0)
9790         bne.b           is_denorm_x              9790         bne.b           is_denorm_x
9791 is_zero_x:                                       9791 is_zero_x:
9792         mov.b           &ZERO, %d0               9792         mov.b           &ZERO, %d0
9793         rts                                      9793         rts
9794 is_denorm_x:                                     9794 is_denorm_x:
9795         mov.b           &DENORM, %d0             9795         mov.b           &DENORM, %d0
9796         rts                                      9796         rts
9797 is_unnorm_x:                                     9797 is_unnorm_x:
9798         bsr.l           unnorm_fix               9798         bsr.l           unnorm_fix              # convert to norm,denorm,or zero
9799         rts                                      9799         rts
9800 is_unnorm_reg_x:                                 9800 is_unnorm_reg_x:
9801         mov.b           &UNNORM, %d0             9801         mov.b           &UNNORM, %d0
9802         rts                                      9802         rts
9803 inf_or_nan_x:                                    9803 inf_or_nan_x:
9804         tst.l           FTEMP_LO(%a0)            9804         tst.l           FTEMP_LO(%a0)
9805         bne.b           is_nan_x                 9805         bne.b           is_nan_x
9806         mov.l           FTEMP_HI(%a0), %d0       9806         mov.l           FTEMP_HI(%a0), %d0
9807         and.l           &0x7fffffff, %d0         9807         and.l           &0x7fffffff, %d0        # msb is a don't care!
9808         bne.b           is_nan_x                 9808         bne.b           is_nan_x
9809 is_inf_x:                                        9809 is_inf_x:
9810         mov.b           &INF, %d0                9810         mov.b           &INF, %d0
9811         rts                                      9811         rts
9812 is_nan_x:                                        9812 is_nan_x:
9813         mov.b           &QNAN, %d0               9813         mov.b           &QNAN, %d0
9814         rts                                      9814         rts
9815                                                  9815 
9816 #############################################    9816 #############################################################
9817                                                  9817 
9818 qnan:   long            0x7fff0000, 0xfffffff    9818 qnan:   long            0x7fff0000, 0xffffffff, 0xffffffff
9819                                                  9819 
9820 #############################################    9820 #########################################################################
9821 # XDEF **************************************    9821 # XDEF **************************************************************** #
9822 #       t_dz(): Handle 060FPLSP dz exception     9822 #       t_dz(): Handle 060FPLSP dz exception for "flogn" emulation.     #
9823 #       t_dz2(): Handle 060FPLSP dz exception    9823 #       t_dz2(): Handle 060FPLSP dz exception for "fatanh" emulation.   #
9824 #                                                9824 #                                                                       #
9825 #       These rouitnes are used by the 060FPL    9825 #       These rouitnes are used by the 060FPLSP package.                #
9826 #                                                9826 #                                                                       #
9827 # XREF **************************************    9827 # XREF **************************************************************** #
9828 #       None                                     9828 #       None                                                            #
9829 #                                                9829 #                                                                       #
9830 # INPUT *************************************    9830 # INPUT *************************************************************** #
9831 #       a0 = pointer to extended precision so    9831 #       a0 = pointer to extended precision source operand.              #
9832 #                                                9832 #                                                                       #
9833 # OUTPUT ************************************    9833 # OUTPUT ************************************************************** #
9834 #       fp0 = default DZ result.                 9834 #       fp0 = default DZ result.                                        #
9835 #                                                9835 #                                                                       #
9836 # ALGORITHM *********************************    9836 # ALGORITHM *********************************************************** #
9837 #       Transcendental emulation for the 060F    9837 #       Transcendental emulation for the 060FPLSP has detected that     #
9838 # a DZ exception should occur for the instruc    9838 # a DZ exception should occur for the instruction. If DZ is disabled,   #
9839 # return the default result.                     9839 # return the default result.                                            #
9840 #       If DZ is enabled, the dst operand sho    9840 #       If DZ is enabled, the dst operand should be returned unscathed  #
9841 # in fp0 while fp1 is used to create a DZ exc    9841 # in fp0 while fp1 is used to create a DZ exception so that the         #
9842 # operating system can log that such an event    9842 # operating system can log that such an event occurred.                 #
9843 #                                                9843 #                                                                       #
9844 #############################################    9844 #########################################################################
9845                                                  9845 
9846         global          t_dz                     9846         global          t_dz
9847 t_dz:                                            9847 t_dz:
9848         tst.b           SRC_EX(%a0)              9848         tst.b           SRC_EX(%a0)             # check sign for neg or pos
9849         bpl.b           dz_pinf                  9849         bpl.b           dz_pinf                 # branch if pos sign
9850                                                  9850 
9851         global          t_dz2                    9851         global          t_dz2
9852 t_dz2:                                           9852 t_dz2:
9853         ori.l           &dzinf_mask+neg_mask,    9853         ori.l           &dzinf_mask+neg_mask,USER_FPSR(%a6) # set N/I/DZ/ADZ
9854                                                  9854 
9855         btst            &dz_bit,FPCR_ENABLE(%    9855         btst            &dz_bit,FPCR_ENABLE(%a6)
9856         bne.b           dz_minf_ena              9856         bne.b           dz_minf_ena
9857                                                  9857 
9858 # dz is disabled. return a -INF.                 9858 # dz is disabled. return a -INF.
9859         fmov.s          &0xff800000,%fp0         9859         fmov.s          &0xff800000,%fp0        # return -INF
9860         rts                                      9860         rts
9861                                                  9861 
9862 # dz is enabled. create a dz exception so the    9862 # dz is enabled. create a dz exception so the user can record it
9863 # but use fp1 instead. return the dst operand    9863 # but use fp1 instead. return the dst operand unscathed in fp0.
9864 dz_minf_ena:                                     9864 dz_minf_ena:
9865         fmovm.x         EXC_FP0(%a6),&0x80       9865         fmovm.x         EXC_FP0(%a6),&0x80      # return fp0 unscathed
9866         fmov.l          USER_FPCR(%a6),%fpcr     9866         fmov.l          USER_FPCR(%a6),%fpcr
9867         fmov.s          &0xbf800000,%fp1         9867         fmov.s          &0xbf800000,%fp1        # load -1
9868         fdiv.s          &0x00000000,%fp1         9868         fdiv.s          &0x00000000,%fp1        # -1 / 0
9869         rts                                      9869         rts
9870                                                  9870 
9871 dz_pinf:                                         9871 dz_pinf:
9872         ori.l           &dzinf_mask,USER_FPSR    9872         ori.l           &dzinf_mask,USER_FPSR(%a6) # set I/DZ/ADZ
9873                                                  9873 
9874         btst            &dz_bit,FPCR_ENABLE(%    9874         btst            &dz_bit,FPCR_ENABLE(%a6)
9875         bne.b           dz_pinf_ena              9875         bne.b           dz_pinf_ena
9876                                                  9876 
9877 # dz is disabled. return a +INF.                 9877 # dz is disabled. return a +INF.
9878         fmov.s          &0x7f800000,%fp0         9878         fmov.s          &0x7f800000,%fp0        # return +INF
9879         rts                                      9879         rts
9880                                                  9880 
9881 # dz is enabled. create a dz exception so the    9881 # dz is enabled. create a dz exception so the user can record it
9882 # but use fp1 instead. return the dst operand    9882 # but use fp1 instead. return the dst operand unscathed in fp0.
9883 dz_pinf_ena:                                     9883 dz_pinf_ena:
9884         fmovm.x         EXC_FP0(%a6),&0x80       9884         fmovm.x         EXC_FP0(%a6),&0x80      # return fp0 unscathed
9885         fmov.l          USER_FPCR(%a6),%fpcr     9885         fmov.l          USER_FPCR(%a6),%fpcr
9886         fmov.s          &0x3f800000,%fp1         9886         fmov.s          &0x3f800000,%fp1        # load +1
9887         fdiv.s          &0x00000000,%fp1         9887         fdiv.s          &0x00000000,%fp1        # +1 / 0
9888         rts                                      9888         rts
9889                                                  9889 
9890 #############################################    9890 #########################################################################
9891 # XDEF **************************************    9891 # XDEF **************************************************************** #
9892 #       t_operr(): Handle 060FPLSP OPERR exce    9892 #       t_operr(): Handle 060FPLSP OPERR exception during emulation.    #
9893 #                                                9893 #                                                                       #
9894 #       This routine is used by the 060FPLSP     9894 #       This routine is used by the 060FPLSP package.                   #
9895 #                                                9895 #                                                                       #
9896 # XREF **************************************    9896 # XREF **************************************************************** #
9897 #       None.                                    9897 #       None.                                                           #
9898 #                                                9898 #                                                                       #
9899 # INPUT *************************************    9899 # INPUT *************************************************************** #
9900 #       fp1 = source operand                     9900 #       fp1 = source operand                                            #
9901 #                                                9901 #                                                                       #
9902 # OUTPUT ************************************    9902 # OUTPUT ************************************************************** #
9903 #       fp0 = default result                     9903 #       fp0 = default result                                            #
9904 #       fp1 = unchanged                          9904 #       fp1 = unchanged                                                 #
9905 #                                                9905 #                                                                       #
9906 # ALGORITHM *********************************    9906 # ALGORITHM *********************************************************** #
9907 #       An operand error should occur as the     9907 #       An operand error should occur as the result of transcendental   #
9908 # emulation in the 060FPLSP. If OPERR is disa    9908 # emulation in the 060FPLSP. If OPERR is disabled, just return a NAN    #
9909 # in fp0. If OPERR is enabled, return the dst    9909 # in fp0. If OPERR is enabled, return the dst operand unscathed in fp0  #
9910 # and the source operand in fp1. Use fp2 to c    9910 # and the source operand in fp1. Use fp2 to create an OPERR exception   #
9911 # so that the operating system can log the ev    9911 # so that the operating system can log the event.                       #
9912 #                                                9912 #                                                                       #
9913 #############################################    9913 #########################################################################
9914                                                  9914 
9915         global          t_operr                  9915         global          t_operr
9916 t_operr:                                         9916 t_operr:
9917         ori.l           &opnan_mask,USER_FPSR    9917         ori.l           &opnan_mask,USER_FPSR(%a6) # set NAN/OPERR/AIOP
9918                                                  9918 
9919         btst            &operr_bit,FPCR_ENABL    9919         btst            &operr_bit,FPCR_ENABLE(%a6)
9920         bne.b           operr_ena                9920         bne.b           operr_ena
9921                                                  9921 
9922 # operr is disabled. return a QNAN in fp0        9922 # operr is disabled. return a QNAN in fp0
9923         fmovm.x         qnan(%pc),&0x80          9923         fmovm.x         qnan(%pc),&0x80         # return QNAN
9924         rts                                      9924         rts
9925                                                  9925 
9926 # operr is enabled. create an operr exception    9926 # operr is enabled. create an operr exception so the user can record it
9927 # but use fp2 instead. return the dst operand    9927 # but use fp2 instead. return the dst operand unscathed in fp0.
9928 operr_ena:                                       9928 operr_ena:
9929         fmovm.x         EXC_FP0(%a6),&0x80       9929         fmovm.x         EXC_FP0(%a6),&0x80      # return fp0 unscathed
9930         fmov.l          USER_FPCR(%a6),%fpcr     9930         fmov.l          USER_FPCR(%a6),%fpcr
9931         fmovm.x         &0x04,-(%sp)             9931         fmovm.x         &0x04,-(%sp)            # save fp2
9932         fmov.s          &0x7f800000,%fp2         9932         fmov.s          &0x7f800000,%fp2        # load +INF
9933         fmul.s          &0x00000000,%fp2         9933         fmul.s          &0x00000000,%fp2        # +INF x 0
9934         fmovm.x         (%sp)+,&0x20             9934         fmovm.x         (%sp)+,&0x20            # restore fp2
9935         rts                                      9935         rts
9936                                                  9936 
9937 pls_huge:                                        9937 pls_huge:
9938         long            0x7ffe0000,0xffffffff    9938         long            0x7ffe0000,0xffffffff,0xffffffff
9939 mns_huge:                                        9939 mns_huge:
9940         long            0xfffe0000,0xffffffff    9940         long            0xfffe0000,0xffffffff,0xffffffff
9941 pls_tiny:                                        9941 pls_tiny:
9942         long            0x00000000,0x80000000    9942         long            0x00000000,0x80000000,0x00000000
9943 mns_tiny:                                        9943 mns_tiny:
9944         long            0x80000000,0x80000000    9944         long            0x80000000,0x80000000,0x00000000
9945                                                  9945 
9946 #############################################    9946 #########################################################################
9947 # XDEF **************************************    9947 # XDEF **************************************************************** #
9948 #       t_unfl(): Handle 060FPLSP underflow e    9948 #       t_unfl(): Handle 060FPLSP underflow exception during emulation. #
9949 #       t_unfl2(): Handle 060FPLSP underflow     9949 #       t_unfl2(): Handle 060FPLSP underflow exception during           #
9950 #                  emulation. result always p    9950 #                  emulation. result always positive.                   #
9951 #                                                9951 #                                                                       #
9952 #       This routine is used by the 060FPLSP     9952 #       This routine is used by the 060FPLSP package.                   #
9953 #                                                9953 #                                                                       #
9954 # XREF **************************************    9954 # XREF **************************************************************** #
9955 #       None.                                    9955 #       None.                                                           #
9956 #                                                9956 #                                                                       #
9957 # INPUT *************************************    9957 # INPUT *************************************************************** #
9958 #       a0 = pointer to extended precision so    9958 #       a0 = pointer to extended precision source operand               #
9959 #                                                9959 #                                                                       #
9960 # OUTPUT ************************************    9960 # OUTPUT ************************************************************** #
9961 #       fp0 = default underflow result           9961 #       fp0 = default underflow result                                  #
9962 #                                                9962 #                                                                       #
9963 # ALGORITHM *********************************    9963 # ALGORITHM *********************************************************** #
9964 #       An underflow should occur as the resu    9964 #       An underflow should occur as the result of transcendental       #
9965 # emulation in the 060FPLSP. Create an underf    9965 # emulation in the 060FPLSP. Create an underflow by using "fmul"        #
9966 # and two very small numbers of appropriate s    9966 # and two very small numbers of appropriate sign so the operating       #
9967 # system can log the event.                      9967 # system can log the event.                                             #
9968 #                                                9968 #                                                                       #
9969 #############################################    9969 #########################################################################
9970                                                  9970 
9971         global          t_unfl                   9971         global          t_unfl
9972 t_unfl:                                          9972 t_unfl:
9973         tst.b           SRC_EX(%a0)              9973         tst.b           SRC_EX(%a0)
9974         bpl.b           unf_pos                  9974         bpl.b           unf_pos
9975                                                  9975 
9976         global          t_unfl2                  9976         global          t_unfl2
9977 t_unfl2:                                         9977 t_unfl2:
9978         ori.l           &unfinx_mask+neg_mask    9978         ori.l           &unfinx_mask+neg_mask,USER_FPSR(%a6) # set N/UNFL/INEX2/AUNFL/AINEX
9979                                                  9979 
9980         fmov.l          USER_FPCR(%a6),%fpcr     9980         fmov.l          USER_FPCR(%a6),%fpcr
9981         fmovm.x         mns_tiny(%pc),&0x80      9981         fmovm.x         mns_tiny(%pc),&0x80
9982         fmul.x          pls_tiny(%pc),%fp0       9982         fmul.x          pls_tiny(%pc),%fp0
9983                                                  9983 
9984         fmov.l          %fpsr,%d0                9984         fmov.l          %fpsr,%d0
9985         rol.l           &0x8,%d0                 9985         rol.l           &0x8,%d0
9986         mov.b           %d0,FPSR_CC(%a6)         9986         mov.b           %d0,FPSR_CC(%a6)
9987         rts                                      9987         rts
9988 unf_pos:                                         9988 unf_pos:
9989         ori.w           &unfinx_mask,FPSR_EXC    9989         ori.w           &unfinx_mask,FPSR_EXCEPT(%a6) # set UNFL/INEX2/AUNFL/AINEX
9990                                                  9990 
9991         fmov.l          USER_FPCR(%a6),%fpcr     9991         fmov.l          USER_FPCR(%a6),%fpcr
9992         fmovm.x         pls_tiny(%pc),&0x80      9992         fmovm.x         pls_tiny(%pc),&0x80
9993         fmul.x          %fp0,%fp0                9993         fmul.x          %fp0,%fp0
9994                                                  9994 
9995         fmov.l          %fpsr,%d0                9995         fmov.l          %fpsr,%d0
9996         rol.l           &0x8,%d0                 9996         rol.l           &0x8,%d0
9997         mov.b           %d0,FPSR_CC(%a6)         9997         mov.b           %d0,FPSR_CC(%a6)
9998         rts                                      9998         rts
9999                                                  9999 
10000 ############################################    10000 #########################################################################
10001 # XDEF *************************************    10001 # XDEF **************************************************************** #
10002 #       t_ovfl(): Handle 060FPLSP overflow e    10002 #       t_ovfl(): Handle 060FPLSP overflow exception during emulation.  #
10003 #                 (monadic)                     10003 #                 (monadic)                                             #
10004 #       t_ovfl2(): Handle 060FPLSP overflow     10004 #       t_ovfl2(): Handle 060FPLSP overflow exception during            #
10005 #                  emulation. result always     10005 #                  emulation. result always positive. (dyadic)          #
10006 #       t_ovfl_sc(): Handle 060FPLSP overflo    10006 #       t_ovfl_sc(): Handle 060FPLSP overflow exception during          #
10007 #                    emulation for "fscale".    10007 #                    emulation for "fscale".                            #
10008 #                                               10008 #                                                                       #
10009 #       This routine is used by the 060FPLSP    10009 #       This routine is used by the 060FPLSP package.                   #
10010 #                                               10010 #                                                                       #
10011 # XREF *************************************    10011 # XREF **************************************************************** #
10012 #       None.                                   10012 #       None.                                                           #
10013 #                                               10013 #                                                                       #
10014 # INPUT ************************************    10014 # INPUT *************************************************************** #
10015 #       a0 = pointer to extended precision s    10015 #       a0 = pointer to extended precision source operand               #
10016 #                                               10016 #                                                                       #
10017 # OUTPUT ***********************************    10017 # OUTPUT ************************************************************** #
10018 #       fp0 = default underflow result          10018 #       fp0 = default underflow result                                  #
10019 #                                               10019 #                                                                       #
10020 # ALGORITHM ********************************    10020 # ALGORITHM *********************************************************** #
10021 #       An overflow should occur as the resu    10021 #       An overflow should occur as the result of transcendental        #
10022 # emulation in the 060FPLSP. Create an overf    10022 # emulation in the 060FPLSP. Create an overflow by using "fmul"         #
10023 # and two very lareg numbers of appropriate     10023 # and two very lareg numbers of appropriate sign so the operating       #
10024 # system can log the event.                     10024 # system can log the event.                                             #
10025 #       For t_ovfl_sc() we take special care    10025 #       For t_ovfl_sc() we take special care not to lose the INEX2 bit. #
10026 #                                               10026 #                                                                       #
10027 ############################################    10027 #########################################################################
10028                                                 10028 
10029         global          t_ovfl_sc               10029         global          t_ovfl_sc
10030 t_ovfl_sc:                                      10030 t_ovfl_sc:
10031         ori.l           &ovfl_inx_mask,USER_    10031         ori.l           &ovfl_inx_mask,USER_FPSR(%a6) # set OVFL/AOVFL/AINEX
10032                                                 10032 
10033         mov.b           %d0,%d1                 10033         mov.b           %d0,%d1                 # fetch rnd prec,mode
10034         andi.b          &0xc0,%d1               10034         andi.b          &0xc0,%d1               # extract prec
10035         beq.w           ovfl_work               10035         beq.w           ovfl_work
10036                                                 10036 
10037 # dst op is a DENORM. we have to normalize t    10037 # dst op is a DENORM. we have to normalize the mantissa to see if the
10038 # result would be inexact for the given prec    10038 # result would be inexact for the given precision. make a copy of the
10039 # dst so we don't screw up the version passe    10039 # dst so we don't screw up the version passed to us.
10040         mov.w           LOCAL_EX(%a0),FP_SCR    10040         mov.w           LOCAL_EX(%a0),FP_SCR0_EX(%a6)
10041         mov.l           LOCAL_HI(%a0),FP_SCR    10041         mov.l           LOCAL_HI(%a0),FP_SCR0_HI(%a6)
10042         mov.l           LOCAL_LO(%a0),FP_SCR    10042         mov.l           LOCAL_LO(%a0),FP_SCR0_LO(%a6)
10043         lea             FP_SCR0(%a6),%a0        10043         lea             FP_SCR0(%a6),%a0        # pass ptr to FP_SCR0
10044         movm.l          &0xc080,-(%sp)          10044         movm.l          &0xc080,-(%sp)          # save d0-d1/a0
10045         bsr.l           norm                    10045         bsr.l           norm                    # normalize mantissa
10046         movm.l          (%sp)+,&0x0103          10046         movm.l          (%sp)+,&0x0103          # restore d0-d1/a0
10047                                                 10047 
10048         cmpi.b          %d1,&0x40               10048         cmpi.b          %d1,&0x40               # is precision sgl?
10049         bne.b           ovfl_sc_dbl             10049         bne.b           ovfl_sc_dbl             # no; dbl
10050 ovfl_sc_sgl:                                    10050 ovfl_sc_sgl:
10051         tst.l           LOCAL_LO(%a0)           10051         tst.l           LOCAL_LO(%a0)           # is lo lw of sgl set?
10052         bne.b           ovfl_sc_inx             10052         bne.b           ovfl_sc_inx             # yes
10053         tst.b           3+LOCAL_HI(%a0)         10053         tst.b           3+LOCAL_HI(%a0)         # is lo byte of hi lw set?
10054         bne.b           ovfl_sc_inx             10054         bne.b           ovfl_sc_inx             # yes
10055         bra.w           ovfl_work               10055         bra.w           ovfl_work               # don't set INEX2
10056 ovfl_sc_dbl:                                    10056 ovfl_sc_dbl:
10057         mov.l           LOCAL_LO(%a0),%d1       10057         mov.l           LOCAL_LO(%a0),%d1       # are any of lo 11 bits of
10058         andi.l          &0x7ff,%d1              10058         andi.l          &0x7ff,%d1              # dbl mantissa set?
10059         beq.w           ovfl_work               10059         beq.w           ovfl_work               # no; don't set INEX2
10060 ovfl_sc_inx:                                    10060 ovfl_sc_inx:
10061         ori.l           &inex2_mask,USER_FPS    10061         ori.l           &inex2_mask,USER_FPSR(%a6) # set INEX2
10062         bra.b           ovfl_work               10062         bra.b           ovfl_work               # continue
10063                                                 10063 
10064         global          t_ovfl                  10064         global          t_ovfl
10065 t_ovfl:                                         10065 t_ovfl:
10066         ori.w           &ovfinx_mask,FPSR_EX    10066         ori.w           &ovfinx_mask,FPSR_EXCEPT(%a6) # set OVFL/INEX2/AOVFL/AINEX
10067 ovfl_work:                                      10067 ovfl_work:
10068         tst.b           SRC_EX(%a0)             10068         tst.b           SRC_EX(%a0)
10069         bpl.b           ovfl_p                  10069         bpl.b           ovfl_p
10070 ovfl_m:                                         10070 ovfl_m:
10071         fmov.l          USER_FPCR(%a6),%fpcr    10071         fmov.l          USER_FPCR(%a6),%fpcr
10072         fmovm.x         mns_huge(%pc),&0x80     10072         fmovm.x         mns_huge(%pc),&0x80
10073         fmul.x          pls_huge(%pc),%fp0      10073         fmul.x          pls_huge(%pc),%fp0
10074                                                 10074 
10075         fmov.l          %fpsr,%d0               10075         fmov.l          %fpsr,%d0
10076         rol.l           &0x8,%d0                10076         rol.l           &0x8,%d0
10077         ori.b           &neg_mask,%d0           10077         ori.b           &neg_mask,%d0
10078         mov.b           %d0,FPSR_CC(%a6)        10078         mov.b           %d0,FPSR_CC(%a6)
10079         rts                                     10079         rts
10080 ovfl_p:                                         10080 ovfl_p:
10081         fmov.l          USER_FPCR(%a6),%fpcr    10081         fmov.l          USER_FPCR(%a6),%fpcr
10082         fmovm.x         pls_huge(%pc),&0x80     10082         fmovm.x         pls_huge(%pc),&0x80
10083         fmul.x          pls_huge(%pc),%fp0      10083         fmul.x          pls_huge(%pc),%fp0
10084                                                 10084 
10085         fmov.l          %fpsr,%d0               10085         fmov.l          %fpsr,%d0
10086         rol.l           &0x8,%d0                10086         rol.l           &0x8,%d0
10087         mov.b           %d0,FPSR_CC(%a6)        10087         mov.b           %d0,FPSR_CC(%a6)
10088         rts                                     10088         rts
10089                                                 10089 
10090         global          t_ovfl2                 10090         global          t_ovfl2
10091 t_ovfl2:                                        10091 t_ovfl2:
10092         ori.w           &ovfinx_mask,FPSR_EX    10092         ori.w           &ovfinx_mask,FPSR_EXCEPT(%a6) # set OVFL/INEX2/AOVFL/AINEX
10093         fmov.l          USER_FPCR(%a6),%fpcr    10093         fmov.l          USER_FPCR(%a6),%fpcr
10094         fmovm.x         pls_huge(%pc),&0x80     10094         fmovm.x         pls_huge(%pc),&0x80
10095         fmul.x          pls_huge(%pc),%fp0      10095         fmul.x          pls_huge(%pc),%fp0
10096                                                 10096 
10097         fmov.l          %fpsr,%d0               10097         fmov.l          %fpsr,%d0
10098         rol.l           &0x8,%d0                10098         rol.l           &0x8,%d0
10099         mov.b           %d0,FPSR_CC(%a6)        10099         mov.b           %d0,FPSR_CC(%a6)
10100         rts                                     10100         rts
10101                                                 10101 
10102 ############################################    10102 #########################################################################
10103 # XDEF *************************************    10103 # XDEF **************************************************************** #
10104 #       t_catch(): Handle 060FPLSP OVFL,UNFL    10104 #       t_catch(): Handle 060FPLSP OVFL,UNFL,or INEX2 exception during  #
10105 #                  emulation.                   10105 #                  emulation.                                           #
10106 #       t_catch2(): Handle 060FPLSP OVFL,UNF    10106 #       t_catch2(): Handle 060FPLSP OVFL,UNFL,or INEX2 exception during #
10107 #                   emulation.                  10107 #                   emulation.                                          #
10108 #                                               10108 #                                                                       #
10109 #       These routines are used by the 060FP    10109 #       These routines are used by the 060FPLSP package.                #
10110 #                                               10110 #                                                                       #
10111 # XREF *************************************    10111 # XREF **************************************************************** #
10112 #       None.                                   10112 #       None.                                                           #
10113 #                                               10113 #                                                                       #
10114 # INPUT ************************************    10114 # INPUT *************************************************************** #
10115 #       fp0 = default underflow or overflow     10115 #       fp0 = default underflow or overflow result                      #
10116 #                                               10116 #                                                                       #
10117 # OUTPUT ***********************************    10117 # OUTPUT ************************************************************** #
10118 #       fp0 = default result                    10118 #       fp0 = default result                                            #
10119 #                                               10119 #                                                                       #
10120 # ALGORITHM ********************************    10120 # ALGORITHM *********************************************************** #
10121 #       If an overflow or underflow occurred    10121 #       If an overflow or underflow occurred during the last            #
10122 # instruction of transcendental 060FPLSP emu    10122 # instruction of transcendental 060FPLSP emulation, then it has already #
10123 # occurred and has been logged. Now we need     10123 # occurred and has been logged. Now we need to see if an inexact        #
10124 # exception should occur.                       10124 # exception should occur.                                               #
10125 #                                               10125 #                                                                       #
10126 ############################################    10126 #########################################################################
10127                                                 10127 
10128         global          t_catch2                10128         global          t_catch2
10129 t_catch2:                                       10129 t_catch2:
10130         fmov.l          %fpsr,%d0               10130         fmov.l          %fpsr,%d0
10131         or.l            %d0,USER_FPSR(%a6)      10131         or.l            %d0,USER_FPSR(%a6)
10132         bra.b           inx2_work               10132         bra.b           inx2_work
10133                                                 10133 
10134         global          t_catch                 10134         global          t_catch
10135 t_catch:                                        10135 t_catch:
10136         fmov.l          %fpsr,%d0               10136         fmov.l          %fpsr,%d0
10137         or.l            %d0,USER_FPSR(%a6)      10137         or.l            %d0,USER_FPSR(%a6)
10138                                                 10138 
10139 ############################################    10139 #########################################################################
10140 # XDEF *************************************    10140 # XDEF **************************************************************** #
10141 #       t_inx2(): Handle inexact 060FPLSP ex    10141 #       t_inx2(): Handle inexact 060FPLSP exception during emulation.   #
10142 #       t_pinx2(): Handle inexact 060FPLSP e    10142 #       t_pinx2(): Handle inexact 060FPLSP exception for "+" results.   #
10143 #       t_minx2(): Handle inexact 060FPLSP e    10143 #       t_minx2(): Handle inexact 060FPLSP exception for "-" results.   #
10144 #                                               10144 #                                                                       #
10145 # XREF *************************************    10145 # XREF **************************************************************** #
10146 #       None.                                   10146 #       None.                                                           #
10147 #                                               10147 #                                                                       #
10148 # INPUT ************************************    10148 # INPUT *************************************************************** #
10149 #       fp0 = default result                    10149 #       fp0 = default result                                            #
10150 #                                               10150 #                                                                       #
10151 # OUTPUT ***********************************    10151 # OUTPUT ************************************************************** #
10152 #       fp0 = default result                    10152 #       fp0 = default result                                            #
10153 #                                               10153 #                                                                       #
10154 # ALGORITHM ********************************    10154 # ALGORITHM *********************************************************** #
10155 #       The last instruction of transcendent    10155 #       The last instruction of transcendental emulation for the        #
10156 # 060FPLSP should be inexact. So, if inexact    10156 # 060FPLSP should be inexact. So, if inexact is enabled, then we create #
10157 # the event here by adding a large and very     10157 # the event here by adding a large and very small number together       #
10158 # so that the operating system can log the e    10158 # so that the operating system can log the event.                       #
10159 #       Must check, too, if the result was z    10159 #       Must check, too, if the result was zero, in which case we just  #
10160 # set the FPSR bits and return.                 10160 # set the FPSR bits and return.                                         #
10161 #                                               10161 #                                                                       #
10162 ############################################    10162 #########################################################################
10163                                                 10163 
10164         global          t_inx2                  10164         global          t_inx2
10165 t_inx2:                                         10165 t_inx2:
10166         fblt.w          t_minx2                 10166         fblt.w          t_minx2
10167         fbeq.w          inx2_zero               10167         fbeq.w          inx2_zero
10168                                                 10168 
10169         global          t_pinx2                 10169         global          t_pinx2
10170 t_pinx2:                                        10170 t_pinx2:
10171         ori.w           &inx2a_mask,FPSR_EXC    10171         ori.w           &inx2a_mask,FPSR_EXCEPT(%a6) # set INEX2/AINEX
10172         bra.b           inx2_work               10172         bra.b           inx2_work
10173                                                 10173 
10174         global          t_minx2                 10174         global          t_minx2
10175 t_minx2:                                        10175 t_minx2:
10176         ori.l           &inx2a_mask+neg_mask    10176         ori.l           &inx2a_mask+neg_mask,USER_FPSR(%a6)
10177                                                 10177 
10178 inx2_work:                                      10178 inx2_work:
10179         btst            &inex2_bit,FPCR_ENAB    10179         btst            &inex2_bit,FPCR_ENABLE(%a6) # is inexact enabled?
10180         bne.b           inx2_work_ena           10180         bne.b           inx2_work_ena           # yes
10181         rts                                     10181         rts
10182 inx2_work_ena:                                  10182 inx2_work_ena:
10183         fmov.l          USER_FPCR(%a6),%fpcr    10183         fmov.l          USER_FPCR(%a6),%fpcr    # insert user's exceptions
10184         fmov.s          &0x3f800000,%fp1        10184         fmov.s          &0x3f800000,%fp1        # load +1
10185         fadd.x          pls_tiny(%pc),%fp1      10185         fadd.x          pls_tiny(%pc),%fp1      # cause exception
10186         rts                                     10186         rts
10187                                                 10187 
10188 inx2_zero:                                      10188 inx2_zero:
10189         mov.b           &z_bmask,FPSR_CC(%a6    10189         mov.b           &z_bmask,FPSR_CC(%a6)
10190         ori.w           &inx2a_mask,2+USER_F    10190         ori.w           &inx2a_mask,2+USER_FPSR(%a6) # set INEX/AINEX
10191         rts                                     10191         rts
10192                                                 10192 
10193 ############################################    10193 #########################################################################
10194 # XDEF *************************************    10194 # XDEF **************************************************************** #
10195 #       t_extdnrm(): Handle DENORM inputs in    10195 #       t_extdnrm(): Handle DENORM inputs in 060FPLSP.                  #
10196 #       t_resdnrm(): Handle DENORM inputs in    10196 #       t_resdnrm(): Handle DENORM inputs in 060FPLSP for "fscale".     #
10197 #                                               10197 #                                                                       #
10198 #       This routine is used by the 060FPLSP    10198 #       This routine is used by the 060FPLSP package.                   #
10199 #                                               10199 #                                                                       #
10200 # XREF *************************************    10200 # XREF **************************************************************** #
10201 #       None.                                   10201 #       None.                                                           #
10202 #                                               10202 #                                                                       #
10203 # INPUT ************************************    10203 # INPUT *************************************************************** #
10204 #       a0 = pointer to extended precision i    10204 #       a0 = pointer to extended precision input operand                #
10205 #                                               10205 #                                                                       #
10206 # OUTPUT ***********************************    10206 # OUTPUT ************************************************************** #
10207 #       fp0 = default result                    10207 #       fp0 = default result                                            #
10208 #                                               10208 #                                                                       #
10209 # ALGORITHM ********************************    10209 # ALGORITHM *********************************************************** #
10210 #       For all functions that have a denorm    10210 #       For all functions that have a denormalized input and that       #
10211 # f(x)=x, this is the entry point.              10211 # f(x)=x, this is the entry point.                                      #
10212 #       DENORM value is moved using "fmove"     10212 #       DENORM value is moved using "fmove" which triggers an exception #
10213 # if enabled so the operating system can log    10213 # if enabled so the operating system can log the event.                 #
10214 #                                               10214 #                                                                       #
10215 ############################################    10215 #########################################################################
10216                                                 10216 
10217         global          t_extdnrm               10217         global          t_extdnrm
10218 t_extdnrm:                                      10218 t_extdnrm:
10219         fmov.l          USER_FPCR(%a6),%fpcr    10219         fmov.l          USER_FPCR(%a6),%fpcr
10220         fmov.x          SRC_EX(%a0),%fp0        10220         fmov.x          SRC_EX(%a0),%fp0
10221         fmov.l          %fpsr,%d0               10221         fmov.l          %fpsr,%d0
10222         ori.l           &unfinx_mask,%d0        10222         ori.l           &unfinx_mask,%d0
10223         or.l            %d0,USER_FPSR(%a6)      10223         or.l            %d0,USER_FPSR(%a6)
10224         rts                                     10224         rts
10225                                                 10225 
10226         global          t_resdnrm               10226         global          t_resdnrm
10227 t_resdnrm:                                      10227 t_resdnrm:
10228         fmov.l          USER_FPCR(%a6),%fpcr    10228         fmov.l          USER_FPCR(%a6),%fpcr
10229         fmov.x          SRC_EX(%a0),%fp0        10229         fmov.x          SRC_EX(%a0),%fp0
10230         fmov.l          %fpsr,%d0               10230         fmov.l          %fpsr,%d0
10231         or.l            %d0,USER_FPSR(%a6)      10231         or.l            %d0,USER_FPSR(%a6)
10232         rts                                     10232         rts
10233                                                 10233 
10234 ##########################################      10234 ##########################################
10235                                                 10235 
10236 #                                               10236 #
10237 # sto_cos:                                      10237 # sto_cos:
10238 #       This is used by fsincos library emul    10238 #       This is used by fsincos library emulation. The correct
10239 # values are already in fp0 and fp1 so we do    10239 # values are already in fp0 and fp1 so we do nothing here.
10240 #                                               10240 #
10241         global          sto_cos                 10241         global          sto_cos
10242 sto_cos:                                        10242 sto_cos:
10243         rts                                     10243         rts
10244                                                 10244 
10245 ##########################################      10245 ##########################################
10246                                                 10246 
10247 #                                               10247 #
10248 #       dst_qnan --- force result when desti    10248 #       dst_qnan --- force result when destination is a NaN
10249 #                                               10249 #
10250         global          dst_qnan                10250         global          dst_qnan
10251 dst_qnan:                                       10251 dst_qnan:
10252         fmov.x          DST(%a1),%fp0           10252         fmov.x          DST(%a1),%fp0
10253         tst.b           DST_EX(%a1)             10253         tst.b           DST_EX(%a1)
10254         bmi.b           dst_qnan_m              10254         bmi.b           dst_qnan_m
10255 dst_qnan_p:                                     10255 dst_qnan_p:
10256         mov.b           &nan_bmask,FPSR_CC(%    10256         mov.b           &nan_bmask,FPSR_CC(%a6)
10257         rts                                     10257         rts
10258 dst_qnan_m:                                     10258 dst_qnan_m:
10259         mov.b           &nan_bmask+neg_bmask    10259         mov.b           &nan_bmask+neg_bmask,FPSR_CC(%a6)
10260         rts                                     10260         rts
10261                                                 10261 
10262 #                                               10262 #
10263 #       src_qnan --- force result when sourc    10263 #       src_qnan --- force result when source is a NaN
10264 #                                               10264 #
10265         global          src_qnan                10265         global          src_qnan
10266 src_qnan:                                       10266 src_qnan:
10267         fmov.x          SRC(%a0),%fp0           10267         fmov.x          SRC(%a0),%fp0
10268         tst.b           SRC_EX(%a0)             10268         tst.b           SRC_EX(%a0)
10269         bmi.b           src_qnan_m              10269         bmi.b           src_qnan_m
10270 src_qnan_p:                                     10270 src_qnan_p:
10271         mov.b           &nan_bmask,FPSR_CC(%    10271         mov.b           &nan_bmask,FPSR_CC(%a6)
10272         rts                                     10272         rts
10273 src_qnan_m:                                     10273 src_qnan_m:
10274         mov.b           &nan_bmask+neg_bmask    10274         mov.b           &nan_bmask+neg_bmask,FPSR_CC(%a6)
10275         rts                                     10275         rts
10276                                                 10276 
10277 ##########################################      10277 ##########################################
10278                                                 10278 
10279 #                                               10279 #
10280 #       Native instruction support              10280 #       Native instruction support
10281 #                                               10281 #
10282 #       Some systems may need entry points e    10282 #       Some systems may need entry points even for 68060 native
10283 #       instructions.  These routines are pr    10283 #       instructions.  These routines are provided for
10284 #       convenience.                            10284 #       convenience.
10285 #                                               10285 #
10286         global          _fadds_                 10286         global          _fadds_
10287 _fadds_:                                        10287 _fadds_:
10288         fmov.l          %fpcr,-(%sp)            10288         fmov.l          %fpcr,-(%sp)            # save fpcr
10289         fmov.l          &0x00000000,%fpcr       10289         fmov.l          &0x00000000,%fpcr       # clear fpcr for load
10290         fmov.s          0x8(%sp),%fp0           10290         fmov.s          0x8(%sp),%fp0           # load sgl dst
10291         fmov.l          (%sp)+,%fpcr            10291         fmov.l          (%sp)+,%fpcr            # restore fpcr
10292         fadd.s          0x8(%sp),%fp0           10292         fadd.s          0x8(%sp),%fp0           # fadd w/ sgl src
10293         rts                                     10293         rts
10294                                                 10294 
10295         global          _faddd_                 10295         global          _faddd_
10296 _faddd_:                                        10296 _faddd_:
10297         fmov.l          %fpcr,-(%sp)            10297         fmov.l          %fpcr,-(%sp)            # save fpcr
10298         fmov.l          &0x00000000,%fpcr       10298         fmov.l          &0x00000000,%fpcr       # clear fpcr for load
10299         fmov.d          0x8(%sp),%fp0           10299         fmov.d          0x8(%sp),%fp0           # load dbl dst
10300         fmov.l          (%sp)+,%fpcr            10300         fmov.l          (%sp)+,%fpcr            # restore fpcr
10301         fadd.d          0xc(%sp),%fp0           10301         fadd.d          0xc(%sp),%fp0           # fadd w/ dbl src
10302         rts                                     10302         rts
10303                                                 10303 
10304         global          _faddx_                 10304         global          _faddx_
10305 _faddx_:                                        10305 _faddx_:
10306         fmovm.x         0x4(%sp),&0x80          10306         fmovm.x         0x4(%sp),&0x80          # load ext dst
10307         fadd.x          0x10(%sp),%fp0          10307         fadd.x          0x10(%sp),%fp0          # fadd w/ ext src
10308         rts                                     10308         rts
10309                                                 10309 
10310         global          _fsubs_                 10310         global          _fsubs_
10311 _fsubs_:                                        10311 _fsubs_:
10312         fmov.l          %fpcr,-(%sp)            10312         fmov.l          %fpcr,-(%sp)            # save fpcr
10313         fmov.l          &0x00000000,%fpcr       10313         fmov.l          &0x00000000,%fpcr       # clear fpcr for load
10314         fmov.s          0x8(%sp),%fp0           10314         fmov.s          0x8(%sp),%fp0           # load sgl dst
10315         fmov.l          (%sp)+,%fpcr            10315         fmov.l          (%sp)+,%fpcr            # restore fpcr
10316         fsub.s          0x8(%sp),%fp0           10316         fsub.s          0x8(%sp),%fp0           # fsub w/ sgl src
10317         rts                                     10317         rts
10318                                                 10318 
10319         global          _fsubd_                 10319         global          _fsubd_
10320 _fsubd_:                                        10320 _fsubd_:
10321         fmov.l          %fpcr,-(%sp)            10321         fmov.l          %fpcr,-(%sp)            # save fpcr
10322         fmov.l          &0x00000000,%fpcr       10322         fmov.l          &0x00000000,%fpcr       # clear fpcr for load
10323         fmov.d          0x8(%sp),%fp0           10323         fmov.d          0x8(%sp),%fp0           # load dbl dst
10324         fmov.l          (%sp)+,%fpcr            10324         fmov.l          (%sp)+,%fpcr            # restore fpcr
10325         fsub.d          0xc(%sp),%fp0           10325         fsub.d          0xc(%sp),%fp0           # fsub w/ dbl src
10326         rts                                     10326         rts
10327                                                 10327 
10328         global          _fsubx_                 10328         global          _fsubx_
10329 _fsubx_:                                        10329 _fsubx_:
10330         fmovm.x         0x4(%sp),&0x80          10330         fmovm.x         0x4(%sp),&0x80          # load ext dst
10331         fsub.x          0x10(%sp),%fp0          10331         fsub.x          0x10(%sp),%fp0          # fsub w/ ext src
10332         rts                                     10332         rts
10333                                                 10333 
10334         global          _fmuls_                 10334         global          _fmuls_
10335 _fmuls_:                                        10335 _fmuls_:
10336         fmov.l          %fpcr,-(%sp)            10336         fmov.l          %fpcr,-(%sp)            # save fpcr
10337         fmov.l          &0x00000000,%fpcr       10337         fmov.l          &0x00000000,%fpcr       # clear fpcr for load
10338         fmov.s          0x8(%sp),%fp0           10338         fmov.s          0x8(%sp),%fp0           # load sgl dst
10339         fmov.l          (%sp)+,%fpcr            10339         fmov.l          (%sp)+,%fpcr            # restore fpcr
10340         fmul.s          0x8(%sp),%fp0           10340         fmul.s          0x8(%sp),%fp0           # fmul w/ sgl src
10341         rts                                     10341         rts
10342                                                 10342 
10343         global          _fmuld_                 10343         global          _fmuld_
10344 _fmuld_:                                        10344 _fmuld_:
10345         fmov.l          %fpcr,-(%sp)            10345         fmov.l          %fpcr,-(%sp)            # save fpcr
10346         fmov.l          &0x00000000,%fpcr       10346         fmov.l          &0x00000000,%fpcr       # clear fpcr for load
10347         fmov.d          0x8(%sp),%fp0           10347         fmov.d          0x8(%sp),%fp0           # load dbl dst
10348         fmov.l          (%sp)+,%fpcr            10348         fmov.l          (%sp)+,%fpcr            # restore fpcr
10349         fmul.d          0xc(%sp),%fp0           10349         fmul.d          0xc(%sp),%fp0           # fmul w/ dbl src
10350         rts                                     10350         rts
10351                                                 10351 
10352         global          _fmulx_                 10352         global          _fmulx_
10353 _fmulx_:                                        10353 _fmulx_:
10354         fmovm.x         0x4(%sp),&0x80          10354         fmovm.x         0x4(%sp),&0x80          # load ext dst
10355         fmul.x          0x10(%sp),%fp0          10355         fmul.x          0x10(%sp),%fp0          # fmul w/ ext src
10356         rts                                     10356         rts
10357                                                 10357 
10358         global          _fdivs_                 10358         global          _fdivs_
10359 _fdivs_:                                        10359 _fdivs_:
10360         fmov.l          %fpcr,-(%sp)            10360         fmov.l          %fpcr,-(%sp)            # save fpcr
10361         fmov.l          &0x00000000,%fpcr       10361         fmov.l          &0x00000000,%fpcr       # clear fpcr for load
10362         fmov.s          0x8(%sp),%fp0           10362         fmov.s          0x8(%sp),%fp0           # load sgl dst
10363         fmov.l          (%sp)+,%fpcr            10363         fmov.l          (%sp)+,%fpcr            # restore fpcr
10364         fdiv.s          0x8(%sp),%fp0           10364         fdiv.s          0x8(%sp),%fp0           # fdiv w/ sgl src
10365         rts                                     10365         rts
10366                                                 10366 
10367         global          _fdivd_                 10367         global          _fdivd_
10368 _fdivd_:                                        10368 _fdivd_:
10369         fmov.l          %fpcr,-(%sp)            10369         fmov.l          %fpcr,-(%sp)            # save fpcr
10370         fmov.l          &0x00000000,%fpcr       10370         fmov.l          &0x00000000,%fpcr       # clear fpcr for load
10371         fmov.d          0x8(%sp),%fp0           10371         fmov.d          0x8(%sp),%fp0           # load dbl dst
10372         fmov.l          (%sp)+,%fpcr            10372         fmov.l          (%sp)+,%fpcr            # restore fpcr
10373         fdiv.d          0xc(%sp),%fp0           10373         fdiv.d          0xc(%sp),%fp0           # fdiv w/ dbl src
10374         rts                                     10374         rts
10375                                                 10375 
10376         global          _fdivx_                 10376         global          _fdivx_
10377 _fdivx_:                                        10377 _fdivx_:
10378         fmovm.x         0x4(%sp),&0x80          10378         fmovm.x         0x4(%sp),&0x80          # load ext dst
10379         fdiv.x          0x10(%sp),%fp0          10379         fdiv.x          0x10(%sp),%fp0          # fdiv w/ ext src
10380         rts                                     10380         rts
10381                                                 10381 
10382         global          _fabss_                 10382         global          _fabss_
10383 _fabss_:                                        10383 _fabss_:
10384         fabs.s          0x4(%sp),%fp0           10384         fabs.s          0x4(%sp),%fp0           # fabs w/ sgl src
10385         rts                                     10385         rts
10386                                                 10386 
10387         global          _fabsd_                 10387         global          _fabsd_
10388 _fabsd_:                                        10388 _fabsd_:
10389         fabs.d          0x4(%sp),%fp0           10389         fabs.d          0x4(%sp),%fp0           # fabs w/ dbl src
10390         rts                                     10390         rts
10391                                                 10391 
10392         global          _fabsx_                 10392         global          _fabsx_
10393 _fabsx_:                                        10393 _fabsx_:
10394         fabs.x          0x4(%sp),%fp0           10394         fabs.x          0x4(%sp),%fp0           # fabs w/ ext src
10395         rts                                     10395         rts
10396                                                 10396 
10397         global          _fnegs_                 10397         global          _fnegs_
10398 _fnegs_:                                        10398 _fnegs_:
10399         fneg.s          0x4(%sp),%fp0           10399         fneg.s          0x4(%sp),%fp0           # fneg w/ sgl src
10400         rts                                     10400         rts
10401                                                 10401 
10402         global          _fnegd_                 10402         global          _fnegd_
10403 _fnegd_:                                        10403 _fnegd_:
10404         fneg.d          0x4(%sp),%fp0           10404         fneg.d          0x4(%sp),%fp0           # fneg w/ dbl src
10405         rts                                     10405         rts
10406                                                 10406 
10407         global          _fnegx_                 10407         global          _fnegx_
10408 _fnegx_:                                        10408 _fnegx_:
10409         fneg.x          0x4(%sp),%fp0           10409         fneg.x          0x4(%sp),%fp0           # fneg w/ ext src
10410         rts                                     10410         rts
10411                                                 10411 
10412         global          _fsqrts_                10412         global          _fsqrts_
10413 _fsqrts_:                                       10413 _fsqrts_:
10414         fsqrt.s         0x4(%sp),%fp0           10414         fsqrt.s         0x4(%sp),%fp0           # fsqrt w/ sgl src
10415         rts                                     10415         rts
10416                                                 10416 
10417         global          _fsqrtd_                10417         global          _fsqrtd_
10418 _fsqrtd_:                                       10418 _fsqrtd_:
10419         fsqrt.d         0x4(%sp),%fp0           10419         fsqrt.d         0x4(%sp),%fp0           # fsqrt w/ dbl src
10420         rts                                     10420         rts
10421                                                 10421 
10422         global          _fsqrtx_                10422         global          _fsqrtx_
10423 _fsqrtx_:                                       10423 _fsqrtx_:
10424         fsqrt.x         0x4(%sp),%fp0           10424         fsqrt.x         0x4(%sp),%fp0           # fsqrt w/ ext src
10425         rts                                     10425         rts
10426                                                 10426 
10427         global          _fints_                 10427         global          _fints_
10428 _fints_:                                        10428 _fints_:
10429         fint.s          0x4(%sp),%fp0           10429         fint.s          0x4(%sp),%fp0           # fint w/ sgl src
10430         rts                                     10430         rts
10431                                                 10431 
10432         global          _fintd_                 10432         global          _fintd_
10433 _fintd_:                                        10433 _fintd_:
10434         fint.d          0x4(%sp),%fp0           10434         fint.d          0x4(%sp),%fp0           # fint w/ dbl src
10435         rts                                     10435         rts
10436                                                 10436 
10437         global          _fintx_                 10437         global          _fintx_
10438 _fintx_:                                        10438 _fintx_:
10439         fint.x          0x4(%sp),%fp0           10439         fint.x          0x4(%sp),%fp0           # fint w/ ext src
10440         rts                                     10440         rts
10441                                                 10441 
10442         global          _fintrzs_               10442         global          _fintrzs_
10443 _fintrzs_:                                      10443 _fintrzs_:
10444         fintrz.s        0x4(%sp),%fp0           10444         fintrz.s        0x4(%sp),%fp0           # fintrz w/ sgl src
10445         rts                                     10445         rts
10446                                                 10446 
10447         global          _fintrzd_               10447         global          _fintrzd_
10448 _fintrzd_:                                      10448 _fintrzd_:
10449         fintrz.d        0x4(%sp),%fp0           10449         fintrz.d        0x4(%sp),%fp0           # fintrx w/ dbl src
10450         rts                                     10450         rts
10451                                                 10451 
10452         global          _fintrzx_               10452         global          _fintrzx_
10453 _fintrzx_:                                      10453 _fintrzx_:
10454         fintrz.x        0x4(%sp),%fp0           10454         fintrz.x        0x4(%sp),%fp0           # fintrz w/ ext src
10455         rts                                     10455         rts
10456                                                 10456 
10457 ############################################    10457 ########################################################################
10458                                                 10458 
10459 ############################################    10459 #########################################################################
10460 # src_zero(): Return signed zero according t    10460 # src_zero(): Return signed zero according to sign of src operand.      #
10461 ############################################    10461 #########################################################################
10462         global          src_zero                10462         global          src_zero
10463 src_zero:                                       10463 src_zero:
10464         tst.b           SRC_EX(%a0)             10464         tst.b           SRC_EX(%a0)             # get sign of src operand
10465         bmi.b           ld_mzero                10465         bmi.b           ld_mzero                # if neg, load neg zero
10466                                                 10466 
10467 #                                               10467 #
10468 # ld_pzero(): return a positive zero.           10468 # ld_pzero(): return a positive zero.
10469 #                                               10469 #
10470         global          ld_pzero                10470         global          ld_pzero
10471 ld_pzero:                                       10471 ld_pzero:
10472         fmov.s          &0x00000000,%fp0        10472         fmov.s          &0x00000000,%fp0        # load +0
10473         mov.b           &z_bmask,FPSR_CC(%a6    10473         mov.b           &z_bmask,FPSR_CC(%a6)   # set 'Z' ccode bit
10474         rts                                     10474         rts
10475                                                 10475 
10476 # ld_mzero(): return a negative zero.           10476 # ld_mzero(): return a negative zero.
10477         global          ld_mzero                10477         global          ld_mzero
10478 ld_mzero:                                       10478 ld_mzero:
10479         fmov.s          &0x80000000,%fp0        10479         fmov.s          &0x80000000,%fp0        # load -0
10480         mov.b           &neg_bmask+z_bmask,F    10480         mov.b           &neg_bmask+z_bmask,FPSR_CC(%a6) # set 'N','Z' ccode bits
10481         rts                                     10481         rts
10482                                                 10482 
10483 ############################################    10483 #########################################################################
10484 # dst_zero(): Return signed zero according t    10484 # dst_zero(): Return signed zero according to sign of dst operand.      #
10485 ############################################    10485 #########################################################################
10486         global          dst_zero                10486         global          dst_zero
10487 dst_zero:                                       10487 dst_zero:
10488         tst.b           DST_EX(%a1)             10488         tst.b           DST_EX(%a1)             # get sign of dst operand
10489         bmi.b           ld_mzero                10489         bmi.b           ld_mzero                # if neg, load neg zero
10490         bra.b           ld_pzero                10490         bra.b           ld_pzero                # load positive zero
10491                                                 10491 
10492 ############################################    10492 #########################################################################
10493 # src_inf(): Return signed inf according to     10493 # src_inf(): Return signed inf according to sign of src operand.        #
10494 ############################################    10494 #########################################################################
10495         global          src_inf                 10495         global          src_inf
10496 src_inf:                                        10496 src_inf:
10497         tst.b           SRC_EX(%a0)             10497         tst.b           SRC_EX(%a0)             # get sign of src operand
10498         bmi.b           ld_minf                 10498         bmi.b           ld_minf                 # if negative branch
10499                                                 10499 
10500 #                                               10500 #
10501 # ld_pinf(): return a positive infinity.        10501 # ld_pinf(): return a positive infinity.
10502 #                                               10502 #
10503         global          ld_pinf                 10503         global          ld_pinf
10504 ld_pinf:                                        10504 ld_pinf:
10505         fmov.s          &0x7f800000,%fp0        10505         fmov.s          &0x7f800000,%fp0        # load +INF
10506         mov.b           &inf_bmask,FPSR_CC(%    10506         mov.b           &inf_bmask,FPSR_CC(%a6) # set 'INF' ccode bit
10507         rts                                     10507         rts
10508                                                 10508 
10509 #                                               10509 #
10510 # ld_minf():return a negative infinity.         10510 # ld_minf():return a negative infinity.
10511 #                                               10511 #
10512         global          ld_minf                 10512         global          ld_minf
10513 ld_minf:                                        10513 ld_minf:
10514         fmov.s          &0xff800000,%fp0        10514         fmov.s          &0xff800000,%fp0        # load -INF
10515         mov.b           &neg_bmask+inf_bmask    10515         mov.b           &neg_bmask+inf_bmask,FPSR_CC(%a6) # set 'N','I' ccode bits
10516         rts                                     10516         rts
10517                                                 10517 
10518 ############################################    10518 #########################################################################
10519 # dst_inf(): Return signed inf according to     10519 # dst_inf(): Return signed inf according to sign of dst operand.        #
10520 ############################################    10520 #########################################################################
10521         global          dst_inf                 10521         global          dst_inf
10522 dst_inf:                                        10522 dst_inf:
10523         tst.b           DST_EX(%a1)             10523         tst.b           DST_EX(%a1)             # get sign of dst operand
10524         bmi.b           ld_minf                 10524         bmi.b           ld_minf                 # if negative branch
10525         bra.b           ld_pinf                 10525         bra.b           ld_pinf
10526                                                 10526 
10527         global          szr_inf                 10527         global          szr_inf
10528 ############################################    10528 #################################################################
10529 # szr_inf(): Return +ZERO for a negative src    10529 # szr_inf(): Return +ZERO for a negative src operand or         #
10530 #                   +INF for a positive src     10530 #                   +INF for a positive src operand.            #
10531 #            Routine used for fetox, ftwotox    10531 #            Routine used for fetox, ftwotox, and ftentox.      #
10532 ############################################    10532 #################################################################
10533 szr_inf:                                        10533 szr_inf:
10534         tst.b           SRC_EX(%a0)             10534         tst.b           SRC_EX(%a0)             # check sign of source
10535         bmi.b           ld_pzero                10535         bmi.b           ld_pzero
10536         bra.b           ld_pinf                 10536         bra.b           ld_pinf
10537                                                 10537 
10538 ############################################    10538 #########################################################################
10539 # sopr_inf(): Return +INF for a positive src    10539 # sopr_inf(): Return +INF for a positive src operand or                 #
10540 #             jump to operand error routine     10540 #             jump to operand error routine for a negative src operand. #
10541 #             Routine used for flogn, flognp    10541 #             Routine used for flogn, flognp1, flog10, and flog2.       #
10542 ############################################    10542 #########################################################################
10543         global          sopr_inf                10543         global          sopr_inf
10544 sopr_inf:                                       10544 sopr_inf:
10545         tst.b           SRC_EX(%a0)             10545         tst.b           SRC_EX(%a0)             # check sign of source
10546         bmi.w           t_operr                 10546         bmi.w           t_operr
10547         bra.b           ld_pinf                 10547         bra.b           ld_pinf
10548                                                 10548 
10549 ############################################    10549 #################################################################
10550 # setoxm1i(): Return minus one for a negativ    10550 # setoxm1i(): Return minus one for a negative src operand or    #
10551 #             positive infinity for a positi    10551 #             positive infinity for a positive src operand.     #
10552 #             Routine used for fetoxm1.         10552 #             Routine used for fetoxm1.                         #
10553 ############################################    10553 #################################################################
10554         global          setoxm1i                10554         global          setoxm1i
10555 setoxm1i:                                       10555 setoxm1i:
10556         tst.b           SRC_EX(%a0)             10556         tst.b           SRC_EX(%a0)             # check sign of source
10557         bmi.b           ld_mone                 10557         bmi.b           ld_mone
10558         bra.b           ld_pinf                 10558         bra.b           ld_pinf
10559                                                 10559 
10560 ############################################    10560 #########################################################################
10561 # src_one(): Return signed one according to     10561 # src_one(): Return signed one according to sign of src operand.        #
10562 ############################################    10562 #########################################################################
10563         global          src_one                 10563         global          src_one
10564 src_one:                                        10564 src_one:
10565         tst.b           SRC_EX(%a0)             10565         tst.b           SRC_EX(%a0)             # check sign of source
10566         bmi.b           ld_mone                 10566         bmi.b           ld_mone
10567                                                 10567 
10568 #                                               10568 #
10569 # ld_pone(): return positive one.               10569 # ld_pone(): return positive one.
10570 #                                               10570 #
10571         global          ld_pone                 10571         global          ld_pone
10572 ld_pone:                                        10572 ld_pone:
10573         fmov.s          &0x3f800000,%fp0        10573         fmov.s          &0x3f800000,%fp0        # load +1
10574         clr.b           FPSR_CC(%a6)            10574         clr.b           FPSR_CC(%a6)
10575         rts                                     10575         rts
10576                                                 10576 
10577 #                                               10577 #
10578 # ld_mone(): return negative one.               10578 # ld_mone(): return negative one.
10579 #                                               10579 #
10580         global          ld_mone                 10580         global          ld_mone
10581 ld_mone:                                        10581 ld_mone:
10582         fmov.s          &0xbf800000,%fp0        10582         fmov.s          &0xbf800000,%fp0        # load -1
10583         mov.b           &neg_bmask,FPSR_CC(%    10583         mov.b           &neg_bmask,FPSR_CC(%a6) # set 'N' ccode bit
10584         rts                                     10584         rts
10585                                                 10585 
10586 ppiby2: long            0x3fff0000, 0xc90fda    10586 ppiby2: long            0x3fff0000, 0xc90fdaa2, 0x2168c235
10587 mpiby2: long            0xbfff0000, 0xc90fda    10587 mpiby2: long            0xbfff0000, 0xc90fdaa2, 0x2168c235
10588                                                 10588 
10589 ############################################    10589 #################################################################
10590 # spi_2(): Return signed PI/2 according to s    10590 # spi_2(): Return signed PI/2 according to sign of src operand. #
10591 ############################################    10591 #################################################################
10592         global          spi_2                   10592         global          spi_2
10593 spi_2:                                          10593 spi_2:
10594         tst.b           SRC_EX(%a0)             10594         tst.b           SRC_EX(%a0)             # check sign of source
10595         bmi.b           ld_mpi2                 10595         bmi.b           ld_mpi2
10596                                                 10596 
10597 #                                               10597 #
10598 # ld_ppi2(): return positive PI/2.              10598 # ld_ppi2(): return positive PI/2.
10599 #                                               10599 #
10600         global          ld_ppi2                 10600         global          ld_ppi2
10601 ld_ppi2:                                        10601 ld_ppi2:
10602         fmov.l          %d0,%fpcr               10602         fmov.l          %d0,%fpcr
10603         fmov.x          ppiby2(%pc),%fp0        10603         fmov.x          ppiby2(%pc),%fp0        # load +pi/2
10604         bra.w           t_pinx2                 10604         bra.w           t_pinx2                 # set INEX2
10605                                                 10605 
10606 #                                               10606 #
10607 # ld_mpi2(): return negative PI/2.              10607 # ld_mpi2(): return negative PI/2.
10608 #                                               10608 #
10609         global          ld_mpi2                 10609         global          ld_mpi2
10610 ld_mpi2:                                        10610 ld_mpi2:
10611         fmov.l          %d0,%fpcr               10611         fmov.l          %d0,%fpcr
10612         fmov.x          mpiby2(%pc),%fp0        10612         fmov.x          mpiby2(%pc),%fp0        # load -pi/2
10613         bra.w           t_minx2                 10613         bra.w           t_minx2                 # set INEX2
10614                                                 10614 
10615 ############################################    10615 ####################################################
10616 # The following routines give support for fs    10616 # The following routines give support for fsincos. #
10617 ############################################    10617 ####################################################
10618                                                 10618 
10619 #                                               10619 #
10620 # ssincosz(): When the src operand is ZERO,     10620 # ssincosz(): When the src operand is ZERO, store a one in the
10621 #             cosine register and return a Z    10621 #             cosine register and return a ZERO in fp0 w/ the same sign
10622 #             as the src operand.               10622 #             as the src operand.
10623 #                                               10623 #
10624         global          ssincosz                10624         global          ssincosz
10625 ssincosz:                                       10625 ssincosz:
10626         fmov.s          &0x3f800000,%fp1        10626         fmov.s          &0x3f800000,%fp1
10627         tst.b           SRC_EX(%a0)             10627         tst.b           SRC_EX(%a0)             # test sign
10628         bpl.b           sincoszp                10628         bpl.b           sincoszp
10629         fmov.s          &0x80000000,%fp0        10629         fmov.s          &0x80000000,%fp0        # return sin result in fp0
10630         mov.b           &z_bmask+neg_bmask,F    10630         mov.b           &z_bmask+neg_bmask,FPSR_CC(%a6)
10631         rts                                     10631         rts
10632 sincoszp:                                       10632 sincoszp:
10633         fmov.s          &0x00000000,%fp0        10633         fmov.s          &0x00000000,%fp0        # return sin result in fp0
10634         mov.b           &z_bmask,FPSR_CC(%a6    10634         mov.b           &z_bmask,FPSR_CC(%a6)
10635         rts                                     10635         rts
10636                                                 10636 
10637 #                                               10637 #
10638 # ssincosi(): When the src operand is INF, s    10638 # ssincosi(): When the src operand is INF, store a QNAN in the cosine
10639 #             register and jump to the opera    10639 #             register and jump to the operand error routine for negative
10640 #             src operands.                     10640 #             src operands.
10641 #                                               10641 #
10642         global          ssincosi                10642         global          ssincosi
10643 ssincosi:                                       10643 ssincosi:
10644         fmov.x          qnan(%pc),%fp1          10644         fmov.x          qnan(%pc),%fp1          # load NAN
10645         bra.w           t_operr                 10645         bra.w           t_operr
10646                                                 10646 
10647 #                                               10647 #
10648 # ssincosqnan(): When the src operand is a Q    10648 # ssincosqnan(): When the src operand is a QNAN, store the QNAN in the cosine
10649 #                register and branch to the     10649 #                register and branch to the src QNAN routine.
10650 #                                               10650 #
10651         global          ssincosqnan             10651         global          ssincosqnan
10652 ssincosqnan:                                    10652 ssincosqnan:
10653         fmov.x          LOCAL_EX(%a0),%fp1      10653         fmov.x          LOCAL_EX(%a0),%fp1
10654         bra.w           src_qnan                10654         bra.w           src_qnan
10655                                                 10655 
10656 ############################################    10656 ########################################################################
10657                                                 10657 
10658         global          smod_sdnrm              10658         global          smod_sdnrm
10659         global          smod_snorm              10659         global          smod_snorm
10660 smod_sdnrm:                                     10660 smod_sdnrm:
10661 smod_snorm:                                     10661 smod_snorm:
10662         mov.b           DTAG(%a6),%d1           10662         mov.b           DTAG(%a6),%d1
10663         beq.l           smod                    10663         beq.l           smod
10664         cmpi.b          %d1,&ZERO               10664         cmpi.b          %d1,&ZERO
10665         beq.w           smod_zro                10665         beq.w           smod_zro
10666         cmpi.b          %d1,&INF                10666         cmpi.b          %d1,&INF
10667         beq.l           t_operr                 10667         beq.l           t_operr
10668         cmpi.b          %d1,&DENORM             10668         cmpi.b          %d1,&DENORM
10669         beq.l           smod                    10669         beq.l           smod
10670         bra.l           dst_qnan                10670         bra.l           dst_qnan
10671                                                 10671 
10672         global          smod_szero              10672         global          smod_szero
10673 smod_szero:                                     10673 smod_szero:
10674         mov.b           DTAG(%a6),%d1           10674         mov.b           DTAG(%a6),%d1
10675         beq.l           t_operr                 10675         beq.l           t_operr
10676         cmpi.b          %d1,&ZERO               10676         cmpi.b          %d1,&ZERO
10677         beq.l           t_operr                 10677         beq.l           t_operr
10678         cmpi.b          %d1,&INF                10678         cmpi.b          %d1,&INF
10679         beq.l           t_operr                 10679         beq.l           t_operr
10680         cmpi.b          %d1,&DENORM             10680         cmpi.b          %d1,&DENORM
10681         beq.l           t_operr                 10681         beq.l           t_operr
10682         bra.l           dst_qnan                10682         bra.l           dst_qnan
10683                                                 10683 
10684         global          smod_sinf               10684         global          smod_sinf
10685 smod_sinf:                                      10685 smod_sinf:
10686         mov.b           DTAG(%a6),%d1           10686         mov.b           DTAG(%a6),%d1
10687         beq.l           smod_fpn                10687         beq.l           smod_fpn
10688         cmpi.b          %d1,&ZERO               10688         cmpi.b          %d1,&ZERO
10689         beq.l           smod_zro                10689         beq.l           smod_zro
10690         cmpi.b          %d1,&INF                10690         cmpi.b          %d1,&INF
10691         beq.l           t_operr                 10691         beq.l           t_operr
10692         cmpi.b          %d1,&DENORM             10692         cmpi.b          %d1,&DENORM
10693         beq.l           smod_fpn                10693         beq.l           smod_fpn
10694         bra.l           dst_qnan                10694         bra.l           dst_qnan
10695                                                 10695 
10696 smod_zro:                                       10696 smod_zro:
10697 srem_zro:                                       10697 srem_zro:
10698         mov.b           SRC_EX(%a0),%d1         10698         mov.b           SRC_EX(%a0),%d1         # get src sign
10699         mov.b           DST_EX(%a1),%d0         10699         mov.b           DST_EX(%a1),%d0         # get dst sign
10700         eor.b           %d0,%d1                 10700         eor.b           %d0,%d1                 # get qbyte sign
10701         andi.b          &0x80,%d1               10701         andi.b          &0x80,%d1
10702         mov.b           %d1,FPSR_QBYTE(%a6)     10702         mov.b           %d1,FPSR_QBYTE(%a6)
10703         tst.b           %d0                     10703         tst.b           %d0
10704         bpl.w           ld_pzero                10704         bpl.w           ld_pzero
10705         bra.w           ld_mzero                10705         bra.w           ld_mzero
10706                                                 10706 
10707 smod_fpn:                                       10707 smod_fpn:
10708 srem_fpn:                                       10708 srem_fpn:
10709         clr.b           FPSR_QBYTE(%a6)         10709         clr.b           FPSR_QBYTE(%a6)
10710         mov.l           %d0,-(%sp)              10710         mov.l           %d0,-(%sp)
10711         mov.b           SRC_EX(%a0),%d1         10711         mov.b           SRC_EX(%a0),%d1         # get src sign
10712         mov.b           DST_EX(%a1),%d0         10712         mov.b           DST_EX(%a1),%d0         # get dst sign
10713         eor.b           %d0,%d1                 10713         eor.b           %d0,%d1                 # get qbyte sign
10714         andi.b          &0x80,%d1               10714         andi.b          &0x80,%d1
10715         mov.b           %d1,FPSR_QBYTE(%a6)     10715         mov.b           %d1,FPSR_QBYTE(%a6)
10716         cmpi.b          DTAG(%a6),&DENORM       10716         cmpi.b          DTAG(%a6),&DENORM
10717         bne.b           smod_nrm                10717         bne.b           smod_nrm
10718         lea             DST(%a1),%a0            10718         lea             DST(%a1),%a0
10719         mov.l           (%sp)+,%d0              10719         mov.l           (%sp)+,%d0
10720         bra             t_resdnrm               10720         bra             t_resdnrm
10721 smod_nrm:                                       10721 smod_nrm:
10722         fmov.l          (%sp)+,%fpcr            10722         fmov.l          (%sp)+,%fpcr
10723         fmov.x          DST(%a1),%fp0           10723         fmov.x          DST(%a1),%fp0
10724         tst.b           DST_EX(%a1)             10724         tst.b           DST_EX(%a1)
10725         bmi.b           smod_nrm_neg            10725         bmi.b           smod_nrm_neg
10726         rts                                     10726         rts
10727                                                 10727 
10728 smod_nrm_neg:                                   10728 smod_nrm_neg:
10729         mov.b           &neg_bmask,FPSR_CC(%    10729         mov.b           &neg_bmask,FPSR_CC(%a6) # set 'N' code
10730         rts                                     10730         rts
10731                                                 10731 
10732 ############################################    10732 #########################################################################
10733         global          srem_snorm              10733         global          srem_snorm
10734         global          srem_sdnrm              10734         global          srem_sdnrm
10735 srem_sdnrm:                                     10735 srem_sdnrm:
10736 srem_snorm:                                     10736 srem_snorm:
10737         mov.b           DTAG(%a6),%d1           10737         mov.b           DTAG(%a6),%d1
10738         beq.l           srem                    10738         beq.l           srem
10739         cmpi.b          %d1,&ZERO               10739         cmpi.b          %d1,&ZERO
10740         beq.w           srem_zro                10740         beq.w           srem_zro
10741         cmpi.b          %d1,&INF                10741         cmpi.b          %d1,&INF
10742         beq.l           t_operr                 10742         beq.l           t_operr
10743         cmpi.b          %d1,&DENORM             10743         cmpi.b          %d1,&DENORM
10744         beq.l           srem                    10744         beq.l           srem
10745         bra.l           dst_qnan                10745         bra.l           dst_qnan
10746                                                 10746 
10747         global          srem_szero              10747         global          srem_szero
10748 srem_szero:                                     10748 srem_szero:
10749         mov.b           DTAG(%a6),%d1           10749         mov.b           DTAG(%a6),%d1
10750         beq.l           t_operr                 10750         beq.l           t_operr
10751         cmpi.b          %d1,&ZERO               10751         cmpi.b          %d1,&ZERO
10752         beq.l           t_operr                 10752         beq.l           t_operr
10753         cmpi.b          %d1,&INF                10753         cmpi.b          %d1,&INF
10754         beq.l           t_operr                 10754         beq.l           t_operr
10755         cmpi.b          %d1,&DENORM             10755         cmpi.b          %d1,&DENORM
10756         beq.l           t_operr                 10756         beq.l           t_operr
10757         bra.l           dst_qnan                10757         bra.l           dst_qnan
10758                                                 10758 
10759         global          srem_sinf               10759         global          srem_sinf
10760 srem_sinf:                                      10760 srem_sinf:
10761         mov.b           DTAG(%a6),%d1           10761         mov.b           DTAG(%a6),%d1
10762         beq.w           srem_fpn                10762         beq.w           srem_fpn
10763         cmpi.b          %d1,&ZERO               10763         cmpi.b          %d1,&ZERO
10764         beq.w           srem_zro                10764         beq.w           srem_zro
10765         cmpi.b          %d1,&INF                10765         cmpi.b          %d1,&INF
10766         beq.l           t_operr                 10766         beq.l           t_operr
10767         cmpi.b          %d1,&DENORM             10767         cmpi.b          %d1,&DENORM
10768         beq.l           srem_fpn                10768         beq.l           srem_fpn
10769         bra.l           dst_qnan                10769         bra.l           dst_qnan
10770                                                 10770 
10771 ############################################    10771 #########################################################################
10772                                                 10772 
10773         global          sscale_snorm            10773         global          sscale_snorm
10774         global          sscale_sdnrm            10774         global          sscale_sdnrm
10775 sscale_snorm:                                   10775 sscale_snorm:
10776 sscale_sdnrm:                                   10776 sscale_sdnrm:
10777         mov.b           DTAG(%a6),%d1           10777         mov.b           DTAG(%a6),%d1
10778         beq.l           sscale                  10778         beq.l           sscale
10779         cmpi.b          %d1,&ZERO               10779         cmpi.b          %d1,&ZERO
10780         beq.l           dst_zero                10780         beq.l           dst_zero
10781         cmpi.b          %d1,&INF                10781         cmpi.b          %d1,&INF
10782         beq.l           dst_inf                 10782         beq.l           dst_inf
10783         cmpi.b          %d1,&DENORM             10783         cmpi.b          %d1,&DENORM
10784         beq.l           sscale                  10784         beq.l           sscale
10785         bra.l           dst_qnan                10785         bra.l           dst_qnan
10786                                                 10786 
10787         global          sscale_szero            10787         global          sscale_szero
10788 sscale_szero:                                   10788 sscale_szero:
10789         mov.b           DTAG(%a6),%d1           10789         mov.b           DTAG(%a6),%d1
10790         beq.l           sscale                  10790         beq.l           sscale
10791         cmpi.b          %d1,&ZERO               10791         cmpi.b          %d1,&ZERO
10792         beq.l           dst_zero                10792         beq.l           dst_zero
10793         cmpi.b          %d1,&INF                10793         cmpi.b          %d1,&INF
10794         beq.l           dst_inf                 10794         beq.l           dst_inf
10795         cmpi.b          %d1,&DENORM             10795         cmpi.b          %d1,&DENORM
10796         beq.l           sscale                  10796         beq.l           sscale
10797         bra.l           dst_qnan                10797         bra.l           dst_qnan
10798                                                 10798 
10799         global          sscale_sinf             10799         global          sscale_sinf
10800 sscale_sinf:                                    10800 sscale_sinf:
10801         mov.b           DTAG(%a6),%d1           10801         mov.b           DTAG(%a6),%d1
10802         beq.l           t_operr                 10802         beq.l           t_operr
10803         cmpi.b          %d1,&QNAN               10803         cmpi.b          %d1,&QNAN
10804         beq.l           dst_qnan                10804         beq.l           dst_qnan
10805         bra.l           t_operr                 10805         bra.l           t_operr
10806                                                 10806 
10807 ############################################    10807 ########################################################################
10808                                                 10808 
10809         global          sop_sqnan               10809         global          sop_sqnan
10810 sop_sqnan:                                      10810 sop_sqnan:
10811         mov.b           DTAG(%a6),%d1           10811         mov.b           DTAG(%a6),%d1
10812         cmpi.b          %d1,&QNAN               10812         cmpi.b          %d1,&QNAN
10813         beq.l           dst_qnan                10813         beq.l           dst_qnan
10814         bra.l           src_qnan                10814         bra.l           src_qnan
10815                                                 10815 
10816 ############################################    10816 #########################################################################
10817 # norm(): normalize the mantissa of an exten    10817 # norm(): normalize the mantissa of an extended precision input. the    #
10818 #         input operand should not be normal    10818 #         input operand should not be normalized already.               #
10819 #                                               10819 #                                                                       #
10820 # XDEF *************************************    10820 # XDEF **************************************************************** #
10821 #       norm()                                  10821 #       norm()                                                          #
10822 #                                               10822 #                                                                       #
10823 # XREF *************************************    10823 # XREF **************************************************************** #
10824 #       none                                    10824 #       none                                                            #
10825 #                                               10825 #                                                                       #
10826 # INPUT ************************************    10826 # INPUT *************************************************************** #
10827 #       a0 = pointer fp extended precision o    10827 #       a0 = pointer fp extended precision operand to normalize         #
10828 #                                               10828 #                                                                       #
10829 # OUTPUT ***********************************    10829 # OUTPUT ************************************************************** #
10830 #       d0 = number of bit positions the man    10830 #       d0 = number of bit positions the mantissa was shifted           #
10831 #       a0 = the input operand's mantissa is    10831 #       a0 = the input operand's mantissa is normalized; the exponent   #
10832 #            is unchanged.                      10832 #            is unchanged.                                              #
10833 #                                               10833 #                                                                       #
10834 ############################################    10834 #########################################################################
10835         global          norm                    10835         global          norm
10836 norm:                                           10836 norm:
10837         mov.l           %d2, -(%sp)             10837         mov.l           %d2, -(%sp)             # create some temp regs
10838         mov.l           %d3, -(%sp)             10838         mov.l           %d3, -(%sp)
10839                                                 10839 
10840         mov.l           FTEMP_HI(%a0), %d0      10840         mov.l           FTEMP_HI(%a0), %d0      # load hi(mantissa)
10841         mov.l           FTEMP_LO(%a0), %d1      10841         mov.l           FTEMP_LO(%a0), %d1      # load lo(mantissa)
10842                                                 10842 
10843         bfffo           %d0{&0:&32}, %d2        10843         bfffo           %d0{&0:&32}, %d2        # how many places to shift?
10844         beq.b           norm_lo                 10844         beq.b           norm_lo                 # hi(man) is all zeroes!
10845                                                 10845 
10846 norm_hi:                                        10846 norm_hi:
10847         lsl.l           %d2, %d0                10847         lsl.l           %d2, %d0                # left shift hi(man)
10848         bfextu          %d1{&0:%d2}, %d3        10848         bfextu          %d1{&0:%d2}, %d3        # extract lo bits
10849                                                 10849 
10850         or.l            %d3, %d0                10850         or.l            %d3, %d0                # create hi(man)
10851         lsl.l           %d2, %d1                10851         lsl.l           %d2, %d1                # create lo(man)
10852                                                 10852 
10853         mov.l           %d0, FTEMP_HI(%a0)      10853         mov.l           %d0, FTEMP_HI(%a0)      # store new hi(man)
10854         mov.l           %d1, FTEMP_LO(%a0)      10854         mov.l           %d1, FTEMP_LO(%a0)      # store new lo(man)
10855                                                 10855 
10856         mov.l           %d2, %d0                10856         mov.l           %d2, %d0                # return shift amount
10857                                                 10857 
10858         mov.l           (%sp)+, %d3             10858         mov.l           (%sp)+, %d3             # restore temp regs
10859         mov.l           (%sp)+, %d2             10859         mov.l           (%sp)+, %d2
10860                                                 10860 
10861         rts                                     10861         rts
10862                                                 10862 
10863 norm_lo:                                        10863 norm_lo:
10864         bfffo           %d1{&0:&32}, %d2        10864         bfffo           %d1{&0:&32}, %d2        # how many places to shift?
10865         lsl.l           %d2, %d1                10865         lsl.l           %d2, %d1                # shift lo(man)
10866         add.l           &32, %d2                10866         add.l           &32, %d2                # add 32 to shft amount
10867                                                 10867 
10868         mov.l           %d1, FTEMP_HI(%a0)      10868         mov.l           %d1, FTEMP_HI(%a0)      # store hi(man)
10869         clr.l           FTEMP_LO(%a0)           10869         clr.l           FTEMP_LO(%a0)           # lo(man) is now zero
10870                                                 10870 
10871         mov.l           %d2, %d0                10871         mov.l           %d2, %d0                # return shift amount
10872                                                 10872 
10873         mov.l           (%sp)+, %d3             10873         mov.l           (%sp)+, %d3             # restore temp regs
10874         mov.l           (%sp)+, %d2             10874         mov.l           (%sp)+, %d2
10875                                                 10875 
10876         rts                                     10876         rts
10877                                                 10877 
10878 ############################################    10878 #########################################################################
10879 # unnorm_fix(): - changes an UNNORM to one o    10879 # unnorm_fix(): - changes an UNNORM to one of NORM, DENORM, or ZERO     #
10880 #               - returns corresponding opty    10880 #               - returns corresponding optype tag                      #
10881 #                                               10881 #                                                                       #
10882 # XDEF *************************************    10882 # XDEF **************************************************************** #
10883 #       unnorm_fix()                            10883 #       unnorm_fix()                                                    #
10884 #                                               10884 #                                                                       #
10885 # XREF *************************************    10885 # XREF **************************************************************** #
10886 #       norm() - normalize the mantissa         10886 #       norm() - normalize the mantissa                                 #
10887 #                                               10887 #                                                                       #
10888 # INPUT ************************************    10888 # INPUT *************************************************************** #
10889 #       a0 = pointer to unnormalized extende    10889 #       a0 = pointer to unnormalized extended precision number          #
10890 #                                               10890 #                                                                       #
10891 # OUTPUT ***********************************    10891 # OUTPUT ************************************************************** #
10892 #       d0 = optype tag - is corrected to on    10892 #       d0 = optype tag - is corrected to one of NORM, DENORM, or ZERO  #
10893 #       a0 = input operand has been converte    10893 #       a0 = input operand has been converted to a norm, denorm, or     #
10894 #            zero; both the exponent and man    10894 #            zero; both the exponent and mantissa are changed.          #
10895 #                                               10895 #                                                                       #
10896 ############################################    10896 #########################################################################
10897                                                 10897 
10898         global          unnorm_fix              10898         global          unnorm_fix
10899 unnorm_fix:                                     10899 unnorm_fix:
10900         bfffo           FTEMP_HI(%a0){&0:&32    10900         bfffo           FTEMP_HI(%a0){&0:&32}, %d0 # how many shifts are needed?
10901         bne.b           unnorm_shift            10901         bne.b           unnorm_shift            # hi(man) is not all zeroes
10902                                                 10902 
10903 #                                               10903 #
10904 # hi(man) is all zeroes so see if any bits i    10904 # hi(man) is all zeroes so see if any bits in lo(man) are set
10905 #                                               10905 #
10906 unnorm_chk_lo:                                  10906 unnorm_chk_lo:
10907         bfffo           FTEMP_LO(%a0){&0:&32    10907         bfffo           FTEMP_LO(%a0){&0:&32}, %d0 # is operand really a zero?
10908         beq.w           unnorm_zero             10908         beq.w           unnorm_zero             # yes
10909                                                 10909 
10910         add.w           &32, %d0                10910         add.w           &32, %d0                # no; fix shift distance
10911                                                 10911 
10912 #                                               10912 #
10913 # d0 = # shifts needed for complete normaliz    10913 # d0 = # shifts needed for complete normalization
10914 #                                               10914 #
10915 unnorm_shift:                                   10915 unnorm_shift:
10916         clr.l           %d1                     10916         clr.l           %d1                     # clear top word
10917         mov.w           FTEMP_EX(%a0), %d1      10917         mov.w           FTEMP_EX(%a0), %d1      # extract exponent
10918         and.w           &0x7fff, %d1            10918         and.w           &0x7fff, %d1            # strip off sgn
10919                                                 10919 
10920         cmp.w           %d0, %d1                10920         cmp.w           %d0, %d1                # will denorm push exp < 0?
10921         bgt.b           unnorm_nrm_zero         10921         bgt.b           unnorm_nrm_zero         # yes; denorm only until exp = 0
10922                                                 10922 
10923 #                                               10923 #
10924 # exponent would not go < 0. therefore, numb    10924 # exponent would not go < 0. therefore, number stays normalized
10925 #                                               10925 #
10926         sub.w           %d0, %d1                10926         sub.w           %d0, %d1                # shift exponent value
10927         mov.w           FTEMP_EX(%a0), %d0      10927         mov.w           FTEMP_EX(%a0), %d0      # load old exponent
10928         and.w           &0x8000, %d0            10928         and.w           &0x8000, %d0            # save old sign
10929         or.w            %d0, %d1                10929         or.w            %d0, %d1                # {sgn,new exp}
10930         mov.w           %d1, FTEMP_EX(%a0)      10930         mov.w           %d1, FTEMP_EX(%a0)      # insert new exponent
10931                                                 10931 
10932         bsr.l           norm                    10932         bsr.l           norm                    # normalize UNNORM
10933                                                 10933 
10934         mov.b           &NORM, %d0              10934         mov.b           &NORM, %d0              # return new optype tag
10935         rts                                     10935         rts
10936                                                 10936 
10937 #                                               10937 #
10938 # exponent would go < 0, so only denormalize    10938 # exponent would go < 0, so only denormalize until exp = 0
10939 #                                               10939 #
10940 unnorm_nrm_zero:                                10940 unnorm_nrm_zero:
10941         cmp.b           %d1, &32                10941         cmp.b           %d1, &32                # is exp <= 32?
10942         bgt.b           unnorm_nrm_zero_lrg     10942         bgt.b           unnorm_nrm_zero_lrg     # no; go handle large exponent
10943                                                 10943 
10944         bfextu          FTEMP_HI(%a0){%d1:&3    10944         bfextu          FTEMP_HI(%a0){%d1:&32}, %d0 # extract new hi(man)
10945         mov.l           %d0, FTEMP_HI(%a0)      10945         mov.l           %d0, FTEMP_HI(%a0)      # save new hi(man)
10946                                                 10946 
10947         mov.l           FTEMP_LO(%a0), %d0      10947         mov.l           FTEMP_LO(%a0), %d0      # fetch old lo(man)
10948         lsl.l           %d1, %d0                10948         lsl.l           %d1, %d0                # extract new lo(man)
10949         mov.l           %d0, FTEMP_LO(%a0)      10949         mov.l           %d0, FTEMP_LO(%a0)      # save new lo(man)
10950                                                 10950 
10951         and.w           &0x8000, FTEMP_EX(%a    10951         and.w           &0x8000, FTEMP_EX(%a0)  # set exp = 0
10952                                                 10952 
10953         mov.b           &DENORM, %d0            10953         mov.b           &DENORM, %d0            # return new optype tag
10954         rts                                     10954         rts
10955                                                 10955 
10956 #                                               10956 #
10957 # only mantissa bits set are in lo(man)         10957 # only mantissa bits set are in lo(man)
10958 #                                               10958 #
10959 unnorm_nrm_zero_lrg:                            10959 unnorm_nrm_zero_lrg:
10960         sub.w           &32, %d1                10960         sub.w           &32, %d1                # adjust shft amt by 32
10961                                                 10961 
10962         mov.l           FTEMP_LO(%a0), %d0      10962         mov.l           FTEMP_LO(%a0), %d0      # fetch old lo(man)
10963         lsl.l           %d1, %d0                10963         lsl.l           %d1, %d0                # left shift lo(man)
10964                                                 10964 
10965         mov.l           %d0, FTEMP_HI(%a0)      10965         mov.l           %d0, FTEMP_HI(%a0)      # store new hi(man)
10966         clr.l           FTEMP_LO(%a0)           10966         clr.l           FTEMP_LO(%a0)           # lo(man) = 0
10967                                                 10967 
10968         and.w           &0x8000, FTEMP_EX(%a    10968         and.w           &0x8000, FTEMP_EX(%a0)  # set exp = 0
10969                                                 10969 
10970         mov.b           &DENORM, %d0            10970         mov.b           &DENORM, %d0            # return new optype tag
10971         rts                                     10971         rts
10972                                                 10972 
10973 #                                               10973 #
10974 # whole mantissa is zero so this UNNORM is a    10974 # whole mantissa is zero so this UNNORM is actually a zero
10975 #                                               10975 #
10976 unnorm_zero:                                    10976 unnorm_zero:
10977         and.w           &0x8000, FTEMP_EX(%a    10977         and.w           &0x8000, FTEMP_EX(%a0)  # force exponent to zero
10978                                                 10978 
10979         mov.b           &ZERO, %d0              10979         mov.b           &ZERO, %d0              # fix optype tag
10980         rts                                     10980         rts
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php