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

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

Issue 2082006: Use direct loop when filling small arrays. (Closed)
Patch Set: Named constant added Created 10 years, 7 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
« no previous file with comments | « src/ia32/assembler-ia32.cc ('k') | src/ia32/disasm-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-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 788 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 Register array_function, // Array function. 799 Register array_function, // Array function.
800 Register array_size, // As a smi, cannot be 0. 800 Register array_size, // As a smi, cannot be 0.
801 Register result, 801 Register result,
802 Register elements_array, 802 Register elements_array,
803 Register elements_array_end, 803 Register elements_array_end,
804 Register scratch, 804 Register scratch,
805 bool fill_with_hole, 805 bool fill_with_hole,
806 Label* gc_required) { 806 Label* gc_required) {
807 ASSERT(scratch.is(edi)); // rep stos destination 807 ASSERT(scratch.is(edi)); // rep stos destination
808 ASSERT(!fill_with_hole || array_size.is(ecx)); // rep stos count 808 ASSERT(!fill_with_hole || array_size.is(ecx)); // rep stos count
809 ASSERT(!fill_with_hole || !result.is(eax)); // result is never eax
809 810
810 // Load the initial map from the array function. 811 // Load the initial map from the array function.
811 __ mov(elements_array, 812 __ mov(elements_array,
812 FieldOperand(array_function, 813 FieldOperand(array_function,
813 JSFunction::kPrototypeOrInitialMapOffset)); 814 JSFunction::kPrototypeOrInitialMapOffset));
814 815
815 // Allocate the JSArray object together with space for a FixedArray with the 816 // Allocate the JSArray object together with space for a FixedArray with the
816 // requested elements. 817 // requested elements.
817 ASSERT(kSmiTagSize == 1 && kSmiTag == 0); 818 ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
818 __ AllocateInNewSpace(JSArray::kSize + FixedArray::kHeaderSize, 819 __ AllocateInNewSpace(JSArray::kSize + FixedArray::kHeaderSize,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 // For non-empty JSArrays the length of the FixedArray and the JSArray is the 857 // For non-empty JSArrays the length of the FixedArray and the JSArray is the
857 // same. 858 // same.
858 __ mov(FieldOperand(elements_array, Array::kLengthOffset), array_size); 859 __ mov(FieldOperand(elements_array, Array::kLengthOffset), array_size);
859 860
860 // Fill the allocated FixedArray with the hole value if requested. 861 // Fill the allocated FixedArray with the hole value if requested.
861 // result: JSObject 862 // result: JSObject
862 // elements_array: elements array 863 // elements_array: elements array
863 if (fill_with_hole) { 864 if (fill_with_hole) {
864 __ lea(edi, Operand(elements_array, 865 __ lea(edi, Operand(elements_array,
865 FixedArray::kHeaderSize - kHeapObjectTag)); 866 FixedArray::kHeaderSize - kHeapObjectTag));
866
867 __ push(eax);
868 __ mov(eax, Factory::the_hole_value()); 867 __ mov(eax, Factory::the_hole_value());
869
870 __ cld(); 868 __ cld();
869 // Do not use rep stos when filling less than kRepStosThreshold
870 // words.
871 const int kRepStosThreshold = 16;
872 Label loop, entry, done;
873 __ cmp(ecx, kRepStosThreshold);
874 __ j(below, &loop); // Note: ecx > 0.
871 __ rep_stos(); 875 __ rep_stos();
872 876 __ jmp(&done);
873 // Restore saved registers. 877 __ bind(&loop);
874 __ pop(eax); 878 __ stos();
879 __ bind(&entry);
880 __ cmp(edi, Operand(elements_array_end));
881 __ j(below, &loop);
882 __ bind(&done);
875 } 883 }
876 } 884 }
877 885
878 886
879 // Create a new array for the built-in Array function. This function allocates 887 // Create a new array for the built-in Array function. This function allocates
880 // the JSArray object and the FixedArray elements array and initializes these. 888 // the JSArray object and the FixedArray elements array and initializes these.
881 // If the Array cannot be constructed in native code the runtime is called. This 889 // If the Array cannot be constructed in native code the runtime is called. This
882 // function assumes the following state: 890 // function assumes the following state:
883 // edi: constructor (built-in Array function) 891 // edi: constructor (built-in Array function)
884 // eax: argc 892 // eax: argc
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 971
964 // edx: array_size (smi) 972 // edx: array_size (smi)
965 // edi: constructor 973 // edi: constructor
966 // esp[0]: argc (cannot be 0 here) 974 // esp[0]: argc (cannot be 0 here)
967 // esp[4]: constructor (only if construct_call) 975 // esp[4]: constructor (only if construct_call)
968 // esp[8]: return address 976 // esp[8]: return address
969 // esp[C]: argument 977 // esp[C]: argument
970 AllocateJSArray(masm, 978 AllocateJSArray(masm,
971 edi, 979 edi,
972 ecx, 980 ecx,
981 ebx,
973 eax, 982 eax,
974 ebx,
975 edx, 983 edx,
976 edi, 984 edi,
977 true, 985 true,
978 &prepare_generic_code_call); 986 &prepare_generic_code_call);
979 __ IncrementCounter(&Counters::array_function_native, 1); 987 __ IncrementCounter(&Counters::array_function_native, 1);
988 __ mov(eax, ebx);
980 __ pop(ebx); 989 __ pop(ebx);
981 if (construct_call) { 990 if (construct_call) {
982 __ pop(edi); 991 __ pop(edi);
983 } 992 }
984 __ ret(2 * kPointerSize); 993 __ ret(2 * kPointerSize);
985 994
986 // Handle construction of an array from a list of arguments. 995 // Handle construction of an array from a list of arguments.
987 __ bind(&argc_two_or_more); 996 __ bind(&argc_two_or_more);
988 ASSERT(kSmiTag == 0); 997 ASSERT(kSmiTag == 0);
989 __ SmiTag(eax); // Convet argc to a smi. 998 __ SmiTag(eax); // Convet argc to a smi.
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1240 // Dont adapt arguments. 1249 // Dont adapt arguments.
1241 // ------------------------------------------- 1250 // -------------------------------------------
1242 __ bind(&dont_adapt_arguments); 1251 __ bind(&dont_adapt_arguments);
1243 __ jmp(Operand(edx)); 1252 __ jmp(Operand(edx));
1244 } 1253 }
1245 1254
1246 1255
1247 #undef __ 1256 #undef __
1248 1257
1249 } } // namespace v8::internal 1258 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ia32/assembler-ia32.cc ('k') | src/ia32/disasm-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698