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