OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 // hash: key's hash field, including its array index value. | 598 // hash: key's hash field, including its array index value. |
599 and_(hash, Immediate(String::kArrayIndexValueMask)); | 599 and_(hash, Immediate(String::kArrayIndexValueMask)); |
600 shr(hash, Immediate(String::kHashShift)); | 600 shr(hash, Immediate(String::kHashShift)); |
601 // Here we actually clobber the key which will be used if calling into | 601 // Here we actually clobber the key which will be used if calling into |
602 // runtime later. However as the new key is the numeric value of a string key | 602 // runtime later. However as the new key is the numeric value of a string key |
603 // there is no difference in using either key. | 603 // there is no difference in using either key. |
604 Integer32ToSmi(index, hash); | 604 Integer32ToSmi(index, hash); |
605 } | 605 } |
606 | 606 |
607 | 607 |
608 void MacroAssembler::CallRuntime(Runtime::FunctionId id, int num_arguments) { | |
609 CallRuntime(Runtime::FunctionForId(id), num_arguments); | |
610 } | |
611 | |
612 | |
613 void MacroAssembler::CallRuntimeSaveDoubles(Runtime::FunctionId id) { | |
614 const Runtime::Function* function = Runtime::FunctionForId(id); | |
615 Set(rax, function->nargs); | |
616 LoadAddress(rbx, ExternalReference(function, isolate())); | |
617 CEntryStub ces(1, kSaveFPRegs); | |
618 CallStub(&ces); | |
619 } | |
620 | |
621 | |
622 void MacroAssembler::CallRuntime(const Runtime::Function* f, | 608 void MacroAssembler::CallRuntime(const Runtime::Function* f, |
623 int num_arguments) { | 609 int num_arguments, |
| 610 SaveFPRegsMode save_doubles) { |
624 // If the expected number of arguments of the runtime function is | 611 // If the expected number of arguments of the runtime function is |
625 // constant, we check that the actual number of arguments match the | 612 // constant, we check that the actual number of arguments match the |
626 // expectation. | 613 // expectation. |
627 if (f->nargs >= 0 && f->nargs != num_arguments) { | 614 if (f->nargs >= 0 && f->nargs != num_arguments) { |
628 IllegalOperation(num_arguments); | 615 IllegalOperation(num_arguments); |
629 return; | 616 return; |
630 } | 617 } |
631 | 618 |
632 // TODO(1236192): Most runtime routines don't need the number of | 619 // TODO(1236192): Most runtime routines don't need the number of |
633 // arguments passed in because it is constant. At some point we | 620 // arguments passed in because it is constant. At some point we |
634 // should remove this need and make the runtime routine entry code | 621 // should remove this need and make the runtime routine entry code |
635 // smarter. | 622 // smarter. |
636 Set(rax, num_arguments); | 623 Set(rax, num_arguments); |
637 LoadAddress(rbx, ExternalReference(f, isolate())); | 624 LoadAddress(rbx, ExternalReference(f, isolate())); |
638 CEntryStub ces(f->result_size); | 625 CEntryStub ces(f->result_size, save_doubles); |
639 CallStub(&ces); | 626 CallStub(&ces); |
640 } | 627 } |
641 | 628 |
642 | 629 |
643 void MacroAssembler::CallExternalReference(const ExternalReference& ext, | 630 void MacroAssembler::CallExternalReference(const ExternalReference& ext, |
644 int num_arguments) { | 631 int num_arguments) { |
645 Set(rax, num_arguments); | 632 Set(rax, num_arguments); |
646 LoadAddress(rbx, ext); | 633 LoadAddress(rbx, ext); |
647 | 634 |
648 CEntryStub stub(1); | 635 CEntryStub stub(1); |
(...skipping 4268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4917 j(greater, &no_memento_available); | 4904 j(greater, &no_memento_available); |
4918 CompareRoot(MemOperand(scratch_reg, -AllocationMemento::kSize), | 4905 CompareRoot(MemOperand(scratch_reg, -AllocationMemento::kSize), |
4919 Heap::kAllocationMementoMapRootIndex); | 4906 Heap::kAllocationMementoMapRootIndex); |
4920 bind(&no_memento_available); | 4907 bind(&no_memento_available); |
4921 } | 4908 } |
4922 | 4909 |
4923 | 4910 |
4924 } } // namespace v8::internal | 4911 } } // namespace v8::internal |
4925 | 4912 |
4926 #endif // V8_TARGET_ARCH_X64 | 4913 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |