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

数学计算

开发平台:

Unix_Linux

  1. dnl  HP-PA 2.0 mpn_add_n, mpn_sub_n
  2. dnl  Copyright 1997, 2000, 2002, 2003, 2009 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. dnl  This runs at 2 cycles/limb on PA8000 and 1.6875 cycles/limb on PA8500.  It
  15. dnl  should be possible to reach the cache bandwidth 1.5 cycles/limb at least
  16. dnl  with PA8500.  The problem now is stalling of the first ADD,DC after LDO,
  17. dnl  where the processor gets confused about where carry comes from.
  18. include(`../config.m4')
  19. dnl INPUT PARAMETERS
  20. define(`rp',`%r26')
  21. define(`up',`%r25')
  22. define(`vp',`%r24')
  23. define(`n',`%r23')
  24. ifdef(`OPERATION_add_n', `
  25. define(ADCSBC,       `add,dc')
  26. define(INITCY,       `addi -1,%r22,%r0')
  27. define(func,       mpn_add_n)
  28. define(func_nc,       mpn_add_nc)')
  29. ifdef(`OPERATION_sub_n', `
  30. define(ADCSBC,       `sub,db')
  31. define(INITCY,       `subi 0,%r22,%r0')
  32. define(func,       mpn_sub_n)
  33. define(func_nc,       mpn_sub_nc)')
  34. MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc)
  35. ifdef(`HAVE_ABI_2_0w',
  36. `       .level  2.0w
  37. ',`     .level  2.0
  38. ')
  39. PROLOGUE(func_nc)
  40. b L(com)
  41. nop
  42. EPILOGUE()
  43. PROLOGUE(func)
  44. ldi 0, %r22
  45. LDEF(com)
  46. sub %r0, n, %r21
  47. depw,z %r21, 30, 3, %r28 C r28 = 2 * (-n & 7)
  48. depw,z %r21, 28, 3, %r21 C r21 = 8 * (-n & 7)
  49. sub up, %r21, up C offset up
  50. sub vp, %r21, vp C offset vp
  51. sub rp, %r21, rp C offset rp
  52. blr %r28, %r0 C branch into loop
  53. INITCY
  54. LDEF(loop)
  55. ldd 0(up), %r20
  56. ldd 0(vp), %r31
  57. ADCSBC %r20, %r31, %r20
  58. std %r20, 0(rp)
  59. LDEF(7) ldd 8(up), %r21
  60. ldd 8(vp), %r19
  61. ADCSBC %r21, %r19, %r21
  62. std %r21, 8(rp)
  63. LDEF(6) ldd 16(up), %r20
  64. ldd 16(vp), %r31
  65. ADCSBC %r20, %r31, %r20
  66. std %r20, 16(rp)
  67. LDEF(5) ldd 24(up), %r21
  68. ldd 24(vp), %r19
  69. ADCSBC %r21, %r19, %r21
  70. std %r21, 24(rp)
  71. LDEF(4) ldd 32(up), %r20
  72. ldd 32(vp), %r31
  73. ADCSBC %r20, %r31, %r20
  74. std %r20, 32(rp)
  75. LDEF(3) ldd 40(up), %r21
  76. ldd 40(vp), %r19
  77. ADCSBC %r21, %r19, %r21
  78. std %r21, 40(rp)
  79. LDEF(2) ldd 48(up), %r20
  80. ldd 48(vp), %r31
  81. ADCSBC %r20, %r31, %r20
  82. std %r20, 48(rp)
  83. LDEF(1) ldd 56(up), %r21
  84. ldd 56(vp), %r19
  85. ADCSBC %r21, %r19, %r21
  86. ldo 64(up), up
  87. std %r21, 56(rp)
  88. ldo 64(vp), vp
  89. addib,> -8, n, L(loop)
  90. ldo 64(rp), rp
  91. add,dc %r0, %r0, %r29
  92. ifdef(`OPERATION_sub_n',`
  93. subi 1, %r29, %r29
  94. ')
  95. bve (%r2)
  96. ifdef(`HAVE_ABI_2_0w',
  97. ` copy %r29, %r28
  98. ',` ldi 0, %r28
  99. ')
  100. EPILOGUE()