blocks_amd64.s 1.7 KB

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