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

数学计算

开发平台:

Unix_Linux

  1. dnl  PowerPC-32 mpn_mod_34lsub1 -- mpn remainder mod 2^24-1.
  2. dnl  Copyright 2002, 2003, 2005, 2006, 2007 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. include(`../config.m4')
  15. C                cycles/limb
  16. C 603e:              -
  17. C 604e:              -
  18. C 75x (G3):          -
  19. C 7400,7410 (G4):    1          simple load-use scheduling results in 0.75
  20. C 744x,745x (G4+):   0.75
  21. C ppc970:            0.75
  22. C power4:            -
  23. C power5:            -
  24. C TODO
  25. C  * Either start using the low-end masking constants, or remove them.
  26. C  * Merge multiple feed-in cases into a parameterized code block.
  27. C  * Reduce register usage.  It should be possible to almost halve it.
  28. define(`up', `r3')
  29. define(`n', `r4')
  30. define(`a0', `v3')
  31. define(`a1', `v4')
  32. define(`a2', `v5')
  33. define(`c0', `v6')
  34. define(`c1', `v7')
  35. define(`c2', `v8')
  36. define(`z',  `v9')
  37. define(`x0', `v10')
  38. define(`x1', `v11')
  39. define(`x2', `v12')
  40. define(`x3', `v13')
  41. define(`pv', `v14')
  42. define(`y0', `v0')
  43. define(`y1', `v1')
  44. define(`y2', `v2')
  45. define(`y3', `v15')
  46. ASM_START()
  47. PROLOGUE(mpn_mod_34lsub1)
  48. cmpwi cr0, n, 20 C tuned cutoff point
  49. bge L(large)
  50. li r9, 0 C result accumulator
  51. mulli r10, n, 0xb C 0xb = ceil(32/3)
  52. srwi. r10, r10, 5 C r10 = floor(n/3), n < 32
  53. beq L(small_tail)
  54. mtctr r10
  55. lwz r6, 0(up)
  56. lwz r7, 4(up)
  57. lwzu r8, 8(up)
  58. subf n, r10, n
  59. subf n, r10, n
  60. subf n, r10, n
  61. bdz L(small_end)
  62. ALIGN(16)
  63. L(los): rlwinm r0, r6, 0,8,31
  64. add r9, r9, r0 C add 24b from u0
  65. srwi r0, r6, 24
  66. lwz r6, 4(up)
  67. rlwimi r0, r7, 8, 0x00ffff00 C --111100
  68. add r9, r9, r0 C add 8b from u0 and 16b from u1
  69. srwi r0, r7, 16
  70. lwz r7, 8(up)
  71. rlwimi r0, r8, 16, 0x00ff0000 C --221111
  72. add r9, r9, r0 C add 16b from u1 and 8b from u2
  73. srwi r0, r8, 8 C --222222
  74. lwzu r8, 12(up)
  75. add r9, r9, r0 C add 24b from u2
  76. bdnz L(los)
  77. L(small_end):
  78. rlwinm r0, r6, 0,8,31
  79. add r9, r9, r0 C add 24b from u0
  80. srwi r0, r6, 24
  81. rlwimi r0, r7, 8, 0x00ffff00 C --111100
  82. add r9, r9, r0 C add 8b from u0 and 16b from u1
  83. srwi r0, r7, 16
  84. rlwimi r0, r8, 16, 0x00ff0000 C --221111
  85. add r9, r9, r0 C add 16b from u1 and 8b from u2
  86. srwi r0, r8, 8 C --222222
  87. add r9, r9, r0 C add 24b from u2
  88. addi up, up, 4
  89. rlwinm r0, r9, 0,8,31
  90. srwi r9, r9, 24
  91. add r9, r9, r0
  92. L(small_tail):
  93. cmpi cr0, n, 1
  94. blt L(ret)
  95. lwz r6, 0(up)
  96. rlwinm r0, r6, 0,8,31
  97. srwi r6, r6, 24
  98. add r9, r9, r0
  99. add r9, r9, r6
  100. beq L(ret)
  101. lwz r6, 4(up)
  102. rlwinm r0, r6, 8,8,23
  103. srwi r6, r6, 16
  104. add r9, r9, r0
  105. add r9, r9, r6
  106. L(ret): mr r3, r9
  107. blr
  108. L(large):
  109. mfspr r10, 256
  110. oris r0, r10, 0xffff C Set VRSAVE bit 0-15
  111. mtspr 256, r0
  112. andi. r7, up, 15
  113. vxor a0, v0, v0
  114. lis r0, 0xaaaa
  115. vxor a1, v0, v0
  116. ori r0, r0, 0xaaab
  117. vxor a2, v0, v0
  118. li r5, 16
  119. vxor c0, v0, v0
  120. li r6, 32
  121. vxor c1, v0, v0
  122. LEAL( r11, cnsts)
  123. vxor c2, v0, v0
  124. vxor z, v0, v0
  125. beq L(aligned16)
  126. cmpwi cr7, r7, 8
  127. bge cr7, L(na4)
  128. lvx a2, 0, up
  129. addi up, up, 16
  130. vsldoi a2, a2, z, 4
  131. vsldoi a2, z, a2, 12
  132. addi n, n, 9
  133. mulhwu r0, n, r0
  134. srwi r0, r0, 3 C r0 = floor(n/12)
  135. mtctr r0
  136. mulli r8, r0, 12
  137. subf n, r8, n
  138. b L(2)
  139. L(na4): bne cr7, L(na8)
  140. lvx a1, 0, up
  141. addi up, up, -16
  142. vsldoi a1, a1, z, 8
  143. vsldoi a1, z, a1, 8
  144. addi n, n, 6
  145. mulhwu r0, n, r0
  146. srwi r0, r0, 3 C r0 = floor(n/12)
  147. mtctr r0
  148. mulli r8, r0, 12
  149. subf n, r8, n
  150. b L(1)
  151. L(na8):
  152. lvx a0, 0, up
  153. vsldoi a0, a0, z, 12
  154. vsldoi a0, z, a0, 4
  155. addi n, n, 3
  156. mulhwu r0, n, r0
  157. srwi r0, r0, 3 C r0 = floor(n/12)
  158. mtctr r0
  159. mulli r8, r0, 12
  160. subf n, r8, n
  161. b L(0)
  162. L(aligned16):
  163. mulhwu r0, n, r0
  164. srwi r0, r0, 3 C r0 = floor(n/12)
  165. mtctr r0
  166. mulli r8, r0, 12
  167. subf n, r8, n
  168. lvx a0, 0, up
  169. L(0): lvx a1, r5, up
  170. L(1): lvx a2, r6, up
  171. addi up, up, 48
  172. L(2): bdz L(end)
  173. li r12, 256
  174. li r9, 288
  175. ALIGN(32)
  176. L(top):
  177. lvx v0, 0, up
  178. vaddcuw v10, a0, v0
  179. vadduwm a0, a0, v0
  180. vadduwm c0, c0, v10
  181. lvx v1, r5, up
  182. vaddcuw v10, a1, v1
  183. vadduwm a1, a1, v1
  184. vadduwm c1, c1, v10
  185. lvx v2, r6, up
  186. dcbt up, r12
  187. dcbt up, r9
  188. addi up, up, 48
  189. vaddcuw v10, a2, v2
  190. vadduwm a2, a2, v2
  191. vadduwm c2, c2, v10
  192. bdnz L(top)
  193. L(end):
  194. C n = 0...11
  195. cmpwi cr0, n, 0
  196. beq L(sum)
  197. cmpwi cr0, n, 4
  198. ble L(tail.1..4)
  199. cmpwi cr0, n, 8
  200. ble L(tail.5..8)
  201. L(tail.9..11):
  202. lvx v0, 0, up
  203. vaddcuw v10, a0, v0
  204. vadduwm a0, a0, v0
  205. vadduwm c0, c0, v10
  206. lvx v1, r5, up
  207. vaddcuw v10, a1, v1
  208. vadduwm a1, a1, v1
  209. vadduwm c1, c1, v10
  210. lvx v2, r6, up
  211. addi r8, r11, 96
  212. rlwinm r3, n ,4,26,27
  213. lvx v11, r3, r8
  214. vand v2, v2, v11
  215. vaddcuw v10, a2, v2
  216. vadduwm a2, a2, v2
  217. vadduwm c2, c2, v10
  218. b L(sum)
  219. L(tail.5..8):
  220. lvx v0, 0, up
  221. vaddcuw v10, a0, v0
  222. vadduwm a0, a0, v0
  223. vadduwm c0, c0, v10
  224. lvx v1, r5, up
  225. addi r8, r11, 96
  226. rlwinm r3, n ,4,26,27
  227. lvx v11, r3, r8
  228. vand v1, v1, v11
  229. vaddcuw v10, a1, v1
  230. vadduwm a1, a1, v1
  231. vadduwm c1, c1, v10
  232. b L(sum)
  233. L(tail.1..4):
  234. lvx v0, 0, up
  235. addi r8, r11, 96
  236. rlwinm r3, n ,4,26,27
  237. lvx v11, r3, r8
  238. vand v0, v0, v11
  239. vaddcuw v10, a0, v0
  240. vadduwm a0, a0, v0
  241. vadduwm c0, c0, v10
  242. L(sum): lvx pv, 0, r11
  243. vperm x0, a0, z, pv C extract 4 24-bit field from a0
  244. vperm y0, c2, z, pv
  245. lvx pv, r5, r11
  246. vperm x1, a1, z, pv C extract 4 24-bit field from a1
  247. vperm y1, c0, z, pv C extract 4 24-bit field from a1
  248. lvx pv, r6, r11
  249. vperm x2, a2, z, pv C extract 4 24-bit field from a1
  250. vperm y2, c1, z, pv C extract 4 24-bit field from a1
  251. li r10,  48
  252. lvx pv, r10, r11
  253. vperm x3, a0, z, pv C extract remaining/partial a0 fields
  254. vperm y3, c2, z, pv C extract remaining/partial a0 fields
  255. li r10,  64
  256. lvx pv, r10, r11
  257. vperm x3, a1, x3, pv C insert remaining/partial a1 fields
  258. vperm y3, c0, y3, pv C insert remaining/partial a1 fields
  259. li r10,  80
  260. lvx pv, r10, r11
  261. vperm x3, a2, x3, pv C insert remaining/partial a2 fields
  262. vperm y3, c1, y3, pv C insert remaining/partial a2 fields
  263. C We now have 4 128-bit accumulators to sum
  264. vadduwm x0, x0, x1
  265. vadduwm x2, x2, x3
  266. vadduwm x0, x0, x2
  267. vadduwm y0, y0, y1
  268. vadduwm y2, y2, y3
  269. vadduwm y0, y0, y2
  270. vadduwm x0, x0, y0
  271. C Reduce 32-bit fields
  272. vsumsws x0, x0, z
  273. li r7, -16 C FIXME: does all ppc32 ABIs...
  274. stvx x0, r7, r1 C FIXME: ...support storing below sp?
  275. lwz r3, -4(r1)
  276. mtspr 256, r10
  277. blr
  278. EPILOGUE()
  279. C load |      v0       |      v1       |      v2       |
  280. C acc |      a0       |      a1       |      a2       |
  281. C carry |      c0       |      c1       |      c2       |
  282. C | 0   1   2   3 | 4   5   6   7 | 8   9  10  11 |  128
  283. C |---|---|---|---|---|---|---|---|---|---|---|---|   32
  284. C |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   24
  285. C |     |     |     |     |     |     |     |     |   48
  286. C       $---------------$---------------$---------------$---------------$
  287. C       |   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   |
  288. C       |_______________________________________________________________|
  289. C   |           |           |           |           |           |           |
  290. C       <-hi16-> <--- 24 --> <--- 24 --> <--- 24 --> <--- 24 --> <-lo16->
  291. DEF_OBJECT(cnsts,16)
  292. C Permutation vectors in the order they are used above
  293. C #      00   01   02   03    04   05   06   07    08   09   0a   0b    0c   0d   0e   0f
  294.  .byte 0x10,0x01,0x02,0x03, 0x10,0x06,0x07,0x00, 0x10,0x0b,0x04,0x05, 0x10,0x08,0x09,0x0a C a0
  295.  .byte 0x10,0x07,0x00,0x01, 0x10,0x04,0x05,0x06, 0x10,0x09,0x0a,0x0b, 0x10,0x0e,0x0f,0x08 C a1
  296.  .byte 0x10,0x00,0x01,0x02, 0x10,0x05,0x06,0x07, 0x10,0x0a,0x0b,0x04, 0x10,0x0f,0x08,0x09 C a2
  297.  .byte 0x10,0x0d,0x0e,0x0f, 0x10,0x10,0x10,0x0c, 0x10,0x10,0x10,0x10, 0x10,0x10,0x10,0x10 C part a0
  298.  .byte 0x10,0x11,0x12,0x13, 0x10,0x02,0x03,0x17, 0x10,0x10,0x0c,0x0d, 0x10,0x10,0x10,0x10 C part a1
  299.  .byte 0x10,0x11,0x12,0x13, 0x10,0x15,0x16,0x17, 0x10,0x03,0x1a,0x1b, 0x10,0x0c,0x0d,0x0e C part a2
  300. C Masks for high end of number
  301.  .byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
  302.  .byte 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  303.  .byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  304.  .byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00
  305. C Masks for low end of number
  306. C .byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
  307. C .byte 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
  308. C .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
  309. C .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
  310. END_OBJECT(cnsts)