blocks_amd64.s 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // +build amd64,!appengine,!gccgo
  2. #define ROUND(v0, v1, v2, v3) \
  3. ADDQ v1, v0; \
  4. RORQ $51, v1; \
  5. ADDQ v3, v2; \
  6. XORQ v0, v1; \
  7. RORQ $48, v3; \
  8. RORQ $32, v0; \
  9. XORQ v2, v3; \
  10. ADDQ v1, v2; \
  11. ADDQ v3, v0; \
  12. RORQ $43, v3; \
  13. RORQ $47, v1; \
  14. XORQ v0, v3; \
  15. XORQ v2, v1; \
  16. RORQ $32, v2
  17. // blocks(d *digest, data []uint8)
  18. TEXT ·blocks(SB),4,$0-32
  19. MOVQ d+0(FP), BX
  20. MOVQ 0(BX), R9 // R9 = v0
  21. MOVQ 8(BX), R10 // R10 = v1
  22. MOVQ 16(BX), R11 // R11 = v2
  23. MOVQ 24(BX), R12 // R12 = v3
  24. MOVQ p_base+8(FP), DI // DI = *uint64
  25. MOVQ p_len+16(FP), SI // SI = nblocks
  26. XORL DX, DX // DX = index (0)
  27. SHRQ $3, SI // SI /= 8
  28. body:
  29. CMPQ DX, SI
  30. JGE end
  31. MOVQ 0(DI)(DX*8), CX // CX = m
  32. XORQ CX, R12
  33. ROUND(R9, R10, R11, R12)
  34. ROUND(R9, R10, R11, R12)
  35. XORQ CX, R9
  36. ADDQ $1, DX
  37. JMP body
  38. end:
  39. MOVQ R9, 0(BX)
  40. MOVQ R10, 8(BX)
  41. MOVQ R11, 16(BX)
  42. MOVQ R12, 24(BX)
  43. RET
  44. // once(d *digest)
  45. TEXT ·once(SB),4,$0-8
  46. MOVQ d+0(FP), BX
  47. MOVQ 0(BX), R9 // R9 = v0
  48. MOVQ 8(BX), R10 // R10 = v1
  49. MOVQ 16(BX), R11 // R11 = v2
  50. MOVQ 24(BX), R12 // R12 = v3
  51. MOVQ 48(BX), CX // CX = d.x[:]
  52. XORQ CX, R12
  53. ROUND(R9, R10, R11, R12)
  54. ROUND(R9, R10, R11, R12)
  55. XORQ CX, R9
  56. MOVQ R9, 0(BX)
  57. MOVQ R10, 8(BX)
  58. MOVQ R11, 16(BX)
  59. MOVQ R12, 24(BX)
  60. RET
  61. // finalize(d *digest) uint64
  62. TEXT ·finalize(SB),4,$0-16
  63. MOVQ d+0(FP), BX
  64. MOVQ 0(BX), R9 // R9 = v0
  65. MOVQ 8(BX), R10 // R10 = v1
  66. MOVQ 16(BX), R11 // R11 = v2
  67. MOVQ 24(BX), R12 // R12 = v3
  68. MOVQ 48(BX), CX // CX = d.x[:]
  69. XORQ CX, R12
  70. ROUND(R9, R10, R11, R12)
  71. ROUND(R9, R10, R11, R12)
  72. XORQ CX, R9
  73. NOTB R11
  74. ROUND(R9, R10, R11, R12)
  75. ROUND(R9, R10, R11, R12)
  76. ROUND(R9, R10, R11, R12)
  77. ROUND(R9, R10, R11, R12)
  78. XORQ R12, R11
  79. XORQ R10, R9
  80. XORQ R11, R9
  81. MOVQ R9, ret+8(FP)
  82. RET