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