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

Unified Diff: src/ia32/codegen-ia32.cc

Issue 11663005: Adapt Danno's Track Allocation Info idea to fast literals. When allocating a literal array, (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Always use in ICs, and moved feature behind a flag Created 8 years 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 side-by-side diff with in-line comments
Download patch
Index: src/ia32/codegen-ia32.cc
diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc
index 9477bf149af68bc90a24c5a5de6a40dee46894fe..3bb0ee4c68015a2af9722cbef9a1b12b05b1928f 100644
--- a/src/ia32/codegen-ia32.cc
+++ b/src/ia32/codegen-ia32.cc
@@ -388,6 +388,44 @@ OS::MemCopyFunction CreateMemCopyFunction() {
#define __ ACCESS_MASM(masm)
+
+static void PerformAllocationSiteInfoCheck(MacroAssembler* masm,
+ Label* defer_to_runtime,
+ Label* no_info_available) {
danno 2012/12/26 10:32:01 This might be better as a method directly on Macro
mvstanton 2013/01/03 14:40:43 Done.
+ // ----------- S t a t e -------------
+ // -- eax : value
+ // -- ebx : target map
+ // -- ecx : key
+ // -- edx : receiver
danno 2012/12/26 10:32:01 This comment isn't correct any more, I think.
mvstanton 2013/01/03 14:40:43 I changed it to just talk about edx and edi, the o
+ // -- esp[0] : return address
+ //
+ // edi is clobbered.
+ // -----------------------------------
+ masm->JumpIfNotInNewSpace(edx, edi, no_info_available, Label::kNear);
+
+ // Make sure we aren't just at the top of new space.
+ ExternalReference new_space_allocation_top =
+ ExternalReference::new_space_allocation_top_address(masm->isolate());
+ __ lea(edi, Operand(edx, JSArray::kSize + AllocationSiteInfo::kSize));
+
+ __ cmp(edi, Operand::StaticVariable(new_space_allocation_top));
+ __ j(greater_equal, no_info_available);
+
+ __ mov(edi, FieldOperand(edi, AllocationSiteInfo::kMapOffset -
+ AllocationSiteInfo::kSize));
+ __ cmp(edi, Immediate(Handle<Map>(masm->isolate()->heap()->
danno 2012/12/26 10:32:01 This entire check might be useful as a method dire
mvstanton 2013/01/03 14:40:43 Added issue http://code.google.com/p/v8/issues/det
+ allocation_site_info_map())));
+
+ // Use the j/jmp sequence below for debugging, but the j(equal) sequence
+ // for production.
+ // __ j(not_equal, no_info_available);
+ // __ int3();
+ // __ jmp(defer_to_runtime);
+ // or
+ __ j(equal, defer_to_runtime);
+}
+
+
void ElementsTransitionGenerator::GenerateMapChangeElementsTransition(
MacroAssembler* masm) {
// ----------- S t a t e -------------
@@ -420,6 +458,12 @@ void ElementsTransitionGenerator::GenerateSmiToDouble(
// -----------------------------------
Label loop, entry, convert_hole, gc_required, only_change_map;
+ if (FLAG_use_allocation_site_info) {
+ Label no_allocation_site_info;
+ PerformAllocationSiteInfoCheck(masm, fail, &no_allocation_site_info);
+ __ bind(&no_allocation_site_info);
+ }
+
// Check for empty arrays, which only require a map transition and no changes
// to the backing store.
__ mov(edi, FieldOperand(edx, JSObject::kElementsOffset));
@@ -568,6 +612,12 @@ void ElementsTransitionGenerator::GenerateDoubleToObject(
// -----------------------------------
Label loop, entry, convert_hole, gc_required, only_change_map, success;
+ if (FLAG_use_allocation_site_info) {
+ Label no_allocation_site_info;
+ PerformAllocationSiteInfoCheck(masm, fail, &no_allocation_site_info);
+ __ bind(&no_allocation_site_info);
danno 2012/12/26 10:32:01 I like the idea to not pre-transition any arrays t
mvstanton 2013/01/03 14:40:43 I'm trying this out on all platforms with that sec
+ }
+
// Check for empty arrays, which only require a map transition and no changes
// to the backing store.
__ mov(edi, FieldOperand(edx, JSObject::kElementsOffset));

Powered by Google App Engine
This is Rietveld 408576698