| 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());
|
|
|