|  | // Copyright 2019 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | #include "go_asm.h" | 
|  | #include "textflag.h" | 
|  |  | 
|  | #define	CTXT	S4 | 
|  |  | 
|  | // func memequal(a, b unsafe.Pointer, size uintptr) bool | 
|  | TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25 | 
|  | MOV	a+0(FP), A1 | 
|  | MOV	b+8(FP), A2 | 
|  | BEQ	A1, A2, eq | 
|  | MOV	size+16(FP), A3 | 
|  | ADD	A1, A3, A4 | 
|  | loop: | 
|  | BEQ	A1, A4, eq | 
|  |  | 
|  | MOVBU	(A1), A6 | 
|  | ADD	$1, A1 | 
|  | MOVBU	(A2), A7 | 
|  | ADD	$1, A2 | 
|  | BEQ	A6, A7, loop | 
|  |  | 
|  | MOVB	ZERO, ret+24(FP) | 
|  | RET | 
|  | eq: | 
|  | MOV	$1, A1 | 
|  | MOVB	A1, ret+24(FP) | 
|  | RET | 
|  |  | 
|  | // func memequal_varlen(a, b unsafe.Pointer) bool | 
|  | TEXT runtime·memequal_varlen(SB),NOSPLIT,$40-17 | 
|  | MOV	a+0(FP), A1 | 
|  | MOV	b+8(FP), A2 | 
|  | BEQ	A1, A2, eq | 
|  | MOV	8(CTXT), A3    // compiler stores size at offset 8 in the closure | 
|  | MOV	A1, 8(X2) | 
|  | MOV	A2, 16(X2) | 
|  | MOV	A3, 24(X2) | 
|  | CALL	runtime·memequal(SB) | 
|  | MOVBU	32(X2), A1 | 
|  | MOVB	A1, ret+16(FP) | 
|  | RET | 
|  | eq: | 
|  | MOV	$1, A1 | 
|  | MOVB	A1, ret+16(FP) | 
|  | RET |