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

数学计算

开发平台:

Unix_Linux

  1. ; mc88100 __gmpn_mul_1 -- Multiply a limb vector with a single limb and
  2. ; store the product in a second limb vector.
  3. ; Copyright 1992, 1994, 1995, 2000 Free Software Foundation, Inc.
  4. ; This file is part of the GNU MP Library.
  5. ; The GNU MP Library is free software; you can redistribute it and/or modify
  6. ; it under the terms of the GNU Lesser General Public License as published by
  7. ; the Free Software Foundation; either version 3 of the License, or (at your
  8. ; option) any later version.
  9. ; The GNU MP Library is distributed in the hope that it will be useful, but
  10. ; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. ; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. ; License for more details.
  13. ; You should have received a copy of the GNU Lesser General Public License
  14. ; along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  15. ; INPUT PARAMETERS
  16. ; res_ptr r2
  17. ; s1_ptr r3
  18. ; size r4
  19. ; s2_limb r5
  20. ; Common overhead is about 11 cycles/invocation.
  21. ; The speed for S2_LIMB >= 0x10000 is approximately 21 cycles/limb.  (The
  22. ; pipeline stalls 2 cycles due to WB contention.)
  23. ; The speed for S2_LIMB < 0x10000 is approximately 16 cycles/limb.  (The
  24. ; pipeline stalls 2 cycles due to WB contention and 1 cycle due to latency.)
  25. ; To enhance speed:
  26. ; 1. Unroll main loop 4-8 times.
  27. ; 2. Schedule code to avoid WB contention.  It might be tempting to move the
  28. ;    ld instruction in the loops down to save 2 cycles (less WB contention),
  29. ;    but that looses because the ultimate value will be read from outside
  30. ;    the allocated space.  But if we handle the ultimate multiplication in
  31. ;    the tail, we can do this.
  32. ; 3. Make the multiplication with less instructions.  I think the code for
  33. ;    (S2_LIMB >= 0x10000) is not minimal.
  34. ; With these techniques the (S2_LIMB >= 0x10000) case would run in 17 or
  35. ; less cycles/limb; the (S2_LIMB < 0x10000) case would run in 11
  36. ; cycles/limb.  (Assuming infinite unrolling.)
  37. text
  38. align  16
  39. global  ___gmpn_mul_1
  40. ___gmpn_mul_1:
  41. ; Make S1_PTR and RES_PTR point at the end of their blocks
  42. ; and negate SIZE.
  43. lda  r3,r3[r4]
  44. lda  r6,r2[r4] ; RES_PTR in r6 since r2 is retval
  45. subu  r4,r0,r4
  46. addu.co  r2,r0,r0 ; r2 = cy = 0
  47. ld  r9,r3[r4]
  48. mask  r7,r5,0xffff ; r7 = lo(S2_LIMB)
  49. extu  r8,r5,16 ; r8 = hi(S2_LIMB)
  50. bcnd.n  eq0,r8,Lsmall ; jump if (hi(S2_LIMB) == 0)
  51.  subu  r6,r6,4
  52. ; General code for any value of S2_LIMB.
  53. ; Make a stack frame and save r25 and r26
  54. subu  r31,r31,16
  55. st.d  r25,r31,8
  56. ; Enter the loop in the middle
  57. br.n L1
  58. addu  r4,r4,1
  59. Loop: ld  r9,r3[r4]
  60. st  r26,r6[r4]
  61. ; bcnd ne0,r0,0 ; bubble
  62. addu  r4,r4,1
  63. L1: mul  r26,r9,r5 ; low word of product mul_1 WB ld
  64. mask  r12,r9,0xffff ; r12 = lo(s1_limb) mask_1
  65. mul  r11,r12,r7 ; r11 =  prod_0 mul_2 WB mask_1
  66. mul  r10,r12,r8 ; r10 = prod_1a mul_3
  67. extu  r13,r9,16 ; r13 = hi(s1_limb) extu_1 WB mul_1
  68. mul  r12,r13,r7 ; r12 = prod_1b mul_4 WB extu_1
  69. mul  r25,r13,r8 ; r25  = prod_2 mul_5 WB mul_2
  70. extu  r11,r11,16 ; r11 = hi(prod_0) extu_2 WB mul_3
  71. addu  r10,r10,r11 ; addu_1 WB extu_2
  72. ; bcnd ne0,r0,0 ; bubble WB addu_1
  73. addu.co  r10,r10,r12 ; WB mul_4
  74. mask.u  r10,r10,0xffff ; move the 16 most significant bits...
  75. addu.ci  r10,r10,r0 ; ...to the low half of the word...
  76. rot  r10,r10,16 ; ...and put carry in pos 16.
  77. addu.co  r26,r26,r2 ; add old carry limb
  78. bcnd.n  ne0,r4,Loop
  79.  addu.ci r2,r25,r10 ; compute new carry limb
  80. st  r26,r6[r4]
  81. ld.d  r25,r31,8
  82. jmp.n  r1
  83.  addu  r31,r31,16
  84. ; Fast code for S2_LIMB < 0x10000
  85. Lsmall:
  86. ; Enter the loop in the middle
  87. br.n SL1
  88. addu  r4,r4,1
  89. SLoop: ld  r9,r3[r4] ;
  90. st  r8,r6[r4] ;
  91. addu  r4,r4,1 ;
  92. SL1: mul  r8,r9,r5 ; low word of product
  93. mask  r12,r9,0xffff ; r12 = lo(s1_limb)
  94. extu  r13,r9,16 ; r13 = hi(s1_limb)
  95. mul  r11,r12,r7 ; r11 =  prod_0
  96. mul  r12,r13,r7 ; r12 = prod_1b
  97. addu.cio r8,r8,r2 ; add old carry limb
  98. extu  r10,r11,16 ; r11 = hi(prod_0)
  99. addu  r10,r10,r12 ;
  100. bcnd.n  ne0,r4,SLoop
  101. extu  r2,r10,16 ; r2 = new carry limb
  102. jmp.n  r1
  103. st  r8,r6[r4]