OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #if V8_TARGET_ARCH_MIPS64 | 5 #if V8_TARGET_ARCH_MIPS64 |
6 | 6 |
7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/ic/handler-compiler.h" | 10 #include "src/ic/handler-compiler.h" |
(...skipping 1256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1267 | 1267 |
1268 // Save callee saved registers on the stack. | 1268 // Save callee saved registers on the stack. |
1269 __ MultiPush(kCalleeSaved | ra.bit()); | 1269 __ MultiPush(kCalleeSaved | ra.bit()); |
1270 | 1270 |
1271 // Save callee-saved FPU registers. | 1271 // Save callee-saved FPU registers. |
1272 __ MultiPushFPU(kCalleeSavedFPU); | 1272 __ MultiPushFPU(kCalleeSavedFPU); |
1273 // Set up the reserved register for 0.0. | 1273 // Set up the reserved register for 0.0. |
1274 __ Move(kDoubleRegZero, 0.0); | 1274 __ Move(kDoubleRegZero, 0.0); |
1275 | 1275 |
1276 // Load argv in s0 register. | 1276 // Load argv in s0 register. |
1277 if (kMipsAbi == kN64) { | 1277 __ mov(s0, a4); // 5th parameter in mips64 a4 (a4) register. |
1278 __ mov(s0, a4); // 5th parameter in mips64 a4 (a4) register. | |
1279 } else { // Abi O32. | |
1280 // 5th parameter on stack for O32 abi. | |
1281 int offset_to_argv = (kNumCalleeSaved + 1) * kPointerSize; | |
1282 offset_to_argv += kNumCalleeSavedFPU * kDoubleSize; | |
1283 __ ld(s0, MemOperand(sp, offset_to_argv + kCArgsSlotsSize)); | |
1284 } | |
1285 | 1278 |
1286 __ InitializeRootRegister(); | 1279 __ InitializeRootRegister(); |
1287 | 1280 |
1288 // We build an EntryFrame. | 1281 // We build an EntryFrame. |
1289 __ li(a7, Operand(-1)); // Push a bad frame pointer to fail if it is used. | 1282 __ li(a7, Operand(-1)); // Push a bad frame pointer to fail if it is used. |
1290 int marker = type(); | 1283 int marker = type(); |
1291 __ li(a6, Operand(Smi::FromInt(marker))); | 1284 __ li(a6, Operand(Smi::FromInt(marker))); |
1292 __ li(a5, Operand(Smi::FromInt(marker))); | 1285 __ li(a5, Operand(Smi::FromInt(marker))); |
1293 ExternalReference c_entry_fp(Isolate::kCEntryFPAddress, isolate); | 1286 ExternalReference c_entry_fp(Isolate::kCEntryFPAddress, isolate); |
1294 __ li(a4, Operand(c_entry_fp)); | 1287 __ li(a4, Operand(c_entry_fp)); |
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2203 // a3: encoding of subject string (1 if one_byte, 0 if two_byte); | 2196 // a3: encoding of subject string (1 if one_byte, 0 if two_byte); |
2204 // t9: code | 2197 // t9: code |
2205 // subject: Subject string | 2198 // subject: Subject string |
2206 // regexp_data: RegExp data (FixedArray) | 2199 // regexp_data: RegExp data (FixedArray) |
2207 // All checks done. Now push arguments for native regexp code. | 2200 // All checks done. Now push arguments for native regexp code. |
2208 __ IncrementCounter(isolate()->counters()->regexp_entry_native(), | 2201 __ IncrementCounter(isolate()->counters()->regexp_entry_native(), |
2209 1, a0, a2); | 2202 1, a0, a2); |
2210 | 2203 |
2211 // Isolates: note we add an additional parameter here (isolate pointer). | 2204 // Isolates: note we add an additional parameter here (isolate pointer). |
2212 const int kRegExpExecuteArguments = 9; | 2205 const int kRegExpExecuteArguments = 9; |
2213 const int kParameterRegisters = (kMipsAbi == kN64) ? 8 : 4; | 2206 const int kParameterRegisters = 8; |
2214 __ EnterExitFrame(false, kRegExpExecuteArguments - kParameterRegisters); | 2207 __ EnterExitFrame(false, kRegExpExecuteArguments - kParameterRegisters); |
2215 | 2208 |
2216 // Stack pointer now points to cell where return address is to be written. | 2209 // Stack pointer now points to cell where return address is to be written. |
2217 // Arguments are before that on the stack or in registers, meaning we | 2210 // Arguments are before that on the stack or in registers, meaning we |
2218 // treat the return address as argument 5. Thus every argument after that | 2211 // treat the return address as argument 5. Thus every argument after that |
2219 // needs to be shifted back by 1. Since DirectCEntryStub will handle | 2212 // needs to be shifted back by 1. Since DirectCEntryStub will handle |
2220 // allocating space for the c argument slots, we don't need to calculate | 2213 // allocating space for the c argument slots, we don't need to calculate |
2221 // that into the argument positions on the stack. This is how the stack will | 2214 // that into the argument positions on the stack. This is how the stack will |
2222 // look (sp meaning the value of sp at this moment): | 2215 // look (sp meaning the value of sp at this moment): |
2223 // Abi n64: | 2216 // Abi n64: |
2224 // [sp + 1] - Argument 9 | 2217 // [sp + 1] - Argument 9 |
2225 // [sp + 0] - saved ra | 2218 // [sp + 0] - saved ra |
2226 // Abi O32: | 2219 // Abi O32: |
2227 // [sp + 5] - Argument 9 | 2220 // [sp + 5] - Argument 9 |
2228 // [sp + 4] - Argument 8 | 2221 // [sp + 4] - Argument 8 |
2229 // [sp + 3] - Argument 7 | 2222 // [sp + 3] - Argument 7 |
2230 // [sp + 2] - Argument 6 | 2223 // [sp + 2] - Argument 6 |
2231 // [sp + 1] - Argument 5 | 2224 // [sp + 1] - Argument 5 |
2232 // [sp + 0] - saved ra | 2225 // [sp + 0] - saved ra |
2233 | 2226 |
2234 if (kMipsAbi == kN64) { | 2227 // Argument 9: Pass current isolate address. |
2235 // Argument 9: Pass current isolate address. | 2228 __ li(a0, Operand(ExternalReference::isolate_address(isolate()))); |
2236 __ li(a0, Operand(ExternalReference::isolate_address(isolate()))); | 2229 __ sd(a0, MemOperand(sp, 1 * kPointerSize)); |
2237 __ sd(a0, MemOperand(sp, 1 * kPointerSize)); | |
2238 | 2230 |
2239 // Argument 8: Indicate that this is a direct call from JavaScript. | 2231 // Argument 8: Indicate that this is a direct call from JavaScript. |
2240 __ li(a7, Operand(1)); | 2232 __ li(a7, Operand(1)); |
2241 | 2233 |
2242 // Argument 7: Start (high end) of backtracking stack memory area. | 2234 // Argument 7: Start (high end) of backtracking stack memory area. |
2243 __ li(a0, Operand(address_of_regexp_stack_memory_address)); | 2235 __ li(a0, Operand(address_of_regexp_stack_memory_address)); |
2244 __ ld(a0, MemOperand(a0, 0)); | 2236 __ ld(a0, MemOperand(a0, 0)); |
2245 __ li(a2, Operand(address_of_regexp_stack_memory_size)); | 2237 __ li(a2, Operand(address_of_regexp_stack_memory_size)); |
2246 __ ld(a2, MemOperand(a2, 0)); | 2238 __ ld(a2, MemOperand(a2, 0)); |
2247 __ daddu(a6, a0, a2); | 2239 __ daddu(a6, a0, a2); |
2248 | 2240 |
2249 // Argument 6: Set the number of capture registers to zero to force global | 2241 // Argument 6: Set the number of capture registers to zero to force global |
2250 // regexps to behave as non-global. This does not affect non-global regexps. | 2242 // regexps to behave as non-global. This does not affect non-global regexps. |
2251 __ mov(a5, zero_reg); | 2243 __ mov(a5, zero_reg); |
2252 | 2244 |
2253 // Argument 5: static offsets vector buffer. | 2245 // Argument 5: static offsets vector buffer. |
2254 __ li(a4, Operand( | 2246 __ li( |
2255 ExternalReference::address_of_static_offsets_vector(isolate()))); | 2247 a4, |
2256 } else { // O32. | 2248 Operand(ExternalReference::address_of_static_offsets_vector(isolate()))); |
2257 DCHECK(kMipsAbi == kO32); | |
2258 | |
2259 // Argument 9: Pass current isolate address. | |
2260 // CFunctionArgumentOperand handles MIPS stack argument slots. | |
2261 __ li(a0, Operand(ExternalReference::isolate_address(isolate()))); | |
2262 __ sd(a0, MemOperand(sp, 5 * kPointerSize)); | |
2263 | |
2264 // Argument 8: Indicate that this is a direct call from JavaScript. | |
2265 __ li(a0, Operand(1)); | |
2266 __ sd(a0, MemOperand(sp, 4 * kPointerSize)); | |
2267 | |
2268 // Argument 7: Start (high end) of backtracking stack memory area. | |
2269 __ li(a0, Operand(address_of_regexp_stack_memory_address)); | |
2270 __ ld(a0, MemOperand(a0, 0)); | |
2271 __ li(a2, Operand(address_of_regexp_stack_memory_size)); | |
2272 __ ld(a2, MemOperand(a2, 0)); | |
2273 __ daddu(a0, a0, a2); | |
2274 __ sd(a0, MemOperand(sp, 3 * kPointerSize)); | |
2275 | |
2276 // Argument 6: Set the number of capture registers to zero to force global | |
2277 // regexps to behave as non-global. This does not affect non-global regexps. | |
2278 __ mov(a0, zero_reg); | |
2279 __ sd(a0, MemOperand(sp, 2 * kPointerSize)); | |
2280 | |
2281 // Argument 5: static offsets vector buffer. | |
2282 __ li(a0, Operand( | |
2283 ExternalReference::address_of_static_offsets_vector(isolate()))); | |
2284 __ sd(a0, MemOperand(sp, 1 * kPointerSize)); | |
2285 } | |
2286 | 2249 |
2287 // For arguments 4 and 3 get string length, calculate start of string data | 2250 // For arguments 4 and 3 get string length, calculate start of string data |
2288 // and calculate the shift of the index (0 for one_byte and 1 for two byte). | 2251 // and calculate the shift of the index (0 for one_byte and 1 for two byte). |
2289 __ Daddu(t2, subject, Operand(SeqString::kHeaderSize - kHeapObjectTag)); | 2252 __ Daddu(t2, subject, Operand(SeqString::kHeaderSize - kHeapObjectTag)); |
2290 __ Xor(a3, a3, Operand(1)); // 1 for 2-byte str, 0 for 1-byte. | 2253 __ Xor(a3, a3, Operand(1)); // 1 for 2-byte str, 0 for 1-byte. |
2291 // Load the length from the original subject string from the previous stack | 2254 // Load the length from the original subject string from the previous stack |
2292 // frame. Therefore we have to use fp, which points exactly to two pointer | 2255 // frame. Therefore we have to use fp, which points exactly to two pointer |
2293 // sizes below the previous sp. (Because creating a new stack frame pushes | 2256 // sizes below the previous sp. (Because creating a new stack frame pushes |
2294 // the previous fp onto the stack and moves up sp by 2 * kPointerSize.) | 2257 // the previous fp onto the stack and moves up sp by 2 * kPointerSize.) |
2295 __ ld(subject, MemOperand(fp, kSubjectOffset + 2 * kPointerSize)); | 2258 __ ld(subject, MemOperand(fp, kSubjectOffset + 2 * kPointerSize)); |
(...skipping 3382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5678 return_value_operand, NULL); | 5641 return_value_operand, NULL); |
5679 } | 5642 } |
5680 | 5643 |
5681 | 5644 |
5682 #undef __ | 5645 #undef __ |
5683 | 5646 |
5684 } // namespace internal | 5647 } // namespace internal |
5685 } // namespace v8 | 5648 } // namespace v8 |
5686 | 5649 |
5687 #endif // V8_TARGET_ARCH_MIPS64 | 5650 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |