Revision: 4559
Author: [email protected]
Date: Mon May 3 00:44:55 2010
Log: X64: Update allocation to work with no scratch registers at all.
Review URL: http://codereview.chromium.org/1856001
http://code.google.com/p/v8/source/detail?r=4559
Modified:
/branches/bleeding_edge/src/x64/macro-assembler-x64.cc
/branches/bleeding_edge/src/x64/macro-assembler-x64.h
=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Thu Apr 29
05:52:09 2010
+++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Mon May 3
00:44:55 2010
@@ -2346,7 +2346,7 @@
// Just return if allocation top is already known.
if ((flags & RESULT_CONTAINS_TOP) != 0) {
// No use of scratch if allocation top is provided.
- ASSERT(scratch.is(no_reg));
+ ASSERT(!scratch.is_valid());
#ifdef DEBUG
// Assert that result actually contains top on entry.
movq(kScratchRegister, new_space_allocation_top);
@@ -2357,9 +2357,13 @@
}
// Move address of new object to result. Use scratch register if
available.
- if (scratch.is(no_reg)) {
- movq(kScratchRegister, new_space_allocation_top);
- movq(result, Operand(kScratchRegister, 0));
+ if (!scratch.is_valid()) {
+ if (result.is(rax)) {
+ load_rax(new_space_allocation_top);
+ } else {
+ movq(kScratchRegister, new_space_allocation_top);
+ movq(result, Operand(kScratchRegister, 0));
+ }
} else {
ASSERT(!scratch.is(result_end));
movq(scratch, new_space_allocation_top);
@@ -2384,7 +2388,7 @@
store_rax(new_space_allocation_top);
} else {
// Register required - use scratch provided if available.
- if (scratch.is(no_reg)) {
+ if (!scratch.is_valid()) {
movq(kScratchRegister, new_space_allocation_top);
movq(Operand(kScratchRegister, 0), result_end);
} else {
@@ -2408,16 +2412,25 @@
// Calculate new top and bail out if new space is exhausted.
ExternalReference new_space_allocation_limit =
ExternalReference::new_space_allocation_limit_address();
- lea(result_end, Operand(result, object_size));
+
+ Register top_reg = result_end.is_valid() ? result_end : result;
+
+ lea(top_reg, Operand(result, object_size));
movq(kScratchRegister, new_space_allocation_limit);
- cmpq(result_end, Operand(kScratchRegister, 0));
+ cmpq(top_reg, Operand(kScratchRegister, 0));
j(above, gc_required);
// Update allocation top.
- UpdateAllocationTopHelper(result_end, scratch);
-
- // Tag the result if requested.
- if ((flags & TAG_OBJECT) != 0) {
+ UpdateAllocationTopHelper(top_reg, scratch);
+
+ if (top_reg.is(result)) {
+ if ((flags & TAG_OBJECT) != 0) {
+ subq(result, Immediate(object_size - kHeapObjectTag));
+ } else {
+ subq(result, Immediate(object_size));
+ }
+ } else if ((flags & TAG_OBJECT) != 0) {
+ // Tag the result if requested.
addq(result, Immediate(kHeapObjectTag));
}
}
=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.h Thu Apr 29
05:52:09 2010
+++ /branches/bleeding_edge/src/x64/macro-assembler-x64.h Mon May 3
00:44:55 2010
@@ -778,10 +778,17 @@
void LeaveFrame(StackFrame::Type type);
// Allocation support helpers.
+ // Loads the top of new-space into the result register.
+ // If flags contains RESULT_CONTAINS_TOP then result_end is valid and
+ // already contains the top of new-space, and scratch is invalid.
+ // Otherwise the address of the new-space top is loaded into scratch (if
+ // scratch is valid), and the new-space top is loaded into result.
void LoadAllocationTopHelper(Register result,
Register result_end,
Register scratch,
AllocationFlags flags);
+ // Update allocation top with value in result_end register.
+ // If scratch is valid, it contains the address of the allocation top.
void UpdateAllocationTopHelper(Register result_end, Register scratch);
};
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev