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

数学计算

开发平台:

Unix_Linux

  1. dnl  PowerPC-32 mpn_divexact_by3 -- mpn by 3 exact division
  2. dnl  Copyright 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
  3. dnl
  4. dnl  This file is part of the GNU MP Library.
  5. dnl
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or
  7. dnl  modify it under the terms of the GNU Lesser General Public License as
  8. dnl  published by the Free Software Foundation; either version 3 of the
  9. dnl  License, or (at your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  12. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14. dnl  Lesser General Public License for more details.
  15. dnl
  16. dnl  You should have received a copy of the GNU Lesser General Public License
  17. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  18. include(`../config.m4')
  19. C                cycles/limb
  20. C 603e:              ?
  21. C 604e:              5
  22. C 75x (G3):          ?
  23. C 7400,7410 (G4):    8
  24. C 744x,745x (G4+):   6
  25. C power4/ppc970:    12
  26. C power5:            ?
  27. C void mpn_divexact_by3 (mp_ptr dst, mp_srcptr src, mp_size_t size);
  28. C
  29. C We avoid the slow subfe instruction and instead rely on an extremely unlikely
  30. C branch.
  31. C
  32. C The mullw has the inverse in the first operand, since 0xAA..AB won't allow
  33. C any early-out.  The src[] data normally won't either, but there's at least
  34. C a chance, whereas 0xAA..AB never will.  If, for instance, src[] is all
  35. C zeros (not a sensible input of course) we run at 7.0 c/l on ppc750.
  36. C
  37. C The mulhwu has the "3" multiplier in the second operand, which lets 750 and
  38. C 7400 use an early-out.
  39. C INPUT PARAMETERS
  40. define(`rp', `r3')
  41. define(`up', `r4')
  42. define(`n',  `r5')
  43. define(`cy', `r6')
  44. ASM_START()
  45. PROLOGUE(mpn_divexact_by3c)
  46. lwz r11, 0(up)
  47. mtctr n
  48. lis r12, 0xAAAA
  49. ori r12, r12, 0xAAAB
  50. li r10, 3
  51. cmplw cr7, cy, r11
  52. subf r11, cy, r11
  53. mullw r0, r11, r12
  54. stw r0, 0(rp)
  55. bdz L(one)
  56. L(top): lwzu r9, 4(up)
  57. mulhwu r7, r0, r10
  58. bgt- cr7, L(adj) C very unlikely branch
  59. L(bko): cmplw cr7, r7, r9
  60. subf r0, r7, r9
  61. mullw r0, r12, r0
  62. stwu r0, 4(rp)
  63. bdnz L(top)
  64. L(one): mulhwu r3, r0, r10
  65. blelr+ cr7
  66. addi r3, r3, 1
  67. blr
  68. L(adj): addi r7, r7, 1
  69. b L(bko)
  70. EPILOGUE()
  71. ASM_END()