Index: src/a64/lithium-codegen-a64.cc |
diff --git a/src/a64/lithium-codegen-a64.cc b/src/a64/lithium-codegen-a64.cc |
index 4766fa55fd078d3ad2d902732094fec8dc38cc0e..ad0ccfe8153e51afeea0811c688d509214e867a6 100644 |
--- a/src/a64/lithium-codegen-a64.cc |
+++ b/src/a64/lithium-codegen-a64.cc |
@@ -4643,8 +4643,7 @@ MemOperand LCodeGen::BuildSeqStringOperand(Register string, |
STATIC_ASSERT(kCharSize == 1); |
return FieldMemOperand(string, SeqString::kHeaderSize + offset); |
} |
- ASSERT(!temp.is(string)); |
- ASSERT(!temp.is(ToRegister(index))); |
+ |
if (encoding == String::ONE_BYTE_ENCODING) { |
__ Add(temp, string, Operand(ToRegister32(index), SXTW)); |
} else { |
@@ -4662,15 +4661,21 @@ void LCodeGen::DoSeqStringGetChar(LSeqStringGetChar* instr) { |
Register temp = ToRegister(instr->temp()); |
if (FLAG_debug_code) { |
- __ Ldr(temp, FieldMemOperand(string, HeapObject::kMapOffset)); |
- __ Ldrb(temp, FieldMemOperand(temp, Map::kInstanceTypeOffset)); |
+ // Even though this lithium instruction comes with a temp register, we |
+ // can't use it here because we want to use "AtStart" constraints on the |
+ // inputs and the debug code here needs a scratch register. |
+ UseScratchRegisterScope temps(masm()); |
+ Register dbg_temp = temps.AcquireX(); |
+ |
+ __ Ldr(dbg_temp, FieldMemOperand(string, HeapObject::kMapOffset)); |
+ __ Ldrb(dbg_temp, FieldMemOperand(dbg_temp, Map::kInstanceTypeOffset)); |
- __ And(temp, temp, |
+ __ And(dbg_temp, dbg_temp, |
Operand(kStringRepresentationMask | kStringEncodingMask)); |
static const uint32_t one_byte_seq_type = kSeqStringTag | kOneByteStringTag; |
static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag; |
- __ Cmp(temp, Operand(encoding == String::ONE_BYTE_ENCODING |
- ? one_byte_seq_type : two_byte_seq_type)); |
+ __ Cmp(dbg_temp, Operand(encoding == String::ONE_BYTE_ENCODING |
+ ? one_byte_seq_type : two_byte_seq_type)); |
__ Check(eq, kUnexpectedStringType); |
} |