Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(321)

Side by Side Diff: src/ia32/ic-ia32.cc

Issue 201042: Win64 - Allow returning two values from a runtime function. (Closed)
Patch Set: Fixed typo. Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 __ j(below, &fast, taken); 397 __ j(below, &fast, taken);
398 398
399 // Slow case: Push extra copies of the arguments (3). 399 // Slow case: Push extra copies of the arguments (3).
400 __ bind(&slow); 400 __ bind(&slow);
401 __ pop(ecx); 401 __ pop(ecx);
402 __ push(Operand(esp, 1 * kPointerSize)); 402 __ push(Operand(esp, 1 * kPointerSize));
403 __ push(Operand(esp, 1 * kPointerSize)); 403 __ push(Operand(esp, 1 * kPointerSize));
404 __ push(eax); 404 __ push(eax);
405 __ push(ecx); 405 __ push(ecx);
406 // Do tail-call to runtime routine. 406 // Do tail-call to runtime routine.
407 __ TailCallRuntime(ExternalReference(Runtime::kSetProperty), 3); 407 __ TailCallRuntime(ExternalReference(Runtime::kSetProperty), 3, 1);
408 408
409 // Check whether the elements is a pixel array. 409 // Check whether the elements is a pixel array.
410 // eax: value 410 // eax: value
411 // ecx: elements array 411 // ecx: elements array
412 // ebx: index (as a smi) 412 // ebx: index (as a smi)
413 __ bind(&check_pixel_array); 413 __ bind(&check_pixel_array);
414 __ cmp(FieldOperand(ecx, HeapObject::kMapOffset), 414 __ cmp(FieldOperand(ecx, HeapObject::kMapOffset),
415 Immediate(Factory::pixel_array_map())); 415 Immediate(Factory::pixel_array_map()));
416 __ j(not_equal, &slow); 416 __ j(not_equal, &slow);
417 // Check that the value is a smi. If a conversion is needed call into the 417 // Check that the value is a smi. If a conversion is needed call into the
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
660 __ mov(ebx, Operand(esp, (argc + 2) * kPointerSize)); 660 __ mov(ebx, Operand(esp, (argc + 2) * kPointerSize));
661 661
662 // Enter an internal frame. 662 // Enter an internal frame.
663 __ EnterInternalFrame(); 663 __ EnterInternalFrame();
664 664
665 // Push the receiver and the name of the function. 665 // Push the receiver and the name of the function.
666 __ push(edx); 666 __ push(edx);
667 __ push(ebx); 667 __ push(ebx);
668 668
669 // Call the entry. 669 // Call the entry.
670 CEntryStub stub; 670 CEntryStub stub(1);
671 __ mov(eax, Immediate(2)); 671 __ mov(eax, Immediate(2));
672 __ mov(ebx, Immediate(f)); 672 __ mov(ebx, Immediate(f));
673 __ CallStub(&stub); 673 __ CallStub(&stub);
674 674
675 // Move result to edi and exit the internal frame. 675 // Move result to edi and exit the internal frame.
676 __ mov(edi, eax); 676 __ mov(edi, eax);
677 __ LeaveInternalFrame(); 677 __ LeaveInternalFrame();
678 678
679 // Check if the receiver is a global object of some sort. 679 // Check if the receiver is a global object of some sort.
680 Label invoke, global; 680 Label invoke, global;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 // -- esp[4] : receiver 792 // -- esp[4] : receiver
793 // ----------------------------------- 793 // -----------------------------------
794 794
795 __ mov(eax, Operand(esp, kPointerSize)); 795 __ mov(eax, Operand(esp, kPointerSize));
796 __ pop(ebx); 796 __ pop(ebx);
797 __ push(eax); // receiver 797 __ push(eax); // receiver
798 __ push(ecx); // name 798 __ push(ecx); // name
799 __ push(ebx); // return address 799 __ push(ebx); // return address
800 800
801 // Perform tail call to the entry. 801 // Perform tail call to the entry.
802 __ TailCallRuntime(f, 2); 802 __ TailCallRuntime(f, 2, 1);
803 } 803 }
804 804
805 805
806 // One byte opcode for test eax,0xXXXXXXXX. 806 // One byte opcode for test eax,0xXXXXXXXX.
807 static const byte kTestEaxByte = 0xA9; 807 static const byte kTestEaxByte = 0xA9;
808 808
809 809
810 void LoadIC::ClearInlinedVersion(Address address) { 810 void LoadIC::ClearInlinedVersion(Address address) {
811 // Reset the map check of the inlined inobject property load (if 811 // Reset the map check of the inlined inobject property load (if
812 // present) to guarantee failure by holding an invalid map (the null 812 // present) to guarantee failure by holding an invalid map (the null
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 // ----------------------------------- 920 // -----------------------------------
921 921
922 __ mov(eax, Operand(esp, kPointerSize)); 922 __ mov(eax, Operand(esp, kPointerSize));
923 __ mov(ecx, Operand(esp, 2 * kPointerSize)); 923 __ mov(ecx, Operand(esp, 2 * kPointerSize));
924 __ pop(ebx); 924 __ pop(ebx);
925 __ push(ecx); // receiver 925 __ push(ecx); // receiver
926 __ push(eax); // name 926 __ push(eax); // name
927 __ push(ebx); // return address 927 __ push(ebx); // return address
928 928
929 // Perform tail call to the entry. 929 // Perform tail call to the entry.
930 __ TailCallRuntime(f, 2); 930 __ TailCallRuntime(f, 2, 1);
931 } 931 }
932 932
933 933
934 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { 934 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) {
935 // ----------- S t a t e ------------- 935 // ----------- S t a t e -------------
936 // -- eax : value 936 // -- eax : value
937 // -- ecx : name 937 // -- ecx : name
938 // -- esp[0] : return address 938 // -- esp[0] : return address
939 // -- esp[4] : receiver 939 // -- esp[4] : receiver
940 // ----------------------------------- 940 // -----------------------------------
(...skipping 19 matching lines...) Expand all
960 // ----------------------------------- 960 // -----------------------------------
961 961
962 __ pop(ebx); 962 __ pop(ebx);
963 __ push(Operand(esp, 0)); // receiver 963 __ push(Operand(esp, 0)); // receiver
964 __ push(ecx); // transition map 964 __ push(ecx); // transition map
965 __ push(eax); // value 965 __ push(eax); // value
966 __ push(ebx); // return address 966 __ push(ebx); // return address
967 967
968 // Perform tail call to the entry. 968 // Perform tail call to the entry.
969 __ TailCallRuntime( 969 __ TailCallRuntime(
970 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3); 970 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3, 1);
971 } 971 }
972 972
973 973
974 void StoreIC::Generate(MacroAssembler* masm, const ExternalReference& f) { 974 void StoreIC::Generate(MacroAssembler* masm, const ExternalReference& f) {
975 // ----------- S t a t e ------------- 975 // ----------- S t a t e -------------
976 // -- eax : value 976 // -- eax : value
977 // -- ecx : name 977 // -- ecx : name
978 // -- esp[0] : return address 978 // -- esp[0] : return address
979 // -- esp[4] : receiver 979 // -- esp[4] : receiver
980 // ----------------------------------- 980 // -----------------------------------
981 981
982 // Move the return address below the arguments. 982 // Move the return address below the arguments.
983 __ pop(ebx); 983 __ pop(ebx);
984 __ push(Operand(esp, 0)); 984 __ push(Operand(esp, 0));
985 __ push(ecx); 985 __ push(ecx);
986 __ push(eax); 986 __ push(eax);
987 __ push(ebx); 987 __ push(ebx);
988 988
989 // Perform tail call to the entry. 989 // Perform tail call to the entry.
990 __ TailCallRuntime(f, 3); 990 __ TailCallRuntime(f, 3, 1);
991 } 991 }
992 992
993 993
994 // Defined in ic.cc. 994 // Defined in ic.cc.
995 Object* KeyedStoreIC_Miss(Arguments args); 995 Object* KeyedStoreIC_Miss(Arguments args);
996 996
997 void KeyedStoreIC::Generate(MacroAssembler* masm, const ExternalReference& f) { 997 void KeyedStoreIC::Generate(MacroAssembler* masm, const ExternalReference& f) {
998 // ----------- S t a t e ------------- 998 // ----------- S t a t e -------------
999 // -- eax : value 999 // -- eax : value
1000 // -- esp[0] : return address 1000 // -- esp[0] : return address
1001 // -- esp[4] : key 1001 // -- esp[4] : key
1002 // -- esp[8] : receiver 1002 // -- esp[8] : receiver
1003 // ----------------------------------- 1003 // -----------------------------------
1004 1004
1005 // Move the return address below the arguments. 1005 // Move the return address below the arguments.
1006 __ pop(ecx); 1006 __ pop(ecx);
1007 __ push(Operand(esp, 1 * kPointerSize)); 1007 __ push(Operand(esp, 1 * kPointerSize));
1008 __ push(Operand(esp, 1 * kPointerSize)); 1008 __ push(Operand(esp, 1 * kPointerSize));
1009 __ push(eax); 1009 __ push(eax);
1010 __ push(ecx); 1010 __ push(ecx);
1011 1011
1012 // Do tail-call to runtime routine. 1012 // Do tail-call to runtime routine.
1013 __ TailCallRuntime(f, 3); 1013 __ TailCallRuntime(f, 3, 1);
1014 } 1014 }
1015 1015
1016 1016
1017 void KeyedStoreIC::GenerateExtendStorage(MacroAssembler* masm) { 1017 void KeyedStoreIC::GenerateExtendStorage(MacroAssembler* masm) {
1018 // ----------- S t a t e ------------- 1018 // ----------- S t a t e -------------
1019 // -- eax : value 1019 // -- eax : value
1020 // -- ecx : transition map 1020 // -- ecx : transition map
1021 // -- esp[0] : return address 1021 // -- esp[0] : return address
1022 // -- esp[4] : key 1022 // -- esp[4] : key
1023 // -- esp[8] : receiver 1023 // -- esp[8] : receiver
1024 // ----------------------------------- 1024 // -----------------------------------
1025 1025
1026 // Move the return address below the arguments. 1026 // Move the return address below the arguments.
1027 __ pop(ebx); 1027 __ pop(ebx);
1028 __ push(Operand(esp, 1 * kPointerSize)); 1028 __ push(Operand(esp, 1 * kPointerSize));
1029 __ push(ecx); 1029 __ push(ecx);
1030 __ push(eax); 1030 __ push(eax);
1031 __ push(ebx); 1031 __ push(ebx);
1032 1032
1033 // Do tail-call to runtime routine. 1033 // Do tail-call to runtime routine.
1034 __ TailCallRuntime( 1034 __ TailCallRuntime(
1035 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3); 1035 ExternalReference(IC_Utility(kSharedStoreIC_ExtendStorage)), 3, 1);
1036 } 1036 }
1037 1037
1038 #undef __ 1038 #undef __
1039 1039
1040 1040
1041 } } // namespace v8::internal 1041 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698