| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index e9210a9eed693843f20246ac7fd9c6ca9424b516..364c3a1824ef671ee44dcd8f984d4be0363da993 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -429,13 +429,6 @@ double LCodeGen::ToDouble(LConstantOperand* op) const {
|
| }
|
|
|
|
|
| -ExternalReference LCodeGen::ToExternalReference(LConstantOperand* op) const {
|
| - HConstant* constant = chunk_->LookupConstant(op);
|
| - ASSERT(constant->HasExternalReferenceValue());
|
| - return constant->ExternalReferenceValue();
|
| -}
|
| -
|
| -
|
| Handle<Object> LCodeGen::ToHandle(LConstantOperand* op) const {
|
| HConstant* constant = chunk_->LookupConstant(op);
|
| ASSERT(chunk_->LookupLiteralRepresentation(op).IsSmiOrTagged());
|
| @@ -1460,11 +1453,7 @@ void LCodeGen::DoShiftI(LShiftI* instr) {
|
| break;
|
| case Token::SHL:
|
| if (shift_count != 0) {
|
| - if (instr->hydrogen_value()->representation().IsSmi()) {
|
| - __ shl(ToRegister(left), Immediate(shift_count));
|
| - } else {
|
| - __ shll(ToRegister(left), Immediate(shift_count));
|
| - }
|
| + __ shll(ToRegister(left), Immediate(shift_count));
|
| }
|
| break;
|
| default:
|
| @@ -1530,11 +1519,6 @@ void LCodeGen::DoConstantD(LConstantD* instr) {
|
| }
|
|
|
|
|
| -void LCodeGen::DoConstantE(LConstantE* instr) {
|
| - __ LoadAddress(ToRegister(instr->result()), instr->value());
|
| -}
|
| -
|
| -
|
| void LCodeGen::DoConstantT(LConstantT* instr) {
|
| Handle<Object> value = instr->value();
|
| AllowDeferredHandleDereference smi_check;
|
| @@ -1715,7 +1699,7 @@ void LCodeGen::DoMathMinMax(LMathMinMax* instr) {
|
| LOperand* right = instr->right();
|
| ASSERT(left->Equals(instr->result()));
|
| HMathMinMax::Operation operation = instr->hydrogen()->operation();
|
| - if (instr->hydrogen()->representation().IsSmiOrInteger32()) {
|
| + if (instr->hydrogen()->representation().IsInteger32()) {
|
| Label return_left;
|
| Condition condition = (operation == HMathMinMax::kMathMin)
|
| ? less_equal
|
| @@ -1724,26 +1708,17 @@ void LCodeGen::DoMathMinMax(LMathMinMax* instr) {
|
| if (right->IsConstantOperand()) {
|
| Immediate right_imm =
|
| Immediate(ToInteger32(LConstantOperand::cast(right)));
|
| - ASSERT(!instr->hydrogen_value()->representation().IsSmi());
|
| __ cmpl(left_reg, right_imm);
|
| __ j(condition, &return_left, Label::kNear);
|
| __ movq(left_reg, right_imm);
|
| } else if (right->IsRegister()) {
|
| Register right_reg = ToRegister(right);
|
| - if (instr->hydrogen_value()->representation().IsSmi()) {
|
| - __ cmpq(left_reg, right_reg);
|
| - } else {
|
| - __ cmpl(left_reg, right_reg);
|
| - }
|
| + __ cmpl(left_reg, right_reg);
|
| __ j(condition, &return_left, Label::kNear);
|
| __ movq(left_reg, right_reg);
|
| } else {
|
| Operand right_op = ToOperand(right);
|
| - if (instr->hydrogen_value()->representation().IsSmi()) {
|
| - __ cmpq(left_reg, right_op);
|
| - } else {
|
| - __ cmpl(left_reg, right_op);
|
| - }
|
| + __ cmpl(left_reg, right_op);
|
| __ j(condition, &return_left, Label::kNear);
|
| __ movq(left_reg, right_op);
|
| }
|
| @@ -2701,19 +2676,6 @@ void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) {
|
| void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
| HObjectAccess access = instr->hydrogen()->access();
|
| int offset = access.offset();
|
| -
|
| - if (access.IsExternalMemory()) {
|
| - Register result = ToRegister(instr->result());
|
| - if (instr->object()->IsConstantOperand()) {
|
| - ASSERT(result.is(rax));
|
| - __ load_rax(ToExternalReference(LConstantOperand::cast(instr->object())));
|
| - } else {
|
| - Register object = ToRegister(instr->object());
|
| - __ movq(result, MemOperand(object, offset));
|
| - }
|
| - return;
|
| - }
|
| -
|
| Register object = ToRegister(instr->object());
|
| if (FLAG_track_double_fields &&
|
| instr->hydrogen()->representation().IsDouble()) {
|
| @@ -3951,23 +3913,11 @@ void LCodeGen::DoInnerAllocatedObject(LInnerAllocatedObject* instr) {
|
| void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
| Representation representation = instr->representation();
|
|
|
| + Register object = ToRegister(instr->object());
|
| +
|
| HObjectAccess access = instr->hydrogen()->access();
|
| int offset = access.offset();
|
|
|
| - if (access.IsExternalMemory()) {
|
| - Register value = ToRegister(instr->value());
|
| - if (instr->object()->IsConstantOperand()) {
|
| - ASSERT(value.is(rax));
|
| - LConstantOperand* object = LConstantOperand::cast(instr->object());
|
| - __ store_rax(ToExternalReference(object));
|
| - } else {
|
| - Register object = ToRegister(instr->object());
|
| - __ movq(MemOperand(object, offset), value);
|
| - }
|
| - return;
|
| - }
|
| -
|
| - Register object = ToRegister(instr->object());
|
| Handle<Map> transition = instr->transition();
|
|
|
| if (FLAG_track_fields && representation.IsSmi()) {
|
| @@ -4325,7 +4275,7 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) {
|
| ASSERT_NE(instr->temp(), NULL);
|
| __ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg,
|
| ToRegister(instr->temp()), kDontSaveFPRegs);
|
| - } else {
|
| + } else if (FLAG_compiled_transitions) {
|
| PushSafepointRegistersScope scope(this);
|
| if (!object_reg.is(rax)) {
|
| __ movq(rax, object_reg);
|
| @@ -4335,6 +4285,28 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) {
|
| __ CallStub(&stub);
|
| RecordSafepointWithRegisters(
|
| instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
|
| + } else if (IsFastSmiElementsKind(from_kind) &&
|
| + IsFastDoubleElementsKind(to_kind)) {
|
| + Register fixed_object_reg = ToRegister(instr->temp());
|
| + ASSERT(fixed_object_reg.is(rdx));
|
| + Register new_map_reg = ToRegister(instr->new_map_temp());
|
| + ASSERT(new_map_reg.is(rbx));
|
| + __ movq(new_map_reg, to_map, RelocInfo::EMBEDDED_OBJECT);
|
| + __ movq(fixed_object_reg, object_reg);
|
| + CallCode(isolate()->builtins()->TransitionElementsSmiToDouble(),
|
| + RelocInfo::CODE_TARGET, instr);
|
| + } else if (IsFastDoubleElementsKind(from_kind) &&
|
| + IsFastObjectElementsKind(to_kind)) {
|
| + Register fixed_object_reg = ToRegister(instr->temp());
|
| + ASSERT(fixed_object_reg.is(rdx));
|
| + Register new_map_reg = ToRegister(instr->new_map_temp());
|
| + ASSERT(new_map_reg.is(rbx));
|
| + __ movq(new_map_reg, to_map, RelocInfo::EMBEDDED_OBJECT);
|
| + __ movq(fixed_object_reg, object_reg);
|
| + CallCode(isolate()->builtins()->TransitionElementsDoubleToObject(),
|
| + RelocInfo::CODE_TARGET, instr);
|
| + } else {
|
| + UNREACHABLE();
|
| }
|
| __ bind(¬_applicable);
|
| }
|
|
|