OLD | NEW |
1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 printable ? | 90 printable ? |
91 "pc = %02x, sp = %d, curpos = %d, curchar = %08x (%c), bc = %s" : | 91 "pc = %02x, sp = %d, curpos = %d, curchar = %08x (%c), bc = %s" : |
92 "pc = %02x, sp = %d, curpos = %d, curchar = %08x .%c., bc = %s"; | 92 "pc = %02x, sp = %d, curpos = %d, curchar = %08x .%c., bc = %s"; |
93 PrintF(format, | 93 PrintF(format, |
94 pc - code_base, | 94 pc - code_base, |
95 stack_depth, | 95 stack_depth, |
96 current_position, | 96 current_position, |
97 current_char, | 97 current_char, |
98 printable ? current_char : '.', | 98 printable ? current_char : '.', |
99 bytecode_name); | 99 bytecode_name); |
100 for (int i = 1; i < bytecode_length; i++) { | 100 for (int i = 0; i < bytecode_length; i++) { |
101 printf(", %02x", pc[i]); | 101 printf(", %02x", pc[i]); |
102 } | 102 } |
103 printf(" "); | 103 printf(" "); |
104 for (int i = 1; i < bytecode_length; i++) { | 104 for (int i = 1; i < bytecode_length; i++) { |
105 unsigned char b = pc[i]; | 105 unsigned char b = pc[i]; |
106 if (b < 127 && b >= 32) { | 106 if (b < 127 && b >= 32) { |
107 printf("%c", b); | 107 printf("%c", b); |
108 } else { | 108 } else { |
109 printf("."); | 109 printf("."); |
110 } | 110 } |
(...skipping 11 matching lines...) Expand all Loading... |
122 current, \ | 122 current, \ |
123 current_char, \ | 123 current_char, \ |
124 BC_##name##_LENGTH, \ | 124 BC_##name##_LENGTH, \ |
125 #name); | 125 #name); |
126 #else | 126 #else |
127 #define BYTECODE(name) \ | 127 #define BYTECODE(name) \ |
128 case BC_##name: | 128 case BC_##name: |
129 #endif | 129 #endif |
130 | 130 |
131 | 131 |
| 132 static int32_t Load32Aligned(const byte* pc) { |
| 133 ASSERT((reinterpret_cast<int>(pc) & 3) == 0); |
| 134 return *reinterpret_cast<const int32_t *>(pc); |
| 135 } |
| 136 |
| 137 |
| 138 static int32_t Load16Aligned(const byte* pc) { |
| 139 ASSERT((reinterpret_cast<int>(pc) & 1) == 0); |
| 140 return *reinterpret_cast<const uint16_t *>(pc); |
| 141 } |
| 142 |
132 | 143 |
133 template <typename Char> | 144 template <typename Char> |
134 static bool RawMatch(const byte* code_base, | 145 static bool RawMatch(const byte* code_base, |
135 Vector<const Char> subject, | 146 Vector<const Char> subject, |
136 int* registers, | 147 int* registers, |
137 int current, | 148 int current, |
138 uint32_t current_char) { | 149 uint32_t current_char) { |
139 const byte* pc = code_base; | 150 const byte* pc = code_base; |
140 static const int kBacktrackStackSize = 10000; | 151 static const int kBacktrackStackSize = 10000; |
141 int backtrack_stack[kBacktrackStackSize]; | 152 int backtrack_stack[kBacktrackStackSize]; |
142 int backtrack_stack_space = kBacktrackStackSize; | 153 int backtrack_stack_space = kBacktrackStackSize; |
143 int* backtrack_sp = backtrack_stack; | 154 int* backtrack_sp = backtrack_stack; |
144 #ifdef DEBUG | 155 #ifdef DEBUG |
145 if (FLAG_trace_regexp_bytecodes) { | 156 if (FLAG_trace_regexp_bytecodes) { |
146 PrintF("\n\nStart bytecode interpreter\n\n"); | 157 PrintF("\n\nStart bytecode interpreter\n\n"); |
147 } | 158 } |
148 #endif | 159 #endif |
149 while (true) { | 160 while (true) { |
150 switch (*pc) { | 161 int32_t insn = Load32Aligned(pc); |
| 162 switch (insn & BYTECODE_MASK) { |
151 BYTECODE(BREAK) | 163 BYTECODE(BREAK) |
152 UNREACHABLE(); | 164 UNREACHABLE(); |
153 return false; | 165 return false; |
154 BYTECODE(PUSH_CP) | 166 BYTECODE(PUSH_CP) |
155 if (--backtrack_stack_space < 0) { | 167 if (--backtrack_stack_space < 0) { |
156 return false; // No match on backtrack stack overflow. | 168 return false; // No match on backtrack stack overflow. |
157 } | 169 } |
158 *backtrack_sp++ = current + Load32(pc + 1); | 170 *backtrack_sp++ = current; |
159 pc += BC_PUSH_CP_LENGTH; | 171 pc += BC_PUSH_CP_LENGTH; |
160 break; | 172 break; |
161 BYTECODE(PUSH_BT) | 173 BYTECODE(PUSH_BT) |
162 if (--backtrack_stack_space < 0) { | 174 if (--backtrack_stack_space < 0) { |
163 return false; // No match on backtrack stack overflow. | 175 return false; // No match on backtrack stack overflow. |
164 } | 176 } |
165 *backtrack_sp++ = Load32(pc + 1); | 177 *backtrack_sp++ = Load32Aligned(pc + 4); |
166 pc += BC_PUSH_BT_LENGTH; | 178 pc += BC_PUSH_BT_LENGTH; |
167 break; | 179 break; |
168 BYTECODE(PUSH_REGISTER) | 180 BYTECODE(PUSH_REGISTER) |
169 if (--backtrack_stack_space < 0) { | 181 if (--backtrack_stack_space < 0) { |
170 return false; // No match on backtrack stack overflow. | 182 return false; // No match on backtrack stack overflow. |
171 } | 183 } |
172 *backtrack_sp++ = registers[pc[1]]; | 184 *backtrack_sp++ = registers[insn >> BYTECODE_SHIFT]; |
173 pc += BC_PUSH_REGISTER_LENGTH; | 185 pc += BC_PUSH_REGISTER_LENGTH; |
174 break; | 186 break; |
175 BYTECODE(SET_REGISTER) | 187 BYTECODE(SET_REGISTER) |
176 registers[pc[1]] = Load32(pc + 2); | 188 registers[insn >> BYTECODE_SHIFT] = Load32Aligned(pc + 4); |
177 pc += BC_SET_REGISTER_LENGTH; | 189 pc += BC_SET_REGISTER_LENGTH; |
178 break; | 190 break; |
179 BYTECODE(ADVANCE_REGISTER) | 191 BYTECODE(ADVANCE_REGISTER) |
180 registers[pc[1]] += Load32(pc + 2); | 192 registers[insn >> BYTECODE_SHIFT] += Load32Aligned(pc + 4); |
181 pc += BC_ADVANCE_REGISTER_LENGTH; | 193 pc += BC_ADVANCE_REGISTER_LENGTH; |
182 break; | 194 break; |
183 BYTECODE(SET_REGISTER_TO_CP) | 195 BYTECODE(SET_REGISTER_TO_CP) |
184 registers[pc[1]] = current + Load32(pc + 2); | 196 registers[insn >> BYTECODE_SHIFT] = current + Load32Aligned(pc + 4); |
185 pc += BC_SET_REGISTER_TO_CP_LENGTH; | 197 pc += BC_SET_REGISTER_TO_CP_LENGTH; |
186 break; | 198 break; |
187 BYTECODE(SET_CP_TO_REGISTER) | 199 BYTECODE(SET_CP_TO_REGISTER) |
188 current = registers[pc[1]]; | 200 current = registers[insn >> BYTECODE_SHIFT]; |
189 pc += BC_SET_CP_TO_REGISTER_LENGTH; | 201 pc += BC_SET_CP_TO_REGISTER_LENGTH; |
190 break; | 202 break; |
191 BYTECODE(SET_REGISTER_TO_SP) | 203 BYTECODE(SET_REGISTER_TO_SP) |
192 registers[pc[1]] = backtrack_sp - backtrack_stack; | 204 registers[insn >> BYTECODE_SHIFT] = backtrack_sp - backtrack_stack; |
193 pc += BC_SET_REGISTER_TO_SP_LENGTH; | 205 pc += BC_SET_REGISTER_TO_SP_LENGTH; |
194 break; | 206 break; |
195 BYTECODE(SET_SP_TO_REGISTER) | 207 BYTECODE(SET_SP_TO_REGISTER) |
196 backtrack_sp = backtrack_stack + registers[pc[1]]; | 208 backtrack_sp = backtrack_stack + registers[insn >> BYTECODE_SHIFT]; |
197 backtrack_stack_space = kBacktrackStackSize - | 209 backtrack_stack_space = kBacktrackStackSize - |
198 (backtrack_sp - backtrack_stack); | 210 (backtrack_sp - backtrack_stack); |
199 pc += BC_SET_SP_TO_REGISTER_LENGTH; | 211 pc += BC_SET_SP_TO_REGISTER_LENGTH; |
200 break; | 212 break; |
201 BYTECODE(POP_CP) | 213 BYTECODE(POP_CP) |
202 backtrack_stack_space++; | 214 backtrack_stack_space++; |
203 --backtrack_sp; | 215 --backtrack_sp; |
204 current = *backtrack_sp; | 216 current = *backtrack_sp; |
205 pc += BC_POP_CP_LENGTH; | 217 pc += BC_POP_CP_LENGTH; |
206 break; | 218 break; |
207 BYTECODE(POP_BT) | 219 BYTECODE(POP_BT) |
208 backtrack_stack_space++; | 220 backtrack_stack_space++; |
209 --backtrack_sp; | 221 --backtrack_sp; |
210 pc = code_base + *backtrack_sp; | 222 pc = code_base + *backtrack_sp; |
211 break; | 223 break; |
212 BYTECODE(POP_REGISTER) | 224 BYTECODE(POP_REGISTER) |
213 backtrack_stack_space++; | 225 backtrack_stack_space++; |
214 --backtrack_sp; | 226 --backtrack_sp; |
215 registers[pc[1]] = *backtrack_sp; | 227 registers[insn >> BYTECODE_SHIFT] = *backtrack_sp; |
216 pc += BC_POP_REGISTER_LENGTH; | 228 pc += BC_POP_REGISTER_LENGTH; |
217 break; | 229 break; |
218 BYTECODE(FAIL) | 230 BYTECODE(FAIL) |
219 return false; | 231 return false; |
220 BYTECODE(SUCCEED) | 232 BYTECODE(SUCCEED) |
221 return true; | 233 return true; |
222 BYTECODE(ADVANCE_CP) | 234 BYTECODE(ADVANCE_CP) |
223 current += Load32(pc + 1); | 235 current += insn >> BYTECODE_SHIFT; |
224 pc += BC_ADVANCE_CP_LENGTH; | 236 pc += BC_ADVANCE_CP_LENGTH; |
225 break; | 237 break; |
226 BYTECODE(GOTO) | 238 BYTECODE(GOTO) |
227 pc = code_base + Load32(pc + 1); | 239 pc = code_base + Load32Aligned(pc + 4); |
228 break; | 240 break; |
229 BYTECODE(CHECK_GREEDY) | 241 BYTECODE(CHECK_GREEDY) |
230 if (current == backtrack_sp[-1]) { | 242 if (current == backtrack_sp[-1]) { |
231 backtrack_sp--; | 243 backtrack_sp--; |
232 backtrack_stack_space++; | 244 backtrack_stack_space++; |
233 pc = code_base + Load32(pc + 1); | 245 pc = code_base + Load32Aligned(pc + 4); |
234 } else { | 246 } else { |
235 pc += BC_CHECK_GREEDY_LENGTH; | 247 pc += BC_CHECK_GREEDY_LENGTH; |
236 } | 248 } |
237 break; | 249 break; |
238 BYTECODE(LOAD_CURRENT_CHAR) { | 250 BYTECODE(LOAD_CURRENT_CHAR) { |
239 int pos = current + Load32(pc + 1); | 251 int pos = current + (insn >> BYTECODE_SHIFT); |
240 if (pos >= subject.length()) { | 252 if (pos >= subject.length()) { |
241 pc = code_base + Load32(pc + 5); | 253 pc = code_base + Load32Aligned(pc + 4); |
242 } else { | 254 } else { |
243 current_char = subject[pos]; | 255 current_char = subject[pos]; |
244 pc += BC_LOAD_CURRENT_CHAR_LENGTH; | 256 pc += BC_LOAD_CURRENT_CHAR_LENGTH; |
245 } | 257 } |
246 break; | 258 break; |
247 } | 259 } |
248 BYTECODE(LOAD_CURRENT_CHAR_UNCHECKED) { | 260 BYTECODE(LOAD_CURRENT_CHAR_UNCHECKED) { |
249 int pos = current + Load32(pc + 1); | 261 int pos = current + (insn >> BYTECODE_SHIFT); |
250 current_char = subject[pos]; | 262 current_char = subject[pos]; |
251 pc += BC_LOAD_CURRENT_CHAR_UNCHECKED_LENGTH; | 263 pc += BC_LOAD_CURRENT_CHAR_UNCHECKED_LENGTH; |
252 break; | 264 break; |
253 } | 265 } |
254 BYTECODE(LOAD_2_CURRENT_CHARS) { | 266 BYTECODE(LOAD_2_CURRENT_CHARS) { |
255 int pos = current + Load32(pc + 1); | 267 int pos = current + (insn >> BYTECODE_SHIFT); |
256 if (pos + 2 > subject.length()) { | 268 if (pos + 2 > subject.length()) { |
257 pc = code_base + Load32(pc + 5); | 269 pc = code_base + Load32Aligned(pc + 4); |
258 } else { | 270 } else { |
259 Char next = subject[pos + 1]; | 271 Char next = subject[pos + 1]; |
260 current_char = | 272 current_char = |
261 (subject[pos] | (next << (kBitsPerByte * sizeof(Char)))); | 273 (subject[pos] | (next << (kBitsPerByte * sizeof(Char)))); |
262 pc += BC_LOAD_2_CURRENT_CHARS_LENGTH; | 274 pc += BC_LOAD_2_CURRENT_CHARS_LENGTH; |
263 } | 275 } |
264 break; | 276 break; |
265 } | 277 } |
266 BYTECODE(LOAD_2_CURRENT_CHARS_UNCHECKED) { | 278 BYTECODE(LOAD_2_CURRENT_CHARS_UNCHECKED) { |
267 int pos = current + Load32(pc + 1); | 279 int pos = current + (insn >> BYTECODE_SHIFT); |
268 Char next = subject[pos + 1]; | 280 Char next = subject[pos + 1]; |
269 current_char = (subject[pos] | (next << (kBitsPerByte * sizeof(Char)))); | 281 current_char = (subject[pos] | (next << (kBitsPerByte * sizeof(Char)))); |
270 pc += BC_LOAD_2_CURRENT_CHARS_UNCHECKED_LENGTH; | 282 pc += BC_LOAD_2_CURRENT_CHARS_UNCHECKED_LENGTH; |
271 break; | 283 break; |
272 } | 284 } |
273 BYTECODE(LOAD_4_CURRENT_CHARS) { | 285 BYTECODE(LOAD_4_CURRENT_CHARS) { |
274 ASSERT(sizeof(Char) == 1); | 286 ASSERT(sizeof(Char) == 1); |
275 int pos = current + Load32(pc + 1); | 287 int pos = current + (insn >> BYTECODE_SHIFT); |
276 if (pos + 4 > subject.length()) { | 288 if (pos + 4 > subject.length()) { |
277 pc = code_base + Load32(pc + 5); | 289 pc = code_base + Load32Aligned(pc + 4); |
278 } else { | 290 } else { |
279 Char next1 = subject[pos + 1]; | 291 Char next1 = subject[pos + 1]; |
280 Char next2 = subject[pos + 2]; | 292 Char next2 = subject[pos + 2]; |
281 Char next3 = subject[pos + 3]; | 293 Char next3 = subject[pos + 3]; |
282 current_char = (subject[pos] | | 294 current_char = (subject[pos] | |
283 (next1 << 8) | | 295 (next1 << 8) | |
284 (next2 << 16) | | 296 (next2 << 16) | |
285 (next3 << 24)); | 297 (next3 << 24)); |
286 pc += BC_LOAD_4_CURRENT_CHARS_LENGTH; | 298 pc += BC_LOAD_4_CURRENT_CHARS_LENGTH; |
287 } | 299 } |
288 break; | 300 break; |
289 } | 301 } |
290 BYTECODE(LOAD_4_CURRENT_CHARS_UNCHECKED) { | 302 BYTECODE(LOAD_4_CURRENT_CHARS_UNCHECKED) { |
291 ASSERT(sizeof(Char) == 1); | 303 ASSERT(sizeof(Char) == 1); |
292 int pos = current + Load32(pc + 1); | 304 int pos = current + (insn >> BYTECODE_SHIFT); |
293 Char next1 = subject[pos + 1]; | 305 Char next1 = subject[pos + 1]; |
294 Char next2 = subject[pos + 2]; | 306 Char next2 = subject[pos + 2]; |
295 Char next3 = subject[pos + 3]; | 307 Char next3 = subject[pos + 3]; |
296 current_char = (subject[pos] | | 308 current_char = (subject[pos] | |
297 (next1 << 8) | | 309 (next1 << 8) | |
298 (next2 << 16) | | 310 (next2 << 16) | |
299 (next3 << 24)); | 311 (next3 << 24)); |
300 pc += BC_LOAD_4_CURRENT_CHARS_UNCHECKED_LENGTH; | 312 pc += BC_LOAD_4_CURRENT_CHARS_UNCHECKED_LENGTH; |
301 break; | 313 break; |
302 } | 314 } |
| 315 BYTECODE(CHECK_4_CHARS) { |
| 316 uint32_t c = Load32Aligned(pc + 4); |
| 317 if (c == current_char) { |
| 318 pc = code_base + Load32Aligned(pc + 8); |
| 319 } else { |
| 320 pc += BC_CHECK_4_CHARS_LENGTH; |
| 321 } |
| 322 break; |
| 323 } |
303 BYTECODE(CHECK_CHAR) { | 324 BYTECODE(CHECK_CHAR) { |
304 uint32_t c = Load32(pc + 1); | 325 uint32_t c = (insn >> BYTECODE_SHIFT); |
305 if (c == current_char) { | 326 if (c == current_char) { |
306 pc = code_base + Load32(pc + 5); | 327 pc = code_base + Load32Aligned(pc + 4); |
307 } else { | 328 } else { |
308 pc += BC_CHECK_CHAR_LENGTH; | 329 pc += BC_CHECK_CHAR_LENGTH; |
309 } | 330 } |
310 break; | 331 break; |
311 } | 332 } |
| 333 BYTECODE(CHECK_NOT_4_CHARS) { |
| 334 uint32_t c = Load32Aligned(pc + 4); |
| 335 if (c != current_char) { |
| 336 pc = code_base + Load32Aligned(pc + 8); |
| 337 } else { |
| 338 pc += BC_CHECK_NOT_4_CHARS_LENGTH; |
| 339 } |
| 340 break; |
| 341 } |
312 BYTECODE(CHECK_NOT_CHAR) { | 342 BYTECODE(CHECK_NOT_CHAR) { |
313 uint32_t c = Load32(pc + 1); | 343 uint32_t c = (insn >> BYTECODE_SHIFT); |
314 if (c != current_char) { | 344 if (c != current_char) { |
315 pc = code_base + Load32(pc + 5); | 345 pc = code_base + Load32Aligned(pc + 4); |
316 } else { | 346 } else { |
317 pc += BC_CHECK_NOT_CHAR_LENGTH; | 347 pc += BC_CHECK_NOT_CHAR_LENGTH; |
318 } | 348 } |
319 break; | 349 break; |
320 } | 350 } |
| 351 BYTECODE(AND_CHECK_4_CHARS) { |
| 352 uint32_t c = Load32Aligned(pc + 4); |
| 353 if (c == (current_char & Load32Aligned(pc + 8))) { |
| 354 pc = code_base + Load32Aligned(pc + 12); |
| 355 } else { |
| 356 pc += BC_AND_CHECK_4_CHARS_LENGTH; |
| 357 } |
| 358 break; |
| 359 } |
321 BYTECODE(AND_CHECK_CHAR) { | 360 BYTECODE(AND_CHECK_CHAR) { |
322 uint32_t c = Load32(pc + 1); | 361 uint32_t c = (insn >> BYTECODE_SHIFT); |
323 if (c == (current_char & Load32(pc + 5))) { | 362 if (c == (current_char & Load32Aligned(pc + 4))) { |
324 pc = code_base + Load32(pc + 9); | 363 pc = code_base + Load32Aligned(pc + 8); |
325 } else { | 364 } else { |
326 pc += BC_AND_CHECK_CHAR_LENGTH; | 365 pc += BC_AND_CHECK_CHAR_LENGTH; |
327 } | 366 } |
328 break; | 367 break; |
329 } | 368 } |
| 369 BYTECODE(AND_CHECK_NOT_4_CHARS) { |
| 370 uint32_t c = Load32Aligned(pc + 4); |
| 371 if (c != (current_char & Load32Aligned(pc + 8))) { |
| 372 pc = code_base + Load32Aligned(pc + 12); |
| 373 } else { |
| 374 pc += BC_AND_CHECK_NOT_4_CHARS_LENGTH; |
| 375 } |
| 376 break; |
| 377 } |
330 BYTECODE(AND_CHECK_NOT_CHAR) { | 378 BYTECODE(AND_CHECK_NOT_CHAR) { |
331 uint32_t c = Load32(pc + 1); | 379 uint32_t c = (insn >> BYTECODE_SHIFT); |
332 if (c != (current_char & Load32(pc + 5))) { | 380 if (c != (current_char & Load32Aligned(pc + 4))) { |
333 pc = code_base + Load32(pc + 9); | 381 pc = code_base + Load32Aligned(pc + 8); |
334 } else { | 382 } else { |
335 pc += BC_AND_CHECK_NOT_CHAR_LENGTH; | 383 pc += BC_AND_CHECK_NOT_CHAR_LENGTH; |
336 } | 384 } |
337 break; | 385 break; |
338 } | 386 } |
339 BYTECODE(MINUS_AND_CHECK_NOT_CHAR) { | 387 BYTECODE(MINUS_AND_CHECK_NOT_CHAR) { |
340 uint32_t c = Load16(pc + 1); | 388 uint32_t c = (insn >> BYTECODE_SHIFT); |
341 uint32_t minus = Load16(pc + 3); | 389 uint32_t minus = Load16Aligned(pc + 4); |
342 uint32_t mask = Load16(pc + 5); | 390 uint32_t mask = Load16Aligned(pc + 6); |
343 if (c != ((current_char - minus) & mask)) { | 391 if (c != ((current_char - minus) & mask)) { |
344 pc = code_base + Load32(pc + 7); | 392 pc = code_base + Load32Aligned(pc + 8); |
345 } else { | 393 } else { |
346 pc += BC_MINUS_AND_CHECK_NOT_CHAR_LENGTH; | 394 pc += BC_MINUS_AND_CHECK_NOT_CHAR_LENGTH; |
347 } | 395 } |
348 break; | 396 break; |
349 } | 397 } |
350 BYTECODE(CHECK_LT) { | 398 BYTECODE(CHECK_LT) { |
351 uint32_t limit = Load16(pc + 1); | 399 uint32_t limit = (insn >> BYTECODE_SHIFT); |
352 if (current_char < limit) { | 400 if (current_char < limit) { |
353 pc = code_base + Load32(pc + 3); | 401 pc = code_base + Load32Aligned(pc + 4); |
354 } else { | 402 } else { |
355 pc += BC_CHECK_LT_LENGTH; | 403 pc += BC_CHECK_LT_LENGTH; |
356 } | 404 } |
357 break; | 405 break; |
358 } | 406 } |
359 BYTECODE(CHECK_GT) { | 407 BYTECODE(CHECK_GT) { |
360 uint32_t limit = Load16(pc + 1); | 408 uint32_t limit = (insn >> BYTECODE_SHIFT); |
361 if (current_char > limit) { | 409 if (current_char > limit) { |
362 pc = code_base + Load32(pc + 3); | 410 pc = code_base + Load32Aligned(pc + 4); |
363 } else { | 411 } else { |
364 pc += BC_CHECK_GT_LENGTH; | 412 pc += BC_CHECK_GT_LENGTH; |
365 } | 413 } |
366 break; | 414 break; |
367 } | 415 } |
368 BYTECODE(CHECK_REGISTER_LT) | 416 BYTECODE(CHECK_REGISTER_LT) |
369 if (registers[pc[1]] < Load16(pc + 2)) { | 417 if (registers[insn >> BYTECODE_SHIFT] < Load32Aligned(pc + 4)) { |
370 pc = code_base + Load32(pc + 4); | 418 pc = code_base + Load32Aligned(pc + 8); |
371 } else { | 419 } else { |
372 pc += BC_CHECK_REGISTER_LT_LENGTH; | 420 pc += BC_CHECK_REGISTER_LT_LENGTH; |
373 } | 421 } |
374 break; | 422 break; |
375 BYTECODE(CHECK_REGISTER_GE) | 423 BYTECODE(CHECK_REGISTER_GE) |
376 if (registers[pc[1]] >= Load16(pc + 2)) { | 424 if (registers[insn >> BYTECODE_SHIFT] >= Load32Aligned(pc + 4)) { |
377 pc = code_base + Load32(pc + 4); | 425 pc = code_base + Load32Aligned(pc + 8); |
378 } else { | 426 } else { |
379 pc += BC_CHECK_REGISTER_GE_LENGTH; | 427 pc += BC_CHECK_REGISTER_GE_LENGTH; |
380 } | 428 } |
381 break; | 429 break; |
382 BYTECODE(CHECK_REGISTER_EQ_POS) | 430 BYTECODE(CHECK_REGISTER_EQ_POS) |
383 if (registers[pc[1]] == current) { | 431 if (registers[insn >> BYTECODE_SHIFT] == current) { |
384 pc = code_base + Load32(pc + 2); | 432 pc = code_base + Load32Aligned(pc + 4); |
385 } else { | 433 } else { |
386 pc += BC_CHECK_REGISTER_EQ_POS_LENGTH; | 434 pc += BC_CHECK_REGISTER_EQ_POS_LENGTH; |
387 } | 435 } |
388 break; | 436 break; |
389 BYTECODE(LOOKUP_MAP1) { | 437 BYTECODE(LOOKUP_MAP1) { |
390 // Look up character in a bitmap. If we find a 0, then jump to the | 438 // Look up character in a bitmap. If we find a 0, then jump to the |
391 // location at pc + 7. Otherwise fall through! | 439 // location at pc + 8. Otherwise fall through! |
392 int index = current_char - Load16(pc + 1); | 440 int index = current_char - (insn >> BYTECODE_SHIFT); |
393 byte map = code_base[Load32(pc + 3) + (index >> 3)]; | 441 byte map = code_base[Load32Aligned(pc + 4) + (index >> 3)]; |
394 map = ((map >> (index & 7)) & 1); | 442 map = ((map >> (index & 7)) & 1); |
395 if (map == 0) { | 443 if (map == 0) { |
396 pc = code_base + Load32(pc + 7); | 444 pc = code_base + Load32Aligned(pc + 8); |
397 } else { | 445 } else { |
398 pc += BC_LOOKUP_MAP1_LENGTH; | 446 pc += BC_LOOKUP_MAP1_LENGTH; |
399 } | 447 } |
400 break; | 448 break; |
401 } | 449 } |
402 BYTECODE(LOOKUP_MAP2) { | 450 BYTECODE(LOOKUP_MAP2) { |
403 // Look up character in a half-nibble map. If we find 00, then jump to | 451 // Look up character in a half-nibble map. If we find 00, then jump to |
404 // the location at pc + 7. If we find 01 then jump to location at | 452 // the location at pc + 8. If we find 01 then jump to location at |
405 // pc + 11, etc. | 453 // pc + 11, etc. |
406 int index = (current_char - Load16(pc + 1)) << 1; | 454 int index = (current_char - (insn >> BYTECODE_SHIFT)) << 1; |
407 byte map = code_base[Load32(pc + 3) + (index >> 3)]; | 455 byte map = code_base[Load32Aligned(pc + 3) + (index >> 3)]; |
408 map = ((map >> (index & 7)) & 3); | 456 map = ((map >> (index & 7)) & 3); |
409 if (map < 2) { | 457 if (map < 2) { |
410 if (map == 0) { | 458 if (map == 0) { |
411 pc = code_base + Load32(pc + 7); | 459 pc = code_base + Load32Aligned(pc + 8); |
412 } else { | 460 } else { |
413 pc = code_base + Load32(pc + 11); | 461 pc = code_base + Load32Aligned(pc + 12); |
414 } | 462 } |
415 } else { | 463 } else { |
416 if (map == 2) { | 464 if (map == 2) { |
417 pc = code_base + Load32(pc + 15); | 465 pc = code_base + Load32Aligned(pc + 16); |
418 } else { | 466 } else { |
419 pc = code_base + Load32(pc + 19); | 467 pc = code_base + Load32Aligned(pc + 20); |
420 } | 468 } |
421 } | 469 } |
422 break; | 470 break; |
423 } | 471 } |
424 BYTECODE(LOOKUP_MAP8) { | 472 BYTECODE(LOOKUP_MAP8) { |
425 // Look up character in a byte map. Use the byte as an index into a | 473 // Look up character in a byte map. Use the byte as an index into a |
426 // table that follows this instruction immediately. | 474 // table that follows this instruction immediately. |
427 int index = current_char - Load16(pc + 1); | 475 int index = current_char - (insn >> BYTECODE_SHIFT); |
428 byte map = code_base[Load32(pc + 3) + index]; | 476 byte map = code_base[Load32Aligned(pc + 4) + index]; |
429 const byte* new_pc = code_base + Load32(pc + 7) + (map << 2); | 477 const byte* new_pc = code_base + Load32Aligned(pc + 8) + (map << 2); |
430 pc = code_base + Load32(new_pc); | 478 pc = code_base + Load32Aligned(new_pc); |
431 break; | 479 break; |
432 } | 480 } |
433 BYTECODE(LOOKUP_HI_MAP8) { | 481 BYTECODE(LOOKUP_HI_MAP8) { |
434 // Look up high byte of this character in a byte map. Use the byte as | 482 // Look up high byte of this character in a byte map. Use the byte as |
435 // an index into a table that follows this instruction immediately. | 483 // an index into a table that follows this instruction immediately. |
436 int index = (current_char >> 8) - pc[1]; | 484 int index = (current_char >> 8) - (insn >> BYTECODE_SHIFT); |
437 byte map = code_base[Load32(pc + 2) + index]; | 485 byte map = code_base[Load32Aligned(pc + 4) + index]; |
438 const byte* new_pc = code_base + Load32(pc + 6) + (map << 2); | 486 const byte* new_pc = code_base + Load32Aligned(pc + 8) + (map << 2); |
439 pc = code_base + Load32(new_pc); | 487 pc = code_base + Load32Aligned(new_pc); |
440 break; | 488 break; |
441 } | 489 } |
442 BYTECODE(CHECK_NOT_REGS_EQUAL) | 490 BYTECODE(CHECK_NOT_REGS_EQUAL) |
443 if (registers[pc[1]] == registers[pc[2]]) { | 491 if (registers[insn >> BYTECODE_SHIFT] == registers[Load32Aligned(pc + 4)
]) { |
444 pc += BC_CHECK_NOT_REGS_EQUAL_LENGTH; | 492 pc += BC_CHECK_NOT_REGS_EQUAL_LENGTH; |
445 } else { | 493 } else { |
446 pc = code_base + Load32(pc + 3); | 494 pc = code_base + Load32Aligned(pc + 8); |
447 } | 495 } |
448 break; | 496 break; |
449 BYTECODE(CHECK_NOT_BACK_REF) { | 497 BYTECODE(CHECK_NOT_BACK_REF) { |
450 int from = registers[pc[1]]; | 498 int from = registers[insn >> BYTECODE_SHIFT]; |
451 int len = registers[pc[1] + 1] - from; | 499 int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from; |
452 if (from < 0 || len <= 0) { | 500 if (from < 0 || len <= 0) { |
453 pc += BC_CHECK_NOT_BACK_REF_LENGTH; | 501 pc += BC_CHECK_NOT_BACK_REF_LENGTH; |
454 break; | 502 break; |
455 } | 503 } |
456 if (current + len > subject.length()) { | 504 if (current + len > subject.length()) { |
457 pc = code_base + Load32(pc + 2); | 505 pc = code_base + Load32Aligned(pc + 4); |
458 break; | 506 break; |
459 } else { | 507 } else { |
460 int i; | 508 int i; |
461 for (i = 0; i < len; i++) { | 509 for (i = 0; i < len; i++) { |
462 if (subject[from + i] != subject[current + i]) { | 510 if (subject[from + i] != subject[current + i]) { |
463 pc = code_base + Load32(pc + 2); | 511 pc = code_base + Load32Aligned(pc + 4); |
464 break; | 512 break; |
465 } | 513 } |
466 } | 514 } |
467 if (i < len) break; | 515 if (i < len) break; |
468 current += len; | 516 current += len; |
469 } | 517 } |
470 pc += BC_CHECK_NOT_BACK_REF_LENGTH; | 518 pc += BC_CHECK_NOT_BACK_REF_LENGTH; |
471 break; | 519 break; |
472 } | 520 } |
473 BYTECODE(CHECK_NOT_BACK_REF_NO_CASE) { | 521 BYTECODE(CHECK_NOT_BACK_REF_NO_CASE) { |
474 int from = registers[pc[1]]; | 522 int from = registers[insn >> BYTECODE_SHIFT]; |
475 int len = registers[pc[1] + 1] - from; | 523 int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from; |
476 if (from < 0 || len <= 0) { | 524 if (from < 0 || len <= 0) { |
477 pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH; | 525 pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH; |
478 break; | 526 break; |
479 } | 527 } |
480 if (current + len > subject.length()) { | 528 if (current + len > subject.length()) { |
481 pc = code_base + Load32(pc + 2); | 529 pc = code_base + Load32Aligned(pc + 4); |
482 break; | 530 break; |
483 } else { | 531 } else { |
484 if (BackRefMatchesNoCase(from, current, len, subject)) { | 532 if (BackRefMatchesNoCase(from, current, len, subject)) { |
485 current += len; | 533 current += len; |
486 pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH; | 534 pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH; |
487 } else { | 535 } else { |
488 pc = code_base + Load32(pc + 2); | 536 pc = code_base + Load32Aligned(pc + 4); |
489 } | 537 } |
490 } | 538 } |
491 break; | 539 break; |
492 } | 540 } |
493 BYTECODE(CHECK_AT_START) | 541 BYTECODE(CHECK_AT_START) |
494 if (current == 0) { | 542 if (current == 0) { |
495 pc = code_base + Load32(pc + 1); | 543 pc = code_base + Load32Aligned(pc + 4); |
496 } else { | 544 } else { |
497 pc += BC_CHECK_AT_START_LENGTH; | 545 pc += BC_CHECK_AT_START_LENGTH; |
498 } | 546 } |
499 break; | 547 break; |
500 BYTECODE(CHECK_NOT_AT_START) | 548 BYTECODE(CHECK_NOT_AT_START) |
501 if (current == 0) { | 549 if (current == 0) { |
502 pc += BC_CHECK_NOT_AT_START_LENGTH; | 550 pc += BC_CHECK_NOT_AT_START_LENGTH; |
503 } else { | 551 } else { |
504 pc = code_base + Load32(pc + 1); | 552 pc = code_base + Load32Aligned(pc + 4); |
505 } | 553 } |
506 break; | 554 break; |
507 default: | 555 default: |
508 UNREACHABLE(); | 556 UNREACHABLE(); |
509 break; | 557 break; |
510 } | 558 } |
511 } | 559 } |
512 } | 560 } |
513 | 561 |
514 | 562 |
(...skipping 20 matching lines...) Expand all Loading... |
535 if (start_position != 0) previous_char = subject_vector[start_position - 1]; | 583 if (start_position != 0) previous_char = subject_vector[start_position - 1]; |
536 return RawMatch(code_base, | 584 return RawMatch(code_base, |
537 subject_vector, | 585 subject_vector, |
538 registers, | 586 registers, |
539 start_position, | 587 start_position, |
540 previous_char); | 588 previous_char); |
541 } | 589 } |
542 } | 590 } |
543 | 591 |
544 } } // namespace v8::internal | 592 } } // namespace v8::internal |
OLD | NEW |