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

数学计算

开发平台:

Unix_Linux

  1. dnl  PowerPC-64 mpn_add_n/mpn_sub_n -- mpn addition and subtraction.
  2. dnl  Copyright 1999, 2000, 2001, 2003, 2004, 2005, 2007 Free Software
  3. dnl  Foundation, Inc.
  4. dnl  This file is part of the GNU MP Library.
  5. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  6. dnl  it under the terms of the GNU Lesser General Public License as published
  7. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  8. dnl  your option) any later version.
  9. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  10. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. dnl  License for more details.
  13. dnl  You should have received a copy of the GNU Lesser General Public License
  14. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  15. include(`../config.m4')
  16. C cycles/limb
  17. C POWER3/PPC630:     1.5
  18. C POWER4/PPC970:     2
  19. C   n    POWER3/PPC630   POWER4/PPC970
  20. C     1        17.00        19.00
  21. C     2 9.00        10.49
  22. C     3 5.33 7.66
  23. C     4 4.50 5.14
  24. C     5 4.20 4.80
  25. C     6 3.83 4.33
  26. C     7 3.00 3.99
  27. C     8 2.87 3.55
  28. C     9 2.89 3.40
  29. C    10 2.60 3.42
  30. C    11 2.45 3.15
  31. C    12 2.41 2.99
  32. C    13 2.46 3.01
  33. C    14 2.42 2.97
  34. C    15 2.20 2.85
  35. C    50 1.78 2.44
  36. C   100 1.83 2.20
  37. C   200 1.55 2.12
  38. C   400 1.53 2.05
  39. C  1000 1.98 2.02#
  40. C  2000 1.50# 2.04
  41. C  4000 2.55 2.50
  42. C  8000 2.70 2.45
  43. C 16000 2.65 5.94
  44. C 32000 2.62        16.41
  45. C 64000 2.73        18.94
  46. C This code is a little bit slower for POWER3/PPC630 than the simple code used
  47. C previously, but it is much faster for POWER4/PPC970.  The reason for the
  48. C POWER3/PPC630 slowdown can be attributed to the saving and restoring of 4
  49. C registers.
  50. C INPUT PARAMETERS
  51. C rp r3
  52. C up r4
  53. C vp r5
  54. C n r6
  55. ifdef(`OPERATION_add_n',`
  56.   define(ADDSUBC, adde)
  57.   define(ADDSUB, addc)
  58.   define(func, mpn_add_n)
  59.   define(func_nc, mpn_add_nc)
  60.   define(GENRVAL, `addi r3, r3, 1')
  61.   define(SETCBR, `addic r0, $1, -1')
  62.   define(CLRCB, `addic r0, r0, 0')
  63. ')
  64. ifdef(`OPERATION_sub_n',`
  65.   define(ADDSUBC, subfe)
  66.   define(ADDSUB, subfc)
  67.   define(func, mpn_sub_n)
  68.   define(func_nc, mpn_sub_nc)
  69.   define(GENRVAL, `neg r3, r3')
  70.   define(SETCBR, `subfic r0, $1, 0')
  71.   define(CLRCB, `addic r0, r1, -1')
  72. ')
  73. MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc)
  74. ASM_START()
  75. PROLOGUE(func_nc)
  76. SETCBR(r7)
  77. b L(ent)
  78. EPILOGUE()
  79. PROLOGUE(func)
  80. CLRCB
  81. L(ent): std r31, -8(r1)
  82. std r30, -16(r1)
  83. std r29, -24(r1)
  84. std r28, -32(r1)
  85. rldicl. r0, r6, 0,62 C r0 = n & 3, set cr0
  86. cmpdi cr6, r0, 2
  87. addi r6, r6, 3 C compute count...
  88. srdi r6, r6, 2 C ...for ctr
  89. mtctr r6 C copy count into ctr
  90. beq cr0, L(b00)
  91. blt cr6, L(b01)
  92. beq cr6, L(b10)
  93. L(b11): ld r8, 0(r4) C load s1 limb
  94. ld r9, 0(r5) C load s2 limb
  95. ld r10, 8(r4) C load s1 limb
  96. ld r11, 8(r5) C load s2 limb
  97. ld r12, 16(r4) C load s1 limb
  98. addi r4, r4, 24
  99. ld r0, 16(r5) C load s2 limb
  100. addi r5, r5, 24
  101. ADDSUBC r29, r9, r8
  102. ADDSUBC r30, r11, r10
  103. ADDSUBC r31, r0, r12
  104. std r29, 0(r3)
  105. std r30, 8(r3)
  106. std r31, 16(r3)
  107. addi r3, r3, 24
  108. bdnz L(go)
  109. b L(ret)
  110. L(b01): ld r12, 0(r4) C load s1 limb
  111. addi r4, r4, 8
  112. ld r0, 0(r5) C load s2 limb
  113. addi r5, r5, 8
  114. ADDSUBC r31, r0, r12 C add
  115. std r31, 0(r3)
  116. addi r3, r3, 8
  117. bdnz L(go)
  118. b L(ret)
  119. L(b10): ld r10, 0(r4) C load s1 limb
  120. ld r11, 0(r5) C load s2 limb
  121. ld r12, 8(r4) C load s1 limb
  122. addi r4, r4, 16
  123. ld r0, 8(r5) C load s2 limb
  124. addi r5, r5, 16
  125. ADDSUBC r30, r11, r10 C add
  126. ADDSUBC r31, r0, r12 C add
  127. std r30, 0(r3)
  128. std r31, 8(r3)
  129. addi r3, r3, 16
  130. bdnz L(go)
  131. b L(ret)
  132. L(b00): C INITCY C clear/set cy
  133. L(go): ld r6, 0(r4) C load s1 limb
  134. ld r7, 0(r5) C load s2 limb
  135. ld r8, 8(r4) C load s1 limb
  136. ld r9, 8(r5) C load s2 limb
  137. ld r10, 16(r4) C load s1 limb
  138. ld r11, 16(r5) C load s2 limb
  139. ld r12, 24(r4) C load s1 limb
  140. ld r0, 24(r5) C load s2 limb
  141. bdz L(end)
  142. addi r4, r4, 32
  143. addi r5, r5, 32
  144. L(oop): ADDSUBC r28, r7, r6
  145. ld r6, 0(r4) C load s1 limb
  146. ld r7, 0(r5) C load s2 limb
  147. ADDSUBC r29, r9, r8
  148. ld r8, 8(r4) C load s1 limb
  149. ld r9, 8(r5) C load s2 limb
  150. ADDSUBC r30, r11, r10
  151. ld r10, 16(r4) C load s1 limb
  152. ld r11, 16(r5) C load s2 limb
  153. ADDSUBC r31, r0, r12
  154. ld r12, 24(r4) C load s1 limb
  155. ld r0, 24(r5) C load s2 limb
  156. std r28, 0(r3)
  157. addi r4, r4, 32
  158. std r29, 8(r3)
  159. addi r5, r5, 32
  160. std r30, 16(r3)
  161. std r31, 24(r3)
  162. addi r3, r3, 32
  163. bdnz L(oop) C decrement ctr and loop back
  164. L(end): ADDSUBC r28, r7, r6
  165. ADDSUBC r29, r9, r8
  166. ADDSUBC r30, r11, r10
  167. ADDSUBC r31, r0, r12
  168. std r28, 0(r3)
  169. std r29, 8(r3)
  170. std r30, 16(r3)
  171. std r31, 24(r3)
  172. L(ret): ld r31, -8(r1)
  173. ld r30, -16(r1)
  174. ld r29, -24(r1)
  175. ld r28, -32(r1)
  176. subfe r3, r0, r0 C -cy
  177. GENRVAL
  178. blr
  179. EPILOGUE()