1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // Copyright 2011 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- // +build gc
- #define NOSPLIT 4
- #define RODATA 8
- // func castagnoliSSE42(crc uint32, p []byte) uint32
- TEXT ·castagnoliSSE42(SB), NOSPLIT, $0
- MOVL crc+0(FP), AX // CRC value
- MOVL p+4(FP), SI // data pointer
- MOVL p_len+8(FP), CX // len(p)
- NOTL AX
- // If there's less than 8 bytes to process, we do it byte-by-byte.
- CMPQ CX, $8
- JL cleanup
- // Process individual bytes until the input is 8-byte aligned.
- startup:
- MOVQ SI, BX
- ANDQ $7, BX
- JZ aligned
- CRC32B (SI), AX
- DECQ CX
- INCQ SI
- JMP startup
- aligned:
- // The input is now 8-byte aligned and we can process 8-byte chunks.
- CMPQ CX, $8
- JL cleanup
- CRC32Q (SI), AX
- ADDQ $8, SI
- SUBQ $8, CX
- JMP aligned
- cleanup:
- // We may have some bytes left over that we process one at a time.
- CMPQ CX, $0
- JE done
- CRC32B (SI), AX
- INCQ SI
- DECQ CX
- JMP cleanup
- done:
- NOTL AX
- MOVL AX, ret+16(FP)
- RET
- // func haveSSE42() bool
- TEXT ·haveSSE42(SB), NOSPLIT, $0
- XORQ AX, AX
- INCL AX
- CPUID
- SHRQ $20, CX
- ANDQ $1, CX
- MOVB CX, ret+0(FP)
- RET
|