| // +build amd64,!appengine,!gccgo | | // +build amd64,!appengine,!gccgo |
| 2 |
| | 2 |
|
| #define ROUND(v0, v1, v2, v3) \ | | #define ROUND(v0, v1, v2, v3) \ |
| 4 | ADDQ v1, v0; \ | | 4 | ADDQ v1, v0; \ |
| RORQ $51, v1; \ | | RORQ $51, v1; \ |
| 6 | ADDQ v3, v2; \ | | 6 | ADDQ v3, v2; \ |
| 7 | XORQ v0, v1; \ | | 7 | XORQ v0, v1; \ |
| RORQ $48, v3; \ | | RORQ $48, v3; \ |
| RORQ $32, v0; \ | | 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; \ |
| RORQ $43, v3; \ | | RORQ $43, v3; \ |
| RORQ $47, v1; \ | | RORQ $47, v1; \ |
| 15 | XORQ v0, v3; \ | | 15 | XORQ v0, v3; \ |
| 16 | XORQ v2, v1; \ | | 16 | XORQ v2, v1; \ |
| RORQ $32, v2 | | RORQ $32, v2 |
| | | |
| // blocks(d *digest, data []uint8) | | // blocks(d *digest, data []uint8) |
| 20 | TEXT ·blocks(SB),4,$0-32 | | 20 | TEXT ·blocks(SB), 4, $0-32 |
| MOVQ d+0(FP), BX | | MOVQ d+0(FP), BX |
| 22 | MOVQ 0(BX), R9 // R9 = v0 | | 22 | MOVQ 0(BX), R9 // R9 = v0 |
| 23 | MOVQ 8(BX), R10 // R10 = v1 | | 23 | MOVQ 8(BX), R10 // R10 = v1 |
| 24 | MOVQ 16(BX), R11 // R11 = v2 | | 24 | MOVQ 16(BX), R11 // R11 = v2 |
| 25 | MOVQ 24(BX), R12 // R12 = v3 | | 25 | MOVQ 24(BX), R12 // R12 = v3 |
| 26 | MOVQ data+8(FP), DI // DI = *uint64 | | 26 | MOVQ data+8(FP), DI // DI = *uint64 |
| 27 | MOVQ data_len+16(FP), SI// SI = nblocks | | 27 | 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 /= 8 | | 29 | SHRQ $3, SI // SI /= 8 |
| | | | 30 |
|
| body: | | body: |
| CMPQ DX, SI | | CMPQ DX, SI |
| JGE end | | JGE end |
| 33 | MOVQ 0(DI)(DX*8), CX // CX = m | | 34 | MOVQ 0(DI)(DX*8), CX // CX = m |
| XORQ CX, R12 | | XORQ CX, R12 |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| XORQ CX, R9 | | XORQ CX, R9 |
| ADDQ $1, DX | | ADDQ $1, DX |
| JMP body | | JMP body |
| | | | 41 |
|
| end: | | end: |
| MOVQ R9, 0(BX) | | MOVQ R9, 0(BX) |
| MOVQ R10, 8(BX) | | MOVQ R10, 8(BX) |
| MOVQ R11, 16(BX) | | MOVQ R11, 16(BX) |
| MOVQ R12, 24(BX) | | MOVQ R12, 24(BX) |
| RET | | RET |
| | | |
| // once(d *digest) | | // once(d *digest) |
| 48 | TEXT ·once(SB),4,$0-8 | | 50 | TEXT ·once(SB), 4, $0-8 |
| MOVQ d+0(FP), BX | | MOVQ d+0(FP), BX |
| 50 | MOVQ 0(BX), R9 // R9 = v0 | | 52 | MOVQ 0(BX), R9 // R9 = v0 |
| 51 | MOVQ 8(BX), R10 // R10 = v1 | | 53 | MOVQ 8(BX), R10 // R10 = v1 |
| 52 | MOVQ 16(BX), R11 // R11 = v2 | | 54 | MOVQ 16(BX), R11 // R11 = v2 |
| 53 | MOVQ 24(BX), R12 // R12 = v3 | | 55 | MOVQ 24(BX), R12 // R12 = v3 |
| 54 | MOVQ 48(BX), CX // CX = d.x[:] | | 56 | MOVQ 48(BX), CX // CX = d.x[:] |
| XORQ CX, R12 | | XORQ CX, R12 |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| XORQ CX, R9 | | XORQ CX, R9 |
| MOVQ R9, 0(BX) | | MOVQ R9, 0(BX) |
| MOVQ R10, 8(BX) | | MOVQ R10, 8(BX) |
| MOVQ R11, 16(BX) | | MOVQ R11, 16(BX) |
| MOVQ R12, 24(BX) | | MOVQ R12, 24(BX) |
| RET | | RET |
| | | |
| // finalize(d *digest) uint64 | | // finalize(d *digest) uint64 |
| 66 | TEXT ·finalize(SB),4,$0-16 | | 68 | TEXT ·finalize(SB), 4, $0-16 |
| MOVQ d+0(FP), BX | | MOVQ d+0(FP), BX |
| 68 | MOVQ 0(BX), R9 // R9 = v0 | | 70 | MOVQ 0(BX), R9 // R9 = v0 |
| 69 | MOVQ 8(BX), R10 // R10 = v1 | | 71 | MOVQ 8(BX), R10 // R10 = v1 |
| 70 | MOVQ 16(BX), R11 // R11 = v2 | | 72 | MOVQ 16(BX), R11 // R11 = v2 |
| 71 | MOVQ 24(BX), R12 // R12 = v3 | | 73 | MOVQ 24(BX), R12 // R12 = v3 |
| 72 | MOVQ 48(BX), CX // CX = d.x[:] | | 74 | MOVQ 48(BX), CX // CX = d.x[:] |
| XORQ CX, R12 | | XORQ CX, R12 |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| XORQ CX, R9 | | XORQ CX, R9 |
| NOTB R11 | | NOTB R11 |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| ROUND(R9, R10, R11, R12) | | ROUND(R9, R10, R11, R12) |
| XORQ R12, R11 | | XORQ R12, R11 |
| XORQ R10, R9 | | XORQ R10, R9 |
| XORQ R11, R9 | | XORQ R11, R9 |
| MOVQ R9, ret+8(FP) | | MOVQ R9, ret+8(FP) |
| RET | | RET |
| | | |