xor.S 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. /*
  2. * arch/sparc64/lib/xor.S
  3. *
  4. * High speed xor_block operation for RAID4/5 utilizing the
  5. * UltraSparc Visual Instruction Set.
  6. *
  7. * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
  8. */
  9. #include <asm/visasm.h>
  10. #include <asm/asi.h>
  11. #include <asm/dcu.h>
  12. #include <asm/spitfire.h>
  13. /*
  14. * Requirements:
  15. * !(((long)dest | (long)sourceN) & (64 - 1)) &&
  16. * !(len & 127) && len >= 256
  17. */
  18. .text
  19. .align 32
  20. .globl xor_vis_2
  21. .type xor_vis_2,#function
  22. xor_vis_2:
  23. rd %fprs, %o5
  24. andcc %o5, FPRS_FEF|FPRS_DU, %g0
  25. be,pt %icc, 0f
  26. sethi %hi(VISenter), %g1
  27. jmpl %g1 + %lo(VISenter), %g7
  28. add %g7, 8, %g7
  29. 0: wr %g0, FPRS_FEF, %fprs
  30. rd %asi, %g1
  31. wr %g0, ASI_BLK_P, %asi
  32. membar #LoadStore|#StoreLoad|#StoreStore
  33. sub %o0, 128, %o0
  34. ldda [%o1] %asi, %f0
  35. ldda [%o2] %asi, %f16
  36. 2: ldda [%o1 + 64] %asi, %f32
  37. fxor %f0, %f16, %f16
  38. fxor %f2, %f18, %f18
  39. fxor %f4, %f20, %f20
  40. fxor %f6, %f22, %f22
  41. fxor %f8, %f24, %f24
  42. fxor %f10, %f26, %f26
  43. fxor %f12, %f28, %f28
  44. fxor %f14, %f30, %f30
  45. stda %f16, [%o1] %asi
  46. ldda [%o2 + 64] %asi, %f48
  47. ldda [%o1 + 128] %asi, %f0
  48. fxor %f32, %f48, %f48
  49. fxor %f34, %f50, %f50
  50. add %o1, 128, %o1
  51. fxor %f36, %f52, %f52
  52. add %o2, 128, %o2
  53. fxor %f38, %f54, %f54
  54. subcc %o0, 128, %o0
  55. fxor %f40, %f56, %f56
  56. fxor %f42, %f58, %f58
  57. fxor %f44, %f60, %f60
  58. fxor %f46, %f62, %f62
  59. stda %f48, [%o1 - 64] %asi
  60. bne,pt %xcc, 2b
  61. ldda [%o2] %asi, %f16
  62. ldda [%o1 + 64] %asi, %f32
  63. fxor %f0, %f16, %f16
  64. fxor %f2, %f18, %f18
  65. fxor %f4, %f20, %f20
  66. fxor %f6, %f22, %f22
  67. fxor %f8, %f24, %f24
  68. fxor %f10, %f26, %f26
  69. fxor %f12, %f28, %f28
  70. fxor %f14, %f30, %f30
  71. stda %f16, [%o1] %asi
  72. ldda [%o2 + 64] %asi, %f48
  73. membar #Sync
  74. fxor %f32, %f48, %f48
  75. fxor %f34, %f50, %f50
  76. fxor %f36, %f52, %f52
  77. fxor %f38, %f54, %f54
  78. fxor %f40, %f56, %f56
  79. fxor %f42, %f58, %f58
  80. fxor %f44, %f60, %f60
  81. fxor %f46, %f62, %f62
  82. stda %f48, [%o1 + 64] %asi
  83. membar #Sync|#StoreStore|#StoreLoad
  84. wr %g1, %g0, %asi
  85. retl
  86. wr %g0, 0, %fprs
  87. .size xor_vis_2, .-xor_vis_2
  88. .globl xor_vis_3
  89. .type xor_vis_3,#function
  90. xor_vis_3:
  91. rd %fprs, %o5
  92. andcc %o5, FPRS_FEF|FPRS_DU, %g0
  93. be,pt %icc, 0f
  94. sethi %hi(VISenter), %g1
  95. jmpl %g1 + %lo(VISenter), %g7
  96. add %g7, 8, %g7
  97. 0: wr %g0, FPRS_FEF, %fprs
  98. rd %asi, %g1
  99. wr %g0, ASI_BLK_P, %asi
  100. membar #LoadStore|#StoreLoad|#StoreStore
  101. sub %o0, 64, %o0
  102. ldda [%o1] %asi, %f0
  103. ldda [%o2] %asi, %f16
  104. 3: ldda [%o3] %asi, %f32
  105. fxor %f0, %f16, %f48
  106. fxor %f2, %f18, %f50
  107. add %o1, 64, %o1
  108. fxor %f4, %f20, %f52
  109. fxor %f6, %f22, %f54
  110. add %o2, 64, %o2
  111. fxor %f8, %f24, %f56
  112. fxor %f10, %f26, %f58
  113. fxor %f12, %f28, %f60
  114. fxor %f14, %f30, %f62
  115. ldda [%o1] %asi, %f0
  116. fxor %f48, %f32, %f48
  117. fxor %f50, %f34, %f50
  118. fxor %f52, %f36, %f52
  119. fxor %f54, %f38, %f54
  120. add %o3, 64, %o3
  121. fxor %f56, %f40, %f56
  122. fxor %f58, %f42, %f58
  123. subcc %o0, 64, %o0
  124. fxor %f60, %f44, %f60
  125. fxor %f62, %f46, %f62
  126. stda %f48, [%o1 - 64] %asi
  127. bne,pt %xcc, 3b
  128. ldda [%o2] %asi, %f16
  129. ldda [%o3] %asi, %f32
  130. fxor %f0, %f16, %f48
  131. fxor %f2, %f18, %f50
  132. fxor %f4, %f20, %f52
  133. fxor %f6, %f22, %f54
  134. fxor %f8, %f24, %f56
  135. fxor %f10, %f26, %f58
  136. fxor %f12, %f28, %f60
  137. fxor %f14, %f30, %f62
  138. membar #Sync
  139. fxor %f48, %f32, %f48
  140. fxor %f50, %f34, %f50
  141. fxor %f52, %f36, %f52
  142. fxor %f54, %f38, %f54
  143. fxor %f56, %f40, %f56
  144. fxor %f58, %f42, %f58
  145. fxor %f60, %f44, %f60
  146. fxor %f62, %f46, %f62
  147. stda %f48, [%o1] %asi
  148. membar #Sync|#StoreStore|#StoreLoad
  149. wr %g1, %g0, %asi
  150. retl
  151. wr %g0, 0, %fprs
  152. .size xor_vis_3, .-xor_vis_3
  153. .globl xor_vis_4
  154. .type xor_vis_4,#function
  155. xor_vis_4:
  156. rd %fprs, %o5
  157. andcc %o5, FPRS_FEF|FPRS_DU, %g0
  158. be,pt %icc, 0f
  159. sethi %hi(VISenter), %g1
  160. jmpl %g1 + %lo(VISenter), %g7
  161. add %g7, 8, %g7
  162. 0: wr %g0, FPRS_FEF, %fprs
  163. rd %asi, %g1
  164. wr %g0, ASI_BLK_P, %asi
  165. membar #LoadStore|#StoreLoad|#StoreStore
  166. sub %o0, 64, %o0
  167. ldda [%o1] %asi, %f0
  168. ldda [%o2] %asi, %f16
  169. 4: ldda [%o3] %asi, %f32
  170. fxor %f0, %f16, %f16
  171. fxor %f2, %f18, %f18
  172. add %o1, 64, %o1
  173. fxor %f4, %f20, %f20
  174. fxor %f6, %f22, %f22
  175. add %o2, 64, %o2
  176. fxor %f8, %f24, %f24
  177. fxor %f10, %f26, %f26
  178. fxor %f12, %f28, %f28
  179. fxor %f14, %f30, %f30
  180. ldda [%o4] %asi, %f48
  181. fxor %f16, %f32, %f32
  182. fxor %f18, %f34, %f34
  183. fxor %f20, %f36, %f36
  184. fxor %f22, %f38, %f38
  185. add %o3, 64, %o3
  186. fxor %f24, %f40, %f40
  187. fxor %f26, %f42, %f42
  188. fxor %f28, %f44, %f44
  189. fxor %f30, %f46, %f46
  190. ldda [%o1] %asi, %f0
  191. fxor %f32, %f48, %f48
  192. fxor %f34, %f50, %f50
  193. fxor %f36, %f52, %f52
  194. add %o4, 64, %o4
  195. fxor %f38, %f54, %f54
  196. fxor %f40, %f56, %f56
  197. fxor %f42, %f58, %f58
  198. subcc %o0, 64, %o0
  199. fxor %f44, %f60, %f60
  200. fxor %f46, %f62, %f62
  201. stda %f48, [%o1 - 64] %asi
  202. bne,pt %xcc, 4b
  203. ldda [%o2] %asi, %f16
  204. ldda [%o3] %asi, %f32
  205. fxor %f0, %f16, %f16
  206. fxor %f2, %f18, %f18
  207. fxor %f4, %f20, %f20
  208. fxor %f6, %f22, %f22
  209. fxor %f8, %f24, %f24
  210. fxor %f10, %f26, %f26
  211. fxor %f12, %f28, %f28
  212. fxor %f14, %f30, %f30
  213. ldda [%o4] %asi, %f48
  214. fxor %f16, %f32, %f32
  215. fxor %f18, %f34, %f34
  216. fxor %f20, %f36, %f36
  217. fxor %f22, %f38, %f38
  218. fxor %f24, %f40, %f40
  219. fxor %f26, %f42, %f42
  220. fxor %f28, %f44, %f44
  221. fxor %f30, %f46, %f46
  222. membar #Sync
  223. fxor %f32, %f48, %f48
  224. fxor %f34, %f50, %f50
  225. fxor %f36, %f52, %f52
  226. fxor %f38, %f54, %f54
  227. fxor %f40, %f56, %f56
  228. fxor %f42, %f58, %f58
  229. fxor %f44, %f60, %f60
  230. fxor %f46, %f62, %f62
  231. stda %f48, [%o1] %asi
  232. membar #Sync|#StoreStore|#StoreLoad
  233. wr %g1, %g0, %asi
  234. retl
  235. wr %g0, 0, %fprs
  236. .size xor_vis_4, .-xor_vis_4
  237. .globl xor_vis_5
  238. .type xor_vis_5,#function
  239. xor_vis_5:
  240. save %sp, -192, %sp
  241. rd %fprs, %o5
  242. andcc %o5, FPRS_FEF|FPRS_DU, %g0
  243. be,pt %icc, 0f
  244. sethi %hi(VISenter), %g1
  245. jmpl %g1 + %lo(VISenter), %g7
  246. add %g7, 8, %g7
  247. 0: wr %g0, FPRS_FEF, %fprs
  248. rd %asi, %g1
  249. wr %g0, ASI_BLK_P, %asi
  250. membar #LoadStore|#StoreLoad|#StoreStore
  251. sub %i0, 64, %i0
  252. ldda [%i1] %asi, %f0
  253. ldda [%i2] %asi, %f16
  254. 5: ldda [%i3] %asi, %f32
  255. fxor %f0, %f16, %f48
  256. fxor %f2, %f18, %f50
  257. add %i1, 64, %i1
  258. fxor %f4, %f20, %f52
  259. fxor %f6, %f22, %f54
  260. add %i2, 64, %i2
  261. fxor %f8, %f24, %f56
  262. fxor %f10, %f26, %f58
  263. fxor %f12, %f28, %f60
  264. fxor %f14, %f30, %f62
  265. ldda [%i4] %asi, %f16
  266. fxor %f48, %f32, %f48
  267. fxor %f50, %f34, %f50
  268. fxor %f52, %f36, %f52
  269. fxor %f54, %f38, %f54
  270. add %i3, 64, %i3
  271. fxor %f56, %f40, %f56
  272. fxor %f58, %f42, %f58
  273. fxor %f60, %f44, %f60
  274. fxor %f62, %f46, %f62
  275. ldda [%i5] %asi, %f32
  276. fxor %f48, %f16, %f48
  277. fxor %f50, %f18, %f50
  278. add %i4, 64, %i4
  279. fxor %f52, %f20, %f52
  280. fxor %f54, %f22, %f54
  281. add %i5, 64, %i5
  282. fxor %f56, %f24, %f56
  283. fxor %f58, %f26, %f58
  284. fxor %f60, %f28, %f60
  285. fxor %f62, %f30, %f62
  286. ldda [%i1] %asi, %f0
  287. fxor %f48, %f32, %f48
  288. fxor %f50, %f34, %f50
  289. fxor %f52, %f36, %f52
  290. fxor %f54, %f38, %f54
  291. fxor %f56, %f40, %f56
  292. fxor %f58, %f42, %f58
  293. subcc %i0, 64, %i0
  294. fxor %f60, %f44, %f60
  295. fxor %f62, %f46, %f62
  296. stda %f48, [%i1 - 64] %asi
  297. bne,pt %xcc, 5b
  298. ldda [%i2] %asi, %f16
  299. ldda [%i3] %asi, %f32
  300. fxor %f0, %f16, %f48
  301. fxor %f2, %f18, %f50
  302. fxor %f4, %f20, %f52
  303. fxor %f6, %f22, %f54
  304. fxor %f8, %f24, %f56
  305. fxor %f10, %f26, %f58
  306. fxor %f12, %f28, %f60
  307. fxor %f14, %f30, %f62
  308. ldda [%i4] %asi, %f16
  309. fxor %f48, %f32, %f48
  310. fxor %f50, %f34, %f50
  311. fxor %f52, %f36, %f52
  312. fxor %f54, %f38, %f54
  313. fxor %f56, %f40, %f56
  314. fxor %f58, %f42, %f58
  315. fxor %f60, %f44, %f60
  316. fxor %f62, %f46, %f62
  317. ldda [%i5] %asi, %f32
  318. fxor %f48, %f16, %f48
  319. fxor %f50, %f18, %f50
  320. fxor %f52, %f20, %f52
  321. fxor %f54, %f22, %f54
  322. fxor %f56, %f24, %f56
  323. fxor %f58, %f26, %f58
  324. fxor %f60, %f28, %f60
  325. fxor %f62, %f30, %f62
  326. membar #Sync
  327. fxor %f48, %f32, %f48
  328. fxor %f50, %f34, %f50
  329. fxor %f52, %f36, %f52
  330. fxor %f54, %f38, %f54
  331. fxor %f56, %f40, %f56
  332. fxor %f58, %f42, %f58
  333. fxor %f60, %f44, %f60
  334. fxor %f62, %f46, %f62
  335. stda %f48, [%i1] %asi
  336. membar #Sync|#StoreStore|#StoreLoad
  337. wr %g1, %g0, %asi
  338. wr %g0, 0, %fprs
  339. ret
  340. restore
  341. .size xor_vis_5, .-xor_vis_5