1257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Redistribution and use in source and binary forms, with or without
344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// modification, are permitted provided that the following conditions are
444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// met:
544f0eee88ff00398ff7f715fab053374d808c90dSteve Block//
644f0eee88ff00398ff7f715fab053374d808c90dSteve Block//     * Redistributions of source code must retain the above copyright
744f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       notice, this list of conditions and the following disclaimer.
844f0eee88ff00398ff7f715fab053374d808c90dSteve Block//     * Redistributions in binary form must reproduce the above
944f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       copyright notice, this list of conditions and the following
1044f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       disclaimer in the documentation and/or other materials provided
1144f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       with the distribution.
1244f0eee88ff00398ff7f715fab053374d808c90dSteve Block//     * Neither the name of Google Inc. nor the names of its
1344f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       contributors may be used to endorse or promote products derived
1444f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       from this software without specific prior written permission.
1544f0eee88ff00398ff7f715fab053374d808c90dSteve Block//
1644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifndef V8_MIPS_REGEXP_MACRO_ASSEMBLER_MIPS_H_
3044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define V8_MIPS_REGEXP_MACRO_ASSEMBLER_MIPS_H_
3144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "mips/assembler-mips.h"
333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "mips/assembler-mips-inl.h"
343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "macro-assembler.h"
353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "code.h"
363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "mips/macro-assembler-mips.h"
373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3844f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 {
3944f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal {
4044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef V8_INTERPRETED_REGEXP
4244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RegExpMacroAssemblerMIPS: public RegExpMacroAssembler {
4344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
4444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpMacroAssemblerMIPS();
4544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual ~RegExpMacroAssemblerMIPS();
4644f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
4744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else  // V8_INTERPRETED_REGEXP
4844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RegExpMacroAssemblerMIPS: public NativeRegExpMacroAssembler {
4944f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
5044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpMacroAssemblerMIPS(Mode mode, int registers_to_save);
5144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual ~RegExpMacroAssemblerMIPS();
5244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual int stack_limit_slack();
5344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void AdvanceCurrentPosition(int by);
5444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void AdvanceRegister(int reg, int by);
5544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void Backtrack();
5644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void Bind(Label* label);
5744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckAtStart(Label* on_at_start);
5844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckCharacter(uint32_t c, Label* on_equal);
5944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckCharacterAfterAnd(uint32_t c,
6044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                      uint32_t mask,
6144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                      Label* on_equal);
6244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckCharacterGT(uc16 limit, Label* on_greater);
6344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckCharacterLT(uc16 limit, Label* on_less);
6444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckCharacters(Vector<const uc16> str,
6544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                               int cp_offset,
6644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                               Label* on_failure,
6744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                               bool check_end_of_string);
6844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A "greedy loop" is a loop that is both greedy and with a simple
6944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // body. It has a particularly simple implementation.
7044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckGreedyLoop(Label* on_tos_equals_current_position);
7144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckNotAtStart(Label* on_not_at_start);
7244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckNotBackReference(int start_reg, Label* on_no_match);
7344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
7444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                               Label* on_no_match);
7544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckNotRegistersEqual(int reg1, int reg2, Label* on_not_equal);
7644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckNotCharacter(uint32_t c, Label* on_not_equal);
7744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckNotCharacterAfterAnd(uint32_t c,
7844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                         uint32_t mask,
7944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                         Label* on_not_equal);
8044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckNotCharacterAfterMinusAnd(uc16 c,
8144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                              uc16 minus,
8244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                              uc16 mask,
8344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                              Label* on_not_equal);
8444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Checks whether the given offset from the current position is before
8544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the end of the string.
8644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void CheckPosition(int cp_offset, Label* on_outside_input);
8744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool CheckSpecialCharacterClass(uc16 type,
8844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                          Label* on_no_match);
8944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void Fail();
90053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block  virtual Handle<HeapObject> GetCode(Handle<String> source);
9144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void GoTo(Label* label);
9244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void IfRegisterGE(int reg, int comparand, Label* if_ge);
9344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void IfRegisterLT(int reg, int comparand, Label* if_lt);
9444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void IfRegisterEqPos(int reg, Label* if_eq);
9544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual IrregexpImplementation Implementation();
9644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void LoadCurrentCharacter(int cp_offset,
9744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                    Label* on_end_of_input,
9844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                    bool check_bounds = true,
9944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                    int characters = 1);
10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void PopCurrentPosition();
10144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void PopRegister(int register_index);
10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void PushBacktrack(Label* label);
10344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void PushCurrentPosition();
10444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void PushRegister(int register_index,
10544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                            StackCheckFlag check_stack_limit);
10644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void ReadCurrentPositionFromRegister(int reg);
10744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void ReadStackPointerFromRegister(int reg);
10844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void SetCurrentPositionFromEnd(int by);
10944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void SetRegister(int register_index, int to);
11044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void Succeed();
11144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void WriteCurrentPositionToRegister(int reg, int cp_offset);
11244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void ClearRegisters(int reg_from, int reg_to);
11344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void WriteStackPointerToRegister(int reg);
11444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
11544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Called from RegExp if the stack-guard is triggered.
11644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // If the code object is relocated, the return address is fixed before
11744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // returning.
11844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static int CheckStackGuardState(Address* return_address,
11944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                  Code* re_code,
12044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                  Address re_frame);
121589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
12244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
12344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Offsets from frame_pointer() of function parameters and stored registers.
12444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kFramePointer = 0;
12544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
12644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Above the frame pointer - Stored registers and stack passed parameters.
12744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Registers s0 to s7, fp, and ra.
12844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kStoredRegisters = kFramePointer;
12944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Return address (stored from link register, read into pc on return).
13044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kReturnAddress = kStoredRegisters + 9 * kPointerSize;
131257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const int kSecondaryReturnAddress = kReturnAddress + kPointerSize;
13244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Stack frame header.
13344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kStackFrameHeader = kReturnAddress + kPointerSize;
13444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Stack parameters placed by caller.
135257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const int kRegisterOutput = kStackFrameHeader + 20;
13644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kStackHighEnd = kRegisterOutput + kPointerSize;
13744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kDirectCall = kStackHighEnd + kPointerSize;
13844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kIsolate = kDirectCall + kPointerSize;
13944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
14044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Below the frame pointer.
14144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Register parameters stored by setup code.
14244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kInputEnd = kFramePointer - kPointerSize;
14344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kInputStart = kInputEnd - kPointerSize;
14444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kStartIndex = kInputStart - kPointerSize;
14544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kInputString = kStartIndex - kPointerSize;
14644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // When adding local variables remember to push space for them in
14744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the frame in GetCode.
14844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kInputStartMinusOne = kInputString - kPointerSize;
14944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kAtStart = kInputStartMinusOne - kPointerSize;
15044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // First register address. Following registers are below it on the stack.
15144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kRegisterZero = kAtStart - kPointerSize;
15244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
15344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Initial size of code buffer.
15444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const size_t kRegExpCodeSize = 1024;
15544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
15644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Load a number of characters at the given offset from the
15744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // current position, into the current-character register.
15844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void LoadCurrentCharacterUnchecked(int cp_offset, int character_count);
15944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
16044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Check whether preemption has been requested.
16144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CheckPreemption();
16244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
16344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Check whether we are exceeding the stack limit on the backtrack stack.
16444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CheckStackLimit();
16544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
16644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
16744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Generate a call to CheckStackGuardState.
16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void CallCheckStackGuardState(Register scratch);
16944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
17044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The ebp-relative location of a regexp register.
17144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MemOperand register_location(int register_index);
17244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
17344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Register holding the current input position as negative offset from
17444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the end of the string.
17544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Register current_input_offset() { return t2; }
17644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
17744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The register containing the current character after LoadCurrentCharacter.
17844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Register current_character() { return t3; }
17944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
18044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Register holding address of the end of the input string.
18144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Register end_of_input_address() { return t6; }
18244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
18344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Register holding the frame address. Local variables, parameters and
18444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // regexp registers are addressed relative to this.
18544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Register frame_pointer() { return fp; }
18644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
18744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The register containing the backtrack stack top. Provides a meaningful
18844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // name to the register.
18944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Register backtrack_stackpointer() { return t4; }
19044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
19144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Register holding pointer to the current code object.
19244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Register code_pointer() { return t1; }
19344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
194257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Byte size of chars in the string to match (decided by the Mode argument).
19544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline int char_size() { return static_cast<int>(mode_); }
19644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
19744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Equivalent to a conditional branch to the label, unless the label
19844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // is NULL, in which case it is a conditional Backtrack.
19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void BranchOrBacktrack(Label* to,
20044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         Condition condition,
20144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         Register rs,
20244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         const Operand& rt);
20344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
20444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Call and return internally in the generated code in a way that
20544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // is GC-safe (i.e., doesn't leave absolute code addresses on the stack)
20644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void SafeCall(Label* to,
20744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       Condition cond,
20844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       Register rs,
20944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       const Operand& rt);
21044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void SafeReturn();
21144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void SafeCallTarget(Label* name);
21244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
21344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Pushes the value of a register on the backtrack stack. Decrements the
21444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // stack pointer by a word size and stores the register's value there.
21544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void Push(Register source);
21644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
21744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Pops a value from the backtrack stack. Reads the word at the stack pointer
21844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // and increments it by a word size.
21944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void Pop(Register target);
22044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
22144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Calls a C function and cleans up the frame alignment done by
22244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // by FrameAlign. The called function *is* allowed to trigger a garbage
22344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // collection, but may not take more than four arguments (no arguments
22444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // passed on the stack), and the first argument will be a pointer to the
22544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // return address.
22644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void CallCFunctionUsingStub(ExternalReference function,
22744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     int num_arguments);
22844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
22944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
23044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MacroAssembler* masm_;
23144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
23244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Which mode to generate code for (ASCII or UC16).
23344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Mode mode_;
23444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
23544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // One greater than maximal register index actually used.
23644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int num_registers_;
23744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
23844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Number of registers to output at the end (the saved registers
239257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // are always 0..num_saved_registers_-1).
24044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int num_saved_registers_;
24144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
24244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Labels used internally.
24344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Label entry_label_;
24444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Label start_label_;
24544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Label success_label_;
24644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Label backtrack_label_;
24744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Label exit_label_;
24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Label check_preempt_label_;
24944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Label stack_overflow_label_;
250257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Label internal_failure_label_;
25144f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
25244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif  // V8_INTERPRETED_REGEXP
25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25644f0eee88ff00398ff7f715fab053374d808c90dSteve Block}}  // namespace v8::internal
25744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif  // V8_MIPS_REGEXP_MACRO_ASSEMBLER_MIPS_H_
259