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

数学计算

开发平台:

Unix_Linux

  1. dnl  Alpha mpn_com -- mpn one's complement.
  2. dnl  Copyright 2003 Free Software Foundation, Inc.
  3. dnl
  4. dnl  This file is part of the GNU MP Library.
  5. dnl
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or
  7. dnl  modify it under the terms of the GNU Lesser General Public License as
  8. dnl  published by the Free Software Foundation; either version 3 of the
  9. dnl  License, or (at your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  12. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14. dnl  Lesser General Public License for more details.
  15. dnl
  16. dnl  You should have received a copy of the GNU Lesser General Public License
  17. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  18. include(`../config.m4')
  19. C      cycles/limb
  20. C EV4:    4.75
  21. C EV5:    2.0
  22. C EV6:    1.5
  23. C mp_limb_t mpn_com (mp_ptr dst, mp_srcptr src, mp_size_t size);
  24. C
  25. C For ev5 the main loop is 7 cycles plus 1 taken branch bubble, for a total
  26. C 2.0 c/l.  In general, a pattern like this unrolled to N limbs per loop
  27. C will be 1.5+2/N c/l.
  28. C
  29. C 2 cycles of loop control are unavoidable, for pointer updates and the
  30. C taken branch bubble, but also since ldq cannot issue two cycles after stq
  31. C (and with a run of stqs that means neither of two cycles at the end of the
  32. C loop.
  33. C
  34. C The fbeq is forced into the second cycle of the loop using unops, since
  35. C the first time through it must wait for the cvtqt result.  Once that
  36. C result is ready (a 1 cycle stall) then both the branch and following loads
  37. C can issue together.
  38. C
  39. C The main loop handles an odd count of limbs, being two limbs loaded before
  40. C each size test, plus one pipelined around from the previous iteration (or
  41. C setup in the entry sequence).
  42. C
  43. C An even number of limbs is handled by an explicit dst[0]=~src[0] in the
  44. C entry sequence, and an increment of the pointers.  For an odd size there's
  45. C no increment and the first store in the loop (r24) is a repeat of dst[0].
  46. C
  47. C Note that the load for r24 after the possible pointer increment is done
  48. C before the explicit store to dst[0], in case src==dst.
  49. ASM_START()
  50. FLOAT64(L(dat), 2.0)
  51. ALIGN(16)
  52. PROLOGUE(mpn_com,gp)
  53. C r16 dst
  54. C r17 src
  55. C r18 size
  56. lda r30, -16(r30) C temporary stack space
  57. lda r7, -3(r18) C size - 3
  58. ldq r20, 0(r17) C src[0]
  59. srl r7, 1, r6 C (size-3)/2
  60. stq r6, 8(r30) C (size-3)/2
  61. and r7, 1, r5 C 1 if size even
  62. LEA( r8, L(dat))
  63. s8addq r5, r17, r17 C skip src[0] if even
  64. ornot r31, r20, r20 C ~src[0]
  65. unop
  66. ldt f0, 8(r30) C (size-3)/2
  67. ldq r24, 0(r17) C src[0 or 1]
  68. stq r20, 0(r16) C dst[0]
  69. s8addq r5, r16, r19 C skip dst[0] if even
  70. ldt f1, 0(r8) C data 2.0
  71. lda r30, 16(r30) C restore stack
  72. unop
  73. cvtqt f0, f0 C (size-3)/2 as float
  74. ornot r31, r24, r24
  75. blt r7, L(done_1) C if size<=2
  76. unop
  77. unop
  78. C 16-byte alignment here
  79. L(top):
  80. C r17 src, incrementing
  81. C r19 dst, incrementing
  82. C r24 dst[i] result, ready to store
  83. C f0 (size-3)/2, decrementing
  84. C f1 2.0
  85. ldq r20, 8(r17) C src[i+1]
  86. ldq r21, 16(r17) C src[i+2]
  87. unop
  88. unop
  89. fbeq f0, L(done_2)
  90. unop
  91. ldq r22, 24(r17) C src[i+3]
  92. ldq r23, 32(r17) C src[i+4]
  93. stq r24, 0(r19) C dst[i]
  94. ornot r31, r20, r20
  95. subt f0, f1, f0 C count -= 2
  96. unop
  97. stq r20, 8(r19) C dst[i+1]
  98. ornot r31, r21, r21
  99. unop
  100. unop
  101. stq r21, 16(r19) C dst[i+2]
  102. ornot r31, r22, r22
  103. stq r22, 24(r19) C dst[i+3]
  104. ornot r31, r23, r24
  105. lda r17, 32(r17) C src += 4
  106. lda r19, 32(r19) C dst += 4
  107. unop
  108. fbge f0, L(top)
  109. L(done_1):
  110. C r19 &dst[size-1]
  111. C r24 result for dst[size-1]
  112. stq r24, 0(r19) C dst[size-1]
  113. ret r31, (r26), 1
  114. L(done_2):
  115. C r19 &dst[size-3]
  116. C r20 src[size-2]
  117. C r21 src[size-1]
  118. C r24 result for dst[size-3]
  119. stq r24, 0(r19) C dst[size-3]
  120. ornot r31, r20, r20
  121. stq r20, 8(r19) C dst[size-2]
  122. ornot r31, r21, r21
  123. stq r21, 16(r19) C dst[size-1]
  124. ret r31, (r26), 1
  125. EPILOGUE()
  126. ASM_END()