| // 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 | |
| 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 | |
| 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) | |
| R1 | |
| R3 | |
| R1 | |
| R3 | |
| I64LtU | |
| Select | |
| Set R4 | |
| R0 | |
| I32WrapI64 | |
| R2 | |
| I32WrapI64 | |
| R4 | |
| I32WrapI64 | |
| Call memcmp<>(SB) | |
| I64ExtendI32S | |
| Tee R5 | |
| I64Eqz | |
| // check length | |
| R1 | |
| R3 | |
| I64Sub | |
| Set R5 | |
| I64Const $0 | |
| I64Const $-1 | |
| I64Const $1 | |
| R5 | |
| I64Const $0 | |
| I64LtS | |
| Select | |
| R5 | |
| I64Eqz | |
| Select | |
| Return | |
| // compiled with emscripten | |
| // params: a, b, len | |
| // ret: <0/0/>0 | |
| TEXT memcmp<>(SB), NOSPLIT, $0-0 | |
| R2 | |
| $1 | |
| Loop | |
| R0 | |
| I32Load8S $0 | |
| Tee R3 | |
| R1 | |
| I32Load8S $0 | |
| Tee R4 | |
| I32Eq | |
| R0 | |
| I32Const $1 | |
| I32Add | |
| Set R0 | |
| R1 | |
| I32Const $1 | |
| I32Add | |
| Set R1 | |
| I32Const $0 | |
| R2 | |
| I32Const $-1 | |
| I32Add | |
| Tee R2 | |
| I32Eqz | |
| BrIf $3 | |
| Drop | |
| Br $1 | |
| R3 | |
| I32Const $255 | |
| I32And | |
| R4 | |
| I32Const $255 | |
| I32And | |
| I32Sub | |
| I32Const $0 | |
| Return | |