github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/klauspost/compress/snappy/asm_amd64.s (about)

     1  //+build !noasm !appengine
     2  
     3  // Copyright 2015, Klaus Post, see LICENSE for details.
     4  
     5  // func matchLenSSE4(a, b []byte, max int) int
     6  TEXT ·matchLenSSE4(SB), 7, $0
     7  	MOVQ  a+0(FP), SI        // RSI: &a
     8  	MOVQ  b+24(FP), DI       // RDI: &b
     9  	MOVQ  max+48(FP), R10    // R10: max
    10  	XORQ  R11, R11           // R11: match length
    11  	MOVQ  R10, R12           // R12: Remainder
    12  	SHRQ  $4, R10            // max / 16
    13  	MOVQ  $16, AX            // Set length for PCMPESTRI
    14  	MOVQ  $16, DX            // Set length for PCMPESTRI
    15  	ANDQ  $15, R12           // max & 15
    16  	TESTQ R10, R10
    17  	JZ    matchlen_verysmall
    18  
    19  loopback_matchlen:
    20  	MOVOU (SI), X0 // a[x]
    21  	MOVOU (DI), X1 // b[x]
    22  
    23  	// PCMPESTRI $0x18, X1, X0
    24  	// 0x18 = _SIDD_UBYTE_OPS (0x0) | _SIDD_CMP_EQUAL_EACH (0x8) | _SIDD_NEGATIVE_POLARITY (0x10)
    25  	BYTE $0x66; BYTE $0x0f; BYTE $0x3a
    26  	BYTE $0x61; BYTE $0xc1; BYTE $0x18
    27  
    28  	JC match_ended
    29  
    30  	ADDQ $16, SI
    31  	ADDQ $16, DI
    32  	ADDQ $16, R11
    33  
    34  	SUBQ $1, R10
    35  	JNZ  loopback_matchlen
    36  
    37  	// Check the remainder using REP CMPSB
    38  matchlen_verysmall:
    39  	TESTQ R12, R12
    40  	JZ    done_matchlen
    41  	MOVQ  R12, CX
    42  	ADDQ  R12, R11
    43  
    44  	// Compare CX bytes at [SI] [DI]
    45  	// Subtract one from CX for every match.
    46  	// Terminates when CX is zero (checked pre-compare)
    47  	CLD
    48  	REP; CMPSB
    49  
    50  	// Check if last was a match.
    51  	JZ done_matchlen
    52  
    53  	// Subtract remanding bytes.
    54  	SUBQ CX, R11
    55  	SUBQ $1, R11
    56  	MOVQ R11, ret+56(FP)
    57  	RET
    58  
    59  match_ended:
    60  	ADDQ CX, R11
    61  
    62  done_matchlen:
    63  	MOVQ R11, ret+56(FP)
    64  	RET
    65