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

数学计算

开发平台:

Unix_Linux

  1. Copyright 2002, 2005 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.                     POWERPC 32-BIT MPN SUBROUTINES
  14. This directory contains mpn functions for various 32-bit PowerPC chips.
  15. CODE ORGANIZATION
  16. directory   used for
  17. ================================================
  18. powerpc           generic, 604, 604e, 744x, 745x
  19. powerpc/750       740, 750, 7400, 7410
  20. The top-level powerpc directory is currently mostly aimed at 604/604e but
  21. should be reasonable on all powerpcs.
  22. STATUS
  23. The code is quite well optimized for the 604e, other chips have had less
  24. attention.
  25. Altivec SIMD available in 74xx might hold some promise, but unfortunately
  26. GMP only guarantees 32-bit data alignment, so there's lots of fiddling
  27. around with partial operations at the start and end of limb vectors.  A
  28. 128-bit limb would be a novel idea, but is unlikely to be practical, since
  29. it would have to work with ordinary +, -, * etc in the C code.
  30. Also, Altivec isn't very well suited for the GMP multiplication needs.
  31. Using floating-point based multiplication has much better better performance
  32. potential for all current powerpcs, both the ones with slow integer multiply
  33. units (603, 740, 750, 7400, 7410) and those with fast (604, 604e, 744x,
  34. 745x).  This is because all powerpcs do some level of pipelining in the FPU:
  35. 603 and 750 can sustain one fmadd every 2nd cycle.
  36. 604 and 604e can sustain one fmadd per cycle.
  37. 7400 and 7410 can sustain 3 fmadd in 4 cycles.
  38. 744x and 745x can sustain 4 fmadd in 5 cycles.
  39. REGISTER NAMES
  40. The normal powerpc convention is to give registers as plain numbers, like
  41. "mtctr 6", but on Apple MacOS X (powerpc*-*-rhapsody* and
  42. powerpc*-*-darwin*) the assembler demands an "r" like "mtctr r6".  Note
  43. however when register 0 in an instruction means a literal zero the "r" is
  44. omitted, for instance "lwzx r6,0,r7".
  45. The GMP code uses the "r" forms, powerpc-defs.m4 transforms them to plain
  46. numbers according to what GMP_ASM_POWERPC_R_REGISTERS finds is needed.
  47. (Note that this style isn't fully general, as the identifier r4 and the
  48. register r4 will not be distinguishable on some systems.  However, this is
  49. not a problem for the limited GMP assembly usage.)
  50. GLOBAL REFERENCES
  51. Linux non-PIC
  52. lis 9, __gmp_binvert_limb_table@ha
  53. rlwinm 11, 5, 31, 25, 31
  54. la 9, __gmp_binvert_limb_table@l(9)
  55. lbzx 11, 9, 11
  56. Linux PIC (FIXME)
  57. .LCL0:
  58. .long .LCTOC1-.LCF0
  59. bcl 20, 31, .LCF0
  60. .LCF0:
  61. mflr 30
  62. lwz 7, .LCL0-.LCF0(30)
  63. add 30, 7, 30
  64. lwz 11, .LC0-.LCTOC1(30)
  65. rlwinm 3, 5, 31, 25, 31
  66. lbzx 7, 11, 3
  67. AIX (always PIC)
  68. LC..0:
  69. .tc __gmp_binvert_limb_table[TC],__gmp_binvert_limb_table[RW]
  70. lwz 9, LC..0(2)
  71. rlwinm 0, 5, 31, 25, 31
  72. lbzx 0, 9, 0
  73. Darwin (non-PIC)
  74. lis r2, ha16(___gmp_binvert_limb_table)
  75. rlwinm r9, r5, 31, 25, 31
  76. la r2, lo16(___gmp_binvert_limb_table)(r2)
  77. lbzx r0, r2, r9
  78. Darwin (PIC)
  79. mflr r0
  80. bcl 20, 31, L0001$pb
  81. L0001$pb:
  82. mflr r7
  83. mtlr r0
  84. addis r2, r7, ha16(L___gmp_binvert_limb_table$non_lazy_ptr-L0001$pb)
  85. rlwinm r9, r5, 31, 25, 31
  86. lwz r2, lo16(L___gmp_binvert_limb_table$non_lazy_ptr-L0001$pb)(r2)
  87. lbzx r0, r2, r9
  88. ------
  89. .non_lazy_symbol_pointer
  90. L___gmp_binvert_limb_table$non_lazy_ptr:
  91. .indirect_symbol ___gmp_binvert_limb_table
  92. .long 0
  93. .subsections_via_symbols
  94. For GNU/Linux and Darwin, we might want to duplicate __gmp_binvert_limb_table
  95. into the text section in this file.  We should thus be able to reach it like
  96. this:
  97. blr L0
  98. L0: mflr r2
  99. rlwinm r9, r5, 31, 25, 31
  100. addi r9, r9, lo16(local_binvert_table-L0)
  101. lbzx r0, r2, r9
  102. REFERENCES
  103. PowerPC Microprocessor Family: The Programming Environments for 32-bit
  104. Microprocessors, IBM document G522-0290-01, 2000.
  105. PowerPC 604e RISC Microprocessor User's Manual with Supplement for PowerPC
  106. 604 Microprocessor, IBM document G552-0330-00, Freescale document
  107. MPC604EUM/AD, 3/1998.
  108. MPC7410/MPC7400 RISC Microprocessor User's Manual, Freescale document
  109. MPC7400UM/D, rev 1, 11/2002.
  110. MPC7450 RISC Microprocessor Family Reference Manual, Freescale document
  111. MPC7450UM, rev 5, 1/2005.
  112. The above are available online from
  113. http://www.ibm.com/chips/techlib/techlib.nsf/productfamilies/PowerPC
  114. http://www.freescale.com/PowerPC
  115. ----------------
  116. Local variables:
  117. mode: text
  118. fill-column: 76
  119. End: