1 1.1.1.2 mrg Copyright 1996, 1999-2001, 2003 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 33 1.1 mrg INTEL PENTIUM P5 MPN SUBROUTINES 34 1.1 mrg 35 1.1 mrg 36 1.1 mrg This directory contains mpn functions optimized for Intel Pentium (P5,P54) 37 1.1 mrg processors. The mmx subdirectory has additional code for Pentium with MMX 38 1.1 mrg (P55). 39 1.1 mrg 40 1.1 mrg 41 1.1 mrg STATUS 42 1.1 mrg 43 1.1 mrg cycles/limb 44 1.1 mrg 45 1.1 mrg mpn_add_n/sub_n 2.375 46 1.1 mrg 47 1.1 mrg mpn_mul_1 12.0 48 1.1 mrg mpn_add/submul_1 14.0 49 1.1 mrg 50 1.1 mrg mpn_mul_basecase 14.2 cycles/crossproduct (approx) 51 1.1 mrg 52 1.1 mrg mpn_sqr_basecase 8 cycles/crossproduct (approx) 53 1.1 mrg or 15.5 cycles/triangleproduct (approx) 54 1.1 mrg 55 1.1 mrg mpn_l/rshift 5.375 normal (6.0 on P54) 56 1.1 mrg 1.875 special shift by 1 bit 57 1.1 mrg 58 1.1 mrg mpn_divrem_1 44.0 59 1.1 mrg mpn_mod_1 28.0 60 1.1 mrg mpn_divexact_by3 15.0 61 1.1 mrg 62 1.1 mrg mpn_copyi/copyd 1.0 63 1.1 mrg 64 1.1 mrg Pentium MMX gets the following improvements 65 1.1 mrg 66 1.1 mrg mpn_l/rshift 1.75 67 1.1 mrg 68 1.1 mrg mpn_mul_1 12.0 normal, 7.0 for 16-bit multiplier 69 1.1 mrg 70 1.1 mrg 71 1.1 mrg mpn_add_n and mpn_sub_n run at asymptotically 2 cycles/limb. Due to loop 72 1.1 mrg overhead and other delays (cache refill?), they run at or near 2.5 73 1.1 mrg cycles/limb. 74 1.1 mrg 75 1.1 mrg mpn_mul_1, mpn_addmul_1, mpn_submul_1 all run 1 cycle faster than they 76 1.1 mrg should. Intel documentation says a mul instruction is 10 cycles, but it 77 1.1 mrg measures 9 and the routines using it run as 9. 78 1.1 mrg 79 1.1 mrg 80 1.1 mrg 81 1.1 mrg P55 MMX AND X87 82 1.1 mrg 83 1.1 mrg The cost of switching between MMX and x87 floating point on P55 is about 100 84 1.1 mrg cycles (fld1/por/emms for instance). In order to avoid that the two aren't 85 1.1 mrg mixed and currently that means using MMX and not x87. 86 1.1 mrg 87 1.1 mrg MMX offers a big speedup for lshift and rshift, and a nice speedup for 88 1.1 mrg 16-bit multipliers in mpn_mul_1. If fast code using x87 is found then 89 1.1 mrg perhaps the preference for MMX will be reversed. 90 1.1 mrg 91 1.1 mrg 92 1.1 mrg 93 1.1 mrg 94 1.1 mrg P54 SHLDL 95 1.1 mrg 96 1.1 mrg mpn_lshift and mpn_rshift run at about 6 cycles/limb on P5 and P54, but the 97 1.1 mrg documentation indicates that they should take only 43/8 = 5.375 cycles/limb, 98 1.1 mrg or 5 cycles/limb asymptotically. The P55 runs them at the expected speed. 99 1.1 mrg 100 1.1 mrg It seems that on P54 a shldl or shrdl allows pairing in one following cycle, 101 1.1 mrg but not two. For example, back to back repetitions of the following 102 1.1 mrg 103 1.1 mrg shldl( %cl, %eax, %ebx) 104 1.1 mrg xorl %edx, %edx 105 1.1 mrg xorl %esi, %esi 106 1.1 mrg 107 1.1 mrg run at 5 cycles, as expected, but repetitions of the following run at 7 108 1.1 mrg cycles, whereas 6 would be expected (and is achieved on P55), 109 1.1 mrg 110 1.1 mrg shldl( %cl, %eax, %ebx) 111 1.1 mrg xorl %edx, %edx 112 1.1 mrg xorl %esi, %esi 113 1.1 mrg xorl %edi, %edi 114 1.1 mrg xorl %ebp, %ebp 115 1.1 mrg 116 1.1 mrg Three xorls run at 7 cycles too, so it doesn't seem to be just that pairing 117 1.1 mrg inhibited is only in the second following cycle (or something like that). 118 1.1 mrg 119 1.1 mrg Avoiding this problem would bring P54 shifts down from 6.0 c/l to 5.5 with a 120 1.1 mrg pattern of shift, 2 loads, shift, 2 stores, shift, etc. A start has been 121 1.1 mrg made on something like that, but it's not yet complete. 122 1.1 mrg 123 1.1 mrg 124 1.1 mrg 125 1.1 mrg 126 1.1 mrg OTHER NOTES 127 1.1 mrg 128 1.1 mrg Prefetching Destinations 129 1.1 mrg 130 1.1 mrg Pentium doesn't allocate cache lines on writes, unlike most other modern 131 1.1 mrg processors. Since the functions in the mpn class do array writes, we 132 1.1 mrg have to handle allocating the destination cache lines by reading a word 133 1.1 mrg from it in the loops, to achieve the best performance. 134 1.1 mrg 135 1.1 mrg Prefetching Sources 136 1.1 mrg 137 1.1 mrg Prefetching of sources is pointless since there's no out-of-order loads. 138 1.1 mrg Any load instruction blocks until the line is brought to L1, so it may 139 1.1 mrg as well be the load that wants the data which blocks. 140 1.1 mrg 141 1.1 mrg Data Cache Bank Clashes 142 1.1 mrg 143 1.1 mrg Pairing of memory operations requires that the two issued operations 144 1.1 mrg refer to different cache banks (ie. different addresses modulo 32 145 1.1 mrg bytes). The simplest way to ensure this is to read/write two words from 146 1.1 mrg the same object. If we make operations on different objects, they might 147 1.1 mrg or might not be to the same cache bank. 148 1.1 mrg 149 1.1 mrg PIC %eip Fetching 150 1.1 mrg 151 1.1 mrg A simple call $+5 and popl can be used to get %eip, there's no need to 152 1.1 mrg balance calls and returns since P5 doesn't have any return stack branch 153 1.1 mrg prediction. 154 1.1 mrg 155 1.1 mrg Float Multiplies 156 1.1 mrg 157 1.1 mrg fmul is pairable and can be issued every 2 cycles (with a 4 cycle 158 1.1 mrg latency for data ready to use). This is a lot better than integer mull 159 1.1 mrg or imull at 9 cycles non-pairing. Unfortunately the advantage is 160 1.1 mrg quickly eaten away by needing to throw data through memory back to the 161 1.1 mrg integer registers to adjust for fild and fist being signed, and to do 162 1.1 mrg things like propagating carry bits. 163 1.1 mrg 164 1.1 mrg 165 1.1 mrg 166 1.1 mrg 167 1.1 mrg 168 1.1 mrg REFERENCES 169 1.1 mrg 170 1.1 mrg "Intel Architecture Optimization Manual", 1997, order number 242816. This 171 1.1 mrg is mostly about P5, the parts about P6 aren't relevant. Available on-line: 172 1.1 mrg 173 1.1 mrg http://download.intel.com/design/PentiumII/manuals/242816.htm 174 1.1 mrg 175 1.1 mrg 176 1.1 mrg 177 1.1 mrg ---------------- 178 1.1 mrg Local variables: 179 1.1 mrg mode: text 180 1.1 mrg fill-column: 76 181 1.1 mrg End: 182