13b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 23b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 33b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// found in the LICENSE file. 43b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 53b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#ifndef V8_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ 63b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define V8_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ 73b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 83b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/macro-assembler.h" 93b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/regexp/regexp-macro-assembler.h" 103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/s390/assembler-s390.h" 113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/s390/frames-s390.h" 123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace v8 { 143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace internal { 153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#ifndef V8_INTERPRETED_REGEXP 173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass RegExpMacroAssemblerS390 : public NativeRegExpMacroAssembler { 183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public: 193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch RegExpMacroAssemblerS390(Isolate* isolate, Zone* zone, Mode mode, 203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int registers_to_save); 213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual ~RegExpMacroAssemblerS390(); 223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual int stack_limit_slack(); 233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void AdvanceCurrentPosition(int by); 243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void AdvanceRegister(int reg, int by); 253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void Backtrack(); 263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void Bind(Label* label); 273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckAtStart(Label* on_at_start); 283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckCharacter(unsigned c, Label* on_equal); 293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckCharacterAfterAnd(unsigned c, unsigned mask, 303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label* on_equal); 313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckCharacterGT(uc16 limit, Label* on_greater); 323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckCharacterLT(uc16 limit, Label* on_less); 333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // A "greedy loop" is a loop that is both greedy and with a simple 343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // body. It has a particularly simple implementation. 353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckGreedyLoop(Label* on_tos_equals_current_position); 363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckNotAtStart(int cp_offset, Label* on_not_at_start); 373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckNotBackReference(int start_reg, bool read_backward, 383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label* on_no_match); 393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckNotBackReferenceIgnoreCase(int start_reg, 403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool read_backward, bool unicode, 413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label* on_no_match); 423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckNotCharacter(unsigned c, Label* on_not_equal); 433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckNotCharacterAfterAnd(unsigned c, unsigned mask, 443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label* on_not_equal); 453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckNotCharacterAfterMinusAnd(uc16 c, uc16 minus, uc16 mask, 463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label* on_not_equal); 473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckCharacterInRange(uc16 from, uc16 to, Label* on_in_range); 483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckCharacterNotInRange(uc16 from, uc16 to, 493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label* on_not_in_range); 503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckBitInTable(Handle<ByteArray> table, Label* on_bit_set); 513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Checks whether the given offset from the current position is before 533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // the end of the string. 543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void CheckPosition(int cp_offset, Label* on_outside_input); 553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual bool CheckSpecialCharacterClass(uc16 type, Label* on_no_match); 563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void Fail(); 573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual Handle<HeapObject> GetCode(Handle<String> source); 583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void GoTo(Label* label); 593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void IfRegisterGE(int reg, int comparand, Label* if_ge); 603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void IfRegisterLT(int reg, int comparand, Label* if_lt); 613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void IfRegisterEqPos(int reg, Label* if_eq); 623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual IrregexpImplementation Implementation(); 633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void LoadCurrentCharacter(int cp_offset, Label* on_end_of_input, 643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool check_bounds = true, 653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int characters = 1); 663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void PopCurrentPosition(); 673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void PopRegister(int register_index); 683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void PushBacktrack(Label* label); 693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void PushCurrentPosition(); 703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void PushRegister(int register_index, 713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StackCheckFlag check_stack_limit); 723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void ReadCurrentPositionFromRegister(int reg); 733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void ReadStackPointerFromRegister(int reg); 743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void SetCurrentPositionFromEnd(int by); 753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void SetRegister(int register_index, int to); 763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual bool Succeed(); 773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void WriteCurrentPositionToRegister(int reg, int cp_offset); 783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void ClearRegisters(int reg_from, int reg_to); 793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void WriteStackPointerToRegister(int reg); 803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Called from RegExp if the stack-guard is triggered. 823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // If the code object is relocated, the return address is fixed before 833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // returning. 843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static int CheckStackGuardState(Address* return_address, Code* re_code, 853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Address re_frame); 863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch private: 883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Offsets from frame_pointer() of function parameters and stored registers. 893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kFramePointer = 0; 903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Above the frame pointer - Stored registers and stack passed parameters. 923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Register 6-15(sp) 933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kStoredRegisters = kFramePointer; 943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kCallerFrame = 953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch kStoredRegisters + kCalleeRegisterSaveAreaSize; 963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Stack parameters placed by caller. 973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kCaptureArraySize = kCallerFrame; 983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kStackAreaBase = kCallerFrame + kPointerSize; 993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // kDirectCall again 1003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kSecondaryReturnAddress = kStackAreaBase + 2 * kPointerSize; 1013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kIsolate = kSecondaryReturnAddress + kPointerSize; 1023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Below the frame pointer. 1043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Register parameters stored by setup code. 1053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kDirectCall = kFramePointer - kPointerSize; 1063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kStackHighEnd = kDirectCall - kPointerSize; 1073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kNumOutputRegisters = kStackHighEnd - kPointerSize; 1083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kRegisterOutput = kNumOutputRegisters - kPointerSize; 1093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kInputEnd = kRegisterOutput - kPointerSize; 1103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kInputStart = kInputEnd - kPointerSize; 1113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kStartIndex = kInputStart - kPointerSize; 1123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kInputString = kStartIndex - kPointerSize; 1133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // When adding local variables remember to push space for them in 1143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // the frame in GetCode. 1153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kSuccessfulCaptures = kInputString - kPointerSize; 1163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kStringStartMinusOne = kSuccessfulCaptures - kPointerSize; 1173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // First register address. Following registers are below it on the stack. 1183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kRegisterZero = kStringStartMinusOne - kPointerSize; 1193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Initial size of code buffer. 1213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const size_t kRegExpCodeSize = 1024; 1223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Load a number of characters at the given offset from the 1243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // current position, into the current-character register. 1253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void LoadCurrentCharacterUnchecked(int cp_offset, int character_count); 1263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Check whether preemption has been requested. 1283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void CheckPreemption(); 1293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Check whether we are exceeding the stack limit on the backtrack stack. 1313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void CheckStackLimit(); 1323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void CallCFunctionUsingStub(ExternalReference function, int num_arguments); 1333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Generate a call to CheckStackGuardState. 1353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void CallCheckStackGuardState(Register scratch); 1363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // The ebp-relative location of a regexp register. 1383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MemOperand register_location(int register_index); 1393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Register holding the current input position as negative offset from 1413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // the end of the string. 1423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Register current_input_offset() { return r8; } 1433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // The register containing the current character after LoadCurrentCharacter. 1453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Register current_character() { return r9; } 1463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Register holding address of the end of the input string. 1483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Register end_of_input_address() { return r10; } 1493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Register holding the frame address. Local variables, parameters and 1513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // regexp registers are addressed relative to this. 1523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Register frame_pointer() { return fp; } 1533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // The register containing the backtrack stack top. Provides a meaningful 1553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // name to the register. 1563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Register backtrack_stackpointer() { return r13; } 1573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Register holding pointer to the current code object. 1593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Register code_pointer() { return r7; } 1603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Byte size of chars in the string to match (decided by the Mode argument) 1623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline int char_size() { return static_cast<int>(mode_); } 1633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Equivalent to a conditional branch to the label, unless the label 1653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // is NULL, in which case it is a conditional Backtrack. 1663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void BranchOrBacktrack(Condition condition, Label* to, CRegister cr = cr7); 1673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Call and return internally in the generated code in a way that 1693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // is GC-safe (i.e., doesn't leave absolute code addresses on the stack) 1703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void SafeCall(Label* to, Condition cond = al, CRegister cr = cr7); 1713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void SafeReturn(); 1723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void SafeCallTarget(Label* name); 1733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Pushes the value of a register on the backtrack stack. Decrements the 1753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // stack pointer by a word size and stores the register's value there. 1763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void Push(Register source); 1773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Pops a value from the backtrack stack. Reads the word at the stack pointer 1793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // and increments it by a word size. 1803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void Pop(Register target); 1813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate() const { return masm_->isolate(); } 1833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MacroAssembler* masm_; 1853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Which mode to generate code for (Latin1 or UC16). 1873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Mode mode_; 1883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // One greater than maximal register index actually used. 1903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int num_registers_; 1913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Number of registers to output at the end (the saved registers 1933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // are always 0..num_saved_registers_-1) 1943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int num_saved_registers_; 1953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Labels used internally. 1973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label entry_label_; 1983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label start_label_; 1993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label success_label_; 2003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label backtrack_label_; 2013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label exit_label_; 2023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label check_preempt_label_; 2033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label stack_overflow_label_; 2043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Label internal_failure_label_; 2053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}; 2063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Set of non-volatile registers saved/restored by generated regexp code. 2083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochconst RegList kRegExpCalleeSaved = 2093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1 << 6 | 1 << 7 | 1 << 8 | 1 << 9 | 1 << 10 | 1 << 11 | 1 << 13; 2103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif // V8_INTERPRETED_REGEXP 2123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} // namespace internal 2133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} // namespace v8 2143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif // V8_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ 216