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