Index: src/compiler/frame.h |
diff --git a/src/compiler/frame.h b/src/compiler/frame.h |
index 8d463dfb78d3cc4b22c1160de2c38a71685d2953..a4d6829cfa843d8c06254cce61f6b5f0194a0fbc 100644 |
--- a/src/compiler/frame.h |
+++ b/src/compiler/frame.h |
@@ -113,9 +113,9 @@ class Frame : public ZoneObject { |
int AllocateSpillSlot(int width) { |
int frame_slot_count_before = frame_slot_count_; |
- int slot = AllocateAlignedFrameSlot(width); |
- spill_slot_count_ += (frame_slot_count_ - frame_slot_count_before); |
- return slot; |
+ AllocateAlignedFrameSlots(width); |
+ spill_slot_count_ += frame_slot_count_ - frame_slot_count_before; |
+ return frame_slot_count_ - 1; |
} |
int AlignFrame(int alignment = kDoubleSize); |
@@ -131,23 +131,15 @@ class Frame : public ZoneObject { |
static const int kJSFunctionSlot = 3 + StandardFrameConstants::kCPSlotCount; |
private: |
- int AllocateAlignedFrameSlot(int width) { |
- DCHECK(width == 4 || width == 8 || width == 16); |
- if (kPointerSize == 4) { |
- // Skip one slot if necessary. |
- if (width > kPointerSize) { |
- frame_slot_count_++; |
- frame_slot_count_ |= 1; |
- // 2 extra slots if width == 16. |
- frame_slot_count_ += (width & 16) / 8; |
- } |
- } else { |
- // No alignment when slots are 8 bytes. |
- DCHECK_EQ(8, kPointerSize); |
- // 1 extra slot if width == 16. |
- frame_slot_count_ += (width & 16) / 16; |
- } |
- return frame_slot_count_++; |
+ void AllocateAlignedFrameSlots(int width) { |
+ DCHECK_LT(0, width); |
+ int new_frame_slots = (width + kPointerSize - 1) / kPointerSize; |
+ // Align to 8 bytes if width is a multiple of 8 bytes, and to 16 bytes if |
+ // multiple of 16. |
+ int align_to = (width & 15) == 0 ? 16 : (width & 7) == 0 ? 8 : kPointerSize; |
+ frame_slot_count_ = |
+ RoundUp(frame_slot_count_ + new_frame_slots, align_to / kPointerSize); |
+ DCHECK_LT(0, frame_slot_count_); |
} |
private: |