forked from toolshed/abra
		
	
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
// 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
 |