| // Copied from S2 implementation. |
| |
| //go:build !appengine && !noasm && gc && !noasm |
| |
| #include "textflag.h" |
| |
| // func matchLen(a []byte, b []byte) int |
| TEXT ·matchLen(SB), NOSPLIT, $0-56 |
| MOVQ a_base+0(FP), AX |
| MOVQ b_base+24(FP), CX |
| MOVQ a_len+8(FP), DX |
| |
| // matchLen |
| XORL SI, SI |
| CMPL DX, $0x08 |
| JB matchlen_match4_standalone |
| |
| matchlen_loopback_standalone: |
| MOVQ (AX)(SI*1), BX |
| XORQ (CX)(SI*1), BX |
| JZ matchlen_loop_standalone |
| |
| #ifdef GOAMD64_v3 |
| TZCNTQ BX, BX |
| #else |
| BSFQ BX, BX |
| #endif |
| SHRL $0x03, BX |
| LEAL (SI)(BX*1), SI |
| JMP gen_match_len_end |
| |
| matchlen_loop_standalone: |
| LEAL -8(DX), DX |
| LEAL 8(SI), SI |
| CMPL DX, $0x08 |
| JAE matchlen_loopback_standalone |
| |
| matchlen_match4_standalone: |
| CMPL DX, $0x04 |
| JB matchlen_match2_standalone |
| MOVL (AX)(SI*1), BX |
| CMPL (CX)(SI*1), BX |
| JNE matchlen_match2_standalone |
| LEAL -4(DX), DX |
| LEAL 4(SI), SI |
| |
| matchlen_match2_standalone: |
| CMPL DX, $0x02 |
| JB matchlen_match1_standalone |
| MOVW (AX)(SI*1), BX |
| CMPW (CX)(SI*1), BX |
| JNE matchlen_match1_standalone |
| LEAL -2(DX), DX |
| LEAL 2(SI), SI |
| |
| matchlen_match1_standalone: |
| CMPL DX, $0x01 |
| JB gen_match_len_end |
| MOVB (AX)(SI*1), BL |
| CMPB (CX)(SI*1), BL |
| JNE gen_match_len_end |
| INCL SI |
| |
| gen_match_len_end: |
| MOVQ SI, ret+48(FP) |
| RET |