// 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 S10 // func memequal(a, b unsafe.Pointer, size uintptr) bool TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25 MOV a+0(FP), X5 MOV b+8(FP), X6 MOV size+16(FP), X7 MOV $ret+24(FP), X19 JMP memequal<>(SB) // func memequal_varlen(a, b unsafe.Pointer) bool TEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-17 MOV a+0(FP), X5 MOV b+8(FP), X6 MOV 8(CTXT), X7 // compiler stores size at offset 8 in the closure MOV $ret+16(FP), X19 JMP memequal<>(SB) // On entry X5 and X6 contain pointers, X7 contains length. // X19 contains address for return value. TEXT memequal<>(SB),NOSPLIT|NOFRAME,$0 BEQ X5, X6, eq MOV $32, X8 BLT X7, X8, loop4_check // Check alignment - if alignment differs we have to do one byte at a time. AND $3, X5, X9 AND $3, X6, X10 BNE X9, X10, loop4_check BEQZ X9, loop32_check // Check one byte at a time until we reach 8 byte alignment. SUB X9, X7, X7 align: ADD $-1, X9 MOVBU 0(X5), X10 MOVBU 0(X6), X11 BNE X10, X11, not_eq ADD $1, X5 ADD $1, X6 BNEZ X9, align loop32_check: MOV $32, X9 BLT X7, X9, loop16_check loop32: MOV 0(X5), X10 MOV 0(X6), X11 MOV 8(X5), X12 MOV 8(X6), X13 BNE X10, X11, not_eq BNE X12, X13, not_eq MOV 16(X5), X14 MOV 16(X6), X15 MOV 24(X5), X16 MOV 24(X6), X17 BNE X14, X15, not_eq BNE X16, X17, not_eq ADD $32, X5 ADD $32, X6 ADD $-32, X7 BGE X7, X9, loop32 BEQZ X7, eq loop16_check: MOV $16, X8 BLT X7, X8, loop4_check loop16: MOV 0(X5), X10 MOV 0(X6), X11 MOV 8(X5), X12 MOV 8(X6), X13 BNE X10, X11, not_eq BNE X12, X13, not_eq ADD $16, X5 ADD $16, X6 ADD $-16, X7 BGE X7, X8, loop16 BEQZ X7, eq loop4_check: MOV $4, X8 BLT X7, X8, loop1 loop4: MOVBU 0(X5), X10 MOVBU 0(X6), X11 MOVBU 1(X5), X12 MOVBU 1(X6), X13 BNE X10, X11, not_eq BNE X12, X13, not_eq MOVBU 2(X5), X14 MOVBU 2(X6), X15 MOVBU 3(X5), X16 MOVBU 3(X6), X17 BNE X14, X15, not_eq BNE X16, X17, not_eq ADD $4, X5 ADD $4, X6 ADD $-4, X7 BGE X7, X8, loop4 loop1: BEQZ X7, eq MOVBU 0(X5), X10 MOVBU 0(X6), X11 BNE X10, X11, not_eq ADD $1, X5 ADD $1, X6 ADD $-1, X7 JMP loop1 not_eq: MOV $0, X5 MOVB X5, (X19) RET eq: MOV $1, X5 MOVB X5, (X19) RET