| Index: src/ia32/regexp-macro-assembler-ia32.cc
|
| ===================================================================
|
| --- src/ia32/regexp-macro-assembler-ia32.cc (revision 9531)
|
| +++ src/ia32/regexp-macro-assembler-ia32.cc (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2008-2009 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -134,7 +134,7 @@
|
|
|
| void RegExpMacroAssemblerIA32::AdvanceCurrentPosition(int by) {
|
| if (by != 0) {
|
| - __ add(Operand(edi), Immediate(by * char_size()));
|
| + __ add(edi, Immediate(by * char_size()));
|
| }
|
| }
|
|
|
| @@ -152,8 +152,8 @@
|
| CheckPreemption();
|
| // Pop Code* offset from backtrack stack, add Code* and jump to location.
|
| Pop(ebx);
|
| - __ add(Operand(ebx), Immediate(masm_->CodeObject()));
|
| - __ jmp(Operand(ebx));
|
| + __ add(ebx, Immediate(masm_->CodeObject()));
|
| + __ jmp(ebx);
|
| }
|
|
|
|
|
| @@ -219,7 +219,7 @@
|
| int byte_offset = cp_offset * char_size();
|
| if (check_end_of_string) {
|
| // Check that there are at least str.length() characters left in the input.
|
| - __ cmp(Operand(edi), Immediate(-(byte_offset + byte_length)));
|
| + __ cmp(edi, Immediate(-(byte_offset + byte_length)));
|
| BranchOrBacktrack(greater, on_failure);
|
| }
|
|
|
| @@ -288,7 +288,7 @@
|
| Label fallthrough;
|
| __ cmp(edi, Operand(backtrack_stackpointer(), 0));
|
| __ j(not_equal, &fallthrough);
|
| - __ add(Operand(backtrack_stackpointer()), Immediate(kPointerSize)); // Pop.
|
| + __ add(backtrack_stackpointer(), Immediate(kPointerSize)); // Pop.
|
| BranchOrBacktrack(no_condition, on_equal);
|
| __ bind(&fallthrough);
|
| }
|
| @@ -300,7 +300,7 @@
|
| Label fallthrough;
|
| __ mov(edx, register_location(start_reg)); // Index of start of capture
|
| __ mov(ebx, register_location(start_reg + 1)); // Index of end of capture
|
| - __ sub(ebx, Operand(edx)); // Length of capture.
|
| + __ sub(ebx, edx); // Length of capture.
|
|
|
| // The length of a capture should not be negative. This can only happen
|
| // if the end of the capture is unrecorded, or at a point earlier than
|
| @@ -320,9 +320,9 @@
|
| __ push(backtrack_stackpointer());
|
| // After this, the eax, ecx, and edi registers are available.
|
|
|
| - __ add(edx, Operand(esi)); // Start of capture
|
| - __ add(edi, Operand(esi)); // Start of text to match against capture.
|
| - __ add(ebx, Operand(edi)); // End of text to match against capture.
|
| + __ add(edx, esi); // Start of capture
|
| + __ add(edi, esi); // Start of text to match against capture.
|
| + __ add(ebx, edi); // End of text to match against capture.
|
|
|
| Label loop;
|
| __ bind(&loop);
|
| @@ -339,15 +339,15 @@
|
| __ movzx_b(ecx, Operand(edx, 0));
|
| __ or_(ecx, 0x20);
|
|
|
| - __ cmp(eax, Operand(ecx));
|
| + __ cmp(eax, ecx);
|
| __ j(not_equal, &fail);
|
|
|
| __ bind(&loop_increment);
|
| // Increment pointers into match and capture strings.
|
| - __ add(Operand(edx), Immediate(1));
|
| - __ add(Operand(edi), Immediate(1));
|
| + __ add(edx, Immediate(1));
|
| + __ add(edi, Immediate(1));
|
| // Compare to end of match, and loop if not done.
|
| - __ cmp(edi, Operand(ebx));
|
| + __ cmp(edi, ebx);
|
| __ j(below, &loop);
|
| __ jmp(&success);
|
|
|
| @@ -361,9 +361,9 @@
|
| // Restore original value before continuing.
|
| __ pop(backtrack_stackpointer());
|
| // Drop original value of character position.
|
| - __ add(Operand(esp), Immediate(kPointerSize));
|
| + __ add(esp, Immediate(kPointerSize));
|
| // Compute new value of character position after the matched part.
|
| - __ sub(edi, Operand(esi));
|
| + __ sub(edi, esi);
|
| } else {
|
| ASSERT(mode_ == UC16);
|
| // Save registers before calling C function.
|
| @@ -389,16 +389,19 @@
|
| // Set byte_offset2.
|
| // Found by adding negative string-end offset of current position (edi)
|
| // to end of string.
|
| - __ add(edi, Operand(esi));
|
| + __ add(edi, esi);
|
| __ mov(Operand(esp, 1 * kPointerSize), edi);
|
| // Set byte_offset1.
|
| // Start of capture, where edx already holds string-end negative offset.
|
| - __ add(edx, Operand(esi));
|
| + __ add(edx, esi);
|
| __ mov(Operand(esp, 0 * kPointerSize), edx);
|
|
|
| - ExternalReference compare =
|
| - ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate());
|
| - __ CallCFunction(compare, argument_count);
|
| + {
|
| + AllowExternalCallThatCantCauseGC scope(masm_);
|
| + ExternalReference compare =
|
| + ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate());
|
| + __ CallCFunction(compare, argument_count);
|
| + }
|
| // Pop original values before reacting on result value.
|
| __ pop(ebx);
|
| __ pop(backtrack_stackpointer());
|
| @@ -406,10 +409,10 @@
|
| __ pop(esi);
|
|
|
| // Check if function returned non-zero for success or zero for failure.
|
| - __ or_(eax, Operand(eax));
|
| + __ or_(eax, eax);
|
| BranchOrBacktrack(zero, on_no_match);
|
| // On success, increment position by length of capture.
|
| - __ add(edi, Operand(ebx));
|
| + __ add(edi, ebx);
|
| }
|
| __ bind(&fallthrough);
|
| }
|
| @@ -425,7 +428,7 @@
|
| // Find length of back-referenced capture.
|
| __ mov(edx, register_location(start_reg));
|
| __ mov(eax, register_location(start_reg + 1));
|
| - __ sub(eax, Operand(edx)); // Length to check.
|
| + __ sub(eax, edx); // Length to check.
|
| // Fail on partial or illegal capture (start of capture after end of capture).
|
| BranchOrBacktrack(less, on_no_match);
|
| // Succeed on empty capture (including no capture)
|
| @@ -433,7 +436,7 @@
|
|
|
| // Check that there are sufficient characters left in the input.
|
| __ mov(ebx, edi);
|
| - __ add(ebx, Operand(eax));
|
| + __ add(ebx, eax);
|
| BranchOrBacktrack(greater, on_no_match);
|
|
|
| // Save register to make it available below.
|
| @@ -441,7 +444,7 @@
|
|
|
| // Compute pointers to match string and capture string
|
| __ lea(ebx, Operand(esi, edi, times_1, 0)); // Start of match.
|
| - __ add(edx, Operand(esi)); // Start of capture.
|
| + __ add(edx, esi); // Start of capture.
|
| __ lea(ecx, Operand(eax, ebx, times_1, 0)); // End of match
|
|
|
| Label loop;
|
| @@ -456,10 +459,10 @@
|
| }
|
| __ j(not_equal, &fail);
|
| // Increment pointers into capture and match string.
|
| - __ add(Operand(edx), Immediate(char_size()));
|
| - __ add(Operand(ebx), Immediate(char_size()));
|
| + __ add(edx, Immediate(char_size()));
|
| + __ add(ebx, Immediate(char_size()));
|
| // Check if we have reached end of match area.
|
| - __ cmp(ebx, Operand(ecx));
|
| + __ cmp(ebx, ecx);
|
| __ j(below, &loop);
|
| __ jmp(&success);
|
|
|
| @@ -471,7 +474,7 @@
|
| __ bind(&success);
|
| // Move current character position to position after match.
|
| __ mov(edi, ecx);
|
| - __ sub(Operand(edi), esi);
|
| + __ sub(edi, esi);
|
| // Restore backtrack stackpointer.
|
| __ pop(backtrack_stackpointer());
|
|
|
| @@ -574,17 +577,17 @@
|
| return true;
|
| case '.': {
|
| // Match non-newlines (not 0x0a('\n'), 0x0d('\r'), 0x2028 and 0x2029)
|
| - __ mov(Operand(eax), current_character());
|
| - __ xor_(Operand(eax), Immediate(0x01));
|
| + __ mov(eax, current_character());
|
| + __ xor_(eax, Immediate(0x01));
|
| // See if current character is '\n'^1 or '\r'^1, i.e., 0x0b or 0x0c
|
| - __ sub(Operand(eax), Immediate(0x0b));
|
| + __ sub(eax, Immediate(0x0b));
|
| __ cmp(eax, 0x0c - 0x0b);
|
| BranchOrBacktrack(below_equal, on_no_match);
|
| if (mode_ == UC16) {
|
| // Compare original value to 0x2028 and 0x2029, using the already
|
| // computed (current_char ^ 0x01 - 0x0b). I.e., check for
|
| // 0x201d (0x2028 - 0x0b) or 0x201e.
|
| - __ sub(Operand(eax), Immediate(0x2028 - 0x0b));
|
| + __ sub(eax, Immediate(0x2028 - 0x0b));
|
| __ cmp(eax, 0x2029 - 0x2028);
|
| BranchOrBacktrack(below_equal, on_no_match);
|
| }
|
| @@ -593,7 +596,7 @@
|
| case 'w': {
|
| if (mode_ != ASCII) {
|
| // Table is 128 entries, so all ASCII characters can be tested.
|
| - __ cmp(Operand(current_character()), Immediate('z'));
|
| + __ cmp(current_character(), Immediate('z'));
|
| BranchOrBacktrack(above, on_no_match);
|
| }
|
| ASSERT_EQ(0, word_character_map[0]); // Character '\0' is not a word char.
|
| @@ -607,7 +610,7 @@
|
| Label done;
|
| if (mode_ != ASCII) {
|
| // Table is 128 entries, so all ASCII characters can be tested.
|
| - __ cmp(Operand(current_character()), Immediate('z'));
|
| + __ cmp(current_character(), Immediate('z'));
|
| __ j(above, &done);
|
| }
|
| ASSERT_EQ(0, word_character_map[0]); // Character '\0' is not a word char.
|
| @@ -627,10 +630,10 @@
|
| case 'n': {
|
| // Match newlines (0x0a('\n'), 0x0d('\r'), 0x2028 or 0x2029).
|
| // The opposite of '.'.
|
| - __ mov(Operand(eax), current_character());
|
| - __ xor_(Operand(eax), Immediate(0x01));
|
| + __ mov(eax, current_character());
|
| + __ xor_(eax, Immediate(0x01));
|
| // See if current character is '\n'^1 or '\r'^1, i.e., 0x0b or 0x0c
|
| - __ sub(Operand(eax), Immediate(0x0b));
|
| + __ sub(eax, Immediate(0x0b));
|
| __ cmp(eax, 0x0c - 0x0b);
|
| if (mode_ == ASCII) {
|
| BranchOrBacktrack(above, on_no_match);
|
| @@ -641,7 +644,7 @@
|
| // Compare original value to 0x2028 and 0x2029, using the already
|
| // computed (current_char ^ 0x01 - 0x0b). I.e., check for
|
| // 0x201d (0x2028 - 0x0b) or 0x201e.
|
| - __ sub(Operand(eax), Immediate(0x2028 - 0x0b));
|
| + __ sub(eax, Immediate(0x2028 - 0x0b));
|
| __ cmp(eax, 1);
|
| BranchOrBacktrack(above, on_no_match);
|
| __ bind(&done);
|
| @@ -668,7 +671,12 @@
|
|
|
| // Entry code:
|
| __ bind(&entry_label_);
|
| - // Start new stack frame.
|
| +
|
| + // Tell the system that we have a stack frame. Because the type is MANUAL, no
|
| + // code is generated.
|
| + FrameScope scope(masm_, StackFrame::MANUAL);
|
| +
|
| + // Actually emit code to start a new stack frame.
|
| __ push(ebp);
|
| __ mov(ebp, esp);
|
| // Save callee-save registers. Order here should correspond to order of
|
| @@ -699,7 +707,7 @@
|
|
|
| __ bind(&stack_limit_hit);
|
| CallCheckStackGuardState(ebx);
|
| - __ or_(eax, Operand(eax));
|
| + __ or_(eax, eax);
|
| // If returned value is non-zero, we exit with the returned value as result.
|
| __ j(not_zero, &exit_label_);
|
|
|
| @@ -708,13 +716,13 @@
|
| __ mov(ebx, Operand(ebp, kStartIndex));
|
|
|
| // Allocate space on stack for registers.
|
| - __ sub(Operand(esp), Immediate(num_registers_ * kPointerSize));
|
| + __ sub(esp, Immediate(num_registers_ * kPointerSize));
|
| // Load string length.
|
| __ mov(esi, Operand(ebp, kInputEnd));
|
| // Load input position.
|
| __ mov(edi, Operand(ebp, kInputStart));
|
| // Set up edi to be negative offset from string end.
|
| - __ sub(edi, Operand(esi));
|
| + __ sub(edi, esi);
|
|
|
| // Set eax to address of char before start of the string.
|
| // (effectively string position -1).
|
| @@ -736,7 +744,7 @@
|
| Label init_loop;
|
| __ bind(&init_loop);
|
| __ mov(Operand(ebp, ecx, times_1, +0), eax);
|
| - __ sub(Operand(ecx), Immediate(kPointerSize));
|
| + __ sub(ecx, Immediate(kPointerSize));
|
| __ cmp(ecx, kRegisterZero - num_saved_registers_ * kPointerSize);
|
| __ j(greater, &init_loop);
|
| }
|
| @@ -777,12 +785,12 @@
|
| if (mode_ == UC16) {
|
| __ lea(ecx, Operand(ecx, edx, times_2, 0));
|
| } else {
|
| - __ add(ecx, Operand(edx));
|
| + __ add(ecx, edx);
|
| }
|
| for (int i = 0; i < num_saved_registers_; i++) {
|
| __ mov(eax, register_location(i));
|
| // Convert to index from start of string, not end.
|
| - __ add(eax, Operand(ecx));
|
| + __ add(eax, ecx);
|
| if (mode_ == UC16) {
|
| __ sar(eax, 1); // Convert byte index to character index.
|
| }
|
| @@ -819,7 +827,7 @@
|
| __ push(edi);
|
|
|
| CallCheckStackGuardState(ebx);
|
| - __ or_(eax, Operand(eax));
|
| + __ or_(eax, eax);
|
| // If returning non-zero, we should end execution with the given
|
| // result as return value.
|
| __ j(not_zero, &exit_label_);
|
| @@ -854,7 +862,7 @@
|
| __ CallCFunction(grow_stack, num_arguments);
|
| // If return NULL, we have failed to grow the stack, and
|
| // must exit with a stack-overflow exception.
|
| - __ or_(eax, Operand(eax));
|
| + __ or_(eax, eax);
|
| __ j(equal, &exit_with_exception);
|
| // Otherwise use return value as new stack pointer.
|
| __ mov(backtrack_stackpointer(), eax);
|
| @@ -1183,8 +1191,8 @@
|
|
|
| void RegExpMacroAssemblerIA32::SafeReturn() {
|
| __ pop(ebx);
|
| - __ add(Operand(ebx), Immediate(masm_->CodeObject()));
|
| - __ jmp(Operand(ebx));
|
| + __ add(ebx, Immediate(masm_->CodeObject()));
|
| + __ jmp(ebx);
|
| }
|
|
|
|
|
| @@ -1196,14 +1204,14 @@
|
| void RegExpMacroAssemblerIA32::Push(Register source) {
|
| ASSERT(!source.is(backtrack_stackpointer()));
|
| // Notice: This updates flags, unlike normal Push.
|
| - __ sub(Operand(backtrack_stackpointer()), Immediate(kPointerSize));
|
| + __ sub(backtrack_stackpointer(), Immediate(kPointerSize));
|
| __ mov(Operand(backtrack_stackpointer(), 0), source);
|
| }
|
|
|
|
|
| void RegExpMacroAssemblerIA32::Push(Immediate value) {
|
| // Notice: This updates flags, unlike normal Push.
|
| - __ sub(Operand(backtrack_stackpointer()), Immediate(kPointerSize));
|
| + __ sub(backtrack_stackpointer(), Immediate(kPointerSize));
|
| __ mov(Operand(backtrack_stackpointer(), 0), value);
|
| }
|
|
|
| @@ -1212,7 +1220,7 @@
|
| ASSERT(!target.is(backtrack_stackpointer()));
|
| __ mov(target, Operand(backtrack_stackpointer(), 0));
|
| // Notice: This updates flags, unlike normal Pop.
|
| - __ add(Operand(backtrack_stackpointer()), Immediate(kPointerSize));
|
| + __ add(backtrack_stackpointer(), Immediate(kPointerSize));
|
| }
|
|
|
|
|
|
|