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

Unified Diff: src/x64/macro-assembler-x64.cc

Issue 1899813003: [crankshaft] Fragmentation-free allocation folding. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
« src/heap/spaces.cc ('K') | « src/x64/macro-assembler-x64.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/x64/macro-assembler-x64.cc
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
index 1fdf22d3f2030c10c10e91d743b534e9b8b31232..63d4f8530e36851f5409adeb7bd1fdb8f44ef44c 100644
--- a/src/x64/macro-assembler-x64.cc
+++ b/src/x64/macro-assembler-x64.cc
@@ -4896,23 +4896,27 @@ void MacroAssembler::Allocate(int object_size,
MakeSureDoubleAlignedHelper(result, scratch, gc_required, flags);
}
- // Calculate new top and bail out if new space is exhausted.
- ExternalReference allocation_limit =
- AllocationUtils::GetAllocationLimitReference(isolate(), flags);
-
Register top_reg = result_end.is_valid() ? result_end : result;
if (!top_reg.is(result)) {
Benedikt Meurer 2016/04/19 07:25:39 We can fuse this movp and the addp into a single l
Hannes Payer (out of office) 2016/04/19 11:03:56 Done.
movp(top_reg, result);
}
addp(top_reg, Immediate(object_size));
- j(carry, gc_required);
- Operand limit_operand = ExternalOperand(allocation_limit);
- cmpp(top_reg, limit_operand);
- j(above, gc_required);
- // Update allocation top.
- UpdateAllocationTopHelper(top_reg, scratch, flags);
+ if ((flags & ALLOCATION_FOLDING_DOMINATED) == 0) {
+ j(carry, gc_required);
+ // Calculate new top and bail out if new space is exhausted.
Benedikt Meurer 2016/04/19 07:25:39 This comment is wrong here, as the calculation hap
Hannes Payer (out of office) 2016/04/19 11:03:56 Done.
+ ExternalReference allocation_limit =
+ AllocationUtils::GetAllocationLimitReference(isolate(), flags);
+ Operand limit_operand = ExternalOperand(allocation_limit);
+ cmpp(top_reg, limit_operand);
+ j(above, gc_required);
+ }
+
+ if ((flags & ALLOCATION_FOLDING_DOMINATOR) == 0) {
+ // Update allocation top.
+ UpdateAllocationTopHelper(top_reg, scratch, flags);
+ }
bool tag_result = (flags & TAG_OBJECT) != 0;
if (top_reg.is(result)) {
@@ -4972,20 +4976,25 @@ void MacroAssembler::Allocate(Register object_size,
MakeSureDoubleAlignedHelper(result, scratch, gc_required, flags);
}
- // Calculate new top and bail out if new space is exhausted.
- ExternalReference allocation_limit =
- AllocationUtils::GetAllocationLimitReference(isolate(), flags);
if (!object_size.is(result_end)) {
Benedikt Meurer 2016/04/19 07:25:38 Same here, see comment above.
Hannes Payer (out of office) 2016/04/19 11:03:56 Done.
movp(result_end, object_size);
}
addp(result_end, result);
- j(carry, gc_required);
- Operand limit_operand = ExternalOperand(allocation_limit);
- cmpp(result_end, limit_operand);
- j(above, gc_required);
- // Update allocation top.
- UpdateAllocationTopHelper(result_end, scratch, flags);
+ if ((flags & ALLOCATION_FOLDING_DOMINATED) == 0) {
+ j(carry, gc_required);
+ // Calculate new top and bail out if new space is exhausted.
Benedikt Meurer 2016/04/19 07:25:38 Same here, see comment above.
Hannes Payer (out of office) 2016/04/19 11:03:56 Done.
+ ExternalReference allocation_limit =
+ AllocationUtils::GetAllocationLimitReference(isolate(), flags);
+ Operand limit_operand = ExternalOperand(allocation_limit);
+ cmpp(result_end, limit_operand);
+ j(above, gc_required);
+ }
+
+ if ((flags & ALLOCATION_FOLDING_DOMINATOR) == 0) {
+ // Update allocation top.
+ UpdateAllocationTopHelper(result_end, scratch, flags);
+ }
// Tag the result if requested.
if ((flags & TAG_OBJECT) != 0) {
@@ -4993,6 +5002,14 @@ void MacroAssembler::Allocate(Register object_size,
}
}
+void MacroAssembler::SetTop(Register value, AllocationFlags flags) {
+ ExternalReference allocation_top =
+ AllocationUtils::GetAllocationTopReference(isolate(), flags);
+
+ subp(value, Immediate(kHeapObjectTag));
Benedikt Meurer 2016/04/19 07:25:39 How about this one instead? // TODO(hpayer): Chan
Hannes Payer (out of office) 2016/04/19 11:03:56 Store already uses the scratch register.
+ Store(allocation_top, value);
+ addp(value, Immediate(kHeapObjectTag));
+}
void MacroAssembler::AllocateHeapNumber(Register result,
Register scratch,
« src/heap/spaces.cc ('K') | « src/x64/macro-assembler-x64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698