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