Home | History | Annotate | Download | only in crc32
      1 // Copyright 2011 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 #include "textflag.h"
      6 
      7 // func castagnoliSSE42(crc uint32, p []byte) uint32
      8 TEXT castagnoliSSE42(SB),NOSPLIT,$0
      9 	MOVL crc+0(FP), AX  // CRC value
     10 	MOVL p+4(FP), SI  // data pointer
     11 	MOVL p_len+8(FP), CX  // len(p)
     12 
     13 	NOTL AX
     14 
     15 	/* If there's less than 8 bytes to process, we do it byte-by-byte. */
     16 	CMPQ CX, $8
     17 	JL cleanup
     18 
     19 	/* Process individual bytes until the input is 8-byte aligned. */
     20 startup:
     21 	MOVQ SI, BX
     22 	ANDQ $7, BX
     23 	JZ aligned
     24 
     25 	CRC32B (SI), AX
     26 	DECQ CX
     27 	INCQ SI
     28 	JMP startup
     29 
     30 aligned:
     31 	/* The input is now 8-byte aligned and we can process 8-byte chunks. */
     32 	CMPQ CX, $8
     33 	JL cleanup
     34 
     35 	CRC32Q (SI), AX
     36 	ADDQ $8, SI
     37 	SUBQ $8, CX
     38 	JMP aligned
     39 
     40 cleanup:
     41 	/* We may have some bytes left over that we process one at a time. */
     42 	CMPQ CX, $0
     43 	JE done
     44 
     45 	CRC32B (SI), AX
     46 	INCQ SI
     47 	DECQ CX
     48 	JMP cleanup
     49 
     50 done:
     51 	NOTL AX
     52 	MOVL AX, ret+16(FP)
     53 	RET
     54 
     55 // func haveSSE42() bool
     56 TEXT haveSSE42(SB),NOSPLIT,$0
     57 	XORQ AX, AX
     58 	INCL AX
     59 	CPUID
     60 	SHRQ $20, CX
     61 	ANDQ $1, CX
     62 	MOVB CX, ret+0(FP)
     63 	RET
     64 
     65