1// +build amd64,!appengine,!gccgo1// +build amd64,!appengine,!gccgo
2         2
3#define ROUND(v0, v1, v2, v3) \3#define ROUND(v0, v1, v2, v3) \
4        ADDQ v1, v0; \4        ADDQ v1, v0;  \
5        RORQ $51, v1; \5        RORQ $51, v1; \
6        ADDQ v3, v2; \6        ADDQ v3, v2;  \
7        XORQ v0, v1; \7        XORQ v0, v1;  \
8        RORQ $48, v3; \8        RORQ $48, v3; \
9        RORQ $32, v0; \9        RORQ $32, v0; \
10        XORQ v2, v3; \10        XORQ v2, v3;  \
11        ADDQ v1, v2; \11        ADDQ v1, v2;  \
12        ADDQ v3, v0; \12        ADDQ v3, v0;  \
13        RORQ $43, v3; \13        RORQ $43, v3; \
14        RORQ $47, v1; \14        RORQ $47, v1; \
15        XORQ v0, v3; \15        XORQ v0, v3;  \
16        XORQ v2, v1; \16        XORQ v2, v1;  \
17        RORQ $32, v217        RORQ $32, v2
1818
19// blocks(d *digest, data []uint8)19// blocks(d *digest, data []uint8)
20TEXT ·blocks(SB),4,$0-3220TEXT ·blocks(SB), 4, $0-32
21        MOVQ d+0(FP), BX21        MOVQ d+0(FP), BX
22        MOVQ 0(BX), R9                // R9 = v022        MOVQ 0(BX), R9           // R9 = v0
23        MOVQ 8(BX), R10                // R10 = v123        MOVQ 8(BX), R10          // R10 = v1
24        MOVQ 16(BX), R11        // R11 = v224        MOVQ 16(BX), R11         // R11 = v2
25        MOVQ 24(BX), R12        // R12 = v325        MOVQ 24(BX), R12         // R12 = v3
26        MOVQ data+8(FP), DI        // DI = *uint6426        MOVQ data+8(FP), DI      // DI = *uint64
27        MOVQ data_len+16(FP), SI// SI = nblocks27        MOVQ data_len+16(FP), SI // SI = nblocks
28        XORL DX, DX                // DX = index (0)28        XORL DX, DX              // DX = index (0)
29        SHRQ $3, SI                 // SI /= 829        SHRQ $3, SI              // SI /= 8
30
30body:31body:
31        CMPQ DX, SI32        CMPQ DX, SI
32        JGE  end33        JGE  end
33        MOVQ 0(DI)(DX*8), CX        // CX = m34        MOVQ 0(DI)(DX*8), CX // CX = m
34        XORQ CX, R1235        XORQ CX, R12
35        ROUND(R9, R10, R11, R12)36        ROUND(R9, R10, R11, R12)
36        ROUND(R9, R10, R11, R12)37        ROUND(R9, R10, R11, R12)
37        XORQ CX, R938        XORQ CX, R9
38        ADDQ $1, DX39        ADDQ $1, DX
39        JMP  body40        JMP  body
41
40end:42end:
41        MOVQ R9, 0(BX)43        MOVQ R9, 0(BX)
42        MOVQ R10, 8(BX)44        MOVQ R10, 8(BX)
43        MOVQ R11, 16(BX)45        MOVQ R11, 16(BX)
44        MOVQ R12, 24(BX)46        MOVQ R12, 24(BX)
45        RET47        RET
4648
47// once(d *digest)49// once(d *digest)
48TEXT ·once(SB),4,$0-850TEXT ·once(SB), 4, $0-8
49        MOVQ d+0(FP), BX51        MOVQ d+0(FP), BX
50        MOVQ 0(BX), R9                // R9 = v052        MOVQ 0(BX), R9   // R9 = v0
51        MOVQ 8(BX), R10                // R10 = v153        MOVQ 8(BX), R10  // R10 = v1
52        MOVQ 16(BX), R11        // R11 = v254        MOVQ 16(BX), R11 // R11 = v2
53        MOVQ 24(BX), R12        // R12 = v355        MOVQ 24(BX), R12 // R12 = v3
54        MOVQ 48(BX), CX                // CX = d.x[:]56        MOVQ 48(BX), CX  // CX = d.x[:]
55        XORQ CX, R1257        XORQ CX, R12
56        ROUND(R9, R10, R11, R12)58        ROUND(R9, R10, R11, R12)
57        ROUND(R9, R10, R11, R12)59        ROUND(R9, R10, R11, R12)
58        XORQ CX, R960        XORQ CX, R9
59        MOVQ R9, 0(BX)61        MOVQ R9, 0(BX)
60        MOVQ R10, 8(BX)62        MOVQ R10, 8(BX)
61        MOVQ R11, 16(BX)63        MOVQ R11, 16(BX)
62        MOVQ R12, 24(BX)64        MOVQ R12, 24(BX)
63        RET65        RET
6466
65// finalize(d *digest) uint6467// finalize(d *digest) uint64
66TEXT ·finalize(SB),4,$0-1668TEXT ·finalize(SB), 4, $0-16
67        MOVQ d+0(FP), BX69        MOVQ d+0(FP), BX
68        MOVQ 0(BX), R9                // R9 = v070        MOVQ 0(BX), R9     // R9 = v0
69        MOVQ 8(BX), R10                // R10 = v171        MOVQ 8(BX), R10    // R10 = v1
70        MOVQ 16(BX), R11        // R11 = v272        MOVQ 16(BX), R11   // R11 = v2
71        MOVQ 24(BX), R12        // R12 = v373        MOVQ 24(BX), R12   // R12 = v3
72        MOVQ 48(BX), CX                // CX = d.x[:]74        MOVQ 48(BX), CX    // CX = d.x[:]
73        XORQ CX, R1275        XORQ CX, R12
74        ROUND(R9, R10, R11, R12)76        ROUND(R9, R10, R11, R12)
75        ROUND(R9, R10, R11, R12)77        ROUND(R9, R10, R11, R12)
76        XORQ CX, R978        XORQ CX, R9
77        NOTB R1179        NOTB R11
78        ROUND(R9, R10, R11, R12)80        ROUND(R9, R10, R11, R12)
79        ROUND(R9, R10, R11, R12)81        ROUND(R9, R10, R11, R12)
80        ROUND(R9, R10, R11, R12)82        ROUND(R9, R10, R11, R12)
81        ROUND(R9, R10, R11, R12)83        ROUND(R9, R10, R11, R12)
82        XORQ R12, R1184        XORQ R12, R11
83        XORQ R10, R985        XORQ R10, R9
84        XORQ R11, R986        XORQ R11, R9
85        MOVQ R9, ret+8(FP)87        MOVQ R9, ret+8(FP)
86        RET88        RET
8789