| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index 984d4eb0a8f007041417c31004b15af4565afd5a..229f56a37263e10edcd0f4db9a67194d70729a81 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -1213,6 +1213,21 @@ void LCodeGen::DoExternalArrayLength(LExternalArrayLength* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoElementsKind(LElementsKind* instr) {
|
| + Register result = ToRegister(instr->result());
|
| + Register input = ToRegister(instr->InputAt(0));
|
| +
|
| + // Load map into |result|.
|
| + __ mov(result, FieldOperand(input, HeapObject::kMapOffset));
|
| + // Load map's "bit field 2" into |result|. We only need the first byte,
|
| + // but the following masking takes care of that anyway.
|
| + __ mov(result, FieldOperand(result, Map::kBitField2Offset));
|
| + // Retrieve elements_kind from bit field 2.
|
| + __ and_(result, Map::kElementsKindMask);
|
| + __ shr(result, Map::kElementsKindShift);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoValueOf(LValueOf* instr) {
|
| Register input = ToRegister(instr->InputAt(0));
|
| Register result = ToRegister(instr->result());
|
| @@ -1583,6 +1598,29 @@ void LCodeGen::DoCmpSymbolEqAndBranch(LCmpSymbolEqAndBranch* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoCmpWithConstant(LCmpWithConstant* instr) {
|
| + Register left = ToRegister(instr->InputAt(0));
|
| + Register result = ToRegister(instr->result());
|
| +
|
| + Label done;
|
| + __ cmp(left, instr->hydrogen()->right());
|
| + __ mov(result, factory()->true_value());
|
| + __ j(equal, &done, Label::kNear);
|
| + __ mov(result, factory()->false_value());
|
| + __ bind(&done);
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoCmpWithConstantAndBranch(LCmpWithConstantAndBranch* instr) {
|
| + Register left = ToRegister(instr->InputAt(0));
|
| + int true_block = chunk_->LookupDestination(instr->true_block_id());
|
| + int false_block = chunk_->LookupDestination(instr->false_block_id());
|
| +
|
| + __ cmp(left, instr->hydrogen()->right());
|
| + EmitBranch(true_block, false_block, equal);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoIsNull(LIsNull* instr) {
|
| Register reg = ToRegister(instr->InputAt(0));
|
| Register result = ToRegister(instr->result());
|
| @@ -2376,7 +2414,7 @@ void LCodeGen::DoLoadElements(LLoadElements* instr) {
|
| Register input = ToRegister(instr->InputAt(0));
|
| __ mov(result, FieldOperand(input, JSObject::kElementsOffset));
|
| if (FLAG_debug_code) {
|
| - Label done;
|
| + Label done, ok, fail;
|
| __ cmp(FieldOperand(result, HeapObject::kMapOffset),
|
| Immediate(factory()->fixed_array_map()));
|
| __ j(equal, &done, Label::kNear);
|
| @@ -2386,11 +2424,19 @@ void LCodeGen::DoLoadElements(LLoadElements* instr) {
|
| Register temp((result.is(eax)) ? ebx : eax);
|
| __ push(temp);
|
| __ mov(temp, FieldOperand(result, HeapObject::kMapOffset));
|
| - __ movzx_b(temp, FieldOperand(temp, Map::kInstanceTypeOffset));
|
| - __ sub(Operand(temp), Immediate(FIRST_EXTERNAL_ARRAY_TYPE));
|
| - __ cmp(Operand(temp), Immediate(kExternalArrayTypeCount));
|
| + __ movzx_b(temp, FieldOperand(temp, Map::kBitField2Offset));
|
| + __ and_(temp, Map::kElementsKindMask);
|
| + __ shr(temp, Map::kElementsKindShift);
|
| + __ cmp(temp, JSObject::FAST_ELEMENTS);
|
| + __ j(equal, &ok, Label::kNear);
|
| + __ cmp(temp, JSObject::FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND);
|
| + __ j(less, &fail, Label::kNear);
|
| + __ cmp(temp, JSObject::LAST_EXTERNAL_ARRAY_ELEMENTS_KIND);
|
| + __ j(less_equal, &ok, Label::kNear);
|
| + __ bind(&fail);
|
| + __ Abort("Check for fast elements or pixel array failed.");
|
| + __ bind(&ok);
|
| __ pop(temp);
|
| - __ Check(below, "Check for fast elements or pixel array failed.");
|
| __ bind(&done);
|
| }
|
| }
|
|
|