| // 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 ·Compare(SB), NOSPLIT, $0-56 |
| Get SP |
| I64Load a_base+0(FP) |
| I64Load a_len+8(FP) |
| I64Load b_base+24(FP) |
| I64Load b_len+32(FP) |
| Call cmpbody<>(SB) |
| I64Store ret+48(FP) |
| RET |
| |
| TEXT runtime·cmpstring(SB), NOSPLIT, $0-40 |
| Get SP |
| I64Load a_base+0(FP) |
| I64Load a_len+8(FP) |
| I64Load b_base+16(FP) |
| I64Load b_len+24(FP) |
| Call cmpbody<>(SB) |
| I64Store ret+32(FP) |
| RET |
| |
| // params: a, alen, b, blen |
| // ret: -1/0/1 |
| TEXT cmpbody<>(SB), NOSPLIT, $0-0 |
| // len = min(alen, blen) |
| Get R1 |
| Get R3 |
| Get R1 |
| Get R3 |
| I64LtU |
| Select |
| Set R4 |
| |
| Get R0 |
| I32WrapI64 |
| Get R2 |
| I32WrapI64 |
| Get R4 |
| I32WrapI64 |
| Call memcmp<>(SB) |
| I64ExtendI32S |
| Tee R5 |
| |
| I64Eqz |
| If |
| // check length |
| Get R1 |
| Get R3 |
| I64Sub |
| Set R5 |
| End |
| |
| I64Const $0 |
| I64Const $-1 |
| I64Const $1 |
| Get R5 |
| I64Const $0 |
| I64LtS |
| Select |
| Get R5 |
| I64Eqz |
| Select |
| Return |
| |
| // compiled with emscripten |
| // params: a, b, len |
| // ret: <0/0/>0 |
| TEXT memcmp<>(SB), NOSPLIT, $0-0 |
| Get R2 |
| If $1 |
| Loop |
| Get R0 |
| I32Load8S $0 |
| Tee R3 |
| Get R1 |
| I32Load8S $0 |
| Tee R4 |
| I32Eq |
| If |
| Get R0 |
| I32Const $1 |
| I32Add |
| Set R0 |
| Get R1 |
| I32Const $1 |
| I32Add |
| Set R1 |
| I32Const $0 |
| Get R2 |
| I32Const $-1 |
| I32Add |
| Tee R2 |
| I32Eqz |
| BrIf $3 |
| Drop |
| Br $1 |
| End |
| End |
| Get R3 |
| I32Const $255 |
| I32And |
| Get R4 |
| I32Const $255 |
| I32And |
| I32Sub |
| Else |
| I32Const $0 |
| End |
| Return |