OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 7026 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7037 // -- esp[0] : return address | 7037 // -- esp[0] : return address |
7038 // ----------------------------------- | 7038 // ----------------------------------- |
7039 | 7039 |
7040 Label element_done; | 7040 Label element_done; |
7041 Label double_elements; | 7041 Label double_elements; |
7042 Label smi_element; | 7042 Label smi_element; |
7043 Label slow_elements; | 7043 Label slow_elements; |
7044 Label slow_elements_from_double; | 7044 Label slow_elements_from_double; |
7045 Label fast_elements; | 7045 Label fast_elements; |
7046 | 7046 |
7047 if (!FLAG_trace_elements_transitions) { | 7047 __ CheckFastElements(edi, &double_elements); |
7048 __ CheckFastElements(edi, &double_elements); | |
7049 | 7048 |
7050 // FAST_SMI_ONLY_ELEMENTS or FAST_ELEMENTS | 7049 // FAST_SMI_ONLY_ELEMENTS or FAST_ELEMENTS |
7051 __ JumpIfSmi(eax, &smi_element); | 7050 __ JumpIfSmi(eax, &smi_element); |
7052 __ CheckFastSmiOnlyElements(edi, &fast_elements, Label::kNear); | 7051 __ CheckFastSmiOnlyElements(edi, &fast_elements, Label::kNear); |
7053 | 7052 |
7054 // Store into the array literal requires a elements transition. Call into | 7053 // Store into the array literal requires a elements transition. Call into |
7055 // the runtime. | 7054 // the runtime. |
7056 } | |
7057 | 7055 |
7058 __ bind(&slow_elements); | 7056 __ bind(&slow_elements); |
7059 __ pop(edi); // Pop return address and remember to put back later for tail | 7057 __ pop(edi); // Pop return address and remember to put back later for tail |
7060 // call. | 7058 // call. |
7061 __ push(ebx); | 7059 __ push(ebx); |
7062 __ push(ecx); | 7060 __ push(ecx); |
7063 __ push(eax); | 7061 __ push(eax); |
7064 __ mov(ebx, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); | 7062 __ mov(ebx, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); |
7065 __ push(FieldOperand(ebx, JSFunction::kLiteralsOffset)); | 7063 __ push(FieldOperand(ebx, JSFunction::kLiteralsOffset)); |
7066 __ push(edx); | 7064 __ push(edx); |
7067 __ push(edi); // Return return address so that tail call returns to right | 7065 __ push(edi); // Return return address so that tail call returns to right |
7068 // place. | 7066 // place. |
7069 __ TailCallRuntime(Runtime::kStoreArrayLiteralElement, 5, 1); | 7067 __ TailCallRuntime(Runtime::kStoreArrayLiteralElement, 5, 1); |
7070 | 7068 |
7071 if (!FLAG_trace_elements_transitions) { | 7069 __ bind(&slow_elements_from_double); |
7072 // Array literal has ElementsKind of FAST_DOUBLE_ELEMENTS. | 7070 __ pop(edx); |
7073 __ bind(&double_elements); | 7071 __ jmp(&slow_elements); |
7074 | 7072 |
7075 __ push(edx); | 7073 // Array literal has ElementsKind of FAST_ELEMENTS and value is an object. |
7076 __ mov(edx, FieldOperand(ebx, JSObject::kElementsOffset)); | 7074 __ bind(&fast_elements); |
7077 __ StoreNumberToDoubleElements(eax, | 7075 __ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset)); |
7078 edx, | 7076 __ lea(ecx, FieldOperand(ebx, ecx, times_half_pointer_size, |
7079 ecx, | 7077 FixedArrayBase::kHeaderSize)); |
7080 edi, | 7078 __ mov(Operand(ecx, 0), eax); |
7081 xmm0, | 7079 // Update the write barrier for the array store. |
7082 &slow_elements_from_double, | 7080 __ RecordWrite(ebx, ecx, eax, |
7083 false); | 7081 kDontSaveFPRegs, |
7084 __ pop(edx); | 7082 EMIT_REMEMBERED_SET, |
7085 __ jmp(&element_done); | 7083 OMIT_SMI_CHECK); |
| 7084 __ ret(0); |
7086 | 7085 |
7087 __ bind(&slow_elements_from_double); | 7086 // Array literal has ElementsKind of FAST_SMI_ONLY_ELEMENTS or |
7088 __ pop(edx); | 7087 // FAST_ELEMENTS, and value is Smi. |
7089 __ jmp(&slow_elements); | 7088 __ bind(&smi_element); |
| 7089 __ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset)); |
| 7090 __ mov(FieldOperand(ebx, ecx, times_half_pointer_size, |
| 7091 FixedArrayBase::kHeaderSize), eax); |
| 7092 __ ret(0); |
7090 | 7093 |
7091 // Array literal has ElementsKind of FAST_ELEMENTS and value is an object. | 7094 // Array literal has ElementsKind of FAST_DOUBLE_ELEMENTS. |
7092 __ bind(&fast_elements); | 7095 __ bind(&double_elements); |
7093 __ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset)); | |
7094 __ lea(ecx, FieldOperand(ebx, ecx, times_half_pointer_size, | |
7095 FixedArrayBase::kHeaderSize)); | |
7096 __ mov(Operand(ecx, 0), eax); | |
7097 // Update the write barrier for the array store. | |
7098 __ RecordWrite(ebx, ecx, eax, | |
7099 kDontSaveFPRegs, | |
7100 EMIT_REMEMBERED_SET, | |
7101 OMIT_SMI_CHECK); | |
7102 __ jmp(&element_done); | |
7103 | 7096 |
7104 // Array literal has ElementsKind of FAST_SMI_ONLY_ELEMENTS or | 7097 __ push(edx); |
7105 // FAST_ELEMENTS, and value is Smi. | 7098 __ mov(edx, FieldOperand(ebx, JSObject::kElementsOffset)); |
7106 __ bind(&smi_element); | 7099 __ StoreNumberToDoubleElements(eax, |
7107 __ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset)); | 7100 edx, |
7108 __ mov(FieldOperand(ebx, ecx, times_half_pointer_size, | 7101 ecx, |
7109 FixedArrayBase::kHeaderSize), eax); | 7102 edi, |
7110 // Fall through | 7103 xmm0, |
7111 __ bind(&element_done); | 7104 &slow_elements_from_double, |
7112 __ ret(0); | 7105 false); |
7113 } | 7106 __ pop(edx); |
| 7107 __ ret(0); |
7114 } | 7108 } |
7115 | 7109 |
7116 #undef __ | 7110 #undef __ |
7117 | 7111 |
7118 } } // namespace v8::internal | 7112 } } // namespace v8::internal |
7119 | 7113 |
7120 #endif // V8_TARGET_ARCH_IA32 | 7114 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |