Index: src/mips/regexp-macro-assembler-mips.cc |
diff --git a/src/mips/regexp-macro-assembler-mips.cc b/src/mips/regexp-macro-assembler-mips.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d1dbc435555207ab49572bf7a6816222fcc8f858 |
--- /dev/null |
+++ b/src/mips/regexp-macro-assembler-mips.cc |
@@ -0,0 +1,478 @@ |
+// Copyright 2006-2010 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: |
+// |
+// * Redistributions of source code must retain the above copyright |
+// notice, this list of conditions and the following disclaimer. |
+// * Redistributions in binary form must reproduce the above |
+// copyright notice, this list of conditions and the following |
+// disclaimer in the documentation and/or other materials provided |
+// with the distribution. |
+// * Neither the name of Google Inc. nor the names of its |
+// contributors may be used to endorse or promote products derived |
+// from this software without specific prior written permission. |
+// |
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+#include "v8.h" |
+ |
+#if defined(V8_TARGET_ARCH_MIPS) |
+ |
+#include "unicode.h" |
+#include "log.h" |
+#include "code-stubs.h" |
+#include "regexp-stack.h" |
+#include "macro-assembler.h" |
+#include "regexp-macro-assembler.h" |
+#include "mips/regexp-macro-assembler-mips.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+#ifndef V8_INTERPRETED_REGEXP |
+/* |
+ * This assembler uses the following register assignment convention |
+ * - t1 : Pointer to current code object (Code*) including heap object tag. |
+ * - t2 : Current position in input, as negative offset from end of string. |
+ * Please notice that this is the byte offset, not the character offset! |
+ * - t3 : Currently loaded character. Must be loaded using |
+ * LoadCurrentCharacter before using any of the dispatch methods. |
+ * - t4 : points to tip of backtrack stack |
+ * - t5 : Unused. |
+ * - t6 : End of input (points to byte after last character in input). |
+ * - fp : Frame pointer. Used to access arguments, local variables and |
+ * RegExp registers. |
+ * - sp : points to tip of C stack. |
+ * |
+ * The remaining registers are free for computations. |
+ * |
+ * Each call to a public method should retain this convention. |
+ * The stack will have the following structure: |
+ * - direct_call (if 1, direct call from JavaScript code, if 0 call |
+ * through the runtime system) |
+ * - stack_area_base (High end of the memory area to use as |
+ * backtracking stack) |
+ * - int* capture_array (int[num_saved_registers_], for output). |
+ * - stack frame header (16 bytes in size) |
+ * --- sp when called --- |
+ * - link address |
+ * - backup of registers s0..s7 |
+ * - end of input (Address of end of string) |
+ * - start of input (Address of first character in string) |
+ * - start index (character index of start) |
+ * --- frame pointer ---- |
+ * - void* input_string (location of a handle containing the string) |
+ * - Offset of location before start of input (effectively character |
+ * position -1). Used to initialize capture registers to a non-position. |
+ * - At start (if 1, we are starting at the start of the |
+ * string, otherwise 0) |
+ * - register 0 (Only positions must be stored in the first |
+ * - register 1 num_saved_registers_ registers) |
+ * - ... |
+ * - register num_registers-1 |
+ * --- sp --- |
+ * |
+ * The first num_saved_registers_ registers are initialized to point to |
+ * "character -1" in the string (i.e., char_size() bytes before the first |
+ * character of the string). The remaining registers start out as garbage. |
+ * |
+ * The data up to the return address must be placed there by the calling |
+ * code, by calling the code entry as cast to a function with the signature: |
+ * int (*match)(String* input_string, |
+ * int start_index, |
+ * Address start, |
+ * Address end, |
+ * int* capture_output_array, |
+ * bool at_start, |
+ * byte* stack_area_base, |
+ * bool direct_call) |
+ * The call is performed by NativeRegExpMacroAssembler::Execute() |
+ * (in regexp-macro-assembler.cc). |
+ */ |
+ |
+#define __ ACCESS_MASM(masm_) |
+ |
+RegExpMacroAssemblerMIPS::RegExpMacroAssemblerMIPS( |
+ Mode mode, |
+ int registers_to_save) |
+ : masm_(new MacroAssembler(NULL, kRegExpCodeSize)), |
+ mode_(mode), |
+ num_registers_(registers_to_save), |
+ num_saved_registers_(registers_to_save), |
+ entry_label_(), |
+ start_label_(), |
+ success_label_(), |
+ backtrack_label_(), |
+ exit_label_() { |
+ ASSERT_EQ(0, registers_to_save % 2); |
+ __ jmp(&entry_label_); // We'll write the entry code later. |
+ __ bind(&start_label_); // And then continue from here. |
+} |
+ |
+ |
+RegExpMacroAssemblerMIPS::~RegExpMacroAssemblerMIPS() { |
+ delete masm_; |
+ // Unuse labels in case we throw away the assembler without calling GetCode. |
+ entry_label_.Unuse(); |
+ start_label_.Unuse(); |
+ success_label_.Unuse(); |
+ backtrack_label_.Unuse(); |
+ exit_label_.Unuse(); |
+ check_preempt_label_.Unuse(); |
+ stack_overflow_label_.Unuse(); |
+} |
+ |
+ |
+int RegExpMacroAssemblerMIPS::stack_limit_slack() { |
+ return RegExpStack::kStackLimitSlack; |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::AdvanceCurrentPosition(int by) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::AdvanceRegister(int reg, int by) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::Backtrack() { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::Bind(Label* label) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckCharacter(uint32_t c, Label* on_equal) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckCharacterGT(uc16 limit, Label* on_greater) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckAtStart(Label* on_at_start) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckNotAtStart(Label* on_not_at_start) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckCharacterLT(uc16 limit, Label* on_less) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckCharacters(Vector<const uc16> str, |
+ int cp_offset, |
+ Label* on_failure, |
+ bool check_end_of_string) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckGreedyLoop(Label* on_equal) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckNotBackReferenceIgnoreCase( |
+ int start_reg, |
+ Label* on_no_match) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckNotBackReference( |
+ int start_reg, |
+ Label* on_no_match) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckNotRegistersEqual(int reg1, |
+ int reg2, |
+ Label* on_not_equal) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckNotCharacter(uint32_t c, |
+ Label* on_not_equal) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckCharacterAfterAnd(uint32_t c, |
+ uint32_t mask, |
+ Label* on_equal) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckNotCharacterAfterAnd(uint32_t c, |
+ uint32_t mask, |
+ Label* on_not_equal) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckNotCharacterAfterMinusAnd( |
+ uc16 c, |
+ uc16 minus, |
+ uc16 mask, |
+ Label* on_not_equal) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+bool RegExpMacroAssemblerMIPS::CheckSpecialCharacterClass(uc16 type, |
+ Label* on_no_match) { |
+ UNIMPLEMENTED_MIPS(); |
+ return false; |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::Fail() { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+Handle<Object> RegExpMacroAssemblerMIPS::GetCode(Handle<String> source) { |
+ UNIMPLEMENTED_MIPS(); |
+ return Handle<Object>::null(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::GoTo(Label* to) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::IfRegisterGE(int reg, |
+ int comparand, |
+ Label* if_ge) { |
+ __ lw(a0, register_location(reg)); |
+ BranchOrBacktrack(if_ge, ge, a0, Operand(comparand)); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::IfRegisterLT(int reg, |
+ int comparand, |
+ Label* if_lt) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::IfRegisterEqPos(int reg, |
+ Label* if_eq) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+RegExpMacroAssembler::IrregexpImplementation |
+ RegExpMacroAssemblerMIPS::Implementation() { |
+ return kMIPSImplementation; |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::LoadCurrentCharacter(int cp_offset, |
+ Label* on_end_of_input, |
+ bool check_bounds, |
+ int characters) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::PopCurrentPosition() { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::PopRegister(int register_index) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+ |
+void RegExpMacroAssemblerMIPS::PushBacktrack(Label* label) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::PushCurrentPosition() { |
+ Push(current_input_offset()); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::PushRegister(int register_index, |
+ StackCheckFlag check_stack_limit) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::ReadCurrentPositionFromRegister(int reg) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::ReadStackPointerFromRegister(int reg) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::SetCurrentPositionFromEnd(int by) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::SetRegister(int register_index, int to) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::Succeed() { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::WriteCurrentPositionToRegister(int reg, |
+ int cp_offset) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::ClearRegisters(int reg_from, int reg_to) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::WriteStackPointerToRegister(int reg) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+// Private methods: |
+ |
+void RegExpMacroAssemblerMIPS::CallCheckStackGuardState(Register scratch) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+// Helper function for reading a value out of a stack frame. |
+template <typename T> |
+static T& frame_entry(Address re_frame, int frame_offset) { |
+ return reinterpret_cast<T&>(Memory::int32_at(re_frame + frame_offset)); |
+} |
+ |
+ |
+int RegExpMacroAssemblerMIPS::CheckStackGuardState(Address* return_address, |
+ Code* re_code, |
+ Address re_frame) { |
+ UNIMPLEMENTED_MIPS(); |
+ return 0; |
+} |
+ |
+ |
+MemOperand RegExpMacroAssemblerMIPS::register_location(int register_index) { |
+ UNIMPLEMENTED_MIPS(); |
+ return MemOperand(zero_reg, 0); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckPosition(int cp_offset, |
+ Label* on_outside_input) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::BranchOrBacktrack(Label* to, |
+ Condition condition, |
+ Register rs, |
+ const Operand& rt) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::SafeCall(Label* to, Condition cond, Register rs, |
+ const Operand& rt) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::SafeReturn() { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::SafeCallTarget(Label* name) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::Push(Register source) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::Pop(Register target) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckPreemption() { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CheckStackLimit() { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::CallCFunctionUsingStub( |
+ ExternalReference function, |
+ int num_arguments) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerMIPS::LoadCurrentCharacterUnchecked(int cp_offset, |
+ int characters) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+void RegExpCEntryStub::Generate(MacroAssembler* masm_) { |
+ UNIMPLEMENTED_MIPS(); |
+} |
+ |
+ |
+#undef __ |
+ |
+#endif // V8_INTERPRETED_REGEXP |
+ |
+}} // namespace v8::internal |
+ |
+#endif // V8_TARGET_ARCH_MIPS |