Revision: 19900
Author: [email protected]
Date: Thu Mar 13 14:56:57 2014 UTC
Log: A64: Relax the register constraints for LSeqStringGetChar.
[email protected]
Review URL: https://codereview.chromium.org/197763006
http://code.google.com/p/v8/source/detail?r=19900
Modified:
/branches/bleeding_edge/src/a64/lithium-a64.cc
/branches/bleeding_edge/src/a64/lithium-codegen-a64.cc
=======================================
--- /branches/bleeding_edge/src/a64/lithium-a64.cc Thu Mar 13 13:18:48 2014
UTC
+++ /branches/bleeding_edge/src/a64/lithium-a64.cc Thu Mar 13 14:56:57 2014
UTC
@@ -2015,11 +2015,8 @@
LInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) {
- // TODO(all): Use UseRegisterAtStart and UseRegisterOrConstantAtStart
here.
- // We cannot do it now because the debug code in the implementation
changes
- // temp.
- LOperand* string = UseRegister(instr->string());
- LOperand* index = UseRegisterOrConstant(instr->index());
+ LOperand* string = UseRegisterAtStart(instr->string());
+ LOperand* index = UseRegisterOrConstantAtStart(instr->index());
LOperand* temp = TempRegister();
LSeqStringGetChar* result =
new(zone()) LSeqStringGetChar(string, index, temp);
=======================================
--- /branches/bleeding_edge/src/a64/lithium-codegen-a64.cc Thu Mar 13
13:18:48 2014 UTC
+++ /branches/bleeding_edge/src/a64/lithium-codegen-a64.cc Thu Mar 13
14:56:57 2014 UTC
@@ -4642,8 +4642,7 @@
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 {
@@ -4661,15 +4660,21 @@
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);
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.