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

数学计算

开发平台:

Unix_Linux

  1. dnl  Copyright 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
  2. dnl  This file is part of the GNU MP Library.
  3. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  4. dnl  it under the terms of the GNU Lesser General Public License as published
  5. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  6. dnl  your option) any later version.
  7. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  8. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  9. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  10. dnl  License for more details.
  11. dnl  You should have received a copy of the GNU Lesser General Public License
  12. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  13. dnl  Optimizations:
  14. dnl  * Avoid skip instructions
  15. dnl  * Put carry-generating and carry-consuming insns consecutively
  16. dnl  * Don't allocate any stack, "home" positions for parameteters could be
  17. dnl    used.
  18. include(`../config.m4')
  19. define(`p0',`%r28')
  20. define(`p1',`%r29')
  21. define(`t32',`%r19')
  22. define(`t0',`%r20')
  23. define(`t1',`%r21')
  24. define(`x',`%r22')
  25. define(`m0',`%r23')
  26. define(`m1',`%r24')
  27. ifdef(`HAVE_ABI_2_0w',
  28. ` .level 2.0w
  29. ',` .level 2.0
  30. ')
  31. PROLOGUE(mpn_umul_ppmm_r)
  32. ldo 128(%r30),%r30
  33. ifdef(`HAVE_ABI_2_0w',
  34. ` std %r26,-64(%r30)
  35. std %r25,-56(%r30)
  36. copy %r24,%r31
  37. ',`
  38. depd %r25,31,32,%r26
  39. std %r26,-64(%r30)
  40. depd %r23,31,32,%r24
  41. std %r24,-56(%r30)
  42. ldw -180(%r30),%r31
  43. ')
  44. fldd -64(%r30),%fr4
  45. fldd -56(%r30),%fr5
  46. xmpyu %fr5R,%fr4R,%fr6
  47. fstd %fr6,-128(%r30)
  48. xmpyu %fr5R,%fr4L,%fr7
  49. fstd %fr7,-120(%r30)
  50. xmpyu %fr5L,%fr4R,%fr8
  51. fstd %fr8,-112(%r30)
  52. xmpyu %fr5L,%fr4L,%fr9
  53. fstd %fr9,-104(%r30)
  54. depdi,z 1,31,1,t32 C t32 = 2^32
  55. ldd -128(%r30),p0 C lo = low 64 bit of product
  56. ldd -120(%r30),m0 C m0 = mid0 64 bit of product
  57. ldd -112(%r30),m1 C m1 = mid1 64 bit of product
  58. ldd -104(%r30),p1 C hi = high 64 bit of product
  59. add,l,*nuv m0,m1,x C x = m1+m0
  60.  add,l t32,p1,p1 C propagate carry to mid of p1
  61. depd,z x,31,32,t0 C lo32(m1+m0)
  62. add t0,p0,p0
  63. extrd,u x,31,32,t1 C hi32(m1+m0)
  64. add,dc t1,p1,p1
  65. std p0,0(%r31) C store low half of product
  66. ifdef(`HAVE_ABI_2_0w',
  67. ` copy p1,%r28 C return val in %r28
  68. ',` extrd,u p1,31,32,%r28 C return val in %r28,%r29
  69. ')
  70. bve (%r2)
  71. ldo -128(%r30),%r30
  72. EPILOGUE(mpn_umul_ppmm_r)