| // Copyright 2018 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" |
| |
| TEXT ·Equal(SB), NOSPLIT, $0-49 |
| MOVD a_len+8(FP), R0 |
| MOVD b_len+32(FP), R1 |
| Get R0 |
| Get R1 |
| I64Eq |
| If |
| Get SP |
| I64Load a+0(FP) |
| I64Load b+24(FP) |
| Get R0 |
| Call memeqbody<>(SB) |
| I64Store8 ret+48(FP) |
| Else |
| Get SP |
| I64Const $0 |
| I64Store8 ret+48(FP) |
| End |
| RET |
| |
| // memequal(p, q unsafe.Pointer, size uintptr) bool |
| TEXT runtime·memequal(SB), NOSPLIT, $0-25 |
| Get SP |
| I64Load a+0(FP) |
| I64Load b+8(FP) |
| I64Load size+16(FP) |
| Call memeqbody<>(SB) |
| I64Store8 ret+24(FP) |
| RET |
| |
| // memequal_varlen(a, b unsafe.Pointer) bool |
| TEXT runtime·memequal_varlen(SB), NOSPLIT, $0-17 |
| Get SP |
| I64Load a+0(FP) |
| I64Load b+8(FP) |
| I64Load 8(CTXT) // compiler stores size at offset 8 in the closure |
| Call memeqbody<>(SB) |
| I64Store8 ret+16(FP) |
| RET |
| |
| // params: a, b, len |
| // ret: 0/1 |
| TEXT memeqbody<>(SB), NOSPLIT, $0-0 |
| Get R0 |
| Get R1 |
| I64Eq |
| If |
| I64Const $1 |
| Return |
| End |
| |
| loop: |
| Loop |
| Get R2 |
| I64Eqz |
| If |
| I64Const $1 |
| Return |
| End |
| |
| Get R0 |
| I32WrapI64 |
| I64Load8U $0 |
| Get R1 |
| I32WrapI64 |
| I64Load8U $0 |
| I64Ne |
| If |
| I64Const $0 |
| Return |
| End |
| |
| Get R0 |
| I64Const $1 |
| I64Add |
| Set R0 |
| |
| Get R1 |
| I64Const $1 |
| I64Add |
| Set R1 |
| |
| Get R2 |
| I64Const $1 |
| I64Sub |
| Set R2 |
| |
| Br loop |
| End |
| UNDEF |