github.com/hikaru7719/go@v0.0.0-20181025140707-c8b2ac68906a/src/internal/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 I64ExtendSI32 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 I64ExtendSI32 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 TEXT bytes·IndexByte(SB), NOSPLIT, $0-40 53 FUNCDATA $0, ·IndexByte·args_stackmap(SB) 54 Get SP 55 I64Load b_base+0(FP) 56 I32WrapI64 57 I32Load8U c+24(FP) 58 I64Load b_len+8(FP) 59 I32WrapI64 60 Call memchr<>(SB) 61 I64ExtendSI32 62 Set R0 63 64 I64Const $-1 65 Get R0 66 I64Load b_base+0(FP) 67 I64Sub 68 Get R0 69 I64Eqz $0 70 Select 71 I64Store ret+32(FP) 72 73 RET 74 75 TEXT strings·IndexByte(SB), NOSPLIT, $0-32 76 FUNCDATA $0, ·IndexByteString·args_stackmap(SB) 77 Get SP 78 I64Load s_base+0(FP) 79 I32WrapI64 80 I32Load8U c+16(FP) 81 I64Load s_len+8(FP) 82 I32WrapI64 83 Call memchr<>(SB) 84 I64ExtendSI32 85 Set R0 86 87 I64Const $-1 88 Get R0 89 I64Load s_base+0(FP) 90 I64Sub 91 Get R0 92 I64Eqz $0 93 Select 94 I64Store ret+24(FP) 95 RET 96 97 // compiled with emscripten 98 // params: s, c, len 99 // ret: index 100 TEXT memchr<>(SB), NOSPLIT, $0 101 Get R1 102 I32Const $255 103 I32And 104 Set R4 105 Block 106 Block 107 Get R2 108 I32Const $0 109 I32Ne 110 Tee R3 111 Get R0 112 I32Const $3 113 I32And 114 I32Const $0 115 I32Ne 116 I32And 117 If 118 Get R1 119 I32Const $255 120 I32And 121 Set R5 122 Loop 123 Get R0 124 I32Load8U $0 125 Get R5 126 I32Eq 127 BrIf $2 128 Get R2 129 I32Const $-1 130 I32Add 131 Tee R2 132 I32Const $0 133 I32Ne 134 Tee R3 135 Get R0 136 I32Const $1 137 I32Add 138 Tee R0 139 I32Const $3 140 I32And 141 I32Const $0 142 I32Ne 143 I32And 144 BrIf $0 145 End 146 End 147 Get R3 148 BrIf $0 149 I32Const $0 150 Set R1 151 Br $1 152 End 153 Get R0 154 I32Load8U $0 155 Get R1 156 I32Const $255 157 I32And 158 Tee R3 159 I32Eq 160 If 161 Get R2 162 Set R1 163 Else 164 Get R4 165 I32Const $16843009 166 I32Mul 167 Set R4 168 Block 169 Block 170 Get R2 171 I32Const $3 172 I32GtU 173 If 174 Get R2 175 Set R1 176 Loop 177 Get R0 178 I32Load $0 179 Get R4 180 I32Xor 181 Tee R2 182 I32Const $-2139062144 183 I32And 184 I32Const $-2139062144 185 I32Xor 186 Get R2 187 I32Const $-16843009 188 I32Add 189 I32And 190 I32Eqz 191 If 192 Get R0 193 I32Const $4 194 I32Add 195 Set R0 196 Get R1 197 I32Const $-4 198 I32Add 199 Tee R1 200 I32Const $3 201 I32GtU 202 BrIf $1 203 Br $3 204 End 205 End 206 Else 207 Get R2 208 Set R1 209 Br $1 210 End 211 Br $1 212 End 213 Get R1 214 I32Eqz 215 If 216 I32Const $0 217 Set R1 218 Br $3 219 End 220 End 221 Loop 222 Get R0 223 I32Load8U $0 224 Get R3 225 I32Eq 226 BrIf $2 227 Get R0 228 I32Const $1 229 I32Add 230 Set R0 231 Get R1 232 I32Const $-1 233 I32Add 234 Tee R1 235 BrIf $0 236 I32Const $0 237 Set R1 238 End 239 End 240 End 241 Get R0 242 I32Const $0 243 Get R1 244 Select 245 Return