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 | |
| 7 | M68060 Software Package Copyright © 1993, 1994 Motorola Inc. All rights reserved. |
| 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 | 68060 INTEGER SOFTWARE PACKAGE (Library version) |
| 30 | ------------------------------------------------- |
| 31 | |
| 32 | The file ilsp.s contains the "Library version" of the |
| 33 | 68060 Integer Software Package. Routines included in this |
| 34 | module can be used to emulate 64-bit divide and multiply, |
| 35 | and the "cmp2" instruction. These instructions are not |
| 36 | implemented in hardware on the 68060 and normally take |
| 37 | exception vector #61 "Unimplemented Integer Instruction". |
| 38 | |
| 39 | By re-compiling a program that uses these instructions, and |
| 40 | making subroutine calls in place of the unimplemented |
| 41 | instructions, a program can avoid the overhead associated with |
| 42 | taking the exception. |
| 43 | |
| 44 | Release file format: |
| 45 | -------------------- |
| 46 | The file ilsp.sa is essentially a hexadecimal image of the |
| 47 | release package. This is the ONLY format which will be supported. |
| 48 | The hex image was created by assembling the source code and |
| 49 | then converting the resulting binary output image into an |
| 50 | ASCII text file. The hexadecimal numbers are listed |
| 51 | using the Motorola Assembly Syntax assembler directive "dc.l" |
| 52 | (define constant longword). The file can be converted to other |
| 53 | assembly syntaxes by using any word processor with a global |
| 54 | search and replace function. |
| 55 | |
| 56 | To assist in assembling and linking this module with other modules, |
| 57 | the installer should add a symbolic label to the top of the file. |
| 58 | This will allow calling routines to access the entry points |
| 59 | of this package. |
| 60 | |
| 61 | The source code ilsp.s has also been included but only for |
| 62 | documentation purposes. |
| 63 | |
| 64 | Release file structure: |
| 65 | ----------------------- |
| 66 | The file ilsp.sa contains an "Entry-Point" section and a |
| 67 | code section. The ILSP has no "Call-Out" section. The first section |
| 68 | is the "Entry-Point" section. In order to access a function in the |
| 69 | package, a program must "bsr" or "jsr" to the location listed |
| 70 | below in "68060ILSP Entry Points" that corresponds to the desired |
| 71 | function. A branch instruction located at the selected entry point |
| 72 | within the package will then enter the correct emulation code routine. |
| 73 | |
| 74 | The entry point addresses at the beginning of the package will remain |
| 75 | fixed so that a program calling the routines will not have to be |
| 76 | re-compiled with every new 68060ILSP release. |
| 77 | |
| 78 | For example, to use a 64-bit multiply instruction, |
| 79 | do a "bsr" or "jsr" to the entry point defined by |
| 80 | the 060ILSP entry table. A compiler generated code sequence |
| 81 | for unsigned multiply could look like: |
| 82 | |
| 83 | # mulu.l <ea>,Dh:Dl |
| 84 | # mulu.l _multiplier,%d1:%d0 |
| 85 | |
| 86 | subq.l &0x8,%sp # make room for result on stack |
| 87 | pea (%sp) # pass: result addr on stack |
| 88 | mov.l %d0,-(%sp) # pass: multiplicand on stack |
| 89 | mov.l _multiplier,-(%sp) # pass: multiplier on stack |
| 90 | bsr.l _060LISP_TOP+0x18 # branch to multiply routine |
| 91 | add.l &0xc,%sp # clear arguments from stack |
| 92 | mov.l (%sp)+,%d1 # load result[63:32] |
| 93 | mov.l (%sp)+,%d0 # load result[31:0] |
| 94 | |
| 95 | For a divide: |
| 96 | |
| 97 | # divu.l <ea>,Dr:Dq |
| 98 | # divu.l _divisor,%d1:%d0 |
| 99 | |
| 100 | subq.l &0x8,%sp # make room for result on stack |
| 101 | pea (%sp) # pass: result addr on stack |
| 102 | mov.l %d0,-(%sp) # pass: dividend hi on stack |
| 103 | mov.l %d1,-(%sp) # pass: dividend hi on stack |
| 104 | mov.l _divisor,-(%sp) # pass: divisor on stack |
| 105 | bsr.l _060LISP_TOP+0x08 # branch to divide routine |
| 106 | add.l &0xc,%sp # clear arguments from stack |
| 107 | mov.l (%sp)+,%d1 # load remainder |
| 108 | mov.l (%sp)+,%d0 # load quotient |
| 109 | |
| 110 | The library routines also return the correct condition code |
| 111 | register value. If this is important, then the caller of the library |
| 112 | routine must make sure that the value isn't lost while popping |
| 113 | other items off of the stack. |
| 114 | |
| 115 | An example of using the "cmp2" instruction is as follows: |
| 116 | |
| 117 | # cmp2.l <ea>,Rn |
| 118 | # cmp2.l _bounds,%d0 |
| 119 | |
| 120 | pea _bounds # pass ptr to bounds |
| 121 | mov.l %d0,-(%sp) # pass Rn |
| 122 | bsr.l _060LSP_TOP_+0x48 # branch to "cmp2" routine |
| 123 | mov.w %cc,_tmp # save off condition codes |
| 124 | addq.l &0x8,%sp # clear arguments from stack |
| 125 | |
| 126 | Exception reporting: |
| 127 | -------------------- |
| 128 | If the instruction being emulated is a divide and the source |
| 129 | operand is a zero, then the library routine, as its last |
| 130 | instruction, executes an implemented divide using a zero |
| 131 | source operand so that an "Integer Divide-by-Zero" exception |
| 132 | will be taken. Although the exception stack frame will not |
| 133 | point to the correct instruction, the user will at least be able |
| 134 | to record that such an event occurred if desired. |
| 135 | |
| 136 | 68060ILSP entry points: |
| 137 | ----------------------- |
| 138 | _060ILSP_TOP: |
| 139 | 0x000: _060LSP__idivs64_ |
| 140 | 0x008: _060LSP__idivu64_ |
| 141 | |
| 142 | 0x010: _060LSP__imuls64_ |
| 143 | 0x018: _060LSP__imulu64_ |
| 144 | |
| 145 | 0x020: _060LSP__cmp2_Ab_ |
| 146 | 0x028: _060LSP__cmp2_Aw_ |
| 147 | 0x030: _060LSP__cmp2_Al_ |
| 148 | 0x038: _060LSP__cmp2_Db_ |
| 149 | 0x040: _060LSP__cmp2_Dw_ |
| 150 | 0x048: _060LSP__cmp2_Dl_ |