You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

zdot_ppc440.S 9.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. /*********************************************************************/
  2. /* Copyright 2009, 2010 The University of Texas at Austin. */
  3. /* All rights reserved. */
  4. /* */
  5. /* Redistribution and use in source and binary forms, with or */
  6. /* without modification, are permitted provided that the following */
  7. /* conditions are met: */
  8. /* */
  9. /* 1. Redistributions of source code must retain the above */
  10. /* copyright notice, this list of conditions and the following */
  11. /* disclaimer. */
  12. /* */
  13. /* 2. Redistributions in binary form must reproduce the above */
  14. /* copyright notice, this list of conditions and the following */
  15. /* disclaimer in the documentation and/or other materials */
  16. /* provided with the distribution. */
  17. /* */
  18. /* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
  19. /* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
  20. /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
  21. /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
  22. /* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
  23. /* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
  24. /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
  25. /* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
  26. /* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
  27. /* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
  28. /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
  29. /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
  30. /* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
  31. /* POSSIBILITY OF SUCH DAMAGE. */
  32. /* */
  33. /* The views and conclusions contained in the software and */
  34. /* documentation are those of the authors and should not be */
  35. /* interpreted as representing official policies, either expressed */
  36. /* or implied, of The University of Texas at Austin. */
  37. /*********************************************************************/
  38. #define ASSEMBLER
  39. #include "common.h"
  40. #if defined(F_INTERFACE) && defined(F_INTERFACE_F2C)
  41. #define RESULT r3
  42. #define N r4
  43. #define X r5
  44. #define INCX r6
  45. #define Y r7
  46. #define INCY r8
  47. #define PRE r9
  48. #else
  49. #define N r3
  50. #define X r4
  51. #define INCX r5
  52. #define Y r6
  53. #define INCY r7
  54. #define PRE r8
  55. #endif
  56. #define INCXM1 r10
  57. #define INCYM1 r11
  58. #define FZERO f0
  59. #define STACKSIZE 160
  60. PROLOGUE
  61. PROFCODE
  62. addi SP, SP, -STACKSIZE
  63. li r0, 0
  64. stw r0, 144(SP)
  65. stfd f14, 0(SP)
  66. stfd f15, 8(SP)
  67. stfd f16, 16(SP)
  68. stfd f17, 24(SP)
  69. stfd f18, 32(SP)
  70. stfd f19, 40(SP)
  71. stfd f20, 48(SP)
  72. stfd f21, 56(SP)
  73. stfd f22, 64(SP)
  74. stfd f23, 72(SP)
  75. stfd f24, 80(SP)
  76. stfd f25, 88(SP)
  77. stfd f26, 96(SP)
  78. stfd f27, 104(SP)
  79. stfd f28, 112(SP)
  80. stfd f29, 120(SP)
  81. stfd f30, 128(SP)
  82. stfd f31, 136(SP)
  83. lfs FZERO,144(SP)
  84. #ifdef F_INTERFACE
  85. LDINT N, 0(N)
  86. LDINT INCX, 0(INCX)
  87. LDINT INCY, 0(INCY)
  88. #endif
  89. slwi INCX, INCX, ZBASE_SHIFT
  90. slwi INCY, INCY, ZBASE_SHIFT
  91. subi INCXM1, INCX, SIZE
  92. subi INCYM1, INCY, SIZE
  93. fmr f1, FZERO
  94. fmr f2, FZERO
  95. fmr f3, FZERO
  96. fmr f4, FZERO
  97. fmr f5, FZERO
  98. fmr f6, FZERO
  99. fmr f7, FZERO
  100. fmr f24, FZERO
  101. fmr f25, FZERO
  102. fmr f26, FZERO
  103. fmr f27, FZERO
  104. fmr f28, FZERO
  105. fmr f29, FZERO
  106. fmr f30, FZERO
  107. fmr f31, FZERO
  108. li PRE, 3 * 16 * SIZE
  109. cmpwi cr0, N, 0
  110. ble- LL(999)
  111. #ifdef F_INTERFACE
  112. cmpwi cr0, INCX, 0
  113. bge+ LL(102)
  114. subi r0, N, 1
  115. mullw r0, r0, INCX
  116. sub X, X, r0
  117. .align 4
  118. LL(102):
  119. cmpwi cr0, INCY, 0
  120. bge+ LL(104)
  121. subi r0, N, 1
  122. mullw r0, r0, INCY
  123. sub Y, Y, r0
  124. .align 4
  125. LL(104):
  126. #endif
  127. sub X, X, INCXM1
  128. sub Y, Y, INCYM1
  129. srawi. r0, N, 3
  130. mtspr CTR, r0
  131. beq- LL(150)
  132. LFDX f8, X, INCXM1
  133. LFDX f16, Y, INCYM1
  134. LFDUX f9, X, INCX
  135. LFDUX f17, Y, INCY
  136. LFDX f10, X, INCXM1
  137. LFDX f18, Y, INCYM1
  138. LFDUX f11, X, INCX
  139. LFDUX f19, Y, INCY
  140. LFDX f12, X, INCXM1
  141. LFDX f20, Y, INCYM1
  142. LFDUX f13, X, INCX
  143. LFDUX f21, Y, INCY
  144. LFDX f14, X, INCXM1
  145. LFDUX f15, X, INCX
  146. bdz LL(120)
  147. .align 4
  148. LL(110):
  149. FMADD f0, f8, f16, f0
  150. LFDX f22, Y, INCYM1
  151. #ifdef PPCG4
  152. dcbt X, PRE
  153. #endif
  154. FMADD f3, f8, f17, f3
  155. LFDX f8, X, INCXM1
  156. FMADD f1, f9, f17, f1
  157. LFDUX f23, Y, INCY
  158. FMADD f2, f9, f16, f2
  159. LFDUX f9, X, INCX
  160. FMADD f4, f10, f18, f4
  161. LFDX f16, Y, INCYM1
  162. #ifdef PPCG4
  163. dcbt Y, PRE
  164. #endif
  165. FMADD f7, f10, f19, f7
  166. LFDX f10, X, INCXM1
  167. FMADD f5, f11, f19, f5
  168. LFDUX f17, Y, INCY
  169. FMADD f6, f11, f18, f6
  170. LFDUX f11, X, INCX
  171. FMADD f24, f12, f20, f24
  172. LFDX f18, Y, INCYM1
  173. #if defined(PPCG4) && defined(DOUBLE)
  174. dcbt X, PRE
  175. #endif
  176. FMADD f27, f12, f21, f27
  177. LFDX f12, X, INCXM1
  178. FMADD f25, f13, f21, f25
  179. LFDUX f19, Y, INCY
  180. FMADD f26, f13, f20, f26
  181. LFDUX f13, X, INCX
  182. FMADD f28, f14, f22, f28
  183. LFDX f20, Y, INCYM1
  184. #if defined(PPCG4) && defined(DOUBLE)
  185. dcbt Y, PRE
  186. #endif
  187. FMADD f31, f14, f23, f31
  188. LFDX f14, X, INCXM1
  189. FMADD f29, f15, f23, f29
  190. LFDUX f21, Y, INCY
  191. FMADD f30, f15, f22, f30
  192. LFDUX f15, X, INCX
  193. FMADD f0, f8, f16, f0
  194. LFDX f22, Y, INCYM1
  195. #ifdef PPCG4
  196. dcbt X, PRE
  197. #endif
  198. FMADD f3, f8, f17, f3
  199. LFDX f8, X, INCXM1
  200. FMADD f1, f9, f17, f1
  201. LFDUX f23, Y, INCY
  202. FMADD f2, f9, f16, f2
  203. LFDUX f9, X, INCX
  204. FMADD f4, f10, f18, f4
  205. LFDX f16, Y, INCYM1
  206. #ifdef PPCG4
  207. dcbt Y, PRE
  208. #endif
  209. FMADD f7, f10, f19, f7
  210. LFDX f10, X, INCXM1
  211. FMADD f5, f11, f19, f5
  212. LFDUX f17, Y, INCY
  213. FMADD f6, f11, f18, f6
  214. LFDUX f11, X, INCX
  215. FMADD f24, f12, f20, f24
  216. LFDX f18, Y, INCYM1
  217. #if defined(PPCG4) && defined(DOUBLE)
  218. dcbt X, PRE
  219. #endif
  220. FMADD f27, f12, f21, f27
  221. LFDX f12, X, INCXM1
  222. FMADD f25, f13, f21, f25
  223. LFDUX f19, Y, INCY
  224. FMADD f26, f13, f20, f26
  225. LFDUX f13, X, INCX
  226. FMADD f28, f14, f22, f28
  227. LFDX f20, Y, INCYM1
  228. #if defined(PPCG4) && defined(DOUBLE)
  229. dcbt Y, PRE
  230. #endif
  231. FMADD f31, f14, f23, f31
  232. LFDX f14, X, INCXM1
  233. FMADD f29, f15, f23, f29
  234. LFDUX f21, Y, INCY
  235. FMADD f30, f15, f22, f30
  236. LFDUX f15, X, INCX
  237. bdnz LL(110)
  238. .align 4
  239. LL(120):
  240. FMADD f0, f8, f16, f0
  241. LFDX f22, Y, INCYM1
  242. FMADD f3, f8, f17, f3
  243. LFDX f8, X, INCXM1
  244. FMADD f1, f9, f17, f1
  245. LFDUX f23, Y, INCY
  246. FMADD f2, f9, f16, f2
  247. LFDUX f9, X, INCX
  248. FMADD f4, f10, f18, f4
  249. LFDX f16, Y, INCYM1
  250. FMADD f7, f10, f19, f7
  251. LFDX f10, X, INCXM1
  252. FMADD f5, f11, f19, f5
  253. LFDUX f17, Y, INCY
  254. FMADD f6, f11, f18, f6
  255. LFDUX f11, X, INCX
  256. FMADD f24, f12, f20, f24
  257. LFDX f18, Y, INCYM1
  258. FMADD f27, f12, f21, f27
  259. LFDX f12, X, INCXM1
  260. FMADD f25, f13, f21, f25
  261. LFDUX f19, Y, INCY
  262. FMADD f26, f13, f20, f26
  263. LFDUX f13, X, INCX
  264. FMADD f28, f14, f22, f28
  265. LFDX f20, Y, INCYM1
  266. FMADD f31, f14, f23, f31
  267. LFDX f14, X, INCXM1
  268. FMADD f29, f15, f23, f29
  269. LFDUX f21, Y, INCY
  270. FMADD f30, f15, f22, f30
  271. LFDUX f15, X, INCX
  272. LFDX f22, Y, INCYM1
  273. FMADD f0, f8, f16, f0
  274. LFDUX f23, Y, INCY
  275. FMADD f3, f8, f17, f3
  276. FMADD f1, f9, f17, f1
  277. FMADD f2, f9, f16, f2
  278. FMADD f4, f10, f18, f4
  279. FMADD f7, f10, f19, f7
  280. FMADD f5, f11, f19, f5
  281. FMADD f6, f11, f18, f6
  282. FMADD f24, f12, f20, f24
  283. FMADD f27, f12, f21, f27
  284. FMADD f25, f13, f21, f25
  285. FMADD f26, f13, f20, f26
  286. FMADD f28, f14, f22, f28
  287. FMADD f31, f14, f23, f31
  288. FMADD f29, f15, f23, f29
  289. FMADD f30, f15, f22, f30
  290. .align 4
  291. LL(150):
  292. andi. r0, N, 7
  293. mtspr CTR, r0
  294. beq LL(999)
  295. .align 4
  296. LL(160):
  297. LFDX f8, X, INCXM1
  298. LFDUX f9, X, INCX
  299. LFDX f16, Y, INCYM1
  300. LFDUX f17, Y, INCY
  301. FMADD f0, f8, f16, f0
  302. FMADD f1, f9, f17, f1
  303. FMADD f2, f9, f16, f2
  304. FMADD f3, f8, f17, f3
  305. bdnz LL(160)
  306. .align 4
  307. LL(999):
  308. FADD f0, f0, f4
  309. FADD f1, f1, f5
  310. FADD f2, f2, f6
  311. FADD f3, f3, f7
  312. FADD f24, f28, f24
  313. FADD f25, f29, f25
  314. FADD f26, f30, f26
  315. FADD f27, f31, f27
  316. FADD f0, f0, f24
  317. FADD f1, f1, f25
  318. FADD f2, f2, f26
  319. FADD f3, f3, f27
  320. #ifndef CONJ
  321. FSUB f1, f0, f1
  322. FADD f2, f2, f3
  323. #else
  324. FADD f1, f0, f1
  325. FSUB f2, f3, f2
  326. #endif
  327. #if defined(F_INTERFACE) && defined(F_INTERFACE_F2C)
  328. STFD f1, 0 * SIZE(RESULT)
  329. STFD f2, 1 * SIZE(RESULT)
  330. #endif
  331. #if defined(F_INTERFACE) && defined(F_INTERFACE_GFORT)
  332. #ifndef __64BIT__
  333. #ifndef DOUBLE
  334. stfs f1, 144(SP)
  335. stfs f2, 148(SP)
  336. lwz r3, 144(SP)
  337. lwz r4, 148(SP)
  338. #else
  339. stfd f1, 144(SP)
  340. stfd f2, 152(SP)
  341. lwz r3, 144(SP)
  342. lwz r4, 148(SP)
  343. lwz r5, 152(SP)
  344. lwz r6, 156(SP)
  345. #endif
  346. #else
  347. #ifndef DOUBLE
  348. stfs f1, 144(SP)
  349. stfs f2, 148(SP)
  350. ld r3, 144(SP)
  351. #else
  352. stfd f1, 144(SP)
  353. stfd f2, 152(SP)
  354. ld r3, 144(SP)
  355. ld r4, 152(SP)
  356. #endif
  357. #endif
  358. #endif
  359. lfd f14, 0(SP)
  360. lfd f15, 8(SP)
  361. lfd f16, 16(SP)
  362. lfd f17, 24(SP)
  363. lfd f18, 32(SP)
  364. lfd f19, 40(SP)
  365. lfd f20, 48(SP)
  366. lfd f21, 56(SP)
  367. lfd f22, 64(SP)
  368. lfd f23, 72(SP)
  369. lfd f24, 80(SP)
  370. lfd f25, 88(SP)
  371. lfd f26, 96(SP)
  372. lfd f27, 104(SP)
  373. lfd f28, 112(SP)
  374. lfd f29, 120(SP)
  375. lfd f30, 128(SP)
  376. lfd f31, 136(SP)
  377. addi SP, SP, STACKSIZE
  378. blr
  379. EPILOGUE