README
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:8k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. Copyright 2000, 2001 Free Software Foundation, Inc.
  2. This file is part of the GNU MP Library.
  3. The GNU MP Library is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation; either version 3 of the License, or (at your
  6. option) any later version.
  7. The GNU MP Library is distributed in the hope that it will be useful, but
  8. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  9. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  10. License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  13. AMD K6 MPN SUBROUTINES
  14. This directory contains code optimized for AMD K6 CPUs, meaning K6, K6-2 and
  15. K6-3.
  16. The mmx subdirectory has MMX code suiting plain K6, the k62mmx subdirectory
  17. has MMX code suiting K6-2 and K6-3.  All chips in the K6 family have MMX,
  18. the separate directories are just so that ./configure can omit them if the
  19. assembler doesn't support MMX.
  20. STATUS
  21. Times for the loops, with all code and data in L1 cache, are as follows.
  22.                                  cycles/limb
  23. mpn_add_n/sub_n            3.25 normal, 2.75 in-place
  24. mpn_mul_1                  6.25
  25. mpn_add/submul_1           7.65-8.4  (varying with data values)
  26. mpn_mul_basecase           9.25 cycles/crossproduct (approx)
  27. mpn_sqr_basecase           4.7  cycles/crossproduct (approx)
  28.                                    or 9.2 cycles/triangleproduct (approx)
  29. mpn_l/rshift               3.0
  30. mpn_divrem_1              20.0
  31. mpn_mod_1                 20.0
  32. mpn_divexact_by3          11.0
  33. mpn_copyi                  1.0
  34. mpn_copyd                  1.0
  35. K6-2 and K6-3 have dual-issue MMX and get the following improvements.
  36. mpn_l/rshift               1.75
  37. Prefetching of sources hasn't yet given any joy.  With the 3DNow "prefetch"
  38. instruction, code seems to run slower, and with just "mov" loads it doesn't
  39. seem faster.  Results so far are inconsistent.  The K6 does a hardware
  40. prefetch of the second cache line in a sector, so the penalty for not
  41. prefetching in software is reduced.
  42. NOTES
  43. All K6 family chips have MMX, but only K6-2 and K6-3 have 3DNow.
  44. Plain K6 executes MMX instructions only in the X pipe, but K6-2 and K6-3 can
  45. execute them in both X and Y (and in both together).
  46. Branch misprediction penalty is 1 to 4 cycles (Optimization Manual
  47. chapter 6 table 12).
  48. Write-allocate L1 data cache means prefetching of destinations is unnecessary.
  49. Store queue is 7 entries of 64 bits each.
  50. Floating point multiplications can be done in parallel with integer
  51. multiplications, but there doesn't seem to be any way to make use of this.
  52. OPTIMIZATIONS
  53. Unrolled loops are used to reduce looping overhead.  The unrolling is
  54. configurable up to 32 limbs/loop for most routines, up to 64 for some.
  55. Sometimes computed jumps into the unrolling are used to handle sizes not a
  56. multiple of the unrolling.  An attractive feature of this is that times
  57. smoothly increase with operand size, but an indirect jump is about 6 cycles
  58. and the setups about another 6, so it depends on how much the unrolled code
  59. is faster than a simple loop as to whether a computed jump ought to be used.
  60. Position independent code is implemented using a call to get eip for
  61. computed jumps and a ret is always done, rather than an addl $4,%esp or a
  62. popl, so the CPU return address branch prediction stack stays synchronised
  63. with the actual stack in memory.  Such a call however still costs 4 to 7
  64. cycles.
  65. Branch prediction, in absence of any history, will guess forward jumps are
  66. not taken and backward jumps are taken.  Where possible it's arranged that
  67. the less likely or less important case is under a taken forward jump.
  68. MMX
  69. Putting emms or femms as late as possible in a routine seems to be fastest.
  70. Perhaps an emms or femms stalls until all outstanding MMX instructions have
  71. completed, so putting it later gives them a chance to complete on their own,
  72. in parallel with other operations (like register popping).
  73. The Optimization Manual chapter 5 recommends using a femms on K6-2 and K6-3
  74. at the start of a routine, in case it's been preceded by x87 floating point
  75. operations.  This isn't done because in gmp programs it's expected that x87
  76. floating point won't be much used and that chances are an mpn routine won't
  77. have been preceded by any x87 code.
  78. CODING
  79. Instructions in general code are shown paired if they can decode and execute
  80. together, meaning two short decode instructions with the second not
  81. depending on the first, only the first using the shifter, no more than one
  82. load, and no more than one store.
  83. K6 does some out of order execution so the pairings aren't essential, they
  84. just show what slots might be available.  When decoding is the limiting
  85. factor things can be scheduled that might not execute until later.
  86. NOTES
  87. Code alignment
  88. - if an opcode/modrm or 0Fh/opcode/modrm crosses a cache line boundary,
  89.   short decode is inhibited.  The cross.pl script detects this.
  90. - loops and branch targets should be aligned to 16 bytes, or ensure at least
  91.   2 instructions before a 32 byte boundary.  This makes use of the 16 byte
  92.   cache in the BTB.
  93. Addressing modes
  94. - (%esi) degrades decoding from short to vector.  0(%esi) doesn't have this
  95.   problem, and can be used as an equivalent, or easier is just to use a
  96.   different register, like %ebx.
  97. - K6 and pre-CXT core K6-2 have the following problem.  (K6-2 CXT and K6-3
  98.   have it fixed, these being cpuid function 1 signatures 0x588 to 0x58F).
  99.   If more than 3 bytes are needed to determine instruction length then
  100.   decoding degrades from direct to long, or from long to vector.  This
  101.   happens with forms like "0F opcode mod/rm" with mod/rm=00-xxx-100 since
  102.   with mod=00 the sib determines whether there's a displacement.
  103.   This affects all MMX and 3DNow instructions, and others with an 0F prefix,
  104.   like movzbl.  The modes affected are anything with an index and no
  105.   displacement, or an index but no base, and this includes (%esp) which is
  106.   really (,%esp,1).
  107.   The cross.pl script detects problem cases.  The workaround is to always
  108.   use a displacement, and to do this with Zdisp if it's zero so the
  109.   assembler doesn't discard it.
  110.   See Optimization Manual rev D page 67 and 3DNow Porting Guide rev B pages
  111.   13-14 and 36-37.
  112. Calls
  113. - indirect jumps and calls are not branch predicted, they measure about 6
  114.   cycles.
  115. Various
  116. - adcl      2 cycles of decode, maybe 2 cycles executing in the X pipe
  117. - bsf       12-27 cycles
  118. - emms      5 cycles
  119. - femms     3 cycles
  120. - jecxz     2 cycles taken, 13 not taken (optimization manual says 7 not taken)
  121. - divl      20 cycles back-to-back
  122. - imull     2 decode, 3 execute
  123. - mull      2 decode, 3 execute (optimization manual decoding sample)
  124. - prefetch  2 cycles
  125. - rcll/rcrl implicit by one bit: 2 cycles
  126.             immediate or %cl count: 11 + 2 per bit for dword
  127.                                     13 + 4 per bit for byte
  128. - setCC     2 cycles
  129. - xchgl %eax,reg  1.5 cycles, back-to-back (strange)
  130.         reg,reg   2 cycles, back-to-back
  131. REFERENCES
  132. "AMD-K6 Processor Code Optimization Application Note", AMD publication
  133. number 21924, revision D amendment 0, January 2000.  This describes K6-2 and
  134. K6-3.  Available on-line,
  135. http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/21924.pdf
  136. "AMD-K6 MMX Enhanced Processor x86 Code Optimization Application Note", AMD
  137. publication number 21828, revision A amendment 0, August 1997.  This is an
  138. older edition of the above document, describing plain K6.  Available
  139. on-line,
  140. http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/21828.pdf
  141. "3DNow Technology Manual", AMD publication number 21928G/0-March 2000.
  142. This describes the femms and prefetch instructions, but nothing else from
  143. 3DNow has been used.  Available on-line,
  144. http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/21928.pdf
  145. "3DNow Instruction Porting Guide", AMD publication number 22621, revision B,
  146. August 1999.  This has some notes on general K6 optimizations as well as
  147. 3DNow.  Available on-line,
  148. http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/22621.pdf
  149. ----------------
  150. Local variables:
  151. mode: text
  152. fill-column: 76
  153. End: