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