| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 // ----------------------------------- | 229 // ----------------------------------- |
| 230 | 230 |
| 231 __ movq(rax, Operand(rsp, kPointerSize)); | 231 __ movq(rax, Operand(rsp, kPointerSize)); |
| 232 __ movq(rcx, Operand(rsp, 2 * kPointerSize)); | 232 __ movq(rcx, Operand(rsp, 2 * kPointerSize)); |
| 233 __ pop(rbx); | 233 __ pop(rbx); |
| 234 __ push(rcx); // receiver | 234 __ push(rcx); // receiver |
| 235 __ push(rax); // name | 235 __ push(rax); // name |
| 236 __ push(rbx); // return address | 236 __ push(rbx); // return address |
| 237 | 237 |
| 238 // Perform tail call to the entry. | 238 // Perform tail call to the entry. |
| 239 __ TailCallRuntime(f, 2); | 239 __ TailCallRuntime(f, 2, 1); |
| 240 } | 240 } |
| 241 | 241 |
| 242 | 242 |
| 243 #ifdef DEBUG | 243 #ifdef DEBUG |
| 244 // For use in assert below. | 244 // For use in assert below. |
| 245 static int TenToThe(int exponent) { | 245 static int TenToThe(int exponent) { |
| 246 ASSERT(exponent <= 9); | 246 ASSERT(exponent <= 9); |
| 247 ASSERT(exponent >= 1); | 247 ASSERT(exponent >= 1); |
| 248 int answer = 10; | 248 int answer = 10; |
| 249 for (int i = 1; i < exponent; i++) answer *= 10; | 249 for (int i = 1; i < exponent; i++) answer *= 10; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 // -- rsp[16] : receiver | 366 // -- rsp[16] : receiver |
| 367 // ----------------------------------- | 367 // ----------------------------------- |
| 368 | 368 |
| 369 __ pop(rcx); | 369 __ pop(rcx); |
| 370 __ push(Operand(rsp, 1 * kPointerSize)); // receiver | 370 __ push(Operand(rsp, 1 * kPointerSize)); // receiver |
| 371 __ push(Operand(rsp, 1 * kPointerSize)); // key | 371 __ push(Operand(rsp, 1 * kPointerSize)); // key |
| 372 __ push(rax); // value | 372 __ push(rax); // value |
| 373 __ push(rcx); // return address | 373 __ push(rcx); // return address |
| 374 | 374 |
| 375 // Do tail-call to runtime routine. | 375 // Do tail-call to runtime routine. |
| 376 __ TailCallRuntime(f, 3); | 376 __ TailCallRuntime(f, 3, 1); |
| 377 } | 377 } |
| 378 | 378 |
| 379 | 379 |
| 380 void KeyedStoreIC::GenerateExtendStorage(MacroAssembler* masm) { | 380 void KeyedStoreIC::GenerateExtendStorage(MacroAssembler* masm) { |
| 381 // ----------- S t a t e ------------- | 381 // ----------- S t a t e ------------- |
| 382 // -- rax : value | 382 // -- rax : value |
| 383 // -- rcx : transition map | 383 // -- rcx : transition map |
| 384 // -- rsp[0] : return address | 384 // -- rsp[0] : return address |
| 385 // -- rsp[8] : key | 385 // -- rsp[8] : key |
| 386 // -- rsp[16] : receiver | 386 // -- rsp[16] : receiver |
| 387 // ----------------------------------- | 387 // ----------------------------------- |
| 388 | 388 |
| 389 __ pop(rbx); | 389 __ pop(rbx); |
| 390 __ push(Operand(rsp, 1 * kPointerSize)); // receiver | 390 __ push(Operand(rsp, 1 * kPointerSize)); // receiver |
| 391 __ push(rcx); // transition map | 391 __ push(rcx); // transition map |
| 392 __ push(rax); // value | 392 __ push(rax); // value |
| 393 __ push(rbx); // return address | 393 __ push(rbx); // return address |
| 394 | 394 |
| 395 // Do tail-call to runtime routine. | 395 // Do tail-call to runtime routine. |
| 396 __ TailCallRuntime( | 396 __ TailCallRuntime( |
| 397 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3); | 397 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3, 1); |
| 398 } | 398 } |
| 399 | 399 |
| 400 | 400 |
| 401 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { | 401 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { |
| 402 // ----------- S t a t e ------------- | 402 // ----------- S t a t e ------------- |
| 403 // -- rax : value | 403 // -- rax : value |
| 404 // -- rsp[0] : return address | 404 // -- rsp[0] : return address |
| 405 // -- rsp[8] : key | 405 // -- rsp[8] : key |
| 406 // -- rsp[16] : receiver | 406 // -- rsp[16] : receiver |
| 407 // ----------------------------------- | 407 // ----------------------------------- |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 | 453 |
| 454 | 454 |
| 455 // Slow case: Push extra copies of the arguments (3). | 455 // Slow case: Push extra copies of the arguments (3). |
| 456 __ bind(&slow); | 456 __ bind(&slow); |
| 457 __ pop(rcx); | 457 __ pop(rcx); |
| 458 __ push(Operand(rsp, 1 * kPointerSize)); | 458 __ push(Operand(rsp, 1 * kPointerSize)); |
| 459 __ push(Operand(rsp, 1 * kPointerSize)); | 459 __ push(Operand(rsp, 1 * kPointerSize)); |
| 460 __ push(rax); | 460 __ push(rax); |
| 461 __ push(rcx); | 461 __ push(rcx); |
| 462 // Do tail-call to runtime routine. | 462 // Do tail-call to runtime routine. |
| 463 __ TailCallRuntime(ExternalReference(Runtime::kSetProperty), 3); | 463 __ TailCallRuntime(ExternalReference(Runtime::kSetProperty), 3, 1); |
| 464 | 464 |
| 465 | 465 |
| 466 // Extra capacity case: Check if there is extra capacity to | 466 // Extra capacity case: Check if there is extra capacity to |
| 467 // perform the store and update the length. Used for adding one | 467 // perform the store and update the length. Used for adding one |
| 468 // element to the array by writing to array[array.length]. | 468 // element to the array by writing to array[array.length]. |
| 469 __ bind(&extra); | 469 __ bind(&extra); |
| 470 // rax: value | 470 // rax: value |
| 471 // rdx: JSArray | 471 // rdx: JSArray |
| 472 // rcx: FixedArray | 472 // rcx: FixedArray |
| 473 // rbx: index (as a smi) | 473 // rbx: index (as a smi) |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 __ movq(rbx, Operand(rsp, (argc + 2) * kPointerSize)); | 525 __ movq(rbx, Operand(rsp, (argc + 2) * kPointerSize)); |
| 526 | 526 |
| 527 // Enter an internal frame. | 527 // Enter an internal frame. |
| 528 __ EnterInternalFrame(); | 528 __ EnterInternalFrame(); |
| 529 | 529 |
| 530 // Push the receiver and the name of the function. | 530 // Push the receiver and the name of the function. |
| 531 __ push(rdx); | 531 __ push(rdx); |
| 532 __ push(rbx); | 532 __ push(rbx); |
| 533 | 533 |
| 534 // Call the entry. | 534 // Call the entry. |
| 535 CEntryStub stub; | 535 CEntryStub stub(1); |
| 536 __ movq(rax, Immediate(2)); | 536 __ movq(rax, Immediate(2)); |
| 537 __ movq(rbx, f); | 537 __ movq(rbx, f); |
| 538 __ CallStub(&stub); | 538 __ CallStub(&stub); |
| 539 | 539 |
| 540 // Move result to rdi and exit the internal frame. | 540 // Move result to rdi and exit the internal frame. |
| 541 __ movq(rdi, rax); | 541 __ movq(rdi, rax); |
| 542 __ LeaveInternalFrame(); | 542 __ LeaveInternalFrame(); |
| 543 | 543 |
| 544 // Check if the receiver is a global object of some sort. | 544 // Check if the receiver is a global object of some sort. |
| 545 Label invoke, global; | 545 Label invoke, global; |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 756 // ----------------------------------- | 756 // ----------------------------------- |
| 757 | 757 |
| 758 __ movq(rax, Operand(rsp, kPointerSize)); | 758 __ movq(rax, Operand(rsp, kPointerSize)); |
| 759 | 759 |
| 760 __ pop(rbx); | 760 __ pop(rbx); |
| 761 __ push(rax); // receiver | 761 __ push(rax); // receiver |
| 762 __ push(rcx); // name | 762 __ push(rcx); // name |
| 763 __ push(rbx); // return address | 763 __ push(rbx); // return address |
| 764 | 764 |
| 765 // Perform tail call to the entry. | 765 // Perform tail call to the entry. |
| 766 __ TailCallRuntime(f, 2); | 766 __ TailCallRuntime(f, 2, 1); |
| 767 } | 767 } |
| 768 | 768 |
| 769 | 769 |
| 770 void LoadIC::GenerateArrayLength(MacroAssembler* masm) { | 770 void LoadIC::GenerateArrayLength(MacroAssembler* masm) { |
| 771 // ----------- S t a t e ------------- | 771 // ----------- S t a t e ------------- |
| 772 // -- rcx : name | 772 // -- rcx : name |
| 773 // -- rsp[0] : return address | 773 // -- rsp[0] : return address |
| 774 // -- rsp[8] : receiver | 774 // -- rsp[8] : receiver |
| 775 // ----------------------------------- | 775 // ----------------------------------- |
| 776 | 776 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 933 // -- rsp[0] : return address | 933 // -- rsp[0] : return address |
| 934 // -- rsp[8] : receiver | 934 // -- rsp[8] : receiver |
| 935 // ----------------------------------- | 935 // ----------------------------------- |
| 936 __ pop(rbx); | 936 __ pop(rbx); |
| 937 __ push(Operand(rsp, 0)); // receiver | 937 __ push(Operand(rsp, 0)); // receiver |
| 938 __ push(rcx); // name | 938 __ push(rcx); // name |
| 939 __ push(rax); // value | 939 __ push(rax); // value |
| 940 __ push(rbx); // return address | 940 __ push(rbx); // return address |
| 941 | 941 |
| 942 // Perform tail call to the entry. | 942 // Perform tail call to the entry. |
| 943 __ TailCallRuntime(f, 3); | 943 __ TailCallRuntime(f, 3, 1); |
| 944 } | 944 } |
| 945 | 945 |
| 946 void StoreIC::GenerateExtendStorage(MacroAssembler* masm) { | 946 void StoreIC::GenerateExtendStorage(MacroAssembler* masm) { |
| 947 // ----------- S t a t e ------------- | 947 // ----------- S t a t e ------------- |
| 948 // -- rax : value | 948 // -- rax : value |
| 949 // -- rcx : Map (target of map transition) | 949 // -- rcx : Map (target of map transition) |
| 950 // -- rsp[0] : return address | 950 // -- rsp[0] : return address |
| 951 // -- rsp[8] : receiver | 951 // -- rsp[8] : receiver |
| 952 // ----------------------------------- | 952 // ----------------------------------- |
| 953 | 953 |
| 954 __ pop(rbx); | 954 __ pop(rbx); |
| 955 __ push(Operand(rsp, 0)); // receiver | 955 __ push(Operand(rsp, 0)); // receiver |
| 956 __ push(rcx); // transition map | 956 __ push(rcx); // transition map |
| 957 __ push(rax); // value | 957 __ push(rax); // value |
| 958 __ push(rbx); // return address | 958 __ push(rbx); // return address |
| 959 | 959 |
| 960 // Perform tail call to the entry. | 960 // Perform tail call to the entry. |
| 961 __ TailCallRuntime( | 961 __ TailCallRuntime( |
| 962 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3); | 962 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3, 1); |
| 963 } | 963 } |
| 964 | 964 |
| 965 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { | 965 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { |
| 966 // ----------- S t a t e ------------- | 966 // ----------- S t a t e ------------- |
| 967 // -- rax : value | 967 // -- rax : value |
| 968 // -- rcx : name | 968 // -- rcx : name |
| 969 // -- rsp[0] : return address | 969 // -- rsp[0] : return address |
| 970 // -- rsp[8] : receiver | 970 // -- rsp[8] : receiver |
| 971 // ----------------------------------- | 971 // ----------------------------------- |
| 972 | 972 |
| 973 // Get the receiver from the stack and probe the stub cache. | 973 // Get the receiver from the stack and probe the stub cache. |
| 974 __ movq(rdx, Operand(rsp, kPointerSize)); | 974 __ movq(rdx, Operand(rsp, kPointerSize)); |
| 975 Code::Flags flags = Code::ComputeFlags(Code::STORE_IC, | 975 Code::Flags flags = Code::ComputeFlags(Code::STORE_IC, |
| 976 NOT_IN_LOOP, | 976 NOT_IN_LOOP, |
| 977 MONOMORPHIC); | 977 MONOMORPHIC); |
| 978 StubCache::GenerateProbe(masm, flags, rdx, rcx, rbx, no_reg); | 978 StubCache::GenerateProbe(masm, flags, rdx, rcx, rbx, no_reg); |
| 979 | 979 |
| 980 // Cache miss: Jump to runtime. | 980 // Cache miss: Jump to runtime. |
| 981 Generate(masm, ExternalReference(IC_Utility(kStoreIC_Miss))); | 981 Generate(masm, ExternalReference(IC_Utility(kStoreIC_Miss))); |
| 982 } | 982 } |
| 983 | 983 |
| 984 | 984 |
| 985 #undef __ | 985 #undef __ |
| 986 | 986 |
| 987 | 987 |
| 988 } } // namespace v8::internal | 988 } } // namespace v8::internal |
| OLD | NEW |