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

Side by Side Diff: src/ia32/code-stubs-ia32.cc

Issue 8539011: ARM: Implement runtime function for array literal transitions. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: review feedback Created 9 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « src/builtins.cc ('k') | src/objects.h » ('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 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
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
OLDNEW
« no previous file with comments | « src/builtins.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698