| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_REGEXP_PPC_REGEXP_MACRO_ASSEMBLER_PPC_H_ | 5 #ifndef V8_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ |
| 6 #define V8_REGEXP_PPC_REGEXP_MACRO_ASSEMBLER_PPC_H_ | 6 #define V8_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ |
| 7 | 7 |
| 8 #include "src/macro-assembler.h" | 8 #include "src/macro-assembler.h" |
| 9 #include "src/ppc/assembler-ppc.h" | |
| 10 #include "src/ppc/frames-ppc.h" | |
| 11 #include "src/regexp/regexp-macro-assembler.h" | 9 #include "src/regexp/regexp-macro-assembler.h" |
| 10 #include "src/s390/assembler-s390.h" |
| 11 #include "src/s390/frames-s390.h" |
| 12 | 12 |
| 13 namespace v8 { | 13 namespace v8 { |
| 14 namespace internal { | 14 namespace internal { |
| 15 | 15 |
| 16 | |
| 17 #ifndef V8_INTERPRETED_REGEXP | 16 #ifndef V8_INTERPRETED_REGEXP |
| 18 class RegExpMacroAssemblerPPC : public NativeRegExpMacroAssembler { | 17 class RegExpMacroAssemblerS390 : public NativeRegExpMacroAssembler { |
| 19 public: | 18 public: |
| 20 RegExpMacroAssemblerPPC(Isolate* isolate, Zone* zone, Mode mode, | 19 RegExpMacroAssemblerS390(Isolate* isolate, Zone* zone, Mode mode, |
| 21 int registers_to_save); | 20 int registers_to_save); |
| 22 virtual ~RegExpMacroAssemblerPPC(); | 21 virtual ~RegExpMacroAssemblerS390(); |
| 23 virtual int stack_limit_slack(); | 22 virtual int stack_limit_slack(); |
| 24 virtual void AdvanceCurrentPosition(int by); | 23 virtual void AdvanceCurrentPosition(int by); |
| 25 virtual void AdvanceRegister(int reg, int by); | 24 virtual void AdvanceRegister(int reg, int by); |
| 26 virtual void Backtrack(); | 25 virtual void Backtrack(); |
| 27 virtual void Bind(Label* label); | 26 virtual void Bind(Label* label); |
| 28 virtual void CheckAtStart(Label* on_at_start); | 27 virtual void CheckAtStart(Label* on_at_start); |
| 29 virtual void CheckCharacter(unsigned c, Label* on_equal); | 28 virtual void CheckCharacter(unsigned c, Label* on_equal); |
| 30 virtual void CheckCharacterAfterAnd(unsigned c, unsigned mask, | 29 virtual void CheckCharacterAfterAnd(unsigned c, unsigned mask, |
| 31 Label* on_equal); | 30 Label* on_equal); |
| 32 virtual void CheckCharacterGT(uc16 limit, Label* on_greater); | 31 virtual void CheckCharacterGT(uc16 limit, Label* on_greater); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // If the code object is relocated, the return address is fixed before | 83 // If the code object is relocated, the return address is fixed before |
| 85 // returning. | 84 // returning. |
| 86 static int CheckStackGuardState(Address* return_address, Code* re_code, | 85 static int CheckStackGuardState(Address* return_address, Code* re_code, |
| 87 Address re_frame); | 86 Address re_frame); |
| 88 | 87 |
| 89 private: | 88 private: |
| 90 // Offsets from frame_pointer() of function parameters and stored registers. | 89 // Offsets from frame_pointer() of function parameters and stored registers. |
| 91 static const int kFramePointer = 0; | 90 static const int kFramePointer = 0; |
| 92 | 91 |
| 93 // Above the frame pointer - Stored registers and stack passed parameters. | 92 // Above the frame pointer - Stored registers and stack passed parameters. |
| 94 // Register 25..31. | 93 // Register 6-15(sp) |
| 95 static const int kStoredRegisters = kFramePointer; | 94 static const int kStoredRegisters = kFramePointer; |
| 96 // Return address (stored from link register, read into pc on return). | 95 static const int kCallerFrame = |
| 97 static const int kReturnAddress = kStoredRegisters + 7 * kPointerSize; | 96 kStoredRegisters + kCalleeRegisterSaveAreaSize; |
| 98 static const int kCallerFrame = kReturnAddress + kPointerSize; | |
| 99 // Stack parameters placed by caller. | 97 // Stack parameters placed by caller. |
| 100 static const int kSecondaryReturnAddress = | 98 static const int kCaptureArraySize = kCallerFrame; |
| 101 kCallerFrame + kStackFrameExtraParamSlot * kPointerSize; | 99 static const int kStackAreaBase = kCallerFrame + kPointerSize; |
| 100 // kDirectCall again |
| 101 static const int kSecondaryReturnAddress = kStackAreaBase + 2 * kPointerSize; |
| 102 static const int kIsolate = kSecondaryReturnAddress + kPointerSize; | 102 static const int kIsolate = kSecondaryReturnAddress + kPointerSize; |
| 103 | 103 |
| 104 // Below the frame pointer. | 104 // Below the frame pointer. |
| 105 // Register parameters stored by setup code. | 105 // Register parameters stored by setup code. |
| 106 static const int kDirectCall = kFramePointer - kPointerSize; | 106 static const int kDirectCall = kFramePointer - kPointerSize; |
| 107 static const int kStackHighEnd = kDirectCall - kPointerSize; | 107 static const int kStackHighEnd = kDirectCall - kPointerSize; |
| 108 static const int kNumOutputRegisters = kStackHighEnd - kPointerSize; | 108 static const int kNumOutputRegisters = kStackHighEnd - kPointerSize; |
| 109 static const int kRegisterOutput = kNumOutputRegisters - kPointerSize; | 109 static const int kRegisterOutput = kNumOutputRegisters - kPointerSize; |
| 110 static const int kInputEnd = kRegisterOutput - kPointerSize; | 110 static const int kInputEnd = kRegisterOutput - kPointerSize; |
| 111 static const int kInputStart = kInputEnd - kPointerSize; | 111 static const int kInputStart = kInputEnd - kPointerSize; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 123 | 123 |
| 124 // Load a number of characters at the given offset from the | 124 // Load a number of characters at the given offset from the |
| 125 // current position, into the current-character register. | 125 // current position, into the current-character register. |
| 126 void LoadCurrentCharacterUnchecked(int cp_offset, int character_count); | 126 void LoadCurrentCharacterUnchecked(int cp_offset, int character_count); |
| 127 | 127 |
| 128 // Check whether preemption has been requested. | 128 // Check whether preemption has been requested. |
| 129 void CheckPreemption(); | 129 void CheckPreemption(); |
| 130 | 130 |
| 131 // Check whether we are exceeding the stack limit on the backtrack stack. | 131 // Check whether we are exceeding the stack limit on the backtrack stack. |
| 132 void CheckStackLimit(); | 132 void CheckStackLimit(); |
| 133 | 133 void CallCFunctionUsingStub(ExternalReference function, int num_arguments); |
| 134 | 134 |
| 135 // Generate a call to CheckStackGuardState. | 135 // Generate a call to CheckStackGuardState. |
| 136 void CallCheckStackGuardState(Register scratch); | 136 void CallCheckStackGuardState(Register scratch); |
| 137 | 137 |
| 138 // The ebp-relative location of a regexp register. | 138 // The ebp-relative location of a regexp register. |
| 139 MemOperand register_location(int register_index); | 139 MemOperand register_location(int register_index); |
| 140 | 140 |
| 141 // Register holding the current input position as negative offset from | 141 // Register holding the current input position as negative offset from |
| 142 // the end of the string. | 142 // the end of the string. |
| 143 inline Register current_input_offset() { return r27; } | 143 inline Register current_input_offset() { return r8; } |
| 144 | 144 |
| 145 // The register containing the current character after LoadCurrentCharacter. | 145 // The register containing the current character after LoadCurrentCharacter. |
| 146 inline Register current_character() { return r28; } | 146 inline Register current_character() { return r9; } |
| 147 | 147 |
| 148 // Register holding address of the end of the input string. | 148 // Register holding address of the end of the input string. |
| 149 inline Register end_of_input_address() { return r30; } | 149 inline Register end_of_input_address() { return r10; } |
| 150 | 150 |
| 151 // Register holding the frame address. Local variables, parameters and | 151 // Register holding the frame address. Local variables, parameters and |
| 152 // regexp registers are addressed relative to this. | 152 // regexp registers are addressed relative to this. |
| 153 inline Register frame_pointer() { return fp; } | 153 inline Register frame_pointer() { return fp; } |
| 154 | 154 |
| 155 // The register containing the backtrack stack top. Provides a meaningful | 155 // The register containing the backtrack stack top. Provides a meaningful |
| 156 // name to the register. | 156 // name to the register. |
| 157 inline Register backtrack_stackpointer() { return r29; } | 157 inline Register backtrack_stackpointer() { return r13; } |
| 158 | 158 |
| 159 // Register holding pointer to the current code object. | 159 // Register holding pointer to the current code object. |
| 160 inline Register code_pointer() { return r26; } | 160 inline Register code_pointer() { return r7; } |
| 161 | 161 |
| 162 // Byte size of chars in the string to match (decided by the Mode argument) | 162 // Byte size of chars in the string to match (decided by the Mode argument) |
| 163 inline int char_size() { return static_cast<int>(mode_); } | 163 inline int char_size() { return static_cast<int>(mode_); } |
| 164 | 164 |
| 165 // Equivalent to a conditional branch to the label, unless the label | 165 // Equivalent to a conditional branch to the label, unless the label |
| 166 // is NULL, in which case it is a conditional Backtrack. | 166 // is NULL, in which case it is a conditional Backtrack. |
| 167 void BranchOrBacktrack(Condition condition, Label* to, CRegister cr = cr7); | 167 void BranchOrBacktrack(Condition condition, Label* to, CRegister cr = cr7); |
| 168 | 168 |
| 169 // Call and return internally in the generated code in a way that | 169 // Call and return internally in the generated code in a way that |
| 170 // is GC-safe (i.e., doesn't leave absolute code addresses on the stack) | 170 // is GC-safe (i.e., doesn't leave absolute code addresses on the stack) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 200 Label success_label_; | 200 Label success_label_; |
| 201 Label backtrack_label_; | 201 Label backtrack_label_; |
| 202 Label exit_label_; | 202 Label exit_label_; |
| 203 Label check_preempt_label_; | 203 Label check_preempt_label_; |
| 204 Label stack_overflow_label_; | 204 Label stack_overflow_label_; |
| 205 Label internal_failure_label_; | 205 Label internal_failure_label_; |
| 206 }; | 206 }; |
| 207 | 207 |
| 208 // Set of non-volatile registers saved/restored by generated regexp code. | 208 // Set of non-volatile registers saved/restored by generated regexp code. |
| 209 const RegList kRegExpCalleeSaved = | 209 const RegList kRegExpCalleeSaved = |
| 210 1 << 25 | 1 << 26 | 1 << 27 | 1 << 28 | 1 << 29 | 1 << 30 | 1 << 31; | 210 1 << 6 | 1 << 7 | 1 << 8 | 1 << 9 | 1 << 10 | 1 << 11 | 1 << 13; |
| 211 | 211 |
| 212 #endif // V8_INTERPRETED_REGEXP | 212 #endif // V8_INTERPRETED_REGEXP |
| 213 } // namespace internal | 213 } // namespace internal |
| 214 } // namespace v8 | 214 } // namespace v8 |
| 215 | 215 |
| 216 #endif // V8_REGEXP_PPC_REGEXP_MACRO_ASSEMBLER_PPC_H_ | 216 #endif // V8_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ |
| OLD | NEW |