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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * arch/alpha/lib/csum_ipv6_magic.S
  3.  * Contributed by Richard Henderson <rth@tamu.edu>
  4.  *
  5.  * unsigned short csum_ipv6_magic(struct in6_addr *saddr,
  6.  *                                struct in6_addr *daddr,
  7.  *                                __u32 len,
  8.  *                                unsigned short proto,
  9.  *                                unsigned int csum);
  10.  */
  11. .globl csum_ipv6_magic
  12. .align 4
  13. .ent csum_ipv6_magic
  14. .frame $30,0,$26,0
  15. csum_ipv6_magic:
  16. .prologue 0
  17. ldq $0,0($16) # e0    : load src & dst addr words
  18. zapnot $20,15,$20 # .. e1 : zero extend incoming csum
  19. extqh $18,1,$4 # e0    : byte swap len & proto while we wait
  20. ldq $1,8($16) # .. e1 :
  21. extbl $18,1,$5 # e0 :
  22. ldq $2,0($17) # .. e1 :
  23. extbl $18,2,$6 # e0  :
  24. ldq $3,8($17) # .. e1 :
  25. extbl $18,3,$18 # e0 :
  26. sra $4,32,$4 # e0 :
  27. sll $5,16,$5 # e0 :
  28. addq $20,$0,$20 # .. e1 : begin summing the words
  29. sll $6,8,$6 # e0 :
  30. cmpult $20,$0,$0 # .. e1 :
  31. extwh $19,7,$7 # e0    :
  32. or $4,$18,$18 # .. e1 :
  33. extbl $19,1,$19 # e0    :
  34. or $5,$6,$5 # .. e1 :
  35. or $18,$5,$18 # e0    : len complete
  36. or $19,$7,$19 # .. e1 :
  37. sll $19,48,$19 # e0    :
  38. addq $20,$1,$20 # .. e1 :
  39. sra $19,32,$19 # e0    : proto complete
  40. cmpult $20,$1,$1 # .. e1 :
  41. nop # e0    :
  42. addq $20,$2,$20 # .. e1 :
  43. cmpult $20,$2,$2 # e0    :
  44. addq $20,$3,$20 # .. e1 :
  45. cmpult $20,$3,$3 # e0    :
  46. addq $20,$18,$20 # .. e1 :
  47. cmpult $20,$18,$18 # e0    :
  48. addq $20,$19,$20 # .. e1 :
  49. cmpult $20,$19,$19 # e0    :
  50. addq $0,$1,$0 # .. e1 : merge the carries back into the csum
  51. addq $2,$3,$2 # e0    :
  52. addq $18,$19,$18 # .. e1 :
  53. addq $0,$2,$0 # e0    :
  54. addq $20,$18,$20 # .. e1 :
  55. addq $0,$20,$0 # e0    :
  56. unop #       :
  57. extwl $0,2,$2 # e0    : begin folding the 64-bit value
  58. zapnot $0,3,$3 # .. e1 :
  59. extwl $0,4,$1 # e0    :
  60. addq $2,$3,$3 # .. e1 :
  61. extwl $0,6,$0 # e0    :
  62. addq $3,$1,$3 # .. e1 :
  63. addq $0,$3,$0 # e0    :
  64. unop #       :
  65. extwl $0,2,$1 # e0    : fold 18-bit value
  66. zapnot $0,3,$0 # .. e1 :
  67. addq $0,$1,$0 # e0    :
  68. unop #       :
  69. extwl $0,2,$1 # e0    : fold 17-bit value
  70. zapnot $0,3,$0 # .. e1 :
  71. addq $0,$1,$0 # e0    :
  72. not $0,$0 # e1    : and compliment.
  73. zapnot $0,3,$0 # e0    :
  74. ret # .. e1 :
  75. .end csum_ipv6_magic