...

Text file src/hash/crc32/crc32_amd64p32.s

     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

View as plain text