VIScsum.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:16k
源码类别:

嵌入式Linux

开发平台:

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, 2, %g0 /*  IEU1 Group */
  208. be,pt %icc, 1f /*  CTI */
  209.  and %o0, 4, %g7 /*  IEU0 */
  210. lduh [%o0], %g2 /*  Load */
  211. sub %o1, 2, %o1 /*  IEU0 Group */
  212. add %o0, 2, %o0 /*  IEU1 */
  213. andcc %o0, 4, %g7 /*  IEU1 Group */
  214. sll %g5, 16, %g5 /*  IEU0 */
  215. sll %g2, 16, %g2 /*  IEU0 Group  */
  216. addcc %g2, %o2, %o2 /*  IEU1 Group (regdep) */
  217. bcs,a,pn %icc, 1f /*  CTI */
  218.  add %o2, %g5, %o2 /*  IEU0 */
  219. 1: ld [%o0], %g2 /*  Load */
  220. brz,a,pn %g7, 4f /*  CTI+IEU1 Group */
  221.  and %o0, 0x38, %g3 /*  IEU0 */
  222. add %o0, 4, %o0 /*  IEU0 Group */
  223. sub %o1, 4, %o1 /*  IEU1 */
  224. addcc %g2, %o2, %o2 /*  IEU1 Group */
  225. bcs,a,pn %icc, 1f /*  CTI */
  226.  add %o2, 1, %o2 /*  IEU0 */
  227. 1: and %o0, 0x38, %g3 /*  IEU1 Group */
  228. 4: srl %o2, 0, %o2 /*  IEU0 Group */
  229. mov 0x40, %g1 /*  IEU1 */
  230. brz,pn %g3, 3f /*  CTI+IEU1 Group */
  231.  sub %g1, %g3, %g1 /*  IEU0 */
  232. cmp %o1, 56 /*  IEU1 Group */
  233. blu,pn %icc, 20f /*  CTI */
  234.  andcc %o0, 8, %g0 /*  IEU1 Group */
  235. be,pn %icc, 1f /*  CTI */
  236.  ldx [%o0], %g2 /*  Load */
  237. add %o0, 8, %o0 /*  IEU0 Group */
  238. sub %o1, 8, %o1 /*  IEU1 */
  239. addcc %g2, %o2, %o2 /*  IEU1 Group */
  240. bcs,a,pn %xcc, 1f /*  CTI */
  241.  add %o2, 1, %o2 /*  IEU0 */
  242. 1: andcc %g1, 0x10, %g0 /*  IEU1 Group */
  243. be,pn %icc, 2f /*  CTI */
  244.  and %g1, 0x20, %g1 /*  IEU0 */
  245. ldx [%o0], %g2 /*  Load */
  246. ldx [%o0+8], %g3 /*  Load Group */
  247. add %o0, 16, %o0 /*  IEU0 */
  248. sub %o1, 16, %o1 /*  IEU1 */
  249. addcc %g2, %o2, %o2 /*  IEU1 Group */
  250. bcs,a,pn %xcc, 1f /*  CTI */
  251.  add %o2, 1, %o2 /*  IEU0 */
  252. 1: addcc %g3, %o2, %o2 /*  IEU1 Group */
  253. bcs,a,pn %xcc, 2f /*  CTI */
  254.  add %o2, 1, %o2 /*  IEU0 */
  255. 2: brz,pn %g1, 3f /*  CTI+IEU1 Group */
  256.  ldx [%o0], %g2 /*  Load */
  257. ldx [%o0+8], %g3 /*  Load Group */
  258. ldx [%o0+16], %g5 /*  Load Group */
  259. ldx [%o0+24], %g7 /*  Load Group */
  260. add %o0, 32, %o0 /*  IEU0 */
  261. sub %o1, 32, %o1 /*  IEU1 */
  262. addcc %g2, %o2, %o2 /*  IEU1 Group */
  263. bcs,a,pn %xcc, 1f /*  CTI */
  264.  add %o2, 1, %o2 /*  IEU0 */
  265. 1: addcc %g3, %o2, %o2 /*  IEU1 Group */
  266. bcs,a,pn %xcc, 1f /*  CTI */
  267.  add %o2, 1, %o2 /*  IEU0 */
  268. 1: addcc %g5, %o2, %o2 /*  IEU1 Group */
  269. bcs,a,pn %xcc, 1f /*  CTI */
  270.  add %o2, 1, %o2 /*  IEU0 */
  271. 1: addcc %g7, %o2, %o2 /*  IEU1 Group */
  272. bcs,a,pn %xcc, 3f /*  CTI */
  273.  add %o2, 1, %o2 /*  IEU0 */
  274. 3: cmp %o1, 0xc0 /*  IEU1 Group */
  275. blu,pn %icc, 20f /*  CTI */
  276.  sllx %o2, 32, %g5 /*  IEU0 */
  277. #ifdef __KERNEL__
  278. VISEntry
  279. #endif
  280. addcc %o2, %g5, %o2 /*  IEU1 Group */
  281. sub %o1, 0xc0, %o1 /*  IEU0 */
  282. wr %g0, ASI_BLK_P, %asi /*  LSU Group */
  283. membar #StoreLoad /*  LSU Group */
  284. srlx %o2, 32, %o2 /*  IEU0 Group */
  285. bcs,a,pn %xcc, 1f /*  CTI */
  286.  add %o2, 1, %o2 /*  IEU1 */
  287. 1: andcc %o1, 0x80, %g0 /*  IEU1 Group */
  288. bne,pn %icc, 7f /*  CTI */
  289.  andcc %o1, 0x40, %g0 /*  IEU1 Group */
  290. be,pn %icc, 6f /*  CTI */
  291.  fzero %f12 /*  FPA */
  292. fzero %f14 /*  FPA Group */
  293. ldda [%o0 + 0x000] %asi, %f16
  294. ldda [%o0 + 0x040] %asi, %f32
  295. ldda [%o0 + 0x080] %asi, %f48
  296. START_THE_TRICK(f12,f16,f18,f20,f22,f24,f26)
  297. ba,a,pt %xcc, 3f
  298. 6: sub %o0, 0x40, %o0 /*  IEU0 Group */
  299. fzero %f28 /*  FPA */
  300. fzero %f30 /*  FPA Group */
  301. ldda [%o0 + 0x040] %asi, %f32
  302. ldda [%o0 + 0x080] %asi, %f48
  303. ldda [%o0 + 0x0c0] %asi, %f0
  304. START_THE_TRICK(f28,f32,f34,f36,f38,f40,f42)
  305. ba,a,pt %xcc, 4f
  306. 7: bne,pt %icc, 8f /*  CTI */
  307.  fzero %f44 /*  FPA */
  308. add %o0, 0x40, %o0 /*  IEU0 Group */
  309. fzero %f60 /*  FPA */
  310. fzero %f62 /*  FPA Group */
  311. ldda [%o0 - 0x040] %asi, %f0
  312. ldda [%o0 + 0x000] %asi, %f16
  313. ldda [%o0 + 0x040] %asi, %f32
  314. START_THE_TRICK(f60,f0,f2,f4,f6,f8,f10)
  315. ba,a,pt %xcc, 2f
  316. 8: add %o0, 0x80, %o0 /*  IEU0 Group */
  317. fzero %f46 /*  FPA */
  318. ldda [%o0 - 0x080] %asi, %f48
  319. ldda [%o0 - 0x040] %asi, %f0
  320. ldda [%o0 + 0x000] %asi, %f16
  321. START_THE_TRICK(f44,f48,f50,f52,f54,f56,f58)
  322. 1: DO_THE_TRICK(f44,f46,f48,f50,f52,f54,f56,f58,f60,f62,f0,f2,f4,f6,f8,f10,f12,f14)
  323. ldda [%o0 + 0x040] %asi, %f32
  324. 2: DO_THE_TRICK(f60,f62,f0,f2,f4,f6,f8,f10,f12,f14,f16,f18,f20,f22,f24,f26,f28,f30)
  325. ldda [%o0 + 0x080] %asi, %f48
  326. 3: DO_THE_TRICK(f12,f14,f16,f18,f20,f22,f24,f26,f28,f30,f32,f34,f36,f38,f40,f42,f44,f46)
  327. ldda [%o0 + 0x0c0] %asi, %f0
  328. 4: DO_THE_TRICK(f28,f30,f32,f34,f36,f38,f40,f42,f44,f46,f48,f50,f52,f54,f56,f58,f60,f62)
  329. add %o0, 0x100, %o0 /*  IEU0 Group */
  330. subcc %o1, 0x100, %o1 /*  IEU1 */
  331. bgeu,a,pt %icc, 1b /*  CTI */
  332.  ldda [%o0 + 0x000] %asi, %f16
  333. membar #Sync /*  LSU Group */
  334. DO_THE_TRICK(f44,f46,f48,f50,f52,f54,f56,f58,f60,f62,f0,f2,f4,f6,f8,f10,f12,f14)
  335. END_THE_TRICK(f60,f62,f0,f2,f4,f6,f8,f10,f12,f14,f16,f18,f20,f22,f24,f26,f28,f30)
  336. #ifdef __KERNEL__
  337. ldub [%g6 + AOFF_task_thread + AOFF_thread_current_ds], %g7
  338. #endif
  339. and %o1, 0x3f, %o1 /*  IEU0 Group */
  340. #ifdef __KERNEL__
  341. VISExit
  342. wr %g7, %g0, %asi
  343. #endif
  344. 20: andcc %o1, 0xf0, %g1 /*  IEU1 Group */
  345. be,pn %icc, 23f /*  CTI */
  346.  and %o1, 0xf, %o3 /*  IEU0 */
  347. #ifdef __KERNEL__
  348. 22: sll %g1, 1, %o4 /*  IEU0 Group */
  349. sethi %hi(23f), %g7 /*  IEU1 */
  350. sub %g7, %o4, %g7 /*  IEU0 Group */
  351. jmpl %g7 + %lo(23f), %g0 /*  CTI Group brk forced*/
  352.  add %o0, %g1, %o0 /*  IEU0 */
  353. #else
  354. 22: rd %pc, %g7 /*  LSU Group+4bubbles */
  355. sll %g1, 1, %o4 /*  IEU0 Group */
  356. sub %g7, %o4, %g7 /*  IEU0 Group (regdep) */
  357. jmpl %g7 + (23f - 22b), %g0 /*  CTI Group brk forced*/
  358.  add %o0, %g1, %o0 /*  IEU0 */
  359. #endif
  360. CSUM_LASTCHUNK(0xe0)
  361. CSUM_LASTCHUNK(0xd0)
  362. CSUM_LASTCHUNK(0xc0)
  363. CSUM_LASTCHUNK(0xb0)
  364. CSUM_LASTCHUNK(0xa0)
  365. CSUM_LASTCHUNK(0x90)
  366. CSUM_LASTCHUNK(0x80)
  367. CSUM_LASTCHUNK(0x70)
  368. CSUM_LASTCHUNK(0x60)
  369. CSUM_LASTCHUNK(0x50)
  370. CSUM_LASTCHUNK(0x40)
  371. CSUM_LASTCHUNK(0x30)
  372. CSUM_LASTCHUNK(0x20)
  373. CSUM_LASTCHUNK(0x10)
  374. CSUM_LASTCHUNK(0x00)
  375. 23: brnz,pn %o3, 26f /*  CTI+IEU1 Group */
  376. 24:  sllx %o2, 32, %g1 /*  IEU0 */
  377. 25: addcc %o2, %g1, %o0 /*  IEU1 Group */
  378. srlx %o0, 32, %o0 /*  IEU0 Group (regdep) */
  379. bcs,a,pn %xcc, 1f /*  CTI */
  380.  add %o0, 1, %o0 /*  IEU1 */
  381. 1: retl /*  CTI Group brk forced*/
  382.  srl %o0, 0, %o0 /*  IEU0 */
  383. 26: andcc %o1, 8, %g0 /*  IEU1 Group */
  384. be,pn %icc, 1f /*  CTI */
  385.  ldx [%o0], %g3 /*  Load */
  386. add %o0, 8, %o0 /*  IEU0 Group */
  387. addcc %g3, %o2, %o2 /*  IEU1 Group */
  388. bcs,a,pn %xcc, 1f /*  CTI */
  389.  add %o2, 1, %o2 /*  IEU0 */
  390. 1: andcc %o1, 4, %g0 /*  IEU1 Group */
  391. be,a,pn %icc, 1f /*  CTI */
  392.  clr %g2 /*  IEU0 */
  393. ld [%o0], %g2 /*  Load */
  394. add %o0, 4, %o0 /*  IEU0 Group */
  395. sllx %g2, 32, %g2 /*  IEU0 Group */
  396. 1: andcc %o1, 2, %g0 /*  IEU1 */
  397. be,a,pn %icc, 1f /*  CTI */
  398.  clr %o4 /*  IEU0 Group */
  399. lduh [%o0], %o4 /*  Load */
  400. add %o0, 2, %o0 /*  IEU1 */
  401. sll %o4, 16, %o4 /*  IEU0 Group */
  402. 1: andcc %o1, 1, %g0 /*  IEU1 */
  403. be,a,pn %icc, 1f /*  CTI */
  404.  clr %o5 /*  IEU0 Group */
  405. ldub [%o0], %o5 /*  Load */
  406. sll %o5, 8, %o5 /*  IEU0 Group */
  407. 1: or %g2, %o4, %o4 /*  IEU1 */
  408. or %o5, %o4, %o4 /*  IEU0 Group (regdep) */
  409. addcc %o4, %o2, %o2 /*  IEU1 Group (regdep) */
  410. bcs,a,pn %xcc, 1f /*  CTI */
  411.  add %o2, 1, %o2 /*  IEU0 */
  412. 1: ba,pt %xcc, 25b /*  CTI Group */
  413.  sllx %o2, 32, %g1 /*  IEU0 */
  414. 21: srl %o2, 0, %o2 /*  IEU0 Group */
  415. cmp %o1, 0 /*  IEU1 */
  416. be,pn %icc, 24b /*  CTI */
  417.  andcc %o1, 4, %g0 /*  IEU1 Group */
  418. be,a,pn %icc, 1f /*  CTI */
  419.  clr %g2 /*  IEU0 */
  420. lduh [%o0], %g3 /*  Load */
  421. lduh [%o0+2], %g2 /*  Load Group */
  422. add %o0, 4, %o0 /*  IEU0 Group */
  423. sllx %g3, 48, %g3 /*  IEU0 Group */
  424. sllx %g2, 32, %g2 /*  IEU0 Group */
  425. or %g3, %g2, %g2 /*  IEU0 Group */
  426. 1: andcc %o1, 2, %g0 /*  IEU1 */
  427. be,a,pn %icc, 1f /*  CTI */
  428.  clr %o4 /*  IEU0 Group */
  429. lduh [%o0], %o4 /*  Load */
  430. add %o0, 2, %o0 /*  IEU1 */
  431. sll %o4, 16, %o4 /*  IEU0 Group */
  432. 1: andcc %o1, 1, %g0 /*  IEU1 */
  433. be,a,pn %icc, 1f /*  CTI */
  434.  clr %o5 /*  IEU0 Group */
  435. ldub [%o0], %o5 /*  Load */
  436. sll %o5, 8, %o5 /*  IEU0 Group */
  437. 1: or %g2, %o4, %o4 /*  IEU1 */
  438. or %o5, %o4, %o4 /*  IEU0 Group (regdep) */
  439. addcc %o4, %o2, %o2 /*  IEU1 Group (regdep) */
  440. bcs,a,pn %xcc, 1f /*  CTI */
  441.  add %o2, 1, %o2 /*  IEU0 */
  442. 1: ba,pt %xcc, 25b /*  CTI Group */
  443.  sllx %o2, 32, %g1 /*  IEU0 */