1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved.
2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be
3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file.
4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_REGEXP_PPC_REGEXP_MACRO_ASSEMBLER_PPC_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_REGEXP_PPC_REGEXP_MACRO_ASSEMBLER_PPC_H_
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/macro-assembler.h"
9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/ppc/assembler-ppc.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ppc/frames-ppc.h"
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-macro-assembler.h"
12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace v8 {
14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace internal {
15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifndef V8_INTERPRETED_REGEXP
18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass RegExpMacroAssemblerPPC : public NativeRegExpMacroAssembler {
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RegExpMacroAssemblerPPC(Isolate* isolate, Zone* zone, Mode mode,
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          int registers_to_save);
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual ~RegExpMacroAssemblerPPC();
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual int stack_limit_slack();
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void AdvanceCurrentPosition(int by);
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void AdvanceRegister(int reg, int by);
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void Backtrack();
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void Bind(Label* label);
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckAtStart(Label* on_at_start);
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckCharacter(unsigned c, Label* on_equal);
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckCharacterAfterAnd(unsigned c, unsigned mask,
31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                      Label* on_equal);
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckCharacterGT(uc16 limit, Label* on_greater);
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckCharacterLT(uc16 limit, Label* on_less);
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // A "greedy loop" is a loop that is both greedy and with a simple
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // body. It has a particularly simple implementation.
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckGreedyLoop(Label* on_tos_equals_current_position);
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual void CheckNotAtStart(int cp_offset, Label* on_not_at_start);
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual void CheckNotBackReference(int start_reg, bool read_backward,
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Label* on_no_match);
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
41109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                               bool read_backward, bool unicode,
42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                               Label* on_no_match);
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckNotCharacter(unsigned c, Label* on_not_equal);
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckNotCharacterAfterAnd(unsigned c, unsigned mask,
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                         Label* on_not_equal);
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckNotCharacterAfterMinusAnd(uc16 c, uc16 minus, uc16 mask,
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                              Label* on_not_equal);
48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckCharacterInRange(uc16 from, uc16 to, Label* on_in_range);
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckCharacterNotInRange(uc16 from, uc16 to,
50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                        Label* on_not_in_range);
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckBitInTable(Handle<ByteArray> table, Label* on_bit_set);
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Checks whether the given offset from the current position is before
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // the end of the string.
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CheckPosition(int cp_offset, Label* on_outside_input);
56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual bool CheckSpecialCharacterClass(uc16 type, Label* on_no_match);
57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void Fail();
58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual Handle<HeapObject> GetCode(Handle<String> source);
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void GoTo(Label* label);
60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void IfRegisterGE(int reg, int comparand, Label* if_ge);
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void IfRegisterLT(int reg, int comparand, Label* if_lt);
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void IfRegisterEqPos(int reg, Label* if_eq);
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual IrregexpImplementation Implementation();
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void LoadCurrentCharacter(int cp_offset, Label* on_end_of_input,
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                    bool check_bounds = true,
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                    int characters = 1);
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void PopCurrentPosition();
68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void PopRegister(int register_index);
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void PushBacktrack(Label* label);
70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void PushCurrentPosition();
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void PushRegister(int register_index,
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                            StackCheckFlag check_stack_limit);
73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void ReadCurrentPositionFromRegister(int reg);
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void ReadStackPointerFromRegister(int reg);
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void SetCurrentPositionFromEnd(int by);
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void SetRegister(int register_index, int to);
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual bool Succeed();
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void WriteCurrentPositionToRegister(int reg, int cp_offset);
79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void ClearRegisters(int reg_from, int reg_to);
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void WriteStackPointerToRegister(int reg);
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Called from RegExp if the stack-guard is triggered.
83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // If the code object is relocated, the return address is fixed before
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // returning.
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static int CheckStackGuardState(Address* return_address, Code* re_code,
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                  Address re_frame);
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Offsets from frame_pointer() of function parameters and stored registers.
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kFramePointer = 0;
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Above the frame pointer - Stored registers and stack passed parameters.
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Register 25..31.
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kStoredRegisters = kFramePointer;
95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Return address (stored from link register, read into pc on return).
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kReturnAddress = kStoredRegisters + 7 * kPointerSize;
97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kCallerFrame = kReturnAddress + kPointerSize;
98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Stack parameters placed by caller.
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kSecondaryReturnAddress =
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      kCallerFrame + kStackFrameExtraParamSlot * kPointerSize;
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kIsolate = kSecondaryReturnAddress + kPointerSize;
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Below the frame pointer.
104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Register parameters stored by setup code.
105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kDirectCall = kFramePointer - kPointerSize;
106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kStackHighEnd = kDirectCall - kPointerSize;
107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kNumOutputRegisters = kStackHighEnd - kPointerSize;
108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kRegisterOutput = kNumOutputRegisters - kPointerSize;
109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kInputEnd = kRegisterOutput - kPointerSize;
110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kInputStart = kInputEnd - kPointerSize;
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kStartIndex = kInputStart - kPointerSize;
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kInputString = kStartIndex - kPointerSize;
113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // When adding local variables remember to push space for them in
114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // the frame in GetCode.
115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int kSuccessfulCaptures = kInputString - kPointerSize;
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kStringStartMinusOne = kSuccessfulCaptures - kPointerSize;
117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // First register address. Following registers are below it on the stack.
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kRegisterZero = kStringStartMinusOne - kPointerSize;
119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Initial size of code buffer.
121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const size_t kRegExpCodeSize = 1024;
122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Load a number of characters at the given offset from the
124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // current position, into the current-character register.
125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void LoadCurrentCharacterUnchecked(int cp_offset, int character_count);
126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Check whether preemption has been requested.
128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void CheckPreemption();
129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Check whether we are exceeding the stack limit on the backtrack stack.
131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void CheckStackLimit();
132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Generate a call to CheckStackGuardState.
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void CallCheckStackGuardState(Register scratch);
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // The ebp-relative location of a regexp register.
138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MemOperand register_location(int register_index);
139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Register holding the current input position as negative offset from
141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // the end of the string.
142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline Register current_input_offset() { return r27; }
143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // The register containing the current character after LoadCurrentCharacter.
145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline Register current_character() { return r28; }
146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Register holding address of the end of the input string.
148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline Register end_of_input_address() { return r30; }
149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Register holding the frame address. Local variables, parameters and
151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // regexp registers are addressed relative to this.
152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline Register frame_pointer() { return fp; }
153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // The register containing the backtrack stack top. Provides a meaningful
155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // name to the register.
156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline Register backtrack_stackpointer() { return r29; }
157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Register holding pointer to the current code object.
159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline Register code_pointer() { return r26; }
160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Byte size of chars in the string to match (decided by the Mode argument)
162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline int char_size() { return static_cast<int>(mode_); }
163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Equivalent to a conditional branch to the label, unless the label
165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // is NULL, in which case it is a conditional Backtrack.
166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void BranchOrBacktrack(Condition condition, Label* to, CRegister cr = cr7);
167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Call and return internally in the generated code in a way that
169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // is GC-safe (i.e., doesn't leave absolute code addresses on the stack)
170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline void SafeCall(Label* to, Condition cond = al, CRegister cr = cr7);
171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline void SafeReturn();
172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline void SafeCallTarget(Label* name);
173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Pushes the value of a register on the backtrack stack. Decrements the
175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // stack pointer by a word size and stores the register's value there.
176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline void Push(Register source);
177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Pops a value from the backtrack stack. Reads the word at the stack pointer
179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // and increments it by a word size.
180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline void Pop(Register target);
181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Isolate* isolate() const { return masm_->isolate(); }
183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MacroAssembler* masm_;
185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Which mode to generate code for (Latin1 or UC16).
187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Mode mode_;
188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // One greater than maximal register index actually used.
190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int num_registers_;
191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Number of registers to output at the end (the saved registers
193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // are always 0..num_saved_registers_-1)
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int num_saved_registers_;
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Labels used internally.
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label entry_label_;
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label start_label_;
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label success_label_;
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label backtrack_label_;
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label exit_label_;
202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label check_preempt_label_;
203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label stack_overflow_label_;
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label internal_failure_label_;
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Set of non-volatile registers saved/restored by generated regexp code.
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst RegList kRegExpCalleeSaved =
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    1 << 25 | 1 << 26 | 1 << 27 | 1 << 28 | 1 << 29 | 1 << 30 | 1 << 31;
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif  // V8_INTERPRETED_REGEXP
212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_REGEXP_PPC_REGEXP_MACRO_ASSEMBLER_PPC_H_
216