mirror of https://github.com/gogits/gogs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.2 KiB
67 lines
1.2 KiB
// 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 |
|
|
|
|