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
parent 672bc20a
...@@ -3540,7 +3540,7 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 { ...@@ -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) { ...@@ -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) { ...@@ -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());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment