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

数学计算

开发平台:

Unix_Linux

  1. Copyright 1997, 1999, 2000, 2001, 2002 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. This directory contains mpn functions for 64-bit V9 SPARC
  14. RELEVANT OPTIMIZATION ISSUES
  15. Notation:
  16.   IANY = shift/add/sub/logical/sethi
  17.   IADDLOG = add/sub/logical/sethi
  18.   MEM = ld*/st*
  19.   FA = fadd*/fsub*/f*to*/fmov*
  20.   FM = fmul*
  21. UltraSPARC can issue four instructions per cycle, with these restrictions:
  22. * Two IANY instructions, but only one of these may be a shift.  If there is a
  23.   shift and an IANY instruction, the shift must precede the IANY instruction.
  24. * One FA.
  25. * One FM.
  26. * One branch.
  27. * One MEM.
  28. * IANY/IADDLOG/MEM must be insn 1, 2, or 3 in an issue bundle.  Taken branches
  29.   should not be in slot 4, since that makes the delay insn come from separate
  30.   bundle.
  31. * If two IANY/IADDLOG instructions are to be executed in the same cycle and one
  32.   of these is setting the condition codes, that instruction must be the second
  33.   one.
  34. To summarize, ignoring branches, these are the bundles that can reach the peak
  35. execution speed:
  36. insn1 iany iany mem iany iany mem iany iany mem
  37. insn2 iaddlog mem iany mem iaddlog iany mem iaddlog iany
  38. insn3 mem iaddlog iaddlog fa fa fa fm fm fm
  39. insn4 fa/fm fa/fm fa/fm fm fm fm fa fa fa
  40. The 64-bit integer multiply instruction mulx takes from 5 cycles to 35 cycles,
  41. depending on the position of the most significant bit of the first source
  42. operand.  When used for 32x32->64 multiplication, it needs 20 cycles.
  43. Furthermore, it stalls the processor while executing.  We stay away from that
  44. instruction, and instead use floating-point operations.
  45. Floating-point add and multiply units are fully pipelined.  The latency for
  46. UltraSPARC-1/2 is 3 cycles and for UltraSPARC-3 it is 4 cycles.
  47. Integer conditional move instructions cannot dual-issue with other integer
  48. instructions.  No conditional move can issue 1-5 cycles after a load.  (This
  49. might have been fixed for UltraSPARC-3.)
  50. The UltraSPARC-3 pipeline is very simular to he one of UltraSPARC-1/2 , but is
  51. somewhat slower.  Branches execute slower, and there may be other new stalls.
  52. But integer multiply doesn't stall the entire CPU and also has a much lower
  53. latency.  But it's still not pipelined, and thus useless for our needs.
  54. STATUS
  55. * mpn_lshift, mpn_rshift: The current code runs at 2.0 cycles/limb on
  56.   UltraSPARC-1/2 and 2.65 on UltraSPARC-3.  For UltraSPARC-1/2, the IEU0
  57.   functional unit is saturated with shifts.
  58. * mpn_add_n, mpn_sub_n: The current code runs at 4 cycles/limb on
  59.   UltraSPARC-1/2 and 4.5 cycles/limb on UltraSPARC-3.  The 4 instruction
  60.   recurrency is the speed limiter.
  61. * mpn_addmul_1: The current code runs at 14 cycles/limb asymptotically on
  62.   UltraSPARC-1/2 and 17.5 cycles/limb on UltraSPARC-3.  On UltraSPARC-1/2, the
  63.   code sustains 4 instructions/cycle.  It might be possible to invent a better
  64.   way of summing the intermediate 49-bit operands, but it is unlikely that it
  65.   will save enough instructions to save an entire cycle.
  66.   The load-use of the u operand is not enough scheduled for good L2 cache
  67.   performance.  The UltraSPARC-1/2 L1 cache is direct mapped, and since we use
  68.   temporary stack slots that will conflict with the u and r operands, we miss
  69.   to L2 very often.  The load-use of the std/ldx pairs via the stack are
  70.   perhaps over-scheduled.
  71.   It would be possible to save two instructions: (1) The mov could be avoided
  72.   if the std/ldx were less scheduled.  (2) The ldx of the r operand could be
  73.   split into two ld instructions, saving the shifts/masks.
  74.   It should be possible to reach 14 cycles/limb for UltraSPARC-3 if the fp
  75.   operations where rescheduled for this processor's 4-cycle latency.
  76. * mpn_mul_1: The current code is a straightforward edit of the mpn_addmul_1
  77.   code.  It would be possible to shave one or two cycles from it, with some
  78.   labour.
  79. * mpn_submul_1: Simpleminded code just calling mpn_mul_1 + mpn_sub_n.  This
  80.   means that it runs at 18 cycles/limb on UltraSPARC-1/2 and 23 cycles/limb on
  81.   UltraSPARC-3.  It would be possible to either match the mpn_addmul_1
  82.   performance, or in the worst case use one more instruction group.
  83. * US1/US2 cache conflict resolving.  The direct mapped L1 date cache of US1/US2
  84.   is a problem for mul_1, addmul_1 (and a prospective submul_1).  We should
  85.   allocate a larger cache area, and put the stack temp area in a place that
  86.   doesn't cause cache conflicts.