Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index 61b59edf868c08b11cd80ef246550d679f2df753..ec964280072cfcd3e32b80449670e450536506b0 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -707,8 +707,10 @@ void MacroAssembler::PopFixedFrame(Register marker_reg) { |
// Push and pop all registers that can hold pointers. |
void MacroAssembler::PushSafepointRegisters() { |
- // Safepoints expect a block of contiguous register values starting with r0: |
- DCHECK(((1 << kNumSafepointSavedRegisters) - 1) == kSafepointSavedRegisters); |
+ // Safepoints expect a block of contiguous register values starting with r0. |
+ // except when FLAG_enable_embedded_constant_pool, which omits pp. |
+ DCHECK(FLAG_enable_embedded_constant_pool || |
+ ((1 << kNumSafepointSavedRegisters) - 1) == kSafepointSavedRegisters); |
// Safepoints expect a block of kNumSafepointRegisters values on the |
// stack, so adjust the stack for unsaved registers. |
const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; |
@@ -738,6 +740,10 @@ void MacroAssembler::LoadFromSafepointRegisterSlot(Register dst, Register src) { |
int MacroAssembler::SafepointRegisterStackIndex(int reg_code) { |
// The registers are pushed starting with the highest encoding, |
// which means that lowest encodings are closest to the stack pointer. |
+ if (FLAG_enable_embedded_constant_pool && reg_code > pp.code()) { |
+ // RegList omits pp. |
+ reg_code -= 1; |
+ } |
DCHECK(reg_code >= 0 && reg_code < kNumSafepointRegisters); |
return reg_code; |
} |