ptclbsum386.s 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. TEXT ptclbsum(SB), $0
  2. MOVL addr+0(FP), SI
  3. MOVL len+4(FP), CX
  4. XORL AX, AX /* sum */
  5. TESTL $1, SI /* byte aligned? */
  6. MOVL SI, DI
  7. JEQ _2align
  8. DECL CX
  9. JLT _return
  10. MOVB 0x00(SI), AH
  11. INCL SI
  12. _2align:
  13. TESTL $2, SI /* word aligned? */
  14. JEQ _32loop
  15. CMPL CX, $2 /* less than 2 bytes? */
  16. JLT _1dreg
  17. SUBL $2, CX
  18. XORL BX, BX
  19. MOVW 0x00(SI), BX
  20. ADDL BX, AX
  21. ADCL $0, AX
  22. LEAL 2(SI), SI
  23. _32loop:
  24. CMPL CX, $0x20
  25. JLT _8loop
  26. MOVL CX, BP
  27. SHRL $5, BP
  28. ANDL $0x1F, CX
  29. _32loopx:
  30. MOVL 0x00(SI), BX
  31. MOVL 0x1C(SI), DX
  32. ADCL BX, AX
  33. MOVL 0x04(SI), BX
  34. ADCL DX, AX
  35. MOVL 0x10(SI), DX
  36. ADCL BX, AX
  37. MOVL 0x08(SI), BX
  38. ADCL DX, AX
  39. MOVL 0x14(SI), DX
  40. ADCL BX, AX
  41. MOVL 0x0C(SI), BX
  42. ADCL DX, AX
  43. MOVL 0x18(SI), DX
  44. ADCL BX, AX
  45. LEAL 0x20(SI), SI
  46. ADCL DX, AX
  47. DECL BP
  48. JNE _32loopx
  49. ADCL $0, AX
  50. _8loop:
  51. CMPL CX, $0x08
  52. JLT _2loop
  53. MOVL CX, BP
  54. SHRL $3, BP
  55. ANDL $0x07, CX
  56. _8loopx:
  57. MOVL 0x00(SI), BX
  58. ADCL BX, AX
  59. MOVL 0x04(SI), DX
  60. ADCL DX, AX
  61. LEAL 0x08(SI), SI
  62. DECL BP
  63. JNE _8loopx
  64. ADCL $0, AX
  65. _2loop:
  66. CMPL CX, $0x02
  67. JLT _1dreg
  68. MOVL CX, BP
  69. SHRL $1, BP
  70. ANDL $0x01, CX
  71. _2loopx:
  72. MOVWLZX 0x00(SI), BX
  73. ADCL BX, AX
  74. LEAL 0x02(SI), SI
  75. DECL BP
  76. JNE _2loopx
  77. ADCL $0, AX
  78. _1dreg:
  79. TESTL $1, CX /* 1 byte left? */
  80. JEQ _fold
  81. XORL BX, BX
  82. MOVB 0x00(SI), BX
  83. ADDL BX, AX
  84. ADCL $0, AX
  85. _fold:
  86. MOVL AX, BX
  87. SHRL $16, BX
  88. JEQ _swab
  89. ANDL $0xFFFF, AX
  90. ADDL BX, AX
  91. JMP _fold
  92. _swab:
  93. TESTL $1, addr+0(FP)
  94. /*TESTL $1, DI*/
  95. JNE _return
  96. XCHGB AH, AL
  97. _return:
  98. RET