#include "go_asm.h"
#include "textflag.h"
-// memequal(a, b unsafe.Pointer, size uintptr) bool
-TEXT runtime·memequal<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-25
- // short path to handle 0-byte case
- CBZ R2, equal
- // short path to handle equal pointers
- CMP R0, R1
- BEQ equal
- B memeqbody<>(SB)
-equal:
- MOVD $1, R0
- RET
-
// memequal_varlen(a, b unsafe.Pointer) bool
TEXT runtime·memequal_varlen<ABIInternal>(SB),NOSPLIT,$0-17
- CMP R0, R1
- BEQ eq
MOVD 8(R26), R2 // compiler stores size at offset 8 in the closure
CBZ R2, eq
- B memeqbody<>(SB)
+ B runtime·memequal<ABIInternal>(SB)
eq:
MOVD $1, R0
RET
// R1: pointer b
// R2: data len
// at return: result in R0
-TEXT memeqbody<>(SB),NOSPLIT,$0
+// memequal(a, b unsafe.Pointer, size uintptr) bool
+TEXT runtime·memequal<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-25
+ // short path to handle 0-byte case
+ CBZ R2, equal
+ // short path to handle equal pointers
+ CMP R0, R1
+ BEQ equal
CMP $1, R2
// handle 1-byte special case for better performance
BEQ one
EOR R4, R5
CBNZ R5, not_equal
B equal
+ PCALIGN $16
lt_8:
TBZ $2, R2, lt_4
MOVWU (R0), R4
EOR R4, R5
CBNZ R5, not_equal
B equal
+ PCALIGN $16
lt_4:
TBZ $1, R2, lt_2
MOVHU.P 2(R0), R4