VIScsum.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:18k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: VIScsum.S,v 1.6 2000/02/20 23:21:39 davem Exp $
  2.  * VIScsum.S: High bandwidth IP checksumming utilizing the UltraSparc
  3.  *            Visual Instruction Set.
  4.  *
  5.  * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  6.  * Copyright (C) 2000 David S. Miller (davem@redhat.com)
  7.  *
  8.  * Based on older sparc32/sparc64 checksum.S, which is:
  9.  *
  10.  *      Copyright(C) 1995 Linus Torvalds
  11.  *      Copyright(C) 1995 Miguel de Icaza
  12.  *      Copyright(C) 1996, 1997 David S. Miller
  13.  *    derived from:
  14.  *   Linux/Alpha checksum c-code
  15.  *        Linux/ix86 inline checksum assembly
  16.  *        RFC1071 Computing the Internet Checksum (esp. Jacobsons m68k code)
  17.  *   David Mosberger-Tang for optimized reference c-code
  18.  *   BSD4.4 portable checksum routine
  19.  */
  20. #ifdef __sparc_v9__
  21. #define STACKOFF 2175
  22. #else
  23. #define STACKOFF 64
  24. #endif
  25. #ifdef __KERNEL__
  26. #include <asm/head.h>
  27. #include <asm/asi.h>
  28. #include <asm/visasm.h>
  29. #include <asm/asm_offsets.h>
  30. #else
  31. #define ASI_BLK_P 0xf0
  32. #define FRPS_FEF 0x04
  33. #endif
  34. /* Dobrou noc, SunSoft engineers. Spete sladce.
  35.  * This has a couple of tricks in and those
  36.  * tricks are UltraLinux trade secrets :))
  37.  */
  38. #define START_THE_TRICK(fz,f0,f2,f4,f6,f8,f10)
  39. fcmpgt32 %fz, %f0, %g1 /*  FPM Group */;
  40. fcmpgt32 %fz, %f2, %g2 /*  FPM Group */;
  41. fcmpgt32 %fz, %f4, %g3 /*  FPM Group */;
  42. inc %g1 /*  IEU0 Group */;
  43. fcmpgt32 %fz, %f6, %g5 /*  FPM */;
  44. srl %g1, 1, %g1 /*  IEU0 Group */;
  45. fcmpgt32 %fz, %f8, %g7 /*  FPM */;
  46. inc %g2 /*  IEU0 Group */;
  47. fcmpgt32 %fz, %f10, %o3 /*  FPM */;
  48. srl %g2, 1, %g2 /*  IEU0 Group */;
  49. inc %g3 /*  IEU1 */;
  50. srl %g3, 1, %g3 /*  IEU0 Group */;
  51. add %o2, %g1, %o2 /*  IEU1 */;
  52. add %o2, %g2, %o2 /*  IEU0 Group */;
  53. inc %g5 /*  IEU1 */;
  54. add %o2, %g3, %o2 /*  IEU0 Group */;
  55. #define DO_THE_TRICK(O12,O14,f0,f2,f4,f6,f8,f10,f12,f14,F0,F2,F4,F6,F8,F10,F12,F14)
  56. srl %g5, 1, %g5 /*  IEU0 Group */;
  57. fpadd32 %F0, %f0, %F0 /*  FPA */;
  58. fcmpgt32 %O12, %f12, %o4 /*  FPM */;
  59. inc %g7 /*  IEU0 Group */;
  60. fpadd32 %F2, %f2, %F2 /*  FPA */;
  61. fcmpgt32 %O14, %f14, %o5 /*  FPM */;
  62. add %o2, %g5, %o2 /*  IEU1 Group */;
  63. fpadd32 %F4, %f4, %F4 /*  FPA */;
  64. fcmpgt32 %f0, %F0, %g1 /*  FPM */;
  65. srl %g7, 1, %g7 /*  IEU0 Group */;
  66. fpadd32 %F6, %f6, %F6 /*  FPA */;
  67. fcmpgt32 %f2, %F2, %g2 /*  FPM */;
  68. add %o2, %g7, %o2 /*  IEU0 Group */;
  69. fpadd32 %F8, %f8, %F8 /*  FPA */;
  70. fcmpgt32 %f4, %F4, %g3 /*  FPM */;
  71. inc %o3 /*  IEU0 Group */;
  72. fpadd32 %F10, %f10, %F10 /*  FPA */;
  73. fcmpgt32 %f6, %F6, %g5 /*  FPM */;
  74. srl %o3, 1, %o3 /*  IEU0 Group */;
  75. fpadd32 %F12, %f12, %F12 /*  FPA */;
  76. fcmpgt32 %f8, %F8, %g7 /*  FPM */;
  77. add %o2, %o3, %o2 /*  IEU0 Group */;
  78. fpadd32 %F14, %f14, %F14 /*  FPA */;
  79. fcmpgt32 %f10, %F10, %o3 /*  FPM */;
  80. inc %o4 /*  IEU0 Group */;
  81. inc %o5 /*  IEU1 */;
  82. srl %o4, 1, %o4 /*  IEU0 Group */;
  83. inc %g1 /*  IEU1 */;
  84. srl %o5, 1, %o5 /*  IEU0 Group */;
  85. add %o2, %o4, %o2 /*  IEU1 */;
  86. srl %g1, 1, %g1 /*  IEU0 Group */;
  87. add %o2, %o5, %o2 /*  IEU1 */;
  88. inc %g2 /*  IEU0 Group */;
  89. add %o2, %g1, %o2 /*  IEU1 */;
  90. srl %g2, 1, %g2 /*  IEU0 Group */;
  91. inc %g3 /*  IEU1 */;
  92. srl %g3, 1, %g3 /*  IEU0 Group */;
  93. add %o2, %g2, %o2 /*  IEU1 */;
  94. inc %g5 /*  IEU0 Group */;
  95. add %o2, %g3, %o2 /*  IEU0 */;
  96. #define END_THE_TRICK(O12,O14,f0,f2,f4,f6,f8,f10,f12,f14,S0,S1,S2,S3,T0,T1,U0,fz)
  97. srl %g5, 1, %g5 /*  IEU0 Group */;
  98. fpadd32 %f2, %f0, %S0 /*  FPA */;
  99. fcmpgt32 %O12, %f12, %o4 /*  FPM */;
  100. inc %g7 /*  IEU0 Group */;
  101. fpadd32 %f6, %f4, %S1 /*  FPA */;
  102. fcmpgt32 %O14, %f14, %o5 /*  FPM */;
  103. srl %g7, 1, %g7 /*  IEU0 Group */;
  104. fpadd32 %f10, %f8, %S2 /*  FPA */;
  105. fcmpgt32 %f0, %S0, %g1 /*  FPM */;
  106. inc %o3 /*  IEU0 Group */;
  107. fpadd32 %f14, %f12, %S3 /*  FPA */;
  108. fcmpgt32 %f4, %S1, %g2 /*  FPM */;
  109. add %o2, %g5, %o2 /*  IEU0 Group */;
  110. fpadd32 %S0, %S1, %T0 /*  FPA */;
  111. fcmpgt32 %f8, %S2, %g3 /*  FPM */;
  112. add %o2, %g7, %o2 /*  IEU0 Group */;
  113. fzero %fz /*  FPA */;
  114. fcmpgt32 %f12, %S3, %g5 /*  FPM */;
  115. srl %o3, 1, %o3 /*  IEU0 Group */;
  116. fpadd32 %S2, %S3, %T1 /*  FPA */;
  117. fcmpgt32 %S0, %T0, %g7 /*  FPM */;
  118. add %o2, %o3, %o2 /*  IEU0 Group */;
  119. fpadd32 %T0, %T1, %U0 /*  FPA */;
  120. fcmpgt32 %S2, %T1, %o3 /*  FPM */;
  121. inc %o4 /*  IEU0 Group */;
  122. inc %o5 /*  IEU1 */;
  123. srl %o4, 1, %o4 /*  IEU0 Group */;
  124. inc %g1 /*  IEU1 */;
  125. add %o2, %o4, %o2 /*  IEU0 Group */;
  126. fcmpgt32 %fz, %f2, %o4 /*  FPM */;
  127. srl %o5, 1, %o5 /*  IEU0 Group */;
  128. inc %g2 /*  IEU1 */;
  129. add %o2, %o5, %o2 /*  IEU0 Group */;
  130. fcmpgt32 %fz, %f6, %o5 /*  FPM */;
  131. srl %g1, 1, %g1 /*  IEU0 Group */;
  132. inc %g3 /*  IEU1 */;
  133. add %o2, %g1, %o2 /*  IEU0 Group */;
  134. fcmpgt32 %fz, %f10, %g1 /*  FPM */;
  135. srl %g2, 1, %g2 /*  IEU0 Group */;
  136. inc %g5 /*  IEU1 */;
  137. add %o2, %g2, %o2 /*  IEU0 Group */;
  138. fcmpgt32 %fz, %f14, %g2 /*  FPM */;
  139. srl %g3, 1, %g3 /*  IEU0 Group */;
  140. inc %g7 /*  IEU1 */;
  141. add %o2, %g3, %o2 /*  IEU0 Group */;
  142. fcmpgt32 %fz, %S1, %g3 /*  FPM */;
  143. srl %g5, 1, %g5 /*  IEU0 Group */;
  144. inc %o3 /*  IEU1 */;
  145. add %o2, %g5, %o2 /*  IEU0 Group */;
  146. fcmpgt32 %fz, %S3, %g5 /*  FPM */;
  147. srl %g7, 1, %g7 /*  IEU0 Group */;
  148. inc %o4 /*  IEU1 */;
  149. add %o2, %g7, %o2 /*  IEU0 Group */;
  150. fcmpgt32 %fz, %T1, %g7 /*  FPM */;
  151. srl %o3, 1, %o3 /*  IEU0 Group */;
  152. inc %o5 /*  IEU1 */;
  153. add %o2, %o3, %o2 /*  IEU0 Group */;
  154. fcmpgt32 %T0, %U0, %o3 /*  FPM */;
  155. srl %o4, 1, %o4 /*  IEU0 Group */;
  156. inc %g1 /*  IEU1 */;
  157. sub %o2, %o4, %o2 /*  IEU0 Group */;
  158. fcmpgt32 %fz, %U0, %o4 /*  FPM */;
  159. srl %o5, 1, %o5 /*  IEU0 Group */;
  160. inc %g2 /*  IEU1 */;
  161. srl %g1, 1, %g1 /*  IEU0 Group */;
  162. sub %o2, %o5, %o2 /*  IEU1 */;
  163. std %U0, [%sp + STACKOFF] /*  Store */;
  164. srl %g2, 1, %g2 /*  IEU0 Group */;
  165. sub %o2, %g1, %o2 /*  IEU1 */;
  166. inc %g3 /*  IEU0 Group */;
  167. sub %o2, %g2, %o2 /*  IEU1 */;
  168. srl %g3, 1, %g3 /*  IEU0 Group */;
  169. inc %g5 /*  IEU1 */;
  170. srl %g5, 1, %g5 /*  IEU0 Group */;
  171. sub %o2, %g3, %o2 /*  IEU1 */;
  172. ldx [%sp + STACKOFF], %o5 /*  Load Group */;
  173. inc %g7 /*  IEU0 */;
  174. sub %o2, %g5, %o2 /*  IEU1 */;
  175. srl %g7, 1, %g7 /*  IEU0 Group */;
  176. inc %o3 /*  IEU1 */;
  177. srl %o3, 1, %o3 /*  IEU0 Group */;
  178. sub %o2, %g7, %o2 /*  IEU1 */;
  179. inc %o4 /*  IEU0 Group */;
  180. add %o2, %o3, %o2 /*  IEU1 */;
  181. srl %o4, 1, %o4 /*  IEU0 Group */;
  182. sub %o2, %o4, %o2 /*  IEU0 Group */;
  183. addcc %o2, %o5, %o2 /*  IEU1 Group */;
  184. bcs,a,pn %xcc, 33f /*  CTI */;
  185.  add %o2, 1, %o2 /*  IEU0 */;
  186. 33: /*  That's it */;
  187. #define CSUM_LASTCHUNK(offset)
  188.         ldx             [%o0 - offset - 0x10], %g2;
  189.         ldx             [%o0 - offset - 0x08], %g3;
  190.         addcc           %g2, %o2, %o2;
  191.         bcs,a,pn        %xcc, 31f;
  192.          add            %o2, 1, %o2;
  193. 31:     addcc           %g3, %o2, %o2;
  194.         bcs,a,pn        %xcc, 32f;
  195.          add            %o2, 1, %o2;
  196. 32:
  197. .text
  198. .globl csum_partial
  199. .align 32
  200. csum_partial:
  201. andcc %o0, 7, %g0 /*  IEU1 Group */
  202. be,pt %icc, 4f /*  CTI */
  203.  andcc %o0, 0x38, %g3 /*  IEU1 */
  204. mov 1, %g5 /*  IEU0 Group */
  205. cmp %o1, 6 /*  IEU1 */
  206. bl,pn %icc, 21f /*  CTI */
  207.  andcc %o0, 1, %g0 /*  IEU1 Group */
  208. bne,pn %icc, csump_really_slow /*  CTI */
  209.  andcc %o0, 2, %g0 /*  IEU1 Group */
  210. be,pt %icc, 1f /*  CTI */
  211.  and %o0, 4, %g7 /*  IEU0 */
  212. lduh [%o0], %g2 /*  Load */
  213. sub %o1, 2, %o1 /*  IEU0 Group */
  214. add %o0, 2, %o0 /*  IEU1 */
  215. andcc %o0, 4, %g7 /*  IEU1 Group */
  216. sll %g5, 16, %g5 /*  IEU0 */
  217. sll %g2, 16, %g2 /*  IEU0 Group  */
  218. addcc %g2, %o2, %o2 /*  IEU1 Group (regdep) */
  219. bcs,a,pn %icc, 1f /*  CTI */
  220.  add %o2, %g5, %o2 /*  IEU0 */
  221. 1: ld [%o0], %g2 /*  Load */
  222. brz,a,pn %g7, 4f /*  CTI+IEU1 Group */
  223.  and %o0, 0x38, %g3 /*  IEU0 */
  224. add %o0, 4, %o0 /*  IEU0 Group */
  225. sub %o1, 4, %o1 /*  IEU1 */
  226. addcc %g2, %o2, %o2 /*  IEU1 Group */
  227. bcs,a,pn %icc, 1f /*  CTI */
  228.  add %o2, 1, %o2 /*  IEU0 */
  229. 1: and %o0, 0x38, %g3 /*  IEU1 Group */
  230. 4: srl %o2, 0, %o2 /*  IEU0 Group */
  231. mov 0x40, %g1 /*  IEU1 */
  232. brz,pn %g3, 3f /*  CTI+IEU1 Group */
  233.  sub %g1, %g3, %g1 /*  IEU0 */
  234. cmp %o1, 56 /*  IEU1 Group */
  235. blu,pn %icc, 20f /*  CTI */
  236.  andcc %o0, 8, %g0 /*  IEU1 Group */
  237. be,pn %icc, 1f /*  CTI */
  238.  ldx [%o0], %g2 /*  Load */
  239. add %o0, 8, %o0 /*  IEU0 Group */
  240. sub %o1, 8, %o1 /*  IEU1 */
  241. addcc %g2, %o2, %o2 /*  IEU1 Group */
  242. bcs,a,pn %xcc, 1f /*  CTI */
  243.  add %o2, 1, %o2 /*  IEU0 */
  244. 1: andcc %g1, 0x10, %g0 /*  IEU1 Group */
  245. be,pn %icc, 2f /*  CTI */
  246.  and %g1, 0x20, %g1 /*  IEU0 */
  247. ldx [%o0], %g2 /*  Load */
  248. ldx [%o0+8], %g3 /*  Load Group */
  249. add %o0, 16, %o0 /*  IEU0 */
  250. sub %o1, 16, %o1 /*  IEU1 */
  251. addcc %g2, %o2, %o2 /*  IEU1 Group */
  252. bcs,a,pn %xcc, 1f /*  CTI */
  253.  add %o2, 1, %o2 /*  IEU0 */
  254. 1: addcc %g3, %o2, %o2 /*  IEU1 Group */
  255. bcs,a,pn %xcc, 2f /*  CTI */
  256.  add %o2, 1, %o2 /*  IEU0 */
  257. 2: brz,pn %g1, 3f /*  CTI+IEU1 Group */
  258.  ldx [%o0], %g2 /*  Load */
  259. ldx [%o0+8], %g3 /*  Load Group */
  260. ldx [%o0+16], %g5 /*  Load Group */
  261. ldx [%o0+24], %g7 /*  Load Group */
  262. add %o0, 32, %o0 /*  IEU0 */
  263. sub %o1, 32, %o1 /*  IEU1 */
  264. addcc %g2, %o2, %o2 /*  IEU1 Group */
  265. bcs,a,pn %xcc, 1f /*  CTI */
  266.  add %o2, 1, %o2 /*  IEU0 */
  267. 1: addcc %g3, %o2, %o2 /*  IEU1 Group */
  268. bcs,a,pn %xcc, 1f /*  CTI */
  269.  add %o2, 1, %o2 /*  IEU0 */
  270. 1: addcc %g5, %o2, %o2 /*  IEU1 Group */
  271. bcs,a,pn %xcc, 1f /*  CTI */
  272.  add %o2, 1, %o2 /*  IEU0 */
  273. 1: addcc %g7, %o2, %o2 /*  IEU1 Group */
  274. bcs,a,pn %xcc, 3f /*  CTI */
  275.  add %o2, 1, %o2 /*  IEU0 */
  276. 3: cmp %o1, 0xc0 /*  IEU1 Group */
  277. blu,pn %icc, 20f /*  CTI */
  278.  sllx %o2, 32, %g5 /*  IEU0 */
  279. #ifdef __KERNEL__
  280. VISEntry
  281. #endif
  282. addcc %o2, %g5, %o2 /*  IEU1 Group */
  283. sub %o1, 0xc0, %o1 /*  IEU0 */
  284. wr %g0, ASI_BLK_P, %asi /*  LSU Group */
  285. membar #StoreLoad /*  LSU Group */
  286. srlx %o2, 32, %o2 /*  IEU0 Group */
  287. bcs,a,pn %xcc, 1f /*  CTI */
  288.  add %o2, 1, %o2 /*  IEU1 */
  289. 1: andcc %o1, 0x80, %g0 /*  IEU1 Group */
  290. bne,pn %icc, 7f /*  CTI */
  291.  andcc %o1, 0x40, %g0 /*  IEU1 Group */
  292. be,pn %icc, 6f /*  CTI */
  293.  fzero %f12 /*  FPA */
  294. fzero %f14 /*  FPA Group */
  295. ldda [%o0 + 0x000] %asi, %f16
  296. ldda [%o0 + 0x040] %asi, %f32
  297. ldda [%o0 + 0x080] %asi, %f48
  298. START_THE_TRICK(f12,f16,f18,f20,f22,f24,f26)
  299. ba,a,pt %xcc, 3f
  300. 6: sub %o0, 0x40, %o0 /*  IEU0 Group */
  301. fzero %f28 /*  FPA */
  302. fzero %f30 /*  FPA Group */
  303. ldda [%o0 + 0x040] %asi, %f32
  304. ldda [%o0 + 0x080] %asi, %f48
  305. ldda [%o0 + 0x0c0] %asi, %f0
  306. START_THE_TRICK(f28,f32,f34,f36,f38,f40,f42)
  307. ba,a,pt %xcc, 4f
  308. 7: bne,pt %icc, 8f /*  CTI */
  309.  fzero %f44 /*  FPA */
  310. add %o0, 0x40, %o0 /*  IEU0 Group */
  311. fzero %f60 /*  FPA */
  312. fzero %f62 /*  FPA Group */
  313. ldda [%o0 - 0x040] %asi, %f0
  314. ldda [%o0 + 0x000] %asi, %f16
  315. ldda [%o0 + 0x040] %asi, %f32
  316. START_THE_TRICK(f60,f0,f2,f4,f6,f8,f10)
  317. ba,a,pt %xcc, 2f
  318. 8: add %o0, 0x80, %o0 /*  IEU0 Group */
  319. fzero %f46 /*  FPA */
  320. ldda [%o0 - 0x080] %asi, %f48
  321. ldda [%o0 - 0x040] %asi, %f0
  322. ldda [%o0 + 0x000] %asi, %f16
  323. START_THE_TRICK(f44,f48,f50,f52,f54,f56,f58)
  324. 1: DO_THE_TRICK(f44,f46,f48,f50,f52,f54,f56,f58,f60,f62,f0,f2,f4,f6,f8,f10,f12,f14)
  325. ldda [%o0 + 0x040] %asi, %f32
  326. 2: DO_THE_TRICK(f60,f62,f0,f2,f4,f6,f8,f10,f12,f14,f16,f18,f20,f22,f24,f26,f28,f30)
  327. ldda [%o0 + 0x080] %asi, %f48
  328. 3: DO_THE_TRICK(f12,f14,f16,f18,f20,f22,f24,f26,f28,f30,f32,f34,f36,f38,f40,f42,f44,f46)
  329. ldda [%o0 + 0x0c0] %asi, %f0
  330. 4: DO_THE_TRICK(f28,f30,f32,f34,f36,f38,f40,f42,f44,f46,f48,f50,f52,f54,f56,f58,f60,f62)
  331. add %o0, 0x100, %o0 /*  IEU0 Group */
  332. subcc %o1, 0x100, %o1 /*  IEU1 */
  333. bgeu,a,pt %icc, 1b /*  CTI */
  334.  ldda [%o0 + 0x000] %asi, %f16
  335. membar #Sync /*  LSU Group */
  336. DO_THE_TRICK(f44,f46,f48,f50,f52,f54,f56,f58,f60,f62,f0,f2,f4,f6,f8,f10,f12,f14)
  337. END_THE_TRICK(f60,f62,f0,f2,f4,f6,f8,f10,f12,f14,f16,f18,f20,f22,f24,f26,f28,f30)
  338. #ifdef __KERNEL__
  339. ldub [%g6 + AOFF_task_thread + AOFF_thread_current_ds], %g7
  340. #endif
  341. and %o1, 0x3f, %o1 /*  IEU0 Group */
  342. #ifdef __KERNEL__
  343. VISExit
  344. wr %g7, %g0, %asi
  345. #endif
  346. 20: andcc %o1, 0xf0, %g1 /*  IEU1 Group */
  347. be,pn %icc, 23f /*  CTI */
  348.  and %o1, 0xf, %o3 /*  IEU0 */
  349. #ifdef __KERNEL__
  350. 22: sll %g1, 1, %o4 /*  IEU0 Group */
  351. sethi %hi(23f), %g7 /*  IEU1 */
  352. sub %g7, %o4, %g7 /*  IEU0 Group */
  353. jmpl %g7 + %lo(23f), %g0 /*  CTI Group brk forced*/
  354.  add %o0, %g1, %o0 /*  IEU0 */
  355. #else
  356. 22: rd %pc, %g7 /*  LSU Group+4bubbles */
  357. sll %g1, 1, %o4 /*  IEU0 Group */
  358. sub %g7, %o4, %g7 /*  IEU0 Group (regdep) */
  359. jmpl %g7 + (23f - 22b), %g0 /*  CTI Group brk forced*/
  360.  add %o0, %g1, %o0 /*  IEU0 */
  361. #endif
  362. CSUM_LASTCHUNK(0xe0)
  363. CSUM_LASTCHUNK(0xd0)
  364. CSUM_LASTCHUNK(0xc0)
  365. CSUM_LASTCHUNK(0xb0)
  366. CSUM_LASTCHUNK(0xa0)
  367. CSUM_LASTCHUNK(0x90)
  368. CSUM_LASTCHUNK(0x80)
  369. CSUM_LASTCHUNK(0x70)
  370. CSUM_LASTCHUNK(0x60)
  371. CSUM_LASTCHUNK(0x50)
  372. CSUM_LASTCHUNK(0x40)
  373. CSUM_LASTCHUNK(0x30)
  374. CSUM_LASTCHUNK(0x20)
  375. CSUM_LASTCHUNK(0x10)
  376. CSUM_LASTCHUNK(0x00)
  377. 23: brnz,pn %o3, 26f /*  CTI+IEU1 Group */
  378. 24:  sllx %o2, 32, %g1 /*  IEU0 */
  379. 25: addcc %o2, %g1, %o0 /*  IEU1 Group */
  380. srlx %o0, 32, %o0 /*  IEU0 Group (regdep) */
  381. bcs,a,pn %xcc, 1f /*  CTI */
  382.  add %o0, 1, %o0 /*  IEU1 */
  383. 1: retl /*  CTI Group brk forced*/
  384.  srl %o0, 0, %o0 /*  IEU0 */
  385. 26: andcc %o1, 8, %g0 /*  IEU1 Group */
  386. be,pn %icc, 1f /*  CTI */
  387.  ldx [%o0], %g3 /*  Load */
  388. add %o0, 8, %o0 /*  IEU0 Group */
  389. addcc %g3, %o2, %o2 /*  IEU1 Group */
  390. bcs,a,pn %xcc, 1f /*  CTI */
  391.  add %o2, 1, %o2 /*  IEU0 */
  392. 1: andcc %o1, 4, %g0 /*  IEU1 Group */
  393. be,a,pn %icc, 1f /*  CTI */
  394.  clr %g2 /*  IEU0 */
  395. ld [%o0], %g2 /*  Load */
  396. add %o0, 4, %o0 /*  IEU0 Group */
  397. sllx %g2, 32, %g2 /*  IEU0 Group */
  398. 1: andcc %o1, 2, %g0 /*  IEU1 */
  399. be,a,pn %icc, 1f /*  CTI */
  400.  clr %o4 /*  IEU0 Group */
  401. lduh [%o0], %o4 /*  Load */
  402. add %o0, 2, %o0 /*  IEU1 */
  403. sll %o4, 16, %o4 /*  IEU0 Group */
  404. 1: andcc %o1, 1, %g0 /*  IEU1 */
  405. be,a,pn %icc, 1f /*  CTI */
  406.  clr %o5 /*  IEU0 Group */
  407. ldub [%o0], %o5 /*  Load */
  408. sll %o5, 8, %o5 /*  IEU0 Group */
  409. 1: or %g2, %o4, %o4 /*  IEU1 */
  410. or %o5, %o4, %o4 /*  IEU0 Group (regdep) */
  411. addcc %o4, %o2, %o2 /*  IEU1 Group (regdep) */
  412. bcs,a,pn %xcc, 1f /*  CTI */
  413.  add %o2, 1, %o2 /*  IEU0 */
  414. 1: ba,pt %xcc, 25b /*  CTI Group */
  415.  sllx %o2, 32, %g1 /*  IEU0 */
  416. 21: srl %o2, 0, %o2 /*  IEU0 Group */
  417. cmp %o1, 0 /*  IEU1 */
  418. be,pn %icc, 24b /*  CTI */
  419.  andcc %o1, 4, %g0 /*  IEU1 Group */
  420. be,a,pn %icc, 1f /*  CTI */
  421.  clr %g2 /*  IEU0 */
  422. lduh [%o0], %g3 /*  Load */
  423. lduh [%o0+2], %g2 /*  Load Group */
  424. add %o0, 4, %o0 /*  IEU0 Group */
  425. sllx %g3, 48, %g3 /*  IEU0 Group */
  426. sllx %g2, 32, %g2 /*  IEU0 Group */
  427. or %g3, %g2, %g2 /*  IEU0 Group */
  428. 1: andcc %o1, 2, %g0 /*  IEU1 */
  429. be,a,pn %icc, 1f /*  CTI */
  430.  clr %o4 /*  IEU0 Group */
  431. lduh [%o0], %o4 /*  Load */
  432. add %o0, 2, %o0 /*  IEU1 */
  433. sll %o4, 16, %o4 /*  IEU0 Group */
  434. 1: andcc %o1, 1, %g0 /*  IEU1 */
  435. be,a,pn %icc, 1f /*  CTI */
  436.  clr %o5 /*  IEU0 Group */
  437. ldub [%o0], %o5 /*  Load */
  438. sll %o5, 8, %o5 /*  IEU0 Group */
  439. 1: or %g2, %o4, %o4 /*  IEU1 */
  440. or %o5, %o4, %o4 /*  IEU0 Group (regdep) */
  441. addcc %o4, %o2, %o2 /*  IEU1 Group (regdep) */
  442. bcs,a,pn %xcc, 1f /*  CTI */
  443.  add %o2, 1, %o2 /*  IEU0 */
  444. 1: ba,pt %xcc, 25b /*  CTI Group */
  445.  sllx %o2, 32, %g1 /*  IEU0 */
  446. /* When buff is byte aligned and len is large, we backoff to
  447.  * this really slow handling.  The issue is that we cannot do
  448.  * the VIS stuff when buff is byte aligned as unaligned.c will
  449.  * not fix it up.
  450.  */
  451. csump_really_slow:
  452. mov %o0, %o3
  453. mov %o1, %o4
  454. cmp %o1, 0
  455. ble,pn %icc, 9f
  456.  mov 0, %o0
  457. andcc %o3, 1, %o5
  458. be,pt %icc, 1f
  459.  sra %o4, 1, %g3
  460. add %o1, -1, %o4
  461. ldub [%o3], %o0
  462. add %o3, 1, %o3
  463. sra %o4, 1, %g3
  464. 1:
  465. cmp %g3, 0
  466. be,pt %icc, 3f
  467.  and %o4, 1, %g2
  468. and %o3, 2, %g2
  469. brz,a,pt %g2, 1f
  470.  sra %g3, 1, %g3
  471. add %g3, -1, %g3
  472. add %o4, -2, %o4
  473. lduh [%o3], %g2
  474. add %o3, 2, %o3
  475. add %o0, %g2, %o0
  476. sra %g3, 1, %g3
  477. 1:
  478. cmp %g3, 0
  479. be,pt %icc, 2f
  480.  and %o4, 2, %g2
  481. 1:
  482. ld [%o3], %g2
  483. addcc %o0, %g2, %o0
  484. addx %o0, %g0, %o0
  485. addcc %g3, -1, %g3
  486. bne,pt %icc, 1b
  487.  add %o3, 4, %o3
  488. srl %o0, 16, %o1
  489. sethi %hi(64512), %g2
  490. or %g2, 1023, %g2
  491. and %o0, %g2, %g3
  492. add %g3, %o1, %g3
  493. srl %g3, 16, %o0
  494. and %g3, %g2, %g2
  495. add %g2, %o0, %g3
  496. sll %g3, 16, %g3
  497. srl %g3, 16, %o0
  498. and %o4, 2, %g2
  499. 2:
  500. cmp %g2, 0
  501. be,pt %icc, 3f
  502.  and %o4, 1, %g2
  503. lduh [%o3], %g2
  504. add %o3, 2, %o3
  505. add %o0, %g2, %o0
  506. and %o4, 1, %g2
  507. 3:
  508. cmp %g2, 0
  509. be,pt %icc, 1f
  510.  srl %o0, 16, %o1
  511. ldub [%o3], %g2
  512. sll %g2, 8, %g2
  513. add %o0, %g2, %o0
  514. srl %o0, 16, %o1
  515. 1:
  516. sethi %hi(64512), %g2
  517. or %g2, 1023, %g2
  518. cmp %o5, 0
  519. and %o0, %g2, %g3
  520. add %g3, %o1, %g3
  521. srl %g3, 16, %o0
  522. and %g3, %g2, %g2
  523. add %g2, %o0, %g3
  524. sll %g3, 16, %g3
  525. srl %g3, 16, %o0
  526. srl %g3, 24, %g3
  527. and %o0, 255, %g2
  528. sll %g2, 8, %g2
  529. bne,pt %icc, 1f
  530.  or %g3, %g2, %g2
  531. 9:
  532. mov %o0, %g2
  533. 1:
  534. addcc %g2, %o2, %g2
  535. addx %g2, %g0, %g2
  536. retl
  537.  srl %g2, 0, %o0