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

数学计算

开发平台:

Unix_Linux

  1. dnl  ARM mpn_mul_1 -- Multiply a limb vector with a limb and store the result
  2. dnl  in a second limb vector.
  3. dnl  Contributed by Robert Harley.
  4. dnl  Copyright 1998, 2000, 2001, 2003 Free Software Foundation, Inc.
  5. dnl  This file is part of the GNU MP Library.
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  7. dnl  it under the terms of the GNU Lesser General Public License as published
  8. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  9. dnl  your option) any later version.
  10. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  11. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  12. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  13. dnl  License for more details.
  14. dnl  You should have received a copy of the GNU Lesser General Public License
  15. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  16. include(`../config.m4')
  17. C            cycles/limb
  18. C StrongARM:     6-8  (dependent on vl value)
  19. C XScale:        ?-?
  20. C We should rewrite this along the lines of addmul_1.asm.  That should save a
  21. C cycle on StrongARM, and several cycles on XScale.
  22. define(`rp',`r0')
  23. define(`up',`r1')
  24. define(`n',`r2')
  25. define(`vl',`r3')
  26. ASM_START()
  27. PROLOGUE(mpn_mul_1)
  28. stmfd sp!, { r8, r9, lr }
  29. ands r12, n, #1
  30. beq L(skip1)
  31. ldr lr, [up], #4
  32. umull r9, r12, lr, vl
  33. str r9, [rp], #4
  34. L(skip1):
  35. tst n, #2
  36. beq L(skip2)
  37. mov r8, r12
  38. ldmia up!, { r12, lr }
  39. mov r9, #0
  40. umlal r8, r9, r12, vl
  41. mov r12, #0
  42. umlal r9, r12, lr, vl
  43. stmia rp!, { r8, r9 }
  44. L(skip2):
  45. bics n, n, #3
  46. beq L(return)
  47. stmfd sp!, { r6, r7 }
  48. L(loop):
  49. mov r6, r12
  50. ldmia up!, { r8, r9, r12, lr }
  51. ldr r7, [rp, #12] C cache allocate
  52. mov r7, #0
  53. umlal r6, r7, r8, vl
  54. mov r8, #0
  55. umlal r7, r8, r9, vl
  56. mov r9, #0
  57. umlal r8, r9, r12, vl
  58. mov r12, #0
  59. umlal r9, r12, lr, vl
  60. subs n, n, #4
  61. stmia rp!, { r6, r7, r8, r9 }
  62. bne L(loop)
  63. ldmfd sp!, { r6, r7 }
  64. L(return):
  65. mov r0, r12
  66. ldmfd sp!, { r8, r9, pc }
  67. EPILOGUE(mpn_mul_1)