mirror of
https://github.com/refraction-networking/utls.git
synced 2025-04-06 21:47:36 +03:00
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>
115 lines
1.4 KiB
ArmAsm
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
|