csum_ipv6_magic.S 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 complement.
  73. zapnot $0,3,$0 # e0 :
  74. ret # .. e1 :
  75. .end csum_ipv6_magic