| 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_ |