A64: Fix int32 use in Lithium string functions
Assert register sizes in StringCharLoadGenerator, and fix char_code comparison in DoStringCharFromCode. BUG= R=jochen@chromium.org Review URL: https://codereview.chromium.org/172483002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19503 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
672bc20af8
commit
6a043c1d33
@ -3540,7 +3540,7 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
|
|||||||
|
|
||||||
StringCharLoadGenerator::Generate(masm,
|
StringCharLoadGenerator::Generate(masm,
|
||||||
object_,
|
object_,
|
||||||
index_,
|
index_.W(),
|
||||||
result_,
|
result_,
|
||||||
&call_runtime_);
|
&call_runtime_);
|
||||||
__ SmiTag(result_);
|
__ SmiTag(result_);
|
||||||
|
@ -410,6 +410,7 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm,
|
|||||||
Register index,
|
Register index,
|
||||||
Register result,
|
Register result,
|
||||||
Label* call_runtime) {
|
Label* call_runtime) {
|
||||||
|
ASSERT(string.Is64Bits() && index.Is32Bits() && result.Is64Bits());
|
||||||
// Fetch the instance type of the receiver into result register.
|
// Fetch the instance type of the receiver into result register.
|
||||||
__ Ldr(result, FieldMemOperand(string, HeapObject::kMapOffset));
|
__ Ldr(result, FieldMemOperand(string, HeapObject::kMapOffset));
|
||||||
__ Ldrb(result, FieldMemOperand(result, Map::kInstanceTypeOffset));
|
__ Ldrb(result, FieldMemOperand(result, Map::kInstanceTypeOffset));
|
||||||
@ -424,10 +425,10 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm,
|
|||||||
|
|
||||||
// Handle slices.
|
// Handle slices.
|
||||||
Label indirect_string_loaded;
|
Label indirect_string_loaded;
|
||||||
__ Ldrsw(result,
|
__ Ldr(result.W(),
|
||||||
UntagSmiFieldMemOperand(string, SlicedString::kOffsetOffset));
|
UntagSmiFieldMemOperand(string, SlicedString::kOffsetOffset));
|
||||||
__ Ldr(string, FieldMemOperand(string, SlicedString::kParentOffset));
|
__ Ldr(string, FieldMemOperand(string, SlicedString::kParentOffset));
|
||||||
__ Add(index, index, result);
|
__ Add(index, index, result.W());
|
||||||
__ B(&indirect_string_loaded);
|
__ B(&indirect_string_loaded);
|
||||||
|
|
||||||
// Handle cons strings.
|
// Handle cons strings.
|
||||||
@ -479,11 +480,11 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm,
|
|||||||
STATIC_ASSERT(kTwoByteStringTag == 0);
|
STATIC_ASSERT(kTwoByteStringTag == 0);
|
||||||
__ TestAndBranchIfAnySet(result, kStringEncodingMask, &ascii);
|
__ TestAndBranchIfAnySet(result, kStringEncodingMask, &ascii);
|
||||||
// Two-byte string.
|
// Two-byte string.
|
||||||
__ Ldrh(result, MemOperand(string, index, LSL, 1));
|
__ Ldrh(result, MemOperand(string, index, SXTW, 1));
|
||||||
__ B(&done);
|
__ B(&done);
|
||||||
__ Bind(&ascii);
|
__ Bind(&ascii);
|
||||||
// Ascii string.
|
// Ascii string.
|
||||||
__ Ldrb(result, MemOperand(string, index));
|
__ Ldrb(result, MemOperand(string, index, SXTW));
|
||||||
__ Bind(&done);
|
__ Bind(&done);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,8 @@ class StringCharLoadGenerator : public AllStatic {
|
|||||||
public:
|
public:
|
||||||
// Generates the code for handling different string types and loading the
|
// Generates the code for handling different string types and loading the
|
||||||
// indexed character into |result|. We expect |index| as untagged input and
|
// indexed character into |result|. We expect |index| as untagged input and
|
||||||
// |result| as untagged output.
|
// |result| as untagged output. Register index is asserted to be a 32-bit W
|
||||||
|
// register.
|
||||||
static void Generate(MacroAssembler* masm,
|
static void Generate(MacroAssembler* masm,
|
||||||
Register string,
|
Register string,
|
||||||
Register index,
|
Register index,
|
||||||
|
@ -5161,7 +5161,7 @@ void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) {
|
|||||||
|
|
||||||
StringCharLoadGenerator::Generate(masm(),
|
StringCharLoadGenerator::Generate(masm(),
|
||||||
ToRegister(instr->string()),
|
ToRegister(instr->string()),
|
||||||
ToRegister(instr->index()),
|
ToRegister32(instr->index()),
|
||||||
ToRegister(instr->result()),
|
ToRegister(instr->result()),
|
||||||
deferred->entry());
|
deferred->entry());
|
||||||
__ Bind(deferred->exit());
|
__ Bind(deferred->exit());
|
||||||
@ -5208,13 +5208,13 @@ void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) {
|
|||||||
new(zone()) DeferredStringCharFromCode(this, instr);
|
new(zone()) DeferredStringCharFromCode(this, instr);
|
||||||
|
|
||||||
ASSERT(instr->hydrogen()->value()->representation().IsInteger32());
|
ASSERT(instr->hydrogen()->value()->representation().IsInteger32());
|
||||||
Register char_code = ToRegister(instr->char_code());
|
Register char_code = ToRegister32(instr->char_code());
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
|
|
||||||
__ Cmp(char_code, Operand(String::kMaxOneByteCharCode));
|
__ Cmp(char_code, String::kMaxOneByteCharCode);
|
||||||
__ B(hi, deferred->entry());
|
__ B(hi, deferred->entry());
|
||||||
__ LoadRoot(result, Heap::kSingleCharacterStringCacheRootIndex);
|
__ LoadRoot(result, Heap::kSingleCharacterStringCacheRootIndex);
|
||||||
__ Add(result, result, Operand(char_code, LSL, kPointerSizeLog2));
|
__ Add(result, result, Operand(char_code, SXTW, kPointerSizeLog2));
|
||||||
__ Ldr(result, FieldMemOperand(result, FixedArray::kHeaderSize));
|
__ Ldr(result, FieldMemOperand(result, FixedArray::kHeaderSize));
|
||||||
__ CompareRoot(result, Heap::kUndefinedValueRootIndex);
|
__ CompareRoot(result, Heap::kUndefinedValueRootIndex);
|
||||||
__ B(eq, deferred->entry());
|
__ B(eq, deferred->entry());
|
||||||
|
Loading…
Reference in New Issue
Block a user