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

数学计算

开发平台:

Unix_Linux

  1. ; 29000 mpn_add_n -- Add two limb vectors of the same length > 0 and store
  2. ; sum in a third limb vector.
  3. ; Copyright 1992, 1994, 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 lr2
  17. ; s1_ptr lr3
  18. ; s2_ptr lr4
  19. ; size lr5
  20. ; We use the loadm/storem instructions and operate on chunks of 8
  21. ; limbs/per iteration, until less than 8 limbs remain.
  22. ; The 29k has no addition or subtraction instructions that doesn't
  23. ; affect carry, so we need to save and restore that as soon as we
  24. ; adjust the pointers.  gr116 is used for this purpose.  Note that
  25. ; gr116==0 means that carry should be set.
  26. .sect .lit,lit
  27. .text
  28. .align 4
  29. .global ___gmpn_add_n
  30. .word 0x60000
  31. ___gmpn_add_n:
  32. srl gr117,lr5,3
  33. sub gr118,gr117,1
  34. jmpt gr118,Ltail
  35.  constn gr116,-1 ; init cy reg
  36. sub gr117,gr117,2 ; count for jmpfdec
  37. ; Main loop working 8 limbs/iteration.
  38. Loop: mtsrim cr,(8-1)
  39. loadm 0,0,gr96,lr3
  40. add lr3,lr3,32
  41. mtsrim cr,(8-1)
  42. loadm 0,0,gr104,lr4
  43. add lr4,lr4,32
  44. subr gr116,gr116,0 ; restore carry
  45. addc gr96,gr96,gr104
  46. addc gr97,gr97,gr105
  47. addc gr98,gr98,gr106
  48. addc gr99,gr99,gr107
  49. addc gr100,gr100,gr108
  50. addc gr101,gr101,gr109
  51. addc gr102,gr102,gr110
  52. addc gr103,gr103,gr111
  53. subc gr116,gr116,gr116 ; gr116 = not(cy)
  54. mtsrim cr,(8-1)
  55. storem 0,0,gr96,lr2
  56. jmpfdec gr117,Loop
  57.  add lr2,lr2,32
  58. ; Code for the last up-to-7 limbs.
  59. ; This code might look very strange, but it's hard to write it
  60. ; differently without major slowdown.
  61. and lr5,lr5,(8-1)
  62. Ltail: sub gr118,lr5,1 ; count for CR
  63. jmpt gr118,Lend
  64.  sub gr117,lr5,2 ; count for jmpfdec
  65. mtsr cr,gr118
  66. loadm 0,0,gr96,lr3
  67. mtsr cr,gr118
  68. loadm 0,0,gr104,lr4
  69. subr gr116,gr116,0 ; restore carry
  70. jmpfdec gr117,L1
  71.  addc gr96,gr96,gr104
  72. jmp Lstore
  73.  mtsr cr,gr118
  74. L1: jmpfdec gr117,L2
  75.  addc gr97,gr97,gr105
  76. jmp Lstore
  77.  mtsr cr,gr118
  78. L2: jmpfdec gr117,L3
  79.  addc gr98,gr98,gr106
  80. jmp Lstore
  81.  mtsr cr,gr118
  82. L3: jmpfdec gr117,L4
  83.  addc gr99,gr99,gr107
  84. jmp Lstore
  85.  mtsr cr,gr118
  86. L4: jmpfdec gr117,L5
  87.  addc gr100,gr100,gr108
  88. jmp Lstore
  89.  mtsr cr,gr118
  90. L5: jmpfdec gr117,L6
  91.  addc gr101,gr101,gr109
  92. jmp Lstore
  93.  mtsr cr,gr118
  94. L6: addc gr102,gr102,gr110
  95. Lstore: storem 0,0,gr96,lr2
  96. subc gr116,gr116,gr116 ; gr116 = not(cy)
  97. Lend: jmpi lr0
  98.  add gr96,gr116,1