github.com/SandwichDev/go-internals@v0.0.0-20210605002614-12311ac6b2c5/bytealg/indexbyte_wasm.s (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include "go_asm.h" 6 #include "textflag.h" 7 8 TEXT ·IndexByte(SB), NOSPLIT, $0-40 9 I64Load b_base+0(FP) 10 I32WrapI64 11 I32Load8U c+24(FP) 12 I64Load b_len+8(FP) 13 I32WrapI64 14 Call memchr<>(SB) 15 I64ExtendI32S 16 Set R0 17 18 Get SP 19 I64Const $-1 20 Get R0 21 I64Load b_base+0(FP) 22 I64Sub 23 Get R0 24 I64Eqz $0 25 Select 26 I64Store ret+32(FP) 27 28 RET 29 30 TEXT ·IndexByteString(SB), NOSPLIT, $0-32 31 Get SP 32 I64Load s_base+0(FP) 33 I32WrapI64 34 I32Load8U c+16(FP) 35 I64Load s_len+8(FP) 36 I32WrapI64 37 Call memchr<>(SB) 38 I64ExtendI32S 39 Set R0 40 41 I64Const $-1 42 Get R0 43 I64Load s_base+0(FP) 44 I64Sub 45 Get R0 46 I64Eqz $0 47 Select 48 I64Store ret+24(FP) 49 50 RET 51 52 // initially compiled with emscripten and then modified over time. 53 // params: 54 // R0: s 55 // R1: c 56 // R2: len 57 // ret: index 58 TEXT memchr<>(SB), NOSPLIT, $0 59 Get R1 60 Set R4 61 Block 62 Block 63 Get R2 64 I32Const $0 65 I32Ne 66 Tee R3 67 Get R0 68 I32Const $3 69 I32And 70 I32Const $0 71 I32Ne 72 I32And 73 If 74 Loop 75 Get R0 76 I32Load8U $0 77 Get R1 78 I32Eq 79 BrIf $2 80 Get R2 81 I32Const $-1 82 I32Add 83 Tee R2 84 I32Const $0 85 I32Ne 86 Tee R3 87 Get R0 88 I32Const $1 89 I32Add 90 Tee R0 91 I32Const $3 92 I32And 93 I32Const $0 94 I32Ne 95 I32And 96 BrIf $0 97 End 98 End 99 Get R3 100 BrIf $0 101 I32Const $0 102 Set R1 103 Br $1 104 End 105 Get R0 106 I32Load8U $0 107 Get R4 108 Tee R3 109 I32Eq 110 If 111 Get R2 112 Set R1 113 Else 114 Get R4 115 I32Const $16843009 116 I32Mul 117 Set R4 118 Block 119 Block 120 Get R2 121 I32Const $3 122 I32GtU 123 If 124 Get R2 125 Set R1 126 Loop 127 Get R0 128 I32Load $0 129 Get R4 130 I32Xor 131 Tee R2 132 I32Const $-2139062144 133 I32And 134 I32Const $-2139062144 135 I32Xor 136 Get R2 137 I32Const $-16843009 138 I32Add 139 I32And 140 I32Eqz 141 If 142 Get R0 143 I32Const $4 144 I32Add 145 Set R0 146 Get R1 147 I32Const $-4 148 I32Add 149 Tee R1 150 I32Const $3 151 I32GtU 152 BrIf $1 153 Br $3 154 End 155 End 156 Else 157 Get R2 158 Set R1 159 Br $1 160 End 161 Br $1 162 End 163 Get R1 164 I32Eqz 165 If 166 I32Const $0 167 Set R1 168 Br $3 169 End 170 End 171 Loop 172 Get R0 173 I32Load8U $0 174 Get R3 175 I32Eq 176 BrIf $2 177 Get R0 178 I32Const $1 179 I32Add 180 Set R0 181 Get R1 182 I32Const $-1 183 I32Add 184 Tee R1 185 BrIf $0 186 I32Const $0 187 Set R1 188 End 189 End 190 End 191 Get R0 192 I32Const $0 193 Get R1 194 Select 195 Return