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

数学计算

开发平台:

Unix_Linux

  1. dnl  PowerPC-32 mpn_mod_34lsub1 -- mpn remainder mod 2^24-1.
  2. dnl  Copyright 2002, 2003, 2005 Free Software Foundation, Inc.
  3. dnl  This file is part of the GNU MP Library.
  4. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  5. dnl  it under the terms of the GNU Lesser General Public License as published
  6. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  7. dnl  your option) any later version.
  8. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  9. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. dnl  License for more details.
  12. dnl  You should have received a copy of the GNU Lesser General Public License
  13. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  14. include(`../config.m4')
  15. C                cycles/limb
  16. C 603e:            ?
  17. C 604e:            3
  18. C 75x (G3):        3
  19. C 7400,7410 (G4):  3
  20. C 744x,745x (G4+): 3
  21. C power4/ppc970:   2.5
  22. C power5:          2.5
  23. C mp_limb_t mpn_mod_34lsub1 (mp_srcptr src, mp_size_t size)
  24. C
  25. C There seems no need to schedule the loads back, the code is still 3.0 c/l
  26. C on 750/7400 no matter where they're placed.
  27. C
  28. C Alternatives:
  29. C
  30. C Fetching half words would allow add instead for accumulating, instead of
  31. C adde and its serialization.  An outer loop would be required though, since
  32. C 2^16 halfwords can overflow.  lhz+add would be 2.0 c/l, but if there's
  33. C also a bdz or bdnz for each and a pointer update say every three limbs
  34. C then the total would be 2.67 c/l which isn't much faster than the current
  35. C simpler code.
  36. ASM_START()
  37. PROLOGUE(mpn_mod_34lsub1)
  38. C r3 src
  39. C r4 size
  40. mtctr r4
  41. addic r6, r3, 8 C &src[2], and clear CA
  42. lwz r3, 0(r3) C acc0 = src[0]
  43. bdz L(done)
  44. lwz r4, -4(r6) C acc1 = src[1]
  45. bdz L(two)
  46. lwz r5, 0(r6) C acc2 = src[2]
  47. lis r7, 0 C no carry if just three limbs
  48. bdz L(three)
  49. lis r7, 1 C 0x10000 carry pos
  50. L(top):
  51. C r3 acc0
  52. C r4 acc1
  53. C r5 acc2
  54. C r6 src, incrementing
  55. C r7 carry pos
  56. lwz r0, 4(r6)
  57. adde r3, r3, r0
  58. bdz L(end0)
  59. lwz r0, 8(r6)
  60. adde r4, r4, r0
  61. bdz L(end1)
  62. lwzu r0, 12(r6)
  63. adde r5, r5, r0
  64. bdnz L(top)
  65. srwi r7, r7, 8
  66. L(end0):
  67. srwi r7, r7, 8
  68. L(end1):
  69. subfe r0, r0, r0 C -1 if not CA
  70. andc r7, r7, r0 C final carry, 0x10000, 0x100, 1 or 0
  71. L(three):
  72. rlwinm r6, r3, 0,8,31 C acc0 low
  73. add r7, r7, r6
  74. rlwinm r6, r3, 8,24,31 C acc0 high
  75. add r7, r7, r6
  76. rlwinm r6, r4, 8,8,23 C acc1 low
  77. add r7, r7, r6
  78. rlwinm r6, r4, 16,16,31 C acc1 high
  79. add r7, r7, r6
  80. rlwinm r6, r5, 16,8,15 C acc2 low
  81. add r7, r7, r6
  82. rlwinm r6, r5, 24,8,31 C acc2 high
  83. add r3, r7, r6
  84. L(done):
  85. blr
  86. L(two):
  87. C r3 acc0
  88. C r4 acc1
  89. rlwinm r5, r3, 8,24,31 C acc0 high
  90. rlwinm r3, r3, 0,8,31 C acc0 low
  91. add r3, r3, r5 C acc0 high + low
  92. rlwinm r5, r4, 16,16,31 C acc1 high
  93. add r3, r3, r5 C add acc1 high
  94. rlwinm r5, r4, 8,8,23 C acc1 low
  95. add r3, r3, r5 C add acc1 low
  96. blr
  97. EPILOGUE()