Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index bcb351c6385d06d2ca7b4e6efc64ca0d1bbdbebe..bcb90ca802677f0420aa5f0956f7292a5daa09fe 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -1968,43 +1968,6 @@ void LCodeGen::DoMapEnumLength(LMapEnumLength* instr) { |
} |
-void LCodeGen::DoElementsKind(LElementsKind* instr) { |
- Register result = ToRegister(instr->result()); |
- Register input = ToRegister(instr->value()); |
- |
- // 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->value()); |
- Register result = ToRegister(instr->result()); |
- Register map = ToRegister(instr->temp()); |
- ASSERT(input.is(result)); |
- |
- Label done; |
- |
- if (!instr->hydrogen()->value()->IsHeapObject()) { |
- // If the object is a smi return the object. |
- __ JumpIfSmi(input, &done, Label::kNear); |
- } |
- |
- // If the object is not a value type, return the object. |
- __ CmpObjectType(input, JS_VALUE_TYPE, map); |
- __ j(not_equal, &done, Label::kNear); |
- __ mov(result, FieldOperand(input, JSValue::kValueOffset)); |
- |
- __ bind(&done); |
-} |
- |
- |
void LCodeGen::DoDateField(LDateField* instr) { |
Register object = ToRegister(instr->date()); |
Register result = ToRegister(instr->result()); |
@@ -2126,18 +2089,6 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) { |
} |
-void LCodeGen::DoThrow(LThrow* instr) { |
- __ push(ToOperand(instr->value())); |
- ASSERT(ToRegister(instr->context()).is(esi)); |
- CallRuntime(Runtime::kThrow, 1, instr); |
- |
- if (FLAG_debug_code) { |
- Comment("Unreachable code."); |
- __ int3(); |
- } |
-} |
- |
- |
void LCodeGen::DoAddI(LAddI* instr) { |
LOperand* left = instr->left(); |
LOperand* right = instr->right(); |
@@ -3262,8 +3213,7 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { |
} |
Register object = ToRegister(instr->object()); |
- if (FLAG_track_double_fields && |
- instr->hydrogen()->representation().IsDouble()) { |
+ if (instr->hydrogen()->representation().IsDouble()) { |
if (CpuFeatures::IsSupported(SSE2)) { |
CpuFeatureScope scope(masm(), SSE2); |
XMMRegister result = ToDoubleRegister(instr->result()); |
@@ -3631,26 +3581,28 @@ void LCodeGen::DoArgumentsLength(LArgumentsLength* instr) { |
void LCodeGen::DoWrapReceiver(LWrapReceiver* instr) { |
Register receiver = ToRegister(instr->receiver()); |
Register function = ToRegister(instr->function()); |
- Register scratch = ToRegister(instr->temp()); |
// If the receiver is null or undefined, we have to pass the global |
// object as a receiver to normal functions. Values have to be |
// passed unchanged to builtins and strict-mode functions. |
Label receiver_ok, global_object; |
Label::Distance dist = DeoptEveryNTimes() ? Label::kFar : Label::kNear; |
+ Register scratch = ToRegister(instr->temp()); |
- // Do not transform the receiver to object for strict mode |
- // functions. |
- __ mov(scratch, |
- FieldOperand(function, JSFunction::kSharedFunctionInfoOffset)); |
- __ test_b(FieldOperand(scratch, SharedFunctionInfo::kStrictModeByteOffset), |
- 1 << SharedFunctionInfo::kStrictModeBitWithinByte); |
- __ j(not_equal, &receiver_ok, dist); |
+ if (!instr->hydrogen()->known_function()) { |
+ // Do not transform the receiver to object for strict mode |
+ // functions. |
+ __ mov(scratch, |
+ FieldOperand(function, JSFunction::kSharedFunctionInfoOffset)); |
+ __ test_b(FieldOperand(scratch, SharedFunctionInfo::kStrictModeByteOffset), |
+ 1 << SharedFunctionInfo::kStrictModeBitWithinByte); |
+ __ j(not_equal, &receiver_ok, dist); |
- // Do not transform the receiver to object for builtins. |
- __ test_b(FieldOperand(scratch, SharedFunctionInfo::kNativeByteOffset), |
- 1 << SharedFunctionInfo::kNativeBitWithinByte); |
- __ j(not_equal, &receiver_ok, dist); |
+ // Do not transform the receiver to object for builtins. |
+ __ test_b(FieldOperand(scratch, SharedFunctionInfo::kNativeByteOffset), |
+ 1 << SharedFunctionInfo::kNativeBitWithinByte); |
+ __ j(not_equal, &receiver_ok, dist); |
+ } |
// Normal function. Replace undefined or null with global receiver. |
__ cmp(receiver, factory()->null_value()); |
@@ -3663,14 +3615,14 @@ void LCodeGen::DoWrapReceiver(LWrapReceiver* instr) { |
DeoptimizeIf(equal, instr->environment()); |
__ CmpObjectType(receiver, FIRST_SPEC_OBJECT_TYPE, scratch); |
DeoptimizeIf(below, instr->environment()); |
- __ jmp(&receiver_ok, Label::kNear); |
+ __ jmp(&receiver_ok, Label::kNear); |
__ bind(&global_object); |
__ mov(receiver, FieldOperand(function, JSFunction::kContextOffset)); |
- __ mov(receiver, |
- Operand(receiver, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); |
- __ mov(receiver, FieldOperand(receiver, GlobalObject::kGlobalReceiverOffset)); |
- |
+ const int global_offset = Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX); |
+ __ mov(receiver, Operand(receiver, global_offset)); |
+ const int receiver_offset = GlobalObject::kGlobalReceiverOffset; |
+ __ mov(receiver, FieldOperand(receiver, receiver_offset)); |
__ bind(&receiver_ok); |
} |
@@ -4224,13 +4176,8 @@ void LCodeGen::DoCallFunction(LCallFunction* instr) { |
ASSERT(ToRegister(instr->result()).is(eax)); |
int arity = instr->arity(); |
- CallFunctionStub stub(arity, NO_CALL_FUNCTION_FLAGS); |
- if (instr->hydrogen()->IsTailCall()) { |
- if (NeedsEagerFrame()) __ leave(); |
- __ jmp(stub.GetCode(isolate()), RelocInfo::CODE_TARGET); |
- } else { |
- CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); |
- } |
+ CallFunctionStub stub(arity, instr->hydrogen()->function_flags()); |
+ CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); |
} |
@@ -4363,7 +4310,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
DeoptimizeIf(zero, instr->environment()); |
} |
} |
- } else if (FLAG_track_double_fields && representation.IsDouble()) { |
+ } else if (representation.IsDouble()) { |
ASSERT(transition.is_null()); |
ASSERT(access.IsInobject()); |
ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); |