1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
Copyright 2002, 2005 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify
it under the terms of either:
* the GNU Lesser General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your
option) any later version.
or
* the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any
later version.
or both in parallel, as here.
The GNU MP Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received copies of the GNU General Public License and the
GNU Lesser General Public License along with the GNU MP Library. If not,
see https://www.gnu.org/licenses/.
POWERPC 32-BIT MPN SUBROUTINES
This directory contains mpn functions for various 32-bit PowerPC chips.
CODE ORGANIZATION
directory used for
================================================
powerpc generic, 604, 604e, 744x, 745x
powerpc/750 740, 750, 7400, 7410
The top-level powerpc directory is currently mostly aimed at 604/604e but
should be reasonable on all powerpcs.
STATUS
The code is quite well optimized for the 604e, other chips have had less
attention.
Altivec SIMD available in 74xx might hold some promise, but unfortunately
GMP only guarantees 32-bit data alignment, so there's lots of fiddling
around with partial operations at the start and end of limb vectors. A
128-bit limb would be a novel idea, but is unlikely to be practical, since
it would have to work with ordinary +, -, * etc in the C code.
Also, Altivec isn't very well suited for the GMP multiplication needs.
Using floating-point based multiplication has much better better performance
potential for all current powerpcs, both the ones with slow integer multiply
units (603, 740, 750, 7400, 7410) and those with fast (604, 604e, 744x,
745x). This is because all powerpcs do some level of pipelining in the FPU:
603 and 750 can sustain one fmadd every 2nd cycle.
604 and 604e can sustain one fmadd per cycle.
7400 and 7410 can sustain 3 fmadd in 4 cycles.
744x and 745x can sustain 4 fmadd in 5 cycles.
REGISTER NAMES
The normal powerpc convention is to give registers as plain numbers, like
"mtctr 6", but on Apple MacOS X (powerpc*-*-rhapsody* and
powerpc*-*-darwin*) the assembler demands an "r" like "mtctr r6". Note
however when register 0 in an instruction means a literal zero the "r" is
omitted, for instance "lwzx r6,0,r7".
The GMP code uses the "r" forms, powerpc-defs.m4 transforms them to plain
numbers according to what GMP_ASM_POWERPC_R_REGISTERS finds is needed.
(Note that this style isn't fully general, as the identifier r4 and the
register r4 will not be distinguishable on some systems. However, this is
not a problem for the limited GMP assembly usage.)
GLOBAL REFERENCES
Linux non-PIC
lis 9, __gmp_binvert_limb_table@ha
rlwinm 11, 5, 31, 25, 31
la 9, __gmp_binvert_limb_table@l(9)
lbzx 11, 9, 11
Linux PIC (FIXME)
.LCL0:
.long .LCTOC1-.LCF0
bcl 20, 31, .LCF0
.LCF0:
mflr 30
lwz 7, .LCL0-.LCF0(30)
add 30, 7, 30
lwz 11, .LC0-.LCTOC1(30)
rlwinm 3, 5, 31, 25, 31
lbzx 7, 11, 3
AIX (always PIC)
LC..0:
.tc __gmp_binvert_limb_table[TC],__gmp_binvert_limb_table[RW]
lwz 9, LC..0(2)
rlwinm 0, 5, 31, 25, 31
lbzx 0, 9, 0
Darwin (non-PIC)
lis r2, ha16(___gmp_binvert_limb_table)
rlwinm r9, r5, 31, 25, 31
la r2, lo16(___gmp_binvert_limb_table)(r2)
lbzx r0, r2, r9
Darwin (PIC)
mflr r0
bcl 20, 31, L0001$pb
L0001$pb:
mflr r7
mtlr r0
addis r2, r7, ha16(L___gmp_binvert_limb_table$non_lazy_ptr-L0001$pb)
rlwinm r9, r5, 31, 25, 31
lwz r2, lo16(L___gmp_binvert_limb_table$non_lazy_ptr-L0001$pb)(r2)
lbzx r0, r2, r9
------
.non_lazy_symbol_pointer
L___gmp_binvert_limb_table$non_lazy_ptr:
.indirect_symbol ___gmp_binvert_limb_table
.long 0
.subsections_via_symbols
For GNU/Linux and Darwin, we might want to duplicate __gmp_binvert_limb_table
into the text section in this file. We should thus be able to reach it like
this:
blr L0
L0: mflr r2
rlwinm r9, r5, 31, 25, 31
addi r9, r9, lo16(local_binvert_table-L0)
lbzx r0, r2, r9
REFERENCES
PowerPC Microprocessor Family: The Programming Environments for 32-bit
Microprocessors, IBM document G522-0290-01, 2000.
PowerPC 604e RISC Microprocessor User's Manual with Supplement for PowerPC
604 Microprocessor, IBM document G552-0330-00, Freescale document
MPC604EUM/AD, 3/1998.
MPC7410/MPC7400 RISC Microprocessor User's Manual, Freescale document
MPC7400UM/D, rev 1, 11/2002.
MPC7450 RISC Microprocessor Family Reference Manual, Freescale document
MPC7450UM, rev 5, 1/2005.
The above are available online from
http://www.ibm.com/chips/techlib/techlib.nsf/productfamilies/PowerPC
http://www.freescale.com/PowerPC
----------------
Local variables:
mode: text
fill-column: 76
End:
|