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.

iamax.S 8.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  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. #include "version.h"
  41. #define N $16
  42. #define X $17
  43. #define INCX $18
  44. #define XX $19
  45. #ifndef USE_MIN
  46. #define CMPLT(a, b) cmptlt a, b
  47. #else
  48. #define CMPLT(a, b) cmptlt b, a
  49. #endif
  50. #define STACKSIZE 6 * 8
  51. PROLOGUE
  52. PROFCODE
  53. .frame $sp, STACKSIZE, $26, 0
  54. #ifdef F_INTERFACE
  55. ldl N, 0(N) # n
  56. ldl INCX, 0(INCX) # incx
  57. #endif
  58. lda $sp, -STACKSIZE($sp)
  59. mov X, XX
  60. .align 4
  61. stt $f2, 0($sp)
  62. fclr $f16
  63. cmplt $31, N, $2
  64. unop
  65. stt $f3, 8($sp)
  66. fclr $f17
  67. cmplt $31, INCX, $3
  68. unop
  69. stt $f4, 16($sp)
  70. fclr $f18
  71. SXADDQ INCX, $31, INCX
  72. unop
  73. stt $f5, 24($sp)
  74. fclr $f19
  75. and $2, $3, $2
  76. clr $0
  77. stt $f6, 32($sp)
  78. fclr $f0
  79. sra N, 3, $1
  80. beq $2, $End # if (n <= 0) or (incx <= 0) return
  81. .align 4
  82. LD $f20, 0 * SIZE(X)
  83. unop
  84. fabs $f20, $f0
  85. ble $1, $L15
  86. .align 4
  87. fabs $f20, $f1
  88. unop
  89. addq X, INCX, X
  90. unop
  91. LD $f21, 0 * SIZE(X)
  92. fabs $f20, $f2
  93. addq X, INCX, X
  94. unop
  95. LD $f22, 0 * SIZE(X)
  96. fabs $f20, $f3
  97. addq X, INCX, X
  98. unop
  99. LD $f23, 0 * SIZE(X)
  100. fabs $f20, $f4
  101. addq X, INCX, X
  102. unop
  103. LD $f24, 0 * SIZE(X)
  104. addq X, INCX, X
  105. fabs $f20, $f5
  106. unop
  107. LD $f25, 0 * SIZE(X)
  108. fabs $f20, $f6
  109. addq X, INCX, X
  110. unop
  111. LD $f26, 0 * SIZE(X)
  112. fabs $f20, $f28
  113. addq X, INCX, X
  114. lda $1, -1($1)
  115. LD $f27, 0 * SIZE(X)
  116. unop
  117. addq X, INCX, X
  118. ble $1, $L13
  119. .align 4
  120. $L12:
  121. fcmovne $f16, $f12, $f4
  122. unop
  123. fabs $f20, $f29
  124. ldl $31, 56 * SIZE(X)
  125. fcmovne $f17, $f13, $f5
  126. LD $f20, 0 * SIZE(X)
  127. fabs $f21, $f30
  128. addq X, INCX, X
  129. fcmovne $f18, $f14, $f6
  130. LD $f21, 0 * SIZE(X)
  131. fabs $f22, $f10
  132. addq X, INCX, X
  133. fcmovne $f19, $f15, $f28
  134. LD $f22, 0 * SIZE(X)
  135. fabs $f23, $f11
  136. addq X, INCX, X
  137. fabs $f24, $f12
  138. LD $f23, 0 * SIZE(X)
  139. CMPLT($f0, $f29), $f16
  140. addq X, INCX, X
  141. fabs $f25, $f13
  142. LD $f24, 0 * SIZE(X)
  143. CMPLT($f1, $f30), $f17
  144. addq X, INCX, X
  145. fabs $f26, $f14
  146. LD $f25, 0 * SIZE(X)
  147. CMPLT($f2, $f10), $f18
  148. addq X, INCX, X
  149. fabs $f27, $f15
  150. LD $f26, 0 * SIZE(X)
  151. CMPLT($f3, $f11), $f19
  152. addq X, INCX, X
  153. fcmovne $f16, $f29, $f0
  154. LD $f27, 0 * SIZE(X)
  155. CMPLT($f4, $f12), $f16
  156. addq X, INCX, X
  157. fcmovne $f17, $f30, $f1
  158. unop
  159. CMPLT($f5, $f13), $f17
  160. lda $1, -1($1) # i --
  161. fcmovne $f18, $f10, $f2
  162. unop
  163. CMPLT($f6, $f14), $f18
  164. unop
  165. fcmovne $f19, $f11, $f3
  166. unop
  167. CMPLT($f28, $f15), $f19
  168. bgt $1,$L12
  169. .align 4
  170. $L13:
  171. fcmovne $f16, $f12, $f4
  172. fabs $f20, $f29
  173. fcmovne $f17, $f13, $f5
  174. fabs $f21, $f30
  175. fcmovne $f18, $f14, $f6
  176. fabs $f22, $f10
  177. fcmovne $f19, $f15, $f28
  178. fabs $f23, $f11
  179. fabs $f24, $f12
  180. CMPLT($f0, $f29), $f16
  181. fabs $f25, $f13
  182. CMPLT($f1, $f30), $f17
  183. fabs $f26, $f14
  184. CMPLT($f2, $f10), $f18
  185. fabs $f27, $f15
  186. CMPLT($f3, $f11), $f19
  187. fcmovne $f16, $f29, $f0
  188. CMPLT($f4, $f12), $f16
  189. fcmovne $f17, $f30, $f1
  190. CMPLT($f5, $f13), $f17
  191. fcmovne $f18, $f10, $f2
  192. CMPLT($f6, $f14), $f18
  193. fcmovne $f19, $f11, $f3
  194. CMPLT($f28, $f15), $f19
  195. fcmovne $f16, $f12, $f4
  196. CMPLT($f0, $f1), $f16
  197. fcmovne $f17, $f13, $f5
  198. CMPLT($f2, $f3), $f17
  199. fcmovne $f18, $f14, $f6
  200. CMPLT($f4, $f5), $f18
  201. fcmovne $f19, $f15, $f28
  202. CMPLT($f6, $f28), $f19
  203. fcmovne $f16, $f1, $f0
  204. fcmovne $f17, $f3, $f2
  205. fcmovne $f18, $f5, $f4
  206. fcmovne $f19, $f28, $f6
  207. CMPLT($f0, $f2), $f16
  208. CMPLT($f4, $f6), $f17
  209. fcmovne $f16, $f2, $f0
  210. fcmovne $f17, $f6, $f4
  211. CMPLT($f0, $f4), $f16
  212. fcmovne $f16, $f4, $f0
  213. .align 4
  214. $L15:
  215. and N, 7, $1
  216. unop
  217. unop
  218. ble $1, $L20
  219. .align 4
  220. $L16:
  221. LD $f20, 0 * SIZE(X)
  222. addq X, INCX, X
  223. fabs $f20, $f29
  224. CMPLT($f0, $f29), $f16
  225. fcmovne $f16, $f29, $f0
  226. lda $1, -1($1) # i --
  227. bgt $1, $L16
  228. .align 4
  229. $L20:
  230. sra N, 3, $1
  231. ble $1, $L40
  232. .align 4
  233. LD $f10, 0 * SIZE(XX)
  234. addq XX, INCX, XX
  235. LD $f11, 0 * SIZE(XX)
  236. addq XX, INCX, XX
  237. LD $f12, 0 * SIZE(XX)
  238. addq XX, INCX, XX
  239. LD $f13, 0 * SIZE(XX)
  240. addq XX, INCX, XX
  241. LD $f14, 0 * SIZE(XX)
  242. addq XX, INCX, XX
  243. LD $f15, 0 * SIZE(XX)
  244. addq XX, INCX, XX
  245. LD $f16, 0 * SIZE(XX)
  246. addq XX, INCX, XX
  247. LD $f17, 0 * SIZE(XX)
  248. addq XX, INCX, XX
  249. fabs $f10, $f18
  250. fabs $f11, $f19
  251. fabs $f12, $f20
  252. fabs $f13, $f21
  253. lda $1, -1($1)
  254. ble $1, $L23
  255. .align 4
  256. $L22:
  257. LD $f10, 0 * SIZE(XX)
  258. fabs $f14, $f22
  259. addq XX, INCX, XX
  260. cmpteq $f0, $f18, $f2
  261. LD $f11, 0 * SIZE(XX)
  262. fabs $f15, $f23
  263. addq XX, INCX, XX
  264. cmpteq $f0, $f19, $f3
  265. LD $f12, 0 * SIZE(XX)
  266. fabs $f16, $f24
  267. addq XX, INCX, XX
  268. cmpteq $f0, $f20, $f4
  269. LD $f13, 0 * SIZE(XX)
  270. fabs $f17, $f25
  271. addq XX, INCX, XX
  272. cmpteq $f0, $f21, $f5
  273. LD $f14, 0 * SIZE(XX)
  274. lda $1, -1($1) # i --
  275. cmpteq $f0, $f22, $f26
  276. addq XX, INCX, XX
  277. lda $0, 1($0)
  278. fbne $f2, $End
  279. LD $f15, 0 * SIZE(XX)
  280. cmpteq $f0, $f23, $f27
  281. lda $0, 1($0)
  282. fbne $f3, $End
  283. addq XX, INCX, XX
  284. cmpteq $f0, $f24, $f28
  285. lda $0, 1($0)
  286. fbne $f4, $End
  287. LD $f16, 0 * SIZE(XX)
  288. cmpteq $f0, $f25, $f29
  289. lda $0, 1($0)
  290. fbne $f5, $End
  291. addq XX, INCX, XX
  292. lda $0, 1($0)
  293. fabs $f10, $f18
  294. fbne $f26, $End
  295. LD $f17, 0 * SIZE(XX)
  296. lda $0, 1($0)
  297. fabs $f11, $f19
  298. fbne $f27, $End
  299. addq XX, INCX, XX
  300. lda $0, 1($0)
  301. fabs $f12, $f20
  302. fbne $f28, $End
  303. lda $0, 1($0)
  304. fabs $f13, $f21
  305. fbne $f29, $End
  306. bgt $1, $L22
  307. .align 4
  308. $L23:
  309. fabs $f14, $f22
  310. cmpteq $f0, $f18, $f2
  311. fabs $f15, $f23
  312. cmpteq $f0, $f19, $f3
  313. fabs $f16, $f24
  314. cmpteq $f0, $f20, $f4
  315. fabs $f17, $f25
  316. cmpteq $f0, $f21, $f5
  317. cmpteq $f0, $f22, $f26
  318. lda $0, 1($0)
  319. unop
  320. fbne $f2, $End
  321. cmpteq $f0, $f23, $f27
  322. lda $0, 1($0)
  323. unop
  324. fbne $f3, $End
  325. cmpteq $f0, $f24, $f28
  326. lda $0, 1($0)
  327. unop
  328. fbne $f4, $End
  329. cmpteq $f0, $f25, $f29
  330. lda $0, 1($0)
  331. unop
  332. fbne $f5, $End
  333. lda $0, 1($0)
  334. fbne $f26, $End
  335. lda $0, 1($0)
  336. fbne $f27, $End
  337. lda $0, 1($0)
  338. fbne $f28, $End
  339. lda $0, 1($0)
  340. fbne $f29, $End
  341. .align 4
  342. $L40:
  343. LD $f20, 0 * SIZE(XX)
  344. addq XX, INCX, XX
  345. fabs $f20, $f25
  346. cmpteq $f0, $f25, $f29
  347. lda $0, 1($0)
  348. fbne $f29, $End
  349. br $31, $L40
  350. .align 4
  351. $End:
  352. ldt $f2, 0($sp)
  353. ldt $f3, 8($sp)
  354. ldt $f4, 16($sp)
  355. ldt $f5, 24($sp)
  356. ldt $f6, 32($sp)
  357. lda $sp, STACKSIZE($sp)
  358. ret
  359. EPILOGUE