diff options
Diffstat (limited to 'arch/m68k/ifpsp060/ilsp.doc')
-rw-r--r-- | arch/m68k/ifpsp060/ilsp.doc | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/arch/m68k/ifpsp060/ilsp.doc b/arch/m68k/ifpsp060/ilsp.doc new file mode 100644 index 000000000000..f6fae6d900ae --- /dev/null +++ b/arch/m68k/ifpsp060/ilsp.doc | |||
@@ -0,0 +1,150 @@ | |||
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_ | ||