unixALib.s
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:9k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* unixALib.s - network assembly language routines */
  2. /* Copyright 1995-2000 Wind River Systems, Inc. */
  3. .data
  4. .global _copyright_wind_river
  5. .long _copyright_wind_river
  6. /*
  7. modification history
  8. --------------------
  9. 01q,21aug00,hk   merge SH7729 to SH7700. simplify CPU conditionals.
  10. 01p,28mar00,hk   added .type directive to function names.
  11. 01o,17mar00,zl   made use of alignment macro _ALIGN_TEXT
  12. 01n,05oct99,zl   updated cksum for little endian release.
  13. 01m,25feb99,hk   simplified CPU conditional in default of shld instruction.
  14. 01l,14sep98,hk   simplified CPU conditionals.
  15. 01k,16jul98,st   added SH7750 support.
  16. 01k,08may98,jmc  added support for SH-DSP and SH3-DSP.
  17. 01j,25apr97,hk   changed SH704X to SH7040.
  18. 01i,05aug96,hk   simpified PORTABLE control. deleted unnecessary comments.
  19.  added shld optimization to csLongBoundary.
  20. 01h,29jul96,hk   changed to use 'mova', added DEBUG_LOCAL_SYMBOLS option.
  21. 01g,10jul96,ja   added support for SH7700.
  22. 01f,23jan96,hk   changed bf/s machine code in csLongLoop to use bf.s.
  23. 01e,18dec95,hk   added support for SH704X.
  24. 01d,19may95,hk   tweaking a little. worked around 'mova' alignment problem.
  25. 01c,15may95,hk   optimized.
  26. 01b,12may95,hk   mostly optimized.
  27. 01a,08may95,hk   written based on mc68k-01t.
  28. */
  29. /* optimized version available for the SH family */
  30. #if (defined(PORTABLE) || (CPU_FAMILY != SH))
  31. #define unixALib_PORTABLE
  32. #endif
  33. #ifndef unixALib_PORTABLE
  34. #define _ASMLANGUAGE
  35. #include "vxWorks.h"
  36. #include "asm.h"
  37. /* internals */
  38. .global _cksum
  39. .global __insque
  40. .global __remque
  41. #undef DEBUG_LOCAL_SYMBOLS
  42. #ifdef DEBUG_LOCAL_SYMBOLS
  43. .global csEvenSum
  44. .global csEvenBoundary
  45. .global csLongBoundary
  46. .global csLongLoop
  47. .global csStartLoop
  48. .global csFoldAddT
  49. .global csChkSwapped
  50. .global csNotSwapped
  51. .global csLastSum
  52. .global csLastFold
  53. #endif /* DEBUG_LOCAL_SYMBOLS */
  54. .text
  55. /**************************************************************************
  56. *
  57. * cksum - compute check sum
  58. *
  59. * return 16bit one's complement sum of 'sum' and the 16bit one's
  60. * complement sum of the string 'string' of byte length 'len'.
  61. * Complicated by 'len' or 'sumlen' not being even.
  62. * #define FOLD { lBox.asLong = cSum;  cSum = lBox.asShort[0] + lBox.asShort[1];
  63. *                cSum > 0xffff ? cSum -= 0xffff : cSum; }
  64. * int cksum
  65. *   (
  66. *   int       cSum, /@ previously calculated checksum  @/
  67. *   u_short * mPtr, /@ address of string to be summed  @/
  68. *   int       mLen, /@ length  of string to be summed  @/
  69. *   int       sLen /@ previously summed string length @/
  70. *   )
  71. *   {
  72. *   int                                            swapped = 0;
  73. *   union { char    asChar [2]; u_short asShort; } sBox;
  74. *   union { u_short asShort[2]; long    asLong;  } lBox;
  75. *
  76. *   if (sLen & 0x1)
  77. * {
  78. * sBox.asChar[0] = 0;
  79. * sBox.asChar[1] = *(char *)mPtr; /@  sBox [0:B] @/
  80. * cSum += sBox.asShort; /@  sBox [_:_] @/
  81. * mPtr = (u_short *)((char *)mPtr + 1);
  82. * mLen--;
  83. * }
  84. *   if ((1 & (int)mPtr) && (mLen > 0)) /@ odd boundary            @/
  85. * { /@                         @/
  86. * FOLD; cSum <<= 8; swapped = 1; /@ swap byte order         @/
  87. * /@                         @/
  88. * sBox.asChar[0] = *(u_char *)mPtr; /@  sBox [X:_] @/
  89. * mPtr = (u_short *)((char *)mPtr + 1); /@                         @/
  90. * mLen--; /@ force even boundary     @/
  91. * }
  92. *   while ((mLen -= 2) >= 0) cSum += *mPtr++; /@ sum up                  @/
  93. * /@ mLen: -2 or -1          @/
  94. *   if (swapped)
  95. * { /@ sum is byte-swapped     @/
  96. * FOLD; cSum <<= 8; swapped = 0; /@ return to normal order  @/
  97. *
  98. * if (mLen == -1)
  99. *     { /@ swapped, mLen was even. @/
  100. *     sBox.asChar[1] = *(char *)mPtr; /@  sBox [X:Y] @/
  101. *     cSum += sBox.asShort; /@  sBox [_:_] @/
  102. *     }
  103. * else{ /@ swapped, mLen was odd.  @/
  104. *     sBox.asChar[1] = 0; /@  sBox [X:0] @/
  105. *     cSum += sBox.asShort; /@  sBox [_:_] @/
  106. *     }
  107. * }
  108. *   else{
  109. * if (mLen == -1)
  110. *     { /@ not swapped, mLen was odd. @/
  111. *     sBox.asChar[0] = *(char *)mPtr; /@                            @/
  112. *     sBox.asChar[1] = 0; /@  sBox [A:0]    @/
  113. *     cSum += sBox.asShort; /@  sBox [_:_]    @/
  114. *     }
  115. * else; /@ not swapped, mLen was even.@/
  116. * }
  117. *   FOLD;
  118. *   return (cSum & 0xffff);
  119. *   }
  120. */
  121. .align _ALIGN_TEXT
  122. .type _cksum,@function
  123. /* r4: cSum      */
  124. /* r5: mPtr      */
  125. /* r6: mLen (>0) */
  126. _cksum: /* r7: sLen      */
  127. mov r7,r0
  128. mov #0,r7 /* r7: swapped = 0 */
  129. tst #0x1,r0
  130. bt csEvenSum
  131. mov.b @r5+,r1;
  132. add #-1,r6 /* r6: mLen--     */
  133. extu.b r1,r1 /* r1: 0x000000XX */
  134. #if (_BYTE_ORDER == _LITTLE_ENDIAN)
  135. shll8 r1 /* r1: 0x0000XX00 */
  136. #endif
  137. add r1,r4 /* r4: 0x0001ZZZZ */
  138. csEvenSum: /* r6: mLen (>=0) */
  139. mov r5,r0 /* r5: mPtr */
  140. tst #0x1,r0
  141. bt csEvenBoundary /*     no swap */
  142. cmp/pl r6 /* r6: mLen */
  143. bf csEvenBoundary /*     no swap */
  144. /*-- odd boundary, do swap --*/ /* r4: 0x0001ZZZZ */
  145. shll8 r4 /* r4: 0x01ZZZZ00 */
  146. extu.w r4,r2 /* r2: 0x0000ZZ00 */
  147. shlr16 r4 /* r4: 0x000001ZZ */
  148. add r2,r4 /* r4: 0x0001VVVV */
  149. mov #1,r7
  150. rotr r7 /* r7: 0x80000000 (swapped) */
  151. mov.b @r5+,r3
  152. add #-1,r6 /* r6: mLen-- */
  153. extu.b r3,r3
  154. #if (_BYTE_ORDER == _BIG_ENDIAN)
  155. shll8 r3 /* r3: 0x0000XX00 */
  156. #endif
  157. or r3,r7 /* r7: 0x8000XX00 (swapped | sBox) */
  158. /*-- forced even, swapped --*/
  159. csEvenBoundary:
  160. mov r5,r0 /* r0: mPtr */
  161. tst #0x2,r0 /*     long boundary?               */
  162. bt csLongBoundary /*     if yes, go to long-add stage */
  163. add #-2,r6 /* r6: mLen -= 2 */
  164. mov r6,r0 /* r0: mLen (used at csChkSwapped) */
  165. cmp/pz r6
  166. bf csChkSwapped
  167. mov.w @r5+,r1
  168. extu.w r1,r1
  169. add r1,r4 /*     overflow not possible */
  170. csLongBoundary: /* r6: mLen                      */
  171. mov r6,r0 /*     find fractions of a chunk */
  172. and #0x3c,r0
  173. neg r0,r2 /* r2: offset from ckStartLoop */
  174. mova csStartLoop,r0 /* (csStartLoop must be long aligned) */
  175. add r0,r2
  176. mov r6,r0
  177. and #0x3,r0 /* r0: mLen % 4 */
  178. #if (CPU==SH7000 || CPU==SH7600)
  179. shlr2 r6
  180. shlr2 r6
  181. shlr2 r6
  182. #else
  183. mov #-6,r1
  184. shld r1,r6 /* r6: mLen/64 */
  185. #endif
  186. add #1,r6 /* r6: mLen/64 + 1 */
  187. jmp @r2;
  188. clrt /*     clear T */
  189. /* r7: (swapped | sBox) */
  190. /* r6: mLen/64 + 1      */
  191. /* r5: mPtr             */
  192. /* r4: cSum             */
  193. /* r3: T-bit storage    */
  194. /* r2:                  */
  195. /* r1:                  */
  196. /* r0: mLen % 4         */
  197. .align 2
  198. #if (CPU==SH7000)
  199. nop
  200. csLongLoop:
  201. rotr r3 /* restore T */
  202. #else
  203. csLongLoop:
  204. #endif
  205. mov.l @r5+,r1; addc r1,r4
  206. mov.l @r5+,r1; addc r1,r4
  207. mov.l @r5+,r1; addc r1,r4
  208. mov.l @r5+,r1; addc r1,r4
  209. mov.l @r5+,r1; addc r1,r4
  210. mov.l @r5+,r1; addc r1,r4
  211. mov.l @r5+,r1; addc r1,r4
  212. mov.l @r5+,r1; addc r1,r4
  213. mov.l @r5+,r1; addc r1,r4
  214. mov.l @r5+,r1; addc r1,r4
  215. mov.l @r5+,r1; addc r1,r4
  216. mov.l @r5+,r1; addc r1,r4
  217. mov.l @r5+,r1; addc r1,r4
  218. mov.l @r5+,r1; addc r1,r4
  219. mov.l @r5+,r1; addc r1,r4
  220. mov.l @r5+,r1; addc r1,r4
  221. csStartLoop:
  222. movt r3 /* save T */
  223. #if (CPU==SH7000)
  224. add #-1,r6
  225. tst r6,r6
  226. bf csLongLoop
  227. #else
  228. dt r6
  229. bf.s csLongLoop
  230. rotr r3 /*     restore T */
  231. rotl r3 /*     save T */
  232. #endif
  233. /* r0: mLen ( 0,  1, 2, 3) */
  234. add #-2,r0 /* r0: mLen (-2, -1, 0, 1) */
  235. cmp/pz r0
  236. bf csFoldAddT
  237. /* r0: mLen ( 0,  1) */
  238. mov.w @r5+,r1
  239. rotr r3 /*     restore T */
  240. extu.w r1,r1
  241. addc r1,r4
  242. movt r3 /*     save T */
  243. add #-2,r0
  244. csFoldAddT: /* r0: mLen (-2, -1) */
  245. extu.w r4,r2 /* r2: 0x0000FFFF */
  246. shlr16 r4 /* r4: 0x0000FFFF */
  247. add r2,r4 /* r4: 0x0001FFFE */
  248. add r3,r4 /* r4: 0x0001FFFF */
  249. csChkSwapped: /* r0: mLen (-1, -2) */
  250. cmp/pz r7 /* r7: swapped ?  */
  251. extu.w r7,r3 /* r3: 0x0000XX00 */
  252. bt csNotSwapped
  253. /* r4: 0xFFFFFFFF */ /* unswap */
  254. extu.w r4,r2 /* r2: 0x0000FFFF */
  255. shlr16 r4 /* r4: 0x0000FFFF */
  256. add r2,r4 /* r4: 0x0001FFFE */
  257. shll8 r4 /* r4: 0x01FFFE00 */
  258. cmp/eq #-1,r0 /* r0:(mLen == -1)? */
  259. bf csLastSum /* r3: 0x0000XX00 */
  260. mov.b @r5,r1
  261. extu.b r1,r1 /* r1: 0x000000YY */
  262. #if (_BYTE_ORDER == _LITTLE_ENDIAN)
  263. shll8 r1 /* r3: 0x0000YY00 */
  264. #endif
  265. bra csLastSum;
  266. or r1,r3 /* r3: 0x0000XXYY */
  267. csNotSwapped:
  268. cmp/eq #-1,r0 /* r0:(mLen == -1)? */
  269. bf csLastFold
  270. mov.b @r5,r3
  271. extu.b r3,r3
  272. #if (_BYTE_ORDER == _BIG_ENDIAN)
  273. shll8 r3 /* r3: 0x0000AA00 */
  274. #endif
  275. csLastSum:
  276. add r3,r4 /* r4: cSum += sBox.asShort   */
  277. /*     overflow not possible. */
  278. csLastFold: /* r4: 0xFFFFFFFF */
  279. extu.w r4,r2 /* r2: 0x0000FFFF */
  280. shlr16 r4 /* r4: 0x0000FFFF */
  281. add r2,r4 /* r4: 0x0001FFFE */
  282. extu.w r4,r0 /* r0: 0x0000FFFE */
  283. shlr16 r4 /* r4: 0x00000001 */
  284. rts;
  285. add r4,r0 /* r0: 0x0000FFFF */
  286. /****************************************************************************
  287. *
  288. * insque - insert a node into a linked list
  289. *
  290. */
  291. .align _ALIGN_TEXT
  292. .type __insque,@function
  293. /* r4: pNode */
  294. __insque: /* r5: pPrev */
  295. mov.l   @r5,r0; /* r0: pNext           = pPrev->next */
  296. mov.l   r4,@r5 /*     pPrev->next     = pNode */
  297. mov.l   r4,@(4,r0) /*     pNext->previous = pNode */
  298. mov.l   r0,@r4 /*     pNode->next     = pNext */
  299. rts; /* */
  300. mov.l   r5,@(4,r4) /*     pNode->previous = pPrev */
  301. /****************************************************************************
  302. *
  303. * remque - delete a node from a linked list
  304. *
  305. * NOTE: This routine is only used by remque() in h/net/systm.h
  306. */
  307. .align _ALIGN_TEXT
  308. .type __remque,@function
  309. __remque:        /* r4: pNode       */
  310. mov.l   @r4,r0;        /* r0: pNode->next       */
  311. mov.l   @(4,r4),r1;    /* r1: pNode->previous       */
  312. mov.l   r0,@r1        /*     pNode->previous->next = pNode->next     */
  313. rts;        /*       */
  314. mov.l   r1,@(4,r0)     /*     pNode->next->previous = pNode->previous */
  315. #endif /* !unixALib_PORTABLE */