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..f895dbf9a3875731ec8d2230e35cb1862f4dc00f 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 the 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::DoCmpConstantEq(LCmpConstantEq* 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::DoCmpConstantEqAndBranch(LCmpConstantEqAndBranch* 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 or external elements failed."); |
+ __ bind(&ok); |
__ pop(temp); |
- __ Check(below, "Check for fast elements or pixel array failed."); |
__ bind(&done); |
} |
} |