| OLD | NEW |
| 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 |
| 11 // with the distribution. | 11 // with the distribution. |
| 12 // * Neither the name of Google Inc. nor the names of its | 12 // * Neither the name of Google Inc. nor the names of its |
| 13 // contributors may be used to endorse or promote products derived | 13 // contributors may be used to endorse or promote products derived |
| 14 // from this software without specific prior written permission. | 14 // from this software without specific prior written permission. |
| 15 // | 15 // |
| 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 #include "v8.h" | 28 #include "v8.h" |
| 29 | 29 |
| 30 #if defined(V8_TARGET_ARCH_IA32) |
| 31 |
| 30 #include "codegen-inl.h" | 32 #include "codegen-inl.h" |
| 31 | 33 |
| 32 namespace v8 { | 34 namespace v8 { |
| 33 namespace internal { | 35 namespace internal { |
| 34 | 36 |
| 35 | 37 |
| 36 #define __ ACCESS_MASM(masm) | 38 #define __ ACCESS_MASM(masm) |
| 37 | 39 |
| 38 | 40 |
| 39 void Builtins::Generate_Adaptor(MacroAssembler* masm, | 41 void Builtins::Generate_Adaptor(MacroAssembler* masm, |
| (...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 Register array_function, // Array function. | 801 Register array_function, // Array function. |
| 800 Register array_size, // As a smi, cannot be 0. | 802 Register array_size, // As a smi, cannot be 0. |
| 801 Register result, | 803 Register result, |
| 802 Register elements_array, | 804 Register elements_array, |
| 803 Register elements_array_end, | 805 Register elements_array_end, |
| 804 Register scratch, | 806 Register scratch, |
| 805 bool fill_with_hole, | 807 bool fill_with_hole, |
| 806 Label* gc_required) { | 808 Label* gc_required) { |
| 807 ASSERT(scratch.is(edi)); // rep stos destination | 809 ASSERT(scratch.is(edi)); // rep stos destination |
| 808 ASSERT(!fill_with_hole || array_size.is(ecx)); // rep stos count | 810 ASSERT(!fill_with_hole || array_size.is(ecx)); // rep stos count |
| 811 ASSERT(!fill_with_hole || !result.is(eax)); // result is never eax |
| 809 | 812 |
| 810 // Load the initial map from the array function. | 813 // Load the initial map from the array function. |
| 811 __ mov(elements_array, | 814 __ mov(elements_array, |
| 812 FieldOperand(array_function, | 815 FieldOperand(array_function, |
| 813 JSFunction::kPrototypeOrInitialMapOffset)); | 816 JSFunction::kPrototypeOrInitialMapOffset)); |
| 814 | 817 |
| 815 // Allocate the JSArray object together with space for a FixedArray with the | 818 // Allocate the JSArray object together with space for a FixedArray with the |
| 816 // requested elements. | 819 // requested elements. |
| 817 ASSERT(kSmiTagSize == 1 && kSmiTag == 0); | 820 ASSERT(kSmiTagSize == 1 && kSmiTag == 0); |
| 818 __ AllocateInNewSpace(JSArray::kSize + FixedArray::kHeaderSize, | 821 __ AllocateInNewSpace(JSArray::kSize + FixedArray::kHeaderSize, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 // For non-empty JSArrays the length of the FixedArray and the JSArray is the | 859 // For non-empty JSArrays the length of the FixedArray and the JSArray is the |
| 857 // same. | 860 // same. |
| 858 __ mov(FieldOperand(elements_array, Array::kLengthOffset), array_size); | 861 __ mov(FieldOperand(elements_array, Array::kLengthOffset), array_size); |
| 859 | 862 |
| 860 // Fill the allocated FixedArray with the hole value if requested. | 863 // Fill the allocated FixedArray with the hole value if requested. |
| 861 // result: JSObject | 864 // result: JSObject |
| 862 // elements_array: elements array | 865 // elements_array: elements array |
| 863 if (fill_with_hole) { | 866 if (fill_with_hole) { |
| 864 __ lea(edi, Operand(elements_array, | 867 __ lea(edi, Operand(elements_array, |
| 865 FixedArray::kHeaderSize - kHeapObjectTag)); | 868 FixedArray::kHeaderSize - kHeapObjectTag)); |
| 866 | |
| 867 __ push(eax); | |
| 868 __ mov(eax, Factory::the_hole_value()); | 869 __ mov(eax, Factory::the_hole_value()); |
| 869 | |
| 870 __ cld(); | 870 __ cld(); |
| 871 // Do not use rep stos when filling less than kRepStosThreshold |
| 872 // words. |
| 873 const int kRepStosThreshold = 16; |
| 874 Label loop, entry, done; |
| 875 __ cmp(ecx, kRepStosThreshold); |
| 876 __ j(below, &loop); // Note: ecx > 0. |
| 871 __ rep_stos(); | 877 __ rep_stos(); |
| 872 | 878 __ jmp(&done); |
| 873 // Restore saved registers. | 879 __ bind(&loop); |
| 874 __ pop(eax); | 880 __ stos(); |
| 881 __ bind(&entry); |
| 882 __ cmp(edi, Operand(elements_array_end)); |
| 883 __ j(below, &loop); |
| 884 __ bind(&done); |
| 875 } | 885 } |
| 876 } | 886 } |
| 877 | 887 |
| 878 | 888 |
| 879 // Create a new array for the built-in Array function. This function allocates | 889 // 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. | 890 // 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 | 891 // If the Array cannot be constructed in native code the runtime is called. This |
| 882 // function assumes the following state: | 892 // function assumes the following state: |
| 883 // edi: constructor (built-in Array function) | 893 // edi: constructor (built-in Array function) |
| 884 // eax: argc | 894 // eax: argc |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 | 973 |
| 964 // edx: array_size (smi) | 974 // edx: array_size (smi) |
| 965 // edi: constructor | 975 // edi: constructor |
| 966 // esp[0]: argc (cannot be 0 here) | 976 // esp[0]: argc (cannot be 0 here) |
| 967 // esp[4]: constructor (only if construct_call) | 977 // esp[4]: constructor (only if construct_call) |
| 968 // esp[8]: return address | 978 // esp[8]: return address |
| 969 // esp[C]: argument | 979 // esp[C]: argument |
| 970 AllocateJSArray(masm, | 980 AllocateJSArray(masm, |
| 971 edi, | 981 edi, |
| 972 ecx, | 982 ecx, |
| 983 ebx, |
| 973 eax, | 984 eax, |
| 974 ebx, | |
| 975 edx, | 985 edx, |
| 976 edi, | 986 edi, |
| 977 true, | 987 true, |
| 978 &prepare_generic_code_call); | 988 &prepare_generic_code_call); |
| 979 __ IncrementCounter(&Counters::array_function_native, 1); | 989 __ IncrementCounter(&Counters::array_function_native, 1); |
| 990 __ mov(eax, ebx); |
| 980 __ pop(ebx); | 991 __ pop(ebx); |
| 981 if (construct_call) { | 992 if (construct_call) { |
| 982 __ pop(edi); | 993 __ pop(edi); |
| 983 } | 994 } |
| 984 __ ret(2 * kPointerSize); | 995 __ ret(2 * kPointerSize); |
| 985 | 996 |
| 986 // Handle construction of an array from a list of arguments. | 997 // Handle construction of an array from a list of arguments. |
| 987 __ bind(&argc_two_or_more); | 998 __ bind(&argc_two_or_more); |
| 988 ASSERT(kSmiTag == 0); | 999 ASSERT(kSmiTag == 0); |
| 989 __ SmiTag(eax); // Convet argc to a smi. | 1000 __ SmiTag(eax); // Convet argc to a smi. |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 // Dont adapt arguments. | 1251 // Dont adapt arguments. |
| 1241 // ------------------------------------------- | 1252 // ------------------------------------------- |
| 1242 __ bind(&dont_adapt_arguments); | 1253 __ bind(&dont_adapt_arguments); |
| 1243 __ jmp(Operand(edx)); | 1254 __ jmp(Operand(edx)); |
| 1244 } | 1255 } |
| 1245 | 1256 |
| 1246 | 1257 |
| 1247 #undef __ | 1258 #undef __ |
| 1248 | 1259 |
| 1249 } } // namespace v8::internal | 1260 } } // namespace v8::internal |
| 1261 |
| 1262 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |