| 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 | 5 |
| 6 #include "src/v8.h" | 6 #include "src/v8.h" |
| 7 | 7 |
| 8 #if V8_TARGET_ARCH_MIPS64 | 8 #if V8_TARGET_ARCH_MIPS64 |
| 9 | 9 |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 // Dictionary load failed, go slow (but don't miss). | 263 // Dictionary load failed, go slow (but don't miss). |
| 264 __ bind(&slow); | 264 __ bind(&slow); |
| 265 GenerateRuntimeGetProperty(masm); | 265 GenerateRuntimeGetProperty(masm); |
| 266 } | 266 } |
| 267 | 267 |
| 268 | 268 |
| 269 // A register that isn't one of the parameters to the load ic. | 269 // A register that isn't one of the parameters to the load ic. |
| 270 static const Register LoadIC_TempRegister() { return a3; } | 270 static const Register LoadIC_TempRegister() { return a3; } |
| 271 | 271 |
| 272 | 272 |
| 273 static void LoadIC_PushArgs(MacroAssembler* masm) { |
| 274 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 275 Register name = LoadDescriptor::NameRegister(); |
| 276 if (FLAG_vector_ics) { |
| 277 Register slot = VectorLoadICDescriptor::SlotRegister(); |
| 278 Register vector = VectorLoadICDescriptor::VectorRegister(); |
| 279 |
| 280 __ Push(receiver, name, slot, vector); |
| 281 } else { |
| 282 __ Push(receiver, name); |
| 283 } |
| 284 } |
| 285 |
| 286 |
| 273 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 287 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
| 274 // The return address is on the stack. | 288 // The return address is on the stack. |
| 275 Isolate* isolate = masm->isolate(); | 289 Isolate* isolate = masm->isolate(); |
| 276 | 290 |
| 277 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, a4); | 291 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, a4); |
| 278 | 292 |
| 279 __ mov(LoadIC_TempRegister(), LoadDescriptor::ReceiverRegister()); | 293 LoadIC_PushArgs(masm); |
| 280 __ Push(LoadIC_TempRegister(), LoadDescriptor::NameRegister()); | |
| 281 | 294 |
| 282 // Perform tail call to the entry. | 295 // Perform tail call to the entry. |
| 283 ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); | 296 ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); |
| 284 __ TailCallExternalReference(ref, 2, 1); | 297 int arg_count = FLAG_vector_ics ? 4 : 2; |
| 298 __ TailCallExternalReference(ref, arg_count, 1); |
| 285 } | 299 } |
| 286 | 300 |
| 287 | 301 |
| 288 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 302 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| 289 // The return address is in ra. | 303 // The return address is in ra. |
| 290 | 304 |
| 291 __ mov(LoadIC_TempRegister(), LoadDescriptor::ReceiverRegister()); | 305 __ mov(LoadIC_TempRegister(), LoadDescriptor::ReceiverRegister()); |
| 292 __ Push(LoadIC_TempRegister(), LoadDescriptor::NameRegister()); | 306 __ Push(LoadIC_TempRegister(), LoadDescriptor::NameRegister()); |
| 293 | 307 |
| 294 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); | 308 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 GenerateMiss(masm); | 419 GenerateMiss(masm); |
| 406 } | 420 } |
| 407 | 421 |
| 408 | 422 |
| 409 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { | 423 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
| 410 // The return address is in ra. | 424 // The return address is in ra. |
| 411 Isolate* isolate = masm->isolate(); | 425 Isolate* isolate = masm->isolate(); |
| 412 | 426 |
| 413 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, a4); | 427 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, a4); |
| 414 | 428 |
| 415 __ Push(LoadDescriptor::ReceiverRegister(), LoadDescriptor::NameRegister()); | 429 LoadIC_PushArgs(masm); |
| 416 | 430 |
| 417 // Perform tail call to the entry. | 431 // Perform tail call to the entry. |
| 418 ExternalReference ref = | 432 ExternalReference ref = |
| 419 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); | 433 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); |
| 420 | 434 |
| 421 __ TailCallExternalReference(ref, 2, 1); | 435 int arg_count = FLAG_vector_ics ? 4 : 2; |
| 436 __ TailCallExternalReference(ref, arg_count, 1); |
| 422 } | 437 } |
| 423 | 438 |
| 424 | 439 |
| 425 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 440 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| 426 // The return address is in ra. | 441 // The return address is in ra. |
| 427 | 442 |
| 428 __ Push(LoadDescriptor::ReceiverRegister(), LoadDescriptor::NameRegister()); | 443 __ Push(LoadDescriptor::ReceiverRegister(), LoadDescriptor::NameRegister()); |
| 429 | 444 |
| 430 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); | 445 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |
| 431 } | 446 } |
| (...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1011 patcher.ChangeBranchCondition(ne); | 1026 patcher.ChangeBranchCondition(ne); |
| 1012 } else { | 1027 } else { |
| 1013 DCHECK(Assembler::IsBne(branch_instr)); | 1028 DCHECK(Assembler::IsBne(branch_instr)); |
| 1014 patcher.ChangeBranchCondition(eq); | 1029 patcher.ChangeBranchCondition(eq); |
| 1015 } | 1030 } |
| 1016 } | 1031 } |
| 1017 } | 1032 } |
| 1018 } // namespace v8::internal | 1033 } // namespace v8::internal |
| 1019 | 1034 |
| 1020 #endif // V8_TARGET_ARCH_MIPS64 | 1035 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |