Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 2 | MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP |
| 3 | M68000 Hi-Performance Microprocessor Division |
| 4 | M68060 Software Package |
| 5 | Production Release P1.00 -- October 10, 1994 |
| 6 | |
Jan Engelhardt | 96de0e2 | 2007-10-19 23:21:04 +0200 | [diff] [blame] | 7 | M68060 Software Package Copyright © 1993, 1994 Motorola Inc. All rights reserved. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 8 | |
| 9 | THE SOFTWARE is provided on an "AS IS" basis and without warranty. |
| 10 | To the maximum extent permitted by applicable law, |
| 11 | MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, |
| 12 | INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE |
| 13 | and any warranty against infringement with regard to the SOFTWARE |
| 14 | (INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials. |
| 15 | |
| 16 | To the maximum extent permitted by applicable law, |
| 17 | IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER |
| 18 | (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, |
| 19 | BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) |
| 20 | ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. |
| 21 | Motorola assumes no responsibility for the maintenance and support of the SOFTWARE. |
| 22 | |
| 23 | You are hereby granted a copyright license to use, modify, and distribute the SOFTWARE |
| 24 | so long as this entire notice is retained without alteration in any modified and/or |
| 25 | redistributed versions, and that such modified versions are clearly identified as such. |
| 26 | No licenses are granted by implication, estoppel or otherwise under any patents |
| 27 | or trademarks of Motorola, Inc. |
| 28 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 29 | |
| 30 | 68060 FLOATING-POINT SOFTWARE PACKAGE (Library version) |
| 31 | -------------------------------------------------------- |
| 32 | |
| 33 | The file fplsp.sa contains the "Library version" of the |
| 34 | 68060SP Floating-Point Software Package. The routines |
| 35 | included in this module can be used to emulate the |
| 36 | FP instructions not implemented in 68060 hardware. These |
| 37 | instructions normally take exception vector #11 |
| 38 | "FP Unimplemented Instruction". |
| 39 | |
| 40 | By re-compiling a program that uses these instructions, and |
| 41 | making subroutine calls in place of the unimplemented |
| 42 | instructions, a program can avoid the overhead associated |
| 43 | with taking the exception. |
| 44 | |
| 45 | Release file format: |
| 46 | -------------------- |
| 47 | The file fplsp.sa is essentially a hexadecimal image of the |
| 48 | release package. This is the ONLY format which will be supported. |
| 49 | The hex image was created by assembling the source code and |
| 50 | then converting the resulting binary output image into an |
| 51 | ASCII text file. The hexadecimal numbers are listed |
| 52 | using the Motorola Assembly Syntax assembler directive "dc.l" |
| 53 | (define constant longword). The file can be converted to other |
| 54 | assembly syntaxes by using any word processor with a global |
| 55 | search and replace function. |
| 56 | |
| 57 | To assist in assembling and linking this module with other modules, |
| 58 | the installer should add a symbolic label to the top of the file. |
| 59 | This will allow calling routines to access the entry points |
| 60 | of this package. |
| 61 | |
| 62 | The source code fplsp.s has also been included but only for |
| 63 | documentation purposes. |
| 64 | |
| 65 | Release file structure: |
| 66 | ----------------------- |
| 67 | The file fplsp.sa contains an "Entry-Point" section and a |
| 68 | code section. The FPLSP has no "Call-Out" section. The first section |
| 69 | is the "Entry-Point" section. In order to access a function in the |
| 70 | package, a program must "bsr" or "jsr" to the location listed |
| 71 | below in "68060FPLSP entry points" that corresponds to the desired |
| 72 | function. A branch instruction located at the selected entry point |
| 73 | within the package will then enter the correct emulation code routine. |
| 74 | |
| 75 | The entry point addresses at the beginning of the package will remain |
| 76 | fixed so that a program calling the routines will not have to be |
| 77 | re-compiled with every new 68060FPLSP release. |
| 78 | |
| 79 | There are 3 entry-points for each instruction type: single precision, |
| 80 | double precision, and extended precision. |
| 81 | |
| 82 | As an example, the "fsin" library instruction can be passed an |
| 83 | extended precision operand if program executes: |
| 84 | |
| 85 | # fsin.x fp0 |
| 86 | |
| 87 | fmovm.x &0x01,-(%sp) # pass operand on stack |
| 88 | bsr.l _060FPLSP_TOP+0x1a8 # branch to fsin routine |
| 89 | add.l &0xc,%sp # clear operand from stack |
| 90 | |
| 91 | Upon return, fp0 holds the correct result. The FPSR is |
| 92 | set correctly. The FPCR is unchanged. The FPIAR is undefined. |
| 93 | |
| 94 | Another example. This time, a dyadic operation: |
| 95 | |
| 96 | # frem.s %fp1,%fp0 |
| 97 | |
| 98 | fmov.s %fp1,-(%sp) # pass src operand |
| 99 | fmov.s %fp0,-(%sp) # pass dst operand |
| 100 | bsr.l _060FPLSP_TOP+0x168 # branch to frem routine |
| 101 | addq.l &0x8,%sp # clear operands from stack |
| 102 | |
| 103 | Again, the result is returned in fp0. Note that BOTH operands |
| 104 | are passed in single precision format. |
| 105 | |
| 106 | Exception reporting: |
| 107 | -------------------- |
| 108 | The package takes exceptions according to the FPCR value upon subroutine |
| 109 | entry. If an exception should be reported, then the package forces |
| 110 | this exception using implemented floating-point instructions. |
| 111 | For example, if the instruction being emulated should cause a |
| 112 | floating-point Operand Error exception, then the library routine |
| 113 | executes an FMUL of a zero and an infinity to force the OPERR |
| 114 | exception. Although the FPIAR will be undefined for the enabled |
| 115 | Operand Error exception handler, the user will at least be able |
| 116 | to record that the event occurred. |
| 117 | |
| 118 | Miscellaneous: |
| 119 | -------------- |
| 120 | The package does not attempt to correctly emulate instructions |
| 121 | with Signalling NAN inputs. Use of SNANs should be avoided with |
| 122 | this package. |
| 123 | |
| 124 | The fabs/fadd/fdiv/fint/fintrz/fmul/fneg/fsqrt/fsub entry points |
| 125 | are provided for the convenience of older compilers that make |
| 126 | subroutine calls for all fp instructions. The code does NOT emulate |
| 127 | the instruction but rather simply executes it. |
| 128 | |
| 129 | 68060FPLSP entry points: |
| 130 | ------------------------ |
| 131 | _060FPLSP_TOP: |
| 132 | 0x000: _060LSP__facoss_ |
| 133 | 0x008: _060LSP__facosd_ |
| 134 | 0x010: _060LSP__facosx_ |
| 135 | 0x018: _060LSP__fasins_ |
| 136 | 0x020: _060LSP__fasind_ |
| 137 | 0x028: _060LSP__fasinx_ |
| 138 | 0x030: _060LSP__fatans_ |
| 139 | 0x038: _060LSP__fatand_ |
| 140 | 0x040: _060LSP__fatanx_ |
| 141 | 0x048: _060LSP__fatanhs_ |
| 142 | 0x050: _060LSP__fatanhd_ |
| 143 | 0x058: _060LSP__fatanhx_ |
| 144 | 0x060: _060LSP__fcoss_ |
| 145 | 0x068: _060LSP__fcosd_ |
| 146 | 0x070: _060LSP__fcosx_ |
| 147 | 0x078: _060LSP__fcoshs_ |
| 148 | 0x080: _060LSP__fcoshd_ |
| 149 | 0x088: _060LSP__fcoshx_ |
| 150 | 0x090: _060LSP__fetoxs_ |
| 151 | 0x098: _060LSP__fetoxd_ |
| 152 | 0x0a0: _060LSP__fetoxx_ |
| 153 | 0x0a8: _060LSP__fetoxm1s_ |
| 154 | 0x0b0: _060LSP__fetoxm1d_ |
| 155 | 0x0b8: _060LSP__fetoxm1x_ |
| 156 | 0x0c0: _060LSP__fgetexps_ |
| 157 | 0x0c8: _060LSP__fgetexpd_ |
| 158 | 0x0d0: _060LSP__fgetexpx_ |
| 159 | 0x0d8: _060LSP__fgetmans_ |
| 160 | 0x0e0: _060LSP__fgetmand_ |
| 161 | 0x0e8: _060LSP__fgetmanx_ |
| 162 | 0x0f0: _060LSP__flog10s_ |
| 163 | 0x0f8: _060LSP__flog10d_ |
| 164 | 0x100: _060LSP__flog10x_ |
| 165 | 0x108: _060LSP__flog2s_ |
| 166 | 0x110: _060LSP__flog2d_ |
| 167 | 0x118: _060LSP__flog2x_ |
| 168 | 0x120: _060LSP__flogns_ |
| 169 | 0x128: _060LSP__flognd_ |
| 170 | 0x130: _060LSP__flognx_ |
| 171 | 0x138: _060LSP__flognp1s_ |
| 172 | 0x140: _060LSP__flognp1d_ |
| 173 | 0x148: _060LSP__flognp1x_ |
| 174 | 0x150: _060LSP__fmods_ |
| 175 | 0x158: _060LSP__fmodd_ |
| 176 | 0x160: _060LSP__fmodx_ |
| 177 | 0x168: _060LSP__frems_ |
| 178 | 0x170: _060LSP__fremd_ |
| 179 | 0x178: _060LSP__fremx_ |
| 180 | 0x180: _060LSP__fscales_ |
| 181 | 0x188: _060LSP__fscaled_ |
| 182 | 0x190: _060LSP__fscalex_ |
| 183 | 0x198: _060LSP__fsins_ |
| 184 | 0x1a0: _060LSP__fsind_ |
| 185 | 0x1a8: _060LSP__fsinx_ |
| 186 | 0x1b0: _060LSP__fsincoss_ |
| 187 | 0x1b8: _060LSP__fsincosd_ |
| 188 | 0x1c0: _060LSP__fsincosx_ |
| 189 | 0x1c8: _060LSP__fsinhs_ |
| 190 | 0x1d0: _060LSP__fsinhd_ |
| 191 | 0x1d8: _060LSP__fsinhx_ |
| 192 | 0x1e0: _060LSP__ftans_ |
| 193 | 0x1e8: _060LSP__ftand_ |
| 194 | 0x1f0: _060LSP__ftanx_ |
| 195 | 0x1f8: _060LSP__ftanhs_ |
| 196 | 0x200: _060LSP__ftanhd_ |
| 197 | 0x208: _060LSP__ftanhx_ |
| 198 | 0x210: _060LSP__ftentoxs_ |
| 199 | 0x218: _060LSP__ftentoxd_ |
| 200 | 0x220: _060LSP__ftentoxx_ |
| 201 | 0x228: _060LSP__ftwotoxs_ |
| 202 | 0x230: _060LSP__ftwotoxd_ |
| 203 | 0x238: _060LSP__ftwotoxx_ |
| 204 | |
| 205 | 0x240: _060LSP__fabss_ |
| 206 | 0x248: _060LSP__fabsd_ |
| 207 | 0x250: _060LSP__fabsx_ |
| 208 | 0x258: _060LSP__fadds_ |
| 209 | 0x260: _060LSP__faddd_ |
| 210 | 0x268: _060LSP__faddx_ |
| 211 | 0x270: _060LSP__fdivs_ |
| 212 | 0x278: _060LSP__fdivd_ |
| 213 | 0x280: _060LSP__fdivx_ |
| 214 | 0x288: _060LSP__fints_ |
| 215 | 0x290: _060LSP__fintd_ |
| 216 | 0x298: _060LSP__fintx_ |
| 217 | 0x2a0: _060LSP__fintrzs_ |
| 218 | 0x2a8: _060LSP__fintrzd_ |
| 219 | 0x2b0: _060LSP__fintrzx_ |
| 220 | 0x2b8: _060LSP__fmuls_ |
| 221 | 0x2c0: _060LSP__fmuld_ |
| 222 | 0x2c8: _060LSP__fmulx_ |
| 223 | 0x2d0: _060LSP__fnegs_ |
| 224 | 0x2d8: _060LSP__fnegd_ |
| 225 | 0x2e0: _060LSP__fnegx_ |
| 226 | 0x2e8: _060LSP__fsqrts_ |
| 227 | 0x2f0: _060LSP__fsqrtd_ |
| 228 | 0x2f8: _060LSP__fsqrtx_ |
| 229 | 0x300: _060LSP__fsubs_ |
| 230 | 0x308: _060LSP__fsubd_ |
| 231 | 0x310: _060LSP__fsubx_ |