1c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
27516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// Redistribution and use in source and binary forms, with or without
37516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// modification, are permitted provided that the following conditions are
47516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// met:
57516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//
67516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//     * Redistributions of source code must retain the above copyright
77516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//       notice, this list of conditions and the following disclaimer.
87516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//     * Redistributions in binary form must reproduce the above
97516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//       copyright notice, this list of conditions and the following
107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//       disclaimer in the documentation and/or other materials provided
117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//       with the distribution.
127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//     * Neither the name of Google Inc. nor the names of its
137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//       contributors may be used to endorse or promote products derived
147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//       from this software without specific prior written permission.
157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org//
167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#ifndef V8_MIPS_REGEXP_MACRO_ASSEMBLER_MIPS_H_
307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#define V8_MIPS_REGEXP_MACRO_ASSEMBLER_MIPS_H_
317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
326db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org#include "mips/assembler-mips.h"
336db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org#include "mips/assembler-mips-inl.h"
346db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org#include "macro-assembler.h"
356db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org#include "code.h"
366db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org#include "mips/macro-assembler-mips.h"
376db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgnamespace v8 {
397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgnamespace internal {
407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
415a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org#ifndef V8_INTERPRETED_REGEXP
427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgclass RegExpMacroAssemblerMIPS: public NativeRegExpMacroAssembler {
437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org public:
447028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  RegExpMacroAssemblerMIPS(Mode mode, int registers_to_save, Zone* zone);
457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual ~RegExpMacroAssemblerMIPS();
467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual int stack_limit_slack();
477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void AdvanceCurrentPosition(int by);
487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void AdvanceRegister(int reg, int by);
497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void Backtrack();
507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void Bind(Label* label);
517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckAtStart(Label* on_at_start);
527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckCharacter(uint32_t c, Label* on_equal);
537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckCharacterAfterAnd(uint32_t c,
547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                      uint32_t mask,
557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                      Label* on_equal);
567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckCharacterGT(uc16 limit, Label* on_greater);
577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckCharacterLT(uc16 limit, Label* on_less);
587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // A "greedy loop" is a loop that is both greedy and with a simple
597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // body. It has a particularly simple implementation.
607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckGreedyLoop(Label* on_tos_equals_current_position);
617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckNotAtStart(Label* on_not_at_start);
627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckNotBackReference(int start_reg, Label* on_no_match);
637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                               Label* on_no_match);
657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckNotCharacter(uint32_t c, Label* on_not_equal);
667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckNotCharacterAfterAnd(uint32_t c,
677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                         uint32_t mask,
687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                         Label* on_not_equal);
697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckNotCharacterAfterMinusAnd(uc16 c,
707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                              uc16 minus,
717516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                              uc16 mask,
727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                              Label* on_not_equal);
731456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  virtual void CheckCharacterInRange(uc16 from,
741456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org                                     uc16 to,
751456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org                                     Label* on_in_range);
761456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  virtual void CheckCharacterNotInRange(uc16 from,
771456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org                                        uc16 to,
781456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org                                        Label* on_not_in_range);
791456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  virtual void CheckBitInTable(Handle<ByteArray> table, Label* on_bit_set);
801456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org
817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Checks whether the given offset from the current position is before
827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // the end of the string.
837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void CheckPosition(int cp_offset, Label* on_outside_input);
847516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual bool CheckSpecialCharacterClass(uc16 type,
857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                          Label* on_no_match);
867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void Fail();
8783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  virtual Handle<HeapObject> GetCode(Handle<String> source);
887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void GoTo(Label* label);
897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void IfRegisterGE(int reg, int comparand, Label* if_ge);
907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void IfRegisterLT(int reg, int comparand, Label* if_lt);
917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void IfRegisterEqPos(int reg, Label* if_eq);
927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual IrregexpImplementation Implementation();
937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void LoadCurrentCharacter(int cp_offset,
947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                    Label* on_end_of_input,
957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                    bool check_bounds = true,
967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                    int characters = 1);
977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void PopCurrentPosition();
987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void PopRegister(int register_index);
997516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void PushBacktrack(Label* label);
1007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void PushCurrentPosition();
1017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void PushRegister(int register_index,
1027516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            StackCheckFlag check_stack_limit);
1037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void ReadCurrentPositionFromRegister(int reg);
1047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void ReadStackPointerFromRegister(int reg);
1057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void SetCurrentPositionFromEnd(int by);
1067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void SetRegister(int register_index, int to);
107777db6f4249aa13ebf060a0d290d34936a41eb75jkummerow@chromium.org  virtual bool Succeed();
1087516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void WriteCurrentPositionToRegister(int reg, int cp_offset);
1097516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void ClearRegisters(int reg_from, int reg_to);
1107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void WriteStackPointerToRegister(int reg);
11189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  virtual bool CanReadUnaligned();
1127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Called from RegExp if the stack-guard is triggered.
1147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // If the code object is relocated, the return address is fixed before
1157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // returning.
1167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static int CheckStackGuardState(Address* return_address,
1177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                  Code* re_code,
1187516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                  Address re_frame);
11983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
1207516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org private:
1217516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Offsets from frame_pointer() of function parameters and stored registers.
1227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kFramePointer = 0;
1237516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1247516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Above the frame pointer - Stored registers and stack passed parameters.
1257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Registers s0 to s7, fp, and ra.
1267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kStoredRegisters = kFramePointer;
1277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Return address (stored from link register, read into pc on return).
1287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kReturnAddress = kStoredRegisters + 9 * kPointerSize;
129c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  static const int kSecondaryReturnAddress = kReturnAddress + kPointerSize;
1307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Stack frame header.
1317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kStackFrameHeader = kReturnAddress + kPointerSize;
1327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Stack parameters placed by caller.
133c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  static const int kRegisterOutput = kStackFrameHeader + 20;
134777db6f4249aa13ebf060a0d290d34936a41eb75jkummerow@chromium.org  static const int kNumOutputRegisters = kRegisterOutput + kPointerSize;
135777db6f4249aa13ebf060a0d290d34936a41eb75jkummerow@chromium.org  static const int kStackHighEnd = kNumOutputRegisters + kPointerSize;
1367516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kDirectCall = kStackHighEnd + kPointerSize;
1377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kIsolate = kDirectCall + kPointerSize;
1387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Below the frame pointer.
1407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Register parameters stored by setup code.
1417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kInputEnd = kFramePointer - kPointerSize;
1427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kInputStart = kInputEnd - kPointerSize;
1437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kStartIndex = kInputStart - kPointerSize;
1447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const int kInputString = kStartIndex - kPointerSize;
1457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // When adding local variables remember to push space for them in
1467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // the frame in GetCode.
147777db6f4249aa13ebf060a0d290d34936a41eb75jkummerow@chromium.org  static const int kSuccessfulCaptures = kInputString - kPointerSize;
148777db6f4249aa13ebf060a0d290d34936a41eb75jkummerow@chromium.org  static const int kInputStartMinusOne = kSuccessfulCaptures - kPointerSize;
1497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // First register address. Following registers are below it on the stack.
150777db6f4249aa13ebf060a0d290d34936a41eb75jkummerow@chromium.org  static const int kRegisterZero = kInputStartMinusOne - kPointerSize;
1517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Initial size of code buffer.
1537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  static const size_t kRegExpCodeSize = 1024;
1547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Load a number of characters at the given offset from the
1567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // current position, into the current-character register.
1577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  void LoadCurrentCharacterUnchecked(int cp_offset, int character_count);
1587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Check whether preemption has been requested.
1607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  void CheckPreemption();
1617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Check whether we are exceeding the stack limit on the backtrack stack.
1637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  void CheckStackLimit();
1647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Generate a call to CheckStackGuardState.
1677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  void CallCheckStackGuardState(Register scratch);
1687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // The ebp-relative location of a regexp register.
1707516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  MemOperand register_location(int register_index);
1717516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Register holding the current input position as negative offset from
1737516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // the end of the string.
1747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline Register current_input_offset() { return t2; }
1757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // The register containing the current character after LoadCurrentCharacter.
1777516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline Register current_character() { return t3; }
1787516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Register holding address of the end of the input string.
1807516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline Register end_of_input_address() { return t6; }
1817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Register holding the frame address. Local variables, parameters and
1837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // regexp registers are addressed relative to this.
1847516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline Register frame_pointer() { return fp; }
1857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // The register containing the backtrack stack top. Provides a meaningful
1877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // name to the register.
1887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline Register backtrack_stackpointer() { return t4; }
1897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Register holding pointer to the current code object.
1917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline Register code_pointer() { return t1; }
1927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
193c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  // Byte size of chars in the string to match (decided by the Mode argument).
1947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline int char_size() { return static_cast<int>(mode_); }
1957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Equivalent to a conditional branch to the label, unless the label
1977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // is NULL, in which case it is a conditional Backtrack.
1987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  void BranchOrBacktrack(Label* to,
1997516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                         Condition condition,
2007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                         Register rs,
2017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                         const Operand& rt);
2027516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Call and return internally in the generated code in a way that
2047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // is GC-safe (i.e., doesn't leave absolute code addresses on the stack)
2057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline void SafeCall(Label* to,
2067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                       Condition cond,
2077516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                       Register rs,
2087516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                       const Operand& rt);
2097516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline void SafeReturn();
2107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline void SafeCallTarget(Label* name);
2117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Pushes the value of a register on the backtrack stack. Decrements the
2137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // stack pointer by a word size and stores the register's value there.
2147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline void Push(Register source);
2157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Pops a value from the backtrack stack. Reads the word at the stack pointer
2177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // and increments it by a word size.
2187516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline void Pop(Register target);
2197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2207516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Calls a C function and cleans up the frame alignment done by
2217516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // by FrameAlign. The called function *is* allowed to trigger a garbage
2227516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // collection, but may not take more than four arguments (no arguments
2237516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // passed on the stack), and the first argument will be a pointer to the
2247516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // return address.
2257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  inline void CallCFunctionUsingStub(ExternalReference function,
2267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                     int num_arguments);
2277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
22832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  Isolate* isolate() const { return masm_->isolate(); }
2297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  MacroAssembler* masm_;
2317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Which mode to generate code for (ASCII or UC16).
2337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Mode mode_;
2347516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2357516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // One greater than maximal register index actually used.
2367516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  int num_registers_;
2377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Number of registers to output at the end (the saved registers
239c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  // are always 0..num_saved_registers_-1).
2407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  int num_saved_registers_;
2417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Labels used internally.
2437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label entry_label_;
2447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label start_label_;
2457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label success_label_;
2467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label backtrack_label_;
2477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label exit_label_;
2487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label check_preempt_label_;
2497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  Label stack_overflow_label_;
250c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  Label internal_failure_label_;
2517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org};
2527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#endif  // V8_INTERPRETED_REGEXP
2547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}}  // namespace v8::internal
2577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#endif  // V8_MIPS_REGEXP_MACRO_ASSEMBLER_MIPS_H_
259