utls/bytealg/compare_wasm.s
Agniva De Sarker effdebcc99 runtime,internal/bytealg: optimize wasmZero, wasmMove, Compare
Coalesce set/get pairs into a tee.

Change-Id: I88ccdcb148465615437bebf24145e941a037e0a5
Reviewed-on: https://go-review.googlesource.com/c/go/+/200357
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Richard Musiol <neelance@gmail.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
2019-10-11 04:00:35 +00:00

115 lines
1.4 KiB
ArmAsm

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