// 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 ·IndexByte(SB), NOSPLIT, $0-40 | |
I64Load b_base+0(FP) | |
I32WrapI64 | |
I32Load8U c+24(FP) | |
I64Load b_len+8(FP) | |
I32WrapI64 | |
Call memchr<>(SB) | |
I64ExtendI32S | |
Set R0 | |
Get SP | |
I64Const $-1 | |
Get R0 | |
I64Load b_base+0(FP) | |
I64Sub | |
Get R0 | |
I64Eqz $0 | |
Select | |
I64Store ret+32(FP) | |
RET | |
TEXT ·IndexByteString(SB), NOSPLIT, $0-32 | |
Get SP | |
I64Load s_base+0(FP) | |
I32WrapI64 | |
I32Load8U c+16(FP) | |
I64Load s_len+8(FP) | |
I32WrapI64 | |
Call memchr<>(SB) | |
I64ExtendI32S | |
Set R0 | |
I64Const $-1 | |
Get R0 | |
I64Load s_base+0(FP) | |
I64Sub | |
Get R0 | |
I64Eqz $0 | |
Select | |
I64Store ret+24(FP) | |
RET | |
// initially compiled with emscripten and then modified over time. | |
// params: | |
// R0: s | |
// R1: c | |
// R2: len | |
// ret: index | |
TEXT memchr<>(SB), NOSPLIT, $0 | |
Get R1 | |
Set R4 | |
Block | |
Block | |
Get R2 | |
I32Const $0 | |
I32Ne | |
Tee R3 | |
Get R0 | |
I32Const $3 | |
I32And | |
I32Const $0 | |
I32Ne | |
I32And | |
If | |
Loop | |
Get R0 | |
I32Load8U $0 | |
Get R1 | |
I32Eq | |
BrIf $2 | |
Get R2 | |
I32Const $-1 | |
I32Add | |
Tee R2 | |
I32Const $0 | |
I32Ne | |
Tee R3 | |
Get R0 | |
I32Const $1 | |
I32Add | |
Tee R0 | |
I32Const $3 | |
I32And | |
I32Const $0 | |
I32Ne | |
I32And | |
BrIf $0 | |
End | |
End | |
Get R3 | |
BrIf $0 | |
I32Const $0 | |
Set R1 | |
Br $1 | |
End | |
Get R0 | |
I32Load8U $0 | |
Get R4 | |
Tee R3 | |
I32Eq | |
If | |
Get R2 | |
Set R1 | |
Else | |
Get R4 | |
I32Const $16843009 | |
I32Mul | |
Set R4 | |
Block | |
Block | |
Get R2 | |
I32Const $3 | |
I32GtU | |
If | |
Get R2 | |
Set R1 | |
Loop | |
Get R0 | |
I32Load $0 | |
Get R4 | |
I32Xor | |
Tee R2 | |
I32Const $-2139062144 | |
I32And | |
I32Const $-2139062144 | |
I32Xor | |
Get R2 | |
I32Const $-16843009 | |
I32Add | |
I32And | |
I32Eqz | |
If | |
Get R0 | |
I32Const $4 | |
I32Add | |
Set R0 | |
Get R1 | |
I32Const $-4 | |
I32Add | |
Tee R1 | |
I32Const $3 | |
I32GtU | |
BrIf $1 | |
Br $3 | |
End | |
End | |
Else | |
Get R2 | |
Set R1 | |
Br $1 | |
End | |
Br $1 | |
End | |
Get R1 | |
I32Eqz | |
If | |
I32Const $0 | |
Set R1 | |
Br $3 | |
End | |
End | |
Loop | |
Get R0 | |
I32Load8U $0 | |
Get R3 | |
I32Eq | |
BrIf $2 | |
Get R0 | |
I32Const $1 | |
I32Add | |
Set R0 | |
Get R1 | |
I32Const $-1 | |
I32Add | |
Tee R1 | |
BrIf $0 | |
I32Const $0 | |
Set R1 | |
End | |
End | |
End | |
Get R0 | |
I32Const $0 | |
Get R1 | |
Select | |
Return |