| // 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 |