From c554faa74d8085b62f11924936f068ce0ef2e1cc Mon Sep 17 00:00:00 2001 From: "ager@chromium.org" Date: Thu, 3 Feb 2011 17:01:10 +0000 Subject: [PATCH] X64: Implement FixedArrayLength, BoundsCheck, LoadElements, LoadKeyedFastElement in lithium codegen. Tested locally by hardcoding DoTaggedToI to convert smis to untagged. Review URL: http://codereview.chromium.org/6312124 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6625 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x64/lithium-codegen-x64.cc | 40 ++++++++++++++++++++++++++++++++++++---- src/x64/lithium-x64.cc | 20 ++++++++++++-------- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 0bf218d..70269f9 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -668,7 +668,9 @@ void LCodeGen::DoJSArrayLength(LJSArrayLength* instr) { void LCodeGen::DoFixedArrayLength(LFixedArrayLength* instr) { - Abort("Unimplemented: %s", "DoFixedArrayLength"); + Register result = ToRegister(instr->result()); + Register array = ToRegister(instr->InputAt(0)); + __ movq(result, FieldOperand(array, FixedArray::kLengthOffset)); } @@ -1446,7 +1448,19 @@ void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { void LCodeGen::DoLoadElements(LLoadElements* instr) { - Abort("Unimplemented: %s", "DoLoadElements"); + ASSERT(instr->result()->Equals(instr->InputAt(0))); + Register reg = ToRegister(instr->InputAt(0)); + __ movq(reg, FieldOperand(reg, JSObject::kElementsOffset)); + if (FLAG_debug_code) { + NearLabel done; + __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), + Factory::fixed_array_map()); + __ j(equal, &done); + __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), + Factory::fixed_cow_array_map()); + __ Check(equal, "Check for fast elements failed."); + __ bind(&done); + } } @@ -1456,7 +1470,20 @@ void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) { void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { - Abort("Unimplemented: %s", "DoLoadKeyedFastElement"); + Register elements = ToRegister(instr->elements()); + Register key = ToRegister(instr->key()); + Register result = ToRegister(instr->result()); + ASSERT(result.is(elements)); + + // Load the result. + __ movq(result, FieldOperand(elements, + key, + times_pointer_size, + FixedArray::kHeaderSize)); + + // Check for the hole value. + __ Cmp(result, Factory::the_hole_value()); + DeoptimizeIf(equal, instr->environment()); } @@ -1691,7 +1718,12 @@ void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { - Abort("Unimplemented: %s", "DoBoundsCheck"); + if (instr->length()->IsRegister()) { + __ cmpq(ToRegister(instr->index()), ToRegister(instr->length())); + } else { + __ cmpq(ToRegister(instr->index()), ToOperand(instr->length())); + } + DeoptimizeIf(above_equal, instr->environment()); } diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc index c20a619..c113f12 100644 --- a/src/x64/lithium-x64.cc +++ b/src/x64/lithium-x64.cc @@ -1325,8 +1325,8 @@ LInstruction* LChunkBuilder::DoJSArrayLength(HJSArrayLength* instr) { LInstruction* LChunkBuilder::DoFixedArrayLength(HFixedArrayLength* instr) { - Abort("Unimplemented: %s", "DoFixedArrayLength"); - return NULL; + LOperand* array = UseRegisterAtStart(instr->value()); + return DefineAsRegister(new LFixedArrayLength(array)); } @@ -1337,8 +1337,8 @@ LInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) { LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { - Abort("Unimplemented: %s", "DoBoundsCheck"); - return NULL; + return AssignEnvironment(new LBoundsCheck(UseRegisterAtStart(instr->index()), + Use(instr->length()))); } @@ -1523,15 +1523,19 @@ LInstruction* LChunkBuilder::DoLoadFunctionPrototype( LInstruction* LChunkBuilder::DoLoadElements(HLoadElements* instr) { - Abort("Unimplemented: %s", "DoLoadElements"); - return NULL; + LOperand* input = UseRegisterAtStart(instr->value()); + return DefineSameAsFirst(new LLoadElements(input)); } LInstruction* LChunkBuilder::DoLoadKeyedFastElement( HLoadKeyedFastElement* instr) { - Abort("Unimplemented: %s", "DoLoadKeyedFastElement"); - return NULL; + ASSERT(instr->representation().IsTagged()); + ASSERT(instr->key()->representation().IsInteger32()); + LOperand* obj = UseRegisterAtStart(instr->object()); + LOperand* key = UseRegisterAtStart(instr->key()); + LLoadKeyedFastElement* result = new LLoadKeyedFastElement(obj, key); + return AssignEnvironment(DefineSameAsFirst(result)); } -- 2.7.4