README revision 1.1.1.2 1 1.1 mrg Copyright 2000, 2001 Free Software Foundation, Inc.
2 1.1 mrg
3 1.1 mrg This file is part of the GNU MP Library.
4 1.1 mrg
5 1.1 mrg The GNU MP Library is free software; you can redistribute it and/or modify
6 1.1.1.2 mrg it under the terms of either:
7 1.1.1.2 mrg
8 1.1.1.2 mrg * the GNU Lesser General Public License as published by the Free
9 1.1.1.2 mrg Software Foundation; either version 3 of the License, or (at your
10 1.1.1.2 mrg option) any later version.
11 1.1.1.2 mrg
12 1.1.1.2 mrg or
13 1.1.1.2 mrg
14 1.1.1.2 mrg * the GNU General Public License as published by the Free Software
15 1.1.1.2 mrg Foundation; either version 2 of the License, or (at your option) any
16 1.1.1.2 mrg later version.
17 1.1.1.2 mrg
18 1.1.1.2 mrg or both in parallel, as here.
19 1.1 mrg
20 1.1 mrg The GNU MP Library is distributed in the hope that it will be useful, but
21 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
22 1.1.1.2 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23 1.1.1.2 mrg for more details.
24 1.1 mrg
25 1.1.1.2 mrg You should have received copies of the GNU General Public License and the
26 1.1.1.2 mrg GNU Lesser General Public License along with the GNU MP Library. If not,
27 1.1.1.2 mrg see https://www.gnu.org/licenses/.
28 1.1 mrg
29 1.1 mrg
30 1.1 mrg
31 1.1 mrg
32 1.1 mrg AMD K7 MPN SUBROUTINES
33 1.1 mrg
34 1.1 mrg
35 1.1 mrg This directory contains code optimized for the AMD Athlon CPU.
36 1.1 mrg
37 1.1 mrg The mmx subdirectory has routines using MMX instructions. All Athlons have
38 1.1 mrg MMX, the separate directory is just so that configure can omit it if the
39 1.1 mrg assembler doesn't support MMX.
40 1.1 mrg
41 1.1 mrg
42 1.1 mrg
43 1.1 mrg STATUS
44 1.1 mrg
45 1.1 mrg Times for the loops, with all code and data in L1 cache.
46 1.1 mrg
47 1.1 mrg cycles/limb
48 1.1 mrg mpn_add/sub_n 1.6
49 1.1 mrg
50 1.1 mrg mpn_copyi 0.75 or 1.0 \ varying with data alignment
51 1.1 mrg mpn_copyd 0.75 or 1.0 /
52 1.1 mrg
53 1.1 mrg mpn_divrem_1 17.0 integer part, 15.0 fractional part
54 1.1 mrg mpn_mod_1 17.0
55 1.1 mrg mpn_divexact_by3 8.0
56 1.1 mrg
57 1.1 mrg mpn_l/rshift 1.2
58 1.1 mrg
59 1.1 mrg mpn_mul_1 3.4
60 1.1 mrg mpn_addmul/submul_1 3.9
61 1.1 mrg
62 1.1 mrg mpn_mul_basecase 4.42 cycles/crossproduct (approx)
63 1.1 mrg mpn_sqr_basecase 2.3 cycles/crossproduct (approx)
64 1.1 mrg or 4.55 cycles/triangleproduct (approx)
65 1.1 mrg
66 1.1 mrg Prefetching of sources hasn't yet been tried.
67 1.1 mrg
68 1.1 mrg
69 1.1 mrg
70 1.1 mrg NOTES
71 1.1 mrg
72 1.1 mrg cmov, MMX, 3DNow and some extensions to MMX and 3DNow are available.
73 1.1 mrg
74 1.1 mrg Write-allocate L1 data cache means prefetching of destinations is unnecessary.
75 1.1 mrg
76 1.1 mrg Floating point multiplications can be done in parallel with integer
77 1.1 mrg multiplications, but there doesn't seem to be any way to make use of this.
78 1.1 mrg
79 1.1 mrg Unsigned "mul"s can be issued every 3 cycles. This suggests 3 is a limit on
80 1.1 mrg the speed of the multiplication routines. The documentation shows mul
81 1.1 mrg executing in IEU0 (or maybe in IEU0 and IEU1 together), so it might be that,
82 1.1 mrg to get near 3 cycles code has to be arranged so that nothing else is issued
83 1.1 mrg to IEU0. A busy IEU0 could explain why some code takes 4 cycles and other
84 1.1 mrg apparently equivalent code takes 5.
85 1.1 mrg
86 1.1 mrg
87 1.1 mrg
88 1.1 mrg OPTIMIZATIONS
89 1.1 mrg
90 1.1 mrg Unrolled loops are used to reduce looping overhead. The unrolling is
91 1.1 mrg configurable up to 32 limbs/loop for most routines and up to 64 for some.
92 1.1 mrg The K7 has 64k L1 code cache so quite big unrolling is allowable.
93 1.1 mrg
94 1.1 mrg Computed jumps into the unrolling are used to handle sizes not a multiple of
95 1.1 mrg the unrolling. An attractive feature of this is that times increase
96 1.1 mrg smoothly with operand size, but it may be that some routines should just
97 1.1 mrg have simple loops to finish up, especially when PIC adds between 2 and 16
98 1.1 mrg cycles to get %eip.
99 1.1 mrg
100 1.1 mrg Position independent code is implemented using a call to get %eip for the
101 1.1 mrg computed jumps and a ret is always done, rather than an addl $4,%esp or a
102 1.1 mrg popl, so the CPU return address branch prediction stack stays synchronised
103 1.1 mrg with the actual stack in memory.
104 1.1 mrg
105 1.1 mrg Branch prediction, in absence of any history, will guess forward jumps are
106 1.1 mrg not taken and backward jumps are taken. Where possible it's arranged that
107 1.1 mrg the less likely or less important case is under a taken forward jump.
108 1.1 mrg
109 1.1 mrg
110 1.1 mrg
111 1.1 mrg CODING
112 1.1 mrg
113 1.1 mrg Instructions in general code have been shown grouped if they can execute
114 1.1 mrg together, which means up to three direct-path instructions which have no
115 1.1 mrg successive dependencies. K7 always decodes three and has out-of-order
116 1.1 mrg execution, but the groupings show what slots might be available and what
117 1.1 mrg dependency chains exist.
118 1.1 mrg
119 1.1 mrg When there's vector-path instructions an effort is made to get triplets of
120 1.1 mrg direct-path instructions in between them, even if there's dependencies,
121 1.1 mrg since this maximizes decoding throughput and might save a cycle or two if
122 1.1 mrg decoding is the limiting factor.
123 1.1 mrg
124 1.1 mrg
125 1.1 mrg
126 1.1 mrg INSTRUCTIONS
127 1.1 mrg
128 1.1 mrg adcl direct
129 1.1 mrg divl 39 cycles back-to-back
130 1.1 mrg lodsl,etc vector
131 1.1 mrg loop 1 cycle vector (decl/jnz opens up one decode slot)
132 1.1 mrg movd reg vector
133 1.1 mrg movd mem direct
134 1.1 mrg mull issue every 3 cycles, latency 4 cycles low word, 6 cycles high word
135 1.1 mrg popl vector (use movl for more than one pop)
136 1.1 mrg pushl direct, will pair with a load
137 1.1 mrg shrdl %cl vector, 3 cycles, seems to be 3 decode too
138 1.1 mrg xorl r,r false read dependency recognised
139 1.1 mrg
140 1.1 mrg
141 1.1 mrg
142 1.1 mrg REFERENCES
143 1.1 mrg
144 1.1 mrg "AMD Athlon Processor X86 Code Optimization Guide", AMD publication number
145 1.1 mrg 22007, revision K, February 2002. Available on-line,
146 1.1 mrg
147 1.1 mrg http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/22007.pdf
148 1.1 mrg
149 1.1 mrg "3DNow Technology Manual", AMD publication number 21928G/0-March 2000.
150 1.1 mrg This describes the femms and prefetch instructions. Available on-line,
151 1.1 mrg
152 1.1 mrg http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/21928.pdf
153 1.1 mrg
154 1.1 mrg "AMD Extensions to the 3DNow and MMX Instruction Sets Manual", AMD
155 1.1 mrg publication number 22466, revision D, March 2000. This describes
156 1.1 mrg instructions added in the Athlon processor, such as pswapd and the extra
157 1.1 mrg prefetch forms. Available on-line,
158 1.1 mrg
159 1.1 mrg http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/22466.pdf
160 1.1 mrg
161 1.1 mrg "3DNow Instruction Porting Guide", AMD publication number 22621, revision B,
162 1.1 mrg August 1999. This has some notes on general Athlon optimizations as well as
163 1.1 mrg 3DNow. Available on-line,
164 1.1 mrg
165 1.1 mrg http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/22621.pdf
166 1.1 mrg
167 1.1 mrg
168 1.1 mrg
169 1.1 mrg
170 1.1 mrg ----------------
171 1.1 mrg Local variables:
172 1.1 mrg mode: text
173 1.1 mrg fill-column: 76
174 1.1 mrg End:
175