115613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 45ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 5911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#ifndef V8_X64_REGEXP_MACRO_ASSEMBLER_X64_H_ 6911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#define V8_X64_REGEXP_MACRO_ASSEMBLER_X64_H_ 7911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h" 94b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/x64/assembler-x64-inl.h" 104b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/x64/assembler-x64.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/x64/macro-assembler-x64.h" 126db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 13911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgnamespace v8 { 14911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgnamespace internal { 15911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 16c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#ifndef V8_INTERPRETED_REGEXP 1718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 18911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgclass RegExpMacroAssemblerX64: public NativeRegExpMacroAssembler { 19911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org public: 207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org RegExpMacroAssemblerX64(Mode mode, int registers_to_save, Zone* zone); 21911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual ~RegExpMacroAssemblerX64(); 22911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual int stack_limit_slack(); 23911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void AdvanceCurrentPosition(int by); 24911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void AdvanceRegister(int reg, int by); 25911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void Backtrack(); 26911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void Bind(Label* label); 27911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckAtStart(Label* on_at_start); 28911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckCharacter(uint32_t c, Label* on_equal); 29911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckCharacterAfterAnd(uint32_t c, 30911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org uint32_t mask, 31911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label* on_equal); 32911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckCharacterGT(uc16 limit, Label* on_greater); 33911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckCharacterLT(uc16 limit, Label* on_less); 34911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // A "greedy loop" is a loop that is both greedy and with a simple 35911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // body. It has a particularly simple implementation. 36911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckGreedyLoop(Label* on_tos_equals_current_position); 37911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckNotAtStart(Label* on_not_at_start); 38911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckNotBackReference(int start_reg, Label* on_no_match); 39911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckNotBackReferenceIgnoreCase(int start_reg, 40911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label* on_no_match); 41911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckNotCharacter(uint32_t c, Label* on_not_equal); 42911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckNotCharacterAfterAnd(uint32_t c, 43911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org uint32_t mask, 44911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label* on_not_equal); 45911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckNotCharacterAfterMinusAnd(uc16 c, 46911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org uc16 minus, 47911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org uc16 mask, 48911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label* on_not_equal); 491456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org virtual void CheckCharacterInRange(uc16 from, 501456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uc16 to, 511456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Label* on_in_range); 521456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org virtual void CheckCharacterNotInRange(uc16 from, 531456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uc16 to, 541456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Label* on_not_in_range); 551456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org virtual void CheckBitInTable(Handle<ByteArray> table, Label* on_bit_set); 561456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 57911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Checks whether the given offset from the current position is before 58911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // the end of the string. 59911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void CheckPosition(int cp_offset, Label* on_outside_input); 60911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual bool CheckSpecialCharacterClass(uc16 type, 61911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label* on_no_match); 62911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void Fail(); 6383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org virtual Handle<HeapObject> GetCode(Handle<String> source); 64911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void GoTo(Label* label); 65911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void IfRegisterGE(int reg, int comparand, Label* if_ge); 66911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void IfRegisterLT(int reg, int comparand, Label* if_lt); 67911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void IfRegisterEqPos(int reg, Label* if_eq); 68911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual IrregexpImplementation Implementation(); 69911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void LoadCurrentCharacter(int cp_offset, 70911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label* on_end_of_input, 71911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org bool check_bounds = true, 72911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int characters = 1); 73911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void PopCurrentPosition(); 74911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void PopRegister(int register_index); 75911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void PushBacktrack(Label* label); 76911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void PushCurrentPosition(); 77911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void PushRegister(int register_index, 78911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org StackCheckFlag check_stack_limit); 79911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void ReadCurrentPositionFromRegister(int reg); 80911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void ReadStackPointerFromRegister(int reg); 814a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org virtual void SetCurrentPositionFromEnd(int by); 82911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void SetRegister(int register_index, int to); 8315613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org virtual bool Succeed(); 84911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void WriteCurrentPositionToRegister(int reg, int cp_offset); 85911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void ClearRegisters(int reg_from, int reg_to); 86911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org virtual void WriteStackPointerToRegister(int reg); 87911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 88911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org static Result Match(Handle<Code> regexp, 89911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Handle<String> subject, 90911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int* offsets_vector, 91911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int offsets_vector_length, 92ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int previous_index, 93ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* isolate); 94911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 95911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org static Result Execute(Code* code, 96911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org String* input, 97911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int start_offset, 98911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const byte* input_start, 99911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const byte* input_end, 100911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int* output, 101911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org bool at_start); 102911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 10318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org // Called from RegExp if the stack-guard is triggered. 10418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org // If the code object is relocated, the return address is fixed before 10518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org // returning. 10618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org static int CheckStackGuardState(Address* return_address, 10718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org Code* re_code, 10818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org Address re_frame); 10918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 110911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org private: 111911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Offsets from rbp of function parameters and stored registers. 112911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org static const int kFramePointer = 0; 113911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Above the frame pointer - function parameters and return address. 1142f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kReturn_eip = kFramePointer + kRegisterSize; 1152f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kFrameAlign = kReturn_eip + kRegisterSize; 116911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 117a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org#ifdef _WIN64 118911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Parameters (first four passed as registers, but with room on stack). 119911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // In Microsoft 64-bit Calling Convention, there is room on the callers 120911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // stack (before the return address) to spill parameter registers. We 121911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // use this space to store the register passed parameters. 122911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org static const int kInputString = kFrameAlign; 123a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // StartIndex is passed as 32 bit int. 1242f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kStartIndex = kInputString + kRegisterSize; 1252f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kInputStart = kStartIndex + kRegisterSize; 1262f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kInputEnd = kInputStart + kRegisterSize; 1272f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kRegisterOutput = kInputEnd + kRegisterSize; 12815613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org // For the case of global regular expression, we have room to store at least 12915613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org // one set of capture results. For the case of non-global regexp, we ignore 13015613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org // this value. NumOutputRegisters is passed as 32-bit value. The upper 13115613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org // 32 bit of this 64-bit stack slot may contain garbage. 1322f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kNumOutputRegisters = kRegisterOutput + kRegisterSize; 1332f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kStackHighEnd = kNumOutputRegisters + kRegisterSize; 1340c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // DirectCall is passed as 32 bit int (values 0 or 1). 1352f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kDirectCall = kStackHighEnd + kRegisterSize; 1362f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kIsolate = kDirectCall + kRegisterSize; 137911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#else 138911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // In AMD64 ABI Calling Convention, the first six integer parameters 139911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // are passed as registers, and caller must allocate space on the stack 140911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // if it wants them stored. We push the parameters after the frame pointer. 1412f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kInputString = kFramePointer - kRegisterSize; 1422f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kStartIndex = kInputString - kRegisterSize; 1432f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kInputStart = kStartIndex - kRegisterSize; 1442f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kInputEnd = kInputStart - kRegisterSize; 1452f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kRegisterOutput = kInputEnd - kRegisterSize; 1462f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org 14715613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org // For the case of global regular expression, we have room to store at least 14815613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org // one set of capture results. For the case of non-global regexp, we ignore 14915613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org // this value. 1502f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kNumOutputRegisters = kRegisterOutput - kRegisterSize; 15115613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org static const int kStackHighEnd = kFrameAlign; 1522f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kDirectCall = kStackHighEnd + kRegisterSize; 1532f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kIsolate = kDirectCall + kRegisterSize; 154911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#endif 155911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 156a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org#ifdef _WIN64 157911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Microsoft calling convention has three callee-saved registers 158911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // (that we are using). We push these after the frame pointer. 1592f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kBackup_rsi = kFramePointer - kRegisterSize; 1602f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kBackup_rdi = kBackup_rsi - kRegisterSize; 1612f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kBackup_rbx = kBackup_rdi - kRegisterSize; 162911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org static const int kLastCalleeSaveRegister = kBackup_rbx; 163911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#else 164911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // AMD64 Calling Convention has only one callee-save register that 165911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // we use. We push this after the frame pointer (and after the 166911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // parameters). 1672f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org static const int kBackup_rbx = kNumOutputRegisters - kRegisterSize; 168911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org static const int kLastCalleeSaveRegister = kBackup_rbx; 169911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#endif 170911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 17115613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org static const int kSuccessfulCaptures = kLastCalleeSaveRegister - kPointerSize; 172911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // When adding local variables remember to push space for them in 173911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // the frame in GetCode. 17415613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org static const int kInputStartMinusOne = kSuccessfulCaptures - kPointerSize; 175911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 176911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // First register address. Following registers are below it on the stack. 177dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org static const int kRegisterZero = kInputStartMinusOne - kPointerSize; 178911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 179911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Initial size of code buffer. 180911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org static const size_t kRegExpCodeSize = 1024; 181911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 182911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Load a number of characters at the given offset from the 183911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // current position, into the current-character register. 184911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org void LoadCurrentCharacterUnchecked(int cp_offset, int character_count); 185911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 186911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Check whether preemption has been requested. 187911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org void CheckPreemption(); 188911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 189911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Check whether we are exceeding the stack limit on the backtrack stack. 190911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org void CheckStackLimit(); 191911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 192911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Generate a call to CheckStackGuardState. 193911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org void CallCheckStackGuardState(); 194911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 195911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // The rbp-relative location of a regexp register. 196911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Operand register_location(int register_index); 197911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 198911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // The register containing the current character after LoadCurrentCharacter. 199911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline Register current_character() { return rdx; } 200911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 201911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // The register containing the backtrack stack top. Provides a meaningful 202911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // name to the register. 203911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline Register backtrack_stackpointer() { return rcx; } 204911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 205911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // The registers containing a self pointer to this code's Code object. 206911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline Register code_object_pointer() { return r8; } 207911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 208911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Byte size of chars in the string to match (decided by the Mode argument) 209911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline int char_size() { return static_cast<int>(mode_); } 210911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 211911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Equivalent to a conditional branch to the label, unless the label 212911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // is NULL, in which case it is a conditional Backtrack. 213911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org void BranchOrBacktrack(Condition condition, Label* to); 214911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 215911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org void MarkPositionForCodeRelativeFixup() { 2167028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org code_relative_fixup_positions_.Add(masm_.pc_offset(), zone()); 217911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 218911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 219911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org void FixupCodeRelativePositions(); 220911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 221911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Call and return internally in the generated code in a way that 222911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // is GC-safe (i.e., doesn't leave absolute code addresses on the stack) 223911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void SafeCall(Label* to); 224911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void SafeCallTarget(Label* label); 225911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void SafeReturn(); 226911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 227911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Pushes the value of a register on the backtrack stack. Decrements the 228911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // stack pointer (rcx) by a word size and stores the register's value there. 229911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void Push(Register source); 230911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 231911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Pushes a value on the backtrack stack. Decrements the stack pointer (rcx) 232911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // by a word size and stores the value there. 233911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void Push(Immediate value); 234911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 235911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Pushes the Code object relative offset of a label on the backtrack stack 236911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // (i.e., a backtrack target). Decrements the stack pointer (rcx) 237911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // by a word size and stores the value there. 238911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void Push(Label* label); 239911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 240911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Pops a value from the backtrack stack. Reads the word at the stack pointer 241911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // (rcx) and increments it by a word size. 242911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void Pop(Register target); 243911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 244911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Drops the top value from the backtrack stack without reading it. 245911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Increments the stack pointer (rcx) by a word size. 246911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org inline void Drop(); 247911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 2484edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org inline void ReadPositionFromRegister(Register dst, int reg); 2494edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org 25032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Isolate* isolate() const { return masm_.isolate(); } 25132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 2527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org MacroAssembler masm_; 253ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MacroAssembler::NoRootArrayScope no_root_array_scope_; 254911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 255911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ZoneList<int> code_relative_fixup_positions_; 256911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 2572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Which mode to generate code for (LATIN1 or UC16). 258911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Mode mode_; 259911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 260911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // One greater than maximal register index actually used. 261911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int num_registers_; 262911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 263911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Number of registers to output at the end (the saved registers 264911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // are always 0..num_saved_registers_-1) 265911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int num_saved_registers_; 266911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 267911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Labels used internally. 268911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label entry_label_; 269911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label start_label_; 270911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label success_label_; 271911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label backtrack_label_; 272911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label exit_label_; 273911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label check_preempt_label_; 274911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Label stack_overflow_label_; 275911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org}; 276911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 277c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#endif // V8_INTERPRETED_REGEXP 27818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 279911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org}} // namespace v8::internal 280911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 281911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#endif // V8_X64_REGEXP_MACRO_ASSEMBLER_X64_H_ 282