1f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 6f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm64/lithium-codegen-arm64.h" 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-osr.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium-inl.h" 10f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 11f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace v8 { 12f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace internal { 13f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 14f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#define DEFINE_COMPILE(type) \ 15f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org void L##type::CompileToNative(LCodeGen* generator) { \ 16f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org generator->Do##type(this); \ 17f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 18f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 19f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#undef DEFINE_COMPILE 20f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 21f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#ifdef DEBUG 22f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInstruction::VerifyCall() { 23f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Call instructions can use only fixed registers as temporaries and 24f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // outputs because all registers are blocked by the calling convention. 25f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Inputs operands must use a fixed register or use-at-start policy or 26f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // a non-register policy. 27e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Output() == NULL || 28f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LUnallocated::cast(Output())->HasFixedPolicy() || 29f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org !LUnallocated::cast(Output())->HasRegisterPolicy()); 30f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (UseIterator it(this); !it.Done(); it.Advance()) { 31f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 32e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() || 33f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org operand->IsUsedAtStart()); 34f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 35f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (TempIterator it(this); !it.Done(); it.Advance()) { 36f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 37e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 38f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 39f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 40f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#endif 41f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 42f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 43f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) { 44f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LGap::PrintDataTo(stream); 45f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LLabel* rep = replacement(); 46f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (rep != NULL) { 47f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" Dead block replaced with B%d", rep->block_id()); 48f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 49f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 50f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 51f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 52f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 53f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org arguments()->PrintTo(stream); 54f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" length "); 55f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org length()->PrintTo(stream); 56f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" index "); 57f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org index()->PrintTo(stream); 58f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 59f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 60f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 61f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) { 62f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 63f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 64f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 65f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 66f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 67f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) { 68f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("= "); 69f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org function()->PrintTo(stream); 70f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("#%d / ", arity()); 71f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 72f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 73f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 74f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 75f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0; i < InputCount(); i++) { 76f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org InputAt(i)->PrintTo(stream); 77f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" "); 78f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 79f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("#%d / ", arity()); 80f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 81f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 82f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 83f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) { 84f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("= "); 85f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org constructor()->PrintTo(stream); 86f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" #%d / ", arity()); 87f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 88f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 89f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 90f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) { 91f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("= "); 92f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org constructor()->PrintTo(stream); 93f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" #%d / ", arity()); 94f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ElementsKind kind = hydrogen()->elements_kind(); 95f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" (%s) ", ElementsKindToString(kind)); 96f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 97f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 98f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 99f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 100f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if class_of_test("); 101f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 102f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(", \"%o\") then B%d else B%d", 103f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org *hydrogen()->class_name(), 104f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org true_block_id(), 105f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org false_block_id()); 106f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 107f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 108f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 109f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 110f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if "); 111f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org left()->PrintTo(stream); 112f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" %s ", Token::String(op())); 113f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org right()->PrintTo(stream); 114f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 115f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 117f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 118f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 119f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if has_cached_array_index("); 120f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 121f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 122f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 123f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 124f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 125f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const { 126f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return !gen->IsNextEmittedBlock(block_id()); 127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 128f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 129f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 130f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) { 131f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("B%d", block_id()); 132f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 133f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 134f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 135f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 136f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" = "); 137f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org base_object()->PrintTo(stream); 138f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" + "); 139f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org offset()->PrintTo(stream); 140f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 141f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 142f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 143f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 144f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("= "); 145f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org function()->PrintTo(stream); 146f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" #%d / ", arity()); 147f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 148f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 149f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 150f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) { 151f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("%s ", this->Mnemonic()); 152f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 153f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org PrintOutputOperandTo(stream); 154f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 155f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org PrintDataTo(stream); 156f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 157f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (HasEnvironment()) { 158f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" "); 159f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org environment()->PrintTo(stream); 160f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 162f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (HasPointerMap()) { 163f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" "); 164f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org pointer_map()->PrintTo(stream); 165f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 166f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 167f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 168f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 169f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) { 170f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("= "); 171f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0; i < InputCount(); i++) { 172f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (i > 0) stream->Add(" "); 173f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (InputAt(i) == NULL) { 174f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("NULL"); 175f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 176f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org InputAt(i)->PrintTo(stream); 177f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 178f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 179f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 180f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 181f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 182f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 183f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (HasResult()) result()->PrintTo(stream); 184f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 185f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 186f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 187f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 188f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if has_instance_type("); 189f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 190f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 191f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 192f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 193f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 194f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) { 195f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if is_object("); 196f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 197f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 198f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 199f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 200f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 201f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 202f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if is_string("); 203f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 205f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 206f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 209f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if is_smi("); 210f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 211f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 212f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 213f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 214f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 215f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 216f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if typeof "); 217f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 218f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" == \"%s\" then B%d else B%d", 219f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org hydrogen()->type_literal()->ToCString().get(), 220f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org true_block_id(), false_block_id()); 221f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 222f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 223f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 224f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 225f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if is_undetectable("); 226f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 227f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 228f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 229f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 230f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 231f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgbool LGap::IsRedundant() const { 232f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0; i < 4; i++) { 233f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if ((parallel_moves_[i] != NULL) && !parallel_moves_[i]->IsRedundant()) { 234f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return false; 235f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 236f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 237f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 238f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return true; 239f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 240f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 241f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 242f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) { 243f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0; i < 4; i++) { 244f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("("); 245f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (parallel_moves_[i] != NULL) { 246f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org parallel_moves_[i]->PrintDataTo(stream); 247f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 248f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(") "); 249f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 250f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 251f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 252f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 253f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 254f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org context()->PrintTo(stream); 255f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("[%d]", slot_index()); 256f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 257f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 258f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 259f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 260f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" = "); 261f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org function()->PrintTo(stream); 262f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(".code_entry = "); 263f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org code_object()->PrintTo(stream); 264f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 265f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 266f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 267f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 268f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org context()->PrintTo(stream); 269f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("[%d] <- ", slot_index()); 270f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 271f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 272f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 273f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 274f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 275f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org object()->PrintTo(stream); 276f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("["); 277f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org key()->PrintTo(stream); 278f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("] <- "); 279f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 280f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 281f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 282f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 283f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 284f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org object()->PrintTo(stream); 285f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OStringStream os; 286f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << hydrogen()->access(); 287f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org stream->Add(os.c_str()); 288f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" <- "); 289f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 290f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 291f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 292f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 293f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 294f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org object()->PrintTo(stream); 295f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("."); 296f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(String::cast(*name())->ToCString().get()); 297f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(" <- "); 298f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 299f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 300f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 301f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 302f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 303f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("if string_compare("); 304f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org left()->PrintTo(stream); 305f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org right()->PrintTo(stream); 306f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 307f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 308f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 309f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 310f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 311f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org object()->PrintTo(stream); 312f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stream->Add("%p -> %p", *original_map(), *transitioned_map()); 313f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 314f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 315f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 316f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgtemplate<int T> 317f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LUnaryMathOperation<T>::PrintDataTo(StringStream* stream) { 318f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value()->PrintTo(stream); 319f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 320f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 321f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 322f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgconst char* LArithmeticD::Mnemonic() const { 323f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org switch (op()) { 324f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::ADD: return "add-d"; 325f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::SUB: return "sub-d"; 326f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::MUL: return "mul-d"; 327f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::DIV: return "div-d"; 328f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::MOD: return "mod-d"; 329f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org default: 330f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UNREACHABLE(); 331f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 332f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 333f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 334f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 335f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgconst char* LArithmeticT::Mnemonic() const { 337f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org switch (op()) { 338f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::ADD: return "add-t"; 339f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::SUB: return "sub-t"; 340f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::MUL: return "mul-t"; 341f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::MOD: return "mod-t"; 342f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::DIV: return "div-t"; 343f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::BIT_AND: return "bit-and-t"; 344f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::BIT_OR: return "bit-or-t"; 345f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::BIT_XOR: return "bit-xor-t"; 346f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::ROR: return "ror-t"; 347f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::SHL: return "shl-t"; 348f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::SAR: return "sar-t"; 349f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case Token::SHR: return "shr-t"; 350f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org default: 351f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UNREACHABLE(); 352f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 353f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 354f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 355f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 356f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 357f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 358f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 359f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Register::ToAllocationIndex(reg)); 360f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 361f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 362f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 363f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) { 364f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, 365f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DoubleRegister::ToAllocationIndex(reg)); 366f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 367f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 368f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 370f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (value->EmitAtUses()) { 371f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HInstruction* instr = HInstruction::cast(value); 372f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org VisitInstruction(instr); 373f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 374f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org operand->set_virtual_register(value->id()); 375f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return operand; 376f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 377f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 378f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 379f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 380f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Use(value, ToUnallocated(fixed_register)); 381f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 382f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 383f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 384f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, 385f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DoubleRegister fixed_register) { 386f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Use(value, ToUnallocated(fixed_register)); 387f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 388f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 389f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 390f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) { 391f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 392f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 393f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 394f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 395f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegisterAndClobber(HValue* value) { 396f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 397f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 398f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 399f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 400f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 401f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Use(value, 402f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 403f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LUnallocated::USED_AT_START)); 404f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 405f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 406f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 407f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 408f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return value->IsConstant() ? UseConstant(value) : UseRegister(value); 409f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 410f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 411f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 412f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 413f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return value->IsConstant() ? UseConstant(value) : UseRegisterAtStart(value); 414f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 415f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 416f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 417f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLConstantOperand* LChunkBuilder::UseConstant(HValue* value) { 418f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return chunk_->DefineConstantOperand(HConstant::cast(value)); 419f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 420f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 421f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 422f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseAny(HValue* value) { 423f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return value->IsConstant() 424f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ? UseConstant(value) 425f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 426f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 427f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 428f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 429f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 430f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LUnallocated* result) { 431f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org result->set_virtual_register(current_instruction_->id()); 432f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->set_result(result); 433f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return instr; 434f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 435f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 436f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 437f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister( 438f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LTemplateResultInstruction<1>* instr) { 439f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Define(instr, 440f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 441f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 442f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 443f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 444f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled( 445f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LTemplateResultInstruction<1>* instr, int index) { 446f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Define(instr, 447f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 448f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 449f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 450f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 451f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst( 452f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LTemplateResultInstruction<1>* instr) { 453f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Define(instr, 454f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 455f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 456f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 457f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 458f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineFixed( 459f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LTemplateResultInstruction<1>* instr, Register reg) { 460f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Define(instr, ToUnallocated(reg)); 461f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 462f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 463f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 464f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble( 465f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LTemplateResultInstruction<1>* instr, DoubleRegister reg) { 466f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return Define(instr, ToUnallocated(reg)); 467f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 468f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 469f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 470f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 471f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HInstruction* hinstr, 472f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CanDeoptimize can_deoptimize) { 473f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org info()->MarkAsNonDeferredCalling(); 474f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#ifdef DEBUG 475f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->VerifyCall(); 476f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#endif 477f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->MarkAsCall(); 478f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr = AssignPointerMap(instr); 479f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 480f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // If instruction does not have side-effects lazy deoptimization 481f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // after the call will try to deoptimize to the point before the call. 482f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Thus we still need to attach environment to this call even if 483f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // call sequence can not deoptimize eagerly. 484f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org bool needs_environment = 485f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 486f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org !hinstr->HasObservableSideEffects(); 487f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (needs_environment && !instr->HasEnvironment()) { 488f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr = AssignEnvironment(instr); 4894edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org // We can't really figure out if the environment is needed or not. 4904edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org instr->environment()->set_has_been_used(); 491f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 492f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 493f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return instr; 494f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 495f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 496f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 497f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 498e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->HasPointerMap()); 499f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->set_pointer_map(new(zone()) LPointerMap(zone())); 500f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return instr; 501f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 502f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 503f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 504f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLUnallocated* LChunkBuilder::TempRegister() { 505f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LUnallocated* operand = 506f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 507f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int vreg = allocator_->GetVirtualRegister(); 508f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (!allocator_->AllocationOk()) { 509f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 510f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org vreg = 0; 511f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 512f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org operand->set_virtual_register(vreg); 513f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return operand; 514f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 515f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 516f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 5175924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgLUnallocated* LChunkBuilder::TempDoubleRegister() { 5185924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LUnallocated* operand = 5195924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER); 5205924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org int vreg = allocator_->GetVirtualRegister(); 5215924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (!allocator_->AllocationOk()) { 5225924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 5235924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org vreg = 0; 5245924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 5255924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org operand->set_virtual_register(vreg); 5265924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return operand; 5275924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org} 5285924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 5295924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 530f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgint LPlatformChunk::GetNextSpillIndex() { 531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return spill_slot_count_++; 532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 535f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 536f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int index = GetNextSpillIndex(); 537f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (kind == DOUBLE_REGISTERS) { 538f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return LDoubleStackSlot::Create(index, zone()); 539f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 540e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kind == GENERAL_REGISTERS); 541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return LStackSlot::Create(index, zone()); 542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 543f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 545f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 5469d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) { 5479d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LUnallocated* operand = ToUnallocated(reg); 548e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 5499d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org return operand; 5509d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org} 5519d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 5529d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 553f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { 554f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LUnallocated* operand = ToUnallocated(reg); 555e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return operand; 557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 558f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 559f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 560f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLPlatformChunk* LChunkBuilder::Build() { 561e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_unused()); 562f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org chunk_ = new(zone()) LPlatformChunk(info_, graph_); 563f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LPhase phase("L_Building chunk", chunk_); 564f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org status_ = BUILDING; 565f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 566f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // If compiling for OSR, reserve space for the unoptimized frame, 567f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // which will be subsumed into this frame. 568f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (graph()->has_osr()) { 569f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // TODO(all): GetNextSpillIndex just increments a field. It has no other 570f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // side effects, so we should get rid of this loop. 571f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 572f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org chunk_->GetNextSpillIndex(); 573f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 575f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 576f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org const ZoneList<HBasicBlock*>* blocks = graph_->blocks(); 577f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0; i < blocks->length(); i++) { 578f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DoBasicBlock(blocks->at(i)); 579f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (is_aborted()) return NULL; 580f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 581f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org status_ = DONE; 582f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return chunk_; 583f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 584f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 585f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 586f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block) { 587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_building()); 588f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org current_block_ = block; 589f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 590f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (block->IsStartBlock()) { 591f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org block->UpdateEnvironment(graph_->start_environment()); 592f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org argument_count_ = 0; 593f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (block->predecessors()->length() == 1) { 594f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // We have a single predecessor => copy environment and outgoing 595f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // argument count from the predecessor. 596e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(block->phis()->length() == 0); 597f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 598f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HEnvironment* last_environment = pred->last_environment(); 599e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_environment != NULL); 600f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 601f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Only copy the environment, if it is later used again. 602f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (pred->end()->SecondSuccessor() == NULL) { 603e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->end()->FirstSuccessor() == block); 604f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 605f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if ((pred->end()->FirstSuccessor()->block_id() > block->block_id()) || 606f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (pred->end()->SecondSuccessor()->block_id() > block->block_id())) { 607f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org last_environment = last_environment->Copy(); 608f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 609f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 610f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org block->UpdateEnvironment(last_environment); 611e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->argument_count() >= 0); 612f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org argument_count_ = pred->argument_count(); 613f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 614f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // We are at a state join => process phis. 615f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 616f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // No need to copy the environment, it cannot be used later. 617f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HEnvironment* last_environment = pred->last_environment(); 618f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0; i < block->phis()->length(); ++i) { 619f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HPhi* phi = block->phis()->at(i); 620f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (phi->HasMergedIndex()) { 621f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org last_environment->SetValueAt(phi->merged_index(), phi); 622f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 623f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 624f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 0; i < block->deleted_phis()->length(); ++i) { 625f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (block->deleted_phis()->at(i) < last_environment->length()) { 626f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org last_environment->SetValueAt(block->deleted_phis()->at(i), 627f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org graph_->GetConstantUndefined()); 628f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 630f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org block->UpdateEnvironment(last_environment); 631f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Pick up the outgoing argument count of one of the predecessors. 632f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org argument_count_ = pred->argument_count(); 633f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 634f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 635f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Translate hydrogen instructions to lithium ones for the current block. 636f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HInstruction* current = block->first(); 637f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int start = chunk_->instructions()->length(); 638f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org while ((current != NULL) && !is_aborted()) { 639f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Code for constants in registers is generated lazily. 640f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (!current->EmitAtUses()) { 641f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org VisitInstruction(current); 642f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 643f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org current = current->next(); 644f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 645f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int end = chunk_->instructions()->length() - 1; 646f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (end >= start) { 647f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org block->set_first_instruction_index(start); 648f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org block->set_last_instruction_index(end); 649f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 650f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org block->set_argument_count(argument_count_); 651f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org current_block_ = NULL; 652f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 653f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 654f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 655f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 656f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HInstruction* old_current = current_instruction_; 657f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org current_instruction_ = current; 658f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 659f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* instr = NULL; 660f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (current->CanReplaceWithDummyUses()) { 661f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (current->OperandCount() == 0) { 662f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr = DefineAsRegister(new(zone()) LDummy()); 663f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 664e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!current->OperandAt(0)->IsControlInstruction()); 665f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr = DefineAsRegister(new(zone()) 666f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LDummyUse(UseAny(current->OperandAt(0)))); 667f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 668f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 1; i < current->OperandCount(); ++i) { 669f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (current->OperandAt(i)->IsControlInstruction()) continue; 670f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* dummy = 671f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 672f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org dummy->set_hydrogen_value(current); 673f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org chunk_->AddInstruction(dummy, current_block_); 674f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 675f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 6768d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HBasicBlock* successor; 6778d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org if (current->IsControlInstruction() && 6788d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 6798d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org successor != NULL) { 6808d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = new(zone()) LGoto(successor); 6818d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } else { 6828d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = current->CompileToLithium(this); 6838d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } 684f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 685f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 686f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org argument_count_ += current->argument_delta(); 687e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ >= 0); 688f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 689f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr != NULL) { 690011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(instr, current); 691011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 692011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 693011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org current_instruction_ = old_current; 694011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org} 695011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 696011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 697011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr, 698011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HInstruction* hydrogen_val) { 699011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Associate the hydrogen instruction first, since we may need it for 700011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 701011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->set_hydrogen_value(hydrogen_val); 702f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 703f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#if DEBUG 704011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Make sure that the lithium instruction has either no fixed register 705011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // constraints in temps or the result OR no uses that are only used at 706011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // start. If this invariant doesn't hold, the register allocator can decide 707011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // to insert a split of a range immediately before the instruction due to an 708011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // already allocated register needing to be used for the instruction's fixed 709011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // register constraint. In this case, the register allocator won't see an 710011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // interference between the split child and the use-at-start (it would if 711011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the it was just a plain use), so it is free to move the split child into 712011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the same register that is used for the use-at-start. 713011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // See https://code.google.com/p/chromium/issues/detail?id=201590 714011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (!(instr->ClobbersRegisters() && 715011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->ClobbersDoubleRegisters(isolate()))) { 716011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int fixed = 0; 717011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int used_at_start = 0; 718011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (UseIterator it(instr); !it.Done(); it.Advance()) { 719011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 720011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->IsUsedAtStart()) ++used_at_start; 721f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 722011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->Output() != NULL) { 723011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 724011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 725011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (TempIterator it(instr); !it.Done(); it.Advance()) { 726011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 727011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->HasFixedPolicy()) ++fixed; 728011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 729e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(fixed == 0 || used_at_start == 0); 730011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 731f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#endif 732f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 733011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 734011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignPointerMap(instr); 735011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 736011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_environments && !instr->HasEnvironment()) { 737011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignEnvironment(instr); 738011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 739011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(instr, current_block_); 740011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 741011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->IsCall()) { 742011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; 743011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* instruction_needing_environment = NULL; 744011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (hydrogen_val->HasObservableSideEffects()) { 745011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HSimulate* sim = HSimulate::cast(hydrogen_val->next()); 746011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment = instr; 747011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org sim->ReplayEnvironment(current_block_->last_environment()); 748011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org hydrogen_value_for_lazy_bailout = sim; 749f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 750011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); 751011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); 752011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(bailout, current_block_); 753011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instruction_needing_environment != NULL) { 754011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Store the lazy deopt environment with the instruction if needed. 755011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Right now it is only used for LInstanceOfKnownGlobal. 756011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment-> 757011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org SetDeferredLazyDeoptimizationEnvironment(bailout->environment()); 758486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 759f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 760f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 761f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 762f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 763f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 764f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HEnvironment* hydrogen_env = current_block_->last_environment(); 765f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int argument_index_accumulator = 0; 766f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ZoneList<HValue*> objects_to_materialize(0, zone()); 767f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->set_environment(CreateEnvironment(hydrogen_env, 768f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org &argument_index_accumulator, 769f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org &objects_to_materialize)); 770f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return instr; 771f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 772f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 773f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 774f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 775f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // The control instruction marking the end of a block that completed 776f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // abruptly (e.g., threw an exception). There is nothing specific to do. 777f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 778f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 779f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 780f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 781f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 782f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HArithmeticBinaryOperation* instr) { 783e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 785e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 786f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 787f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (op == Token::MOD) { 788f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseFixedDouble(instr->left(), d0); 789f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = UseFixedDouble(instr->right(), d1); 790f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(Token::MOD, left, right); 791f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixedDouble(result, d0), instr); 792f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 793f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 794f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 795f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 796f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(result); 797f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 798f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 799f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 800f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 801f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 802f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HBinaryOperation* instr) { 803e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((op == Token::ADD) || (op == Token::SUB) || (op == Token::MUL) || 804f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (op == Token::DIV) || (op == Token::MOD) || (op == Token::SHR) || 805f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (op == Token::SHL) || (op == Token::SAR) || (op == Token::ROR) || 806f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (op == Token::BIT_OR) || (op == Token::BIT_AND) || 807f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (op == Token::BIT_XOR)); 808f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HValue* left = instr->left(); 809f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HValue* right = instr->right(); 810f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 811f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // TODO(jbramley): Once we've implemented smi support for all arithmetic 812f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // operations, these assertions should check IsTagged(). 813e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrTagged()); 814e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(left->representation().IsSmiOrTagged()); 815e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(right->representation().IsSmiOrTagged()); 816f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 817f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 818f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left_operand = UseFixed(left, x1); 819f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right_operand = UseFixed(right, x0); 820f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LArithmeticT* result = 821f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LArithmeticT(op, context, left_operand, right_operand); 822f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 823f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 824f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 825f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 826f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( 827f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HBoundsCheckBaseIndexInformation* instr) { 828f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UNREACHABLE(); 829f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 830f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 831f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 832f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 833f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 834f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org info()->MarkAsRequiresFrame(); 835f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* args = NULL; 836f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* length = NULL; 837f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* index = NULL; 838f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 839f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->length()->IsConstant() && instr->index()->IsConstant()) { 840f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org args = UseRegisterAtStart(instr->arguments()); 841f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org length = UseConstant(instr->length()); 842f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org index = UseConstant(instr->index()); 843f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 844f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org args = UseRegister(instr->arguments()); 845f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org length = UseRegisterAtStart(instr->length()); 846f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org index = UseRegisterOrConstantAtStart(instr->index()); 847f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 848f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 849f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 850f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 851f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 852f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 853f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 854f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->representation().IsSmiOrInteger32()) { 855e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 856e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 8575924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 8585924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LInstruction* shifted_operation = TryDoOpWithShiftedRightOperand(instr); 8595924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (shifted_operation != NULL) { 8605924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return shifted_operation; 8615924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 8625924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 863f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 864f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = 865f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UseRegisterOrConstantAtStart(instr->BetterRightOperand()); 866f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* result = instr->representation().IsSmi() ? 867f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineAsRegister(new(zone()) LAddS(left, right)) : 868f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineAsRegister(new(zone()) LAddI(left, right)); 869f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 870f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org result = AssignEnvironment(result); 871f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 872f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return result; 873f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (instr->representation().IsExternal()) { 874e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsExternal()); 875e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsInteger32()); 876e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); 877f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 878f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 879f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LAddE(left, right)); 880f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (instr->representation().IsDouble()) { 881f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticD(Token::ADD, instr); 882f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 883e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsTagged()); 884f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticT(Token::ADD, instr); 885f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 886f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 887f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 888f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 889f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 890f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org info()->MarkAsDeferredCalling(); 891f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseAny(instr->context()); 892f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* size = UseRegisterOrConstant(instr->size()); 893f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp1 = TempRegister(); 894f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp2 = TempRegister(); 895381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LOperand* temp3 = instr->MustPrefillWithFiller() ? TempRegister() : NULL; 896381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2, temp3); 897f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignPointerMap(DefineAsRegister(result)); 898f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 899f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 900f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 901f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 902f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* function = UseFixed(instr->function(), x1); 903f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* receiver = UseFixed(instr->receiver(), x0); 904f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* length = UseFixed(instr->length(), x2); 905f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* elements = UseFixed(instr->elements(), x3); 906f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LApplyArguments* result = new(zone()) LApplyArguments(function, 907f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org receiver, 908f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org length, 909f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org elements); 910f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr, CAN_DEOPTIMIZE_EAGERLY); 911f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 912f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 913f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 914f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* instr) { 915f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org info()->MarkAsRequiresFrame(); 916f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = instr->from_inlined() ? NULL : TempRegister(); 917f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LArgumentsElements(temp)); 918f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 919f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 920f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 921f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* instr) { 922f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org info()->MarkAsRequiresFrame(); 923f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 924f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LArgumentsLength(value)); 925f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 926f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 927f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 928f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 929f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // There are no real uses of the arguments object. 930f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // arguments.length and element access are supported directly on 931f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // stack arguments, and any real arguments object use causes a bailout. 932f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // So this value is never used. 933f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 934f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 935f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 936f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 937f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 938f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->representation().IsSmiOrInteger32()) { 939e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 940e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 941e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32)); 942f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 9435924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LInstruction* shifted_operation = TryDoOpWithShiftedRightOperand(instr); 9445924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (shifted_operation != NULL) { 9455924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return shifted_operation; 9465924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 9475924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 948f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 949f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = 950f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UseRegisterOrConstantAtStart(instr->BetterRightOperand()); 951f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return instr->representation().IsSmi() ? 952f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineAsRegister(new(zone()) LBitS(left, right)) : 953f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineAsRegister(new(zone()) LBitI(left, right)); 954f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 955f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticT(instr->op(), instr); 956f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 957f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 958f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 959f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 960f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 961f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // V8 expects a label to be generated for each basic block. 962f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // This is used in some places like LAllocator::IsBlockBoundary 963f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // in lithium-allocator.cc 964f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LLabel(instr->block()); 965f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 966f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 967f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 968f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 969a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code && instr->skip_check()) return NULL; 970a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 971a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* length = !index->IsConstantOperand() 972a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ? UseRegisterOrConstantAtStart(instr->length()) 973a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org : UseRegisterAtStart(instr->length()); 974a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LInstruction* result = new(zone()) LBoundsCheck(index, length); 975a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code || !instr->skip_check()) { 976a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org result = AssignEnvironment(result); 977a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org } 978a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return result; 979f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 980f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 981f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 982f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 983f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HValue* value = instr->value(); 984f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Representation r = value->representation(); 985f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HType type = value->type(); 986f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 987f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (r.IsInteger32() || r.IsSmi() || r.IsDouble()) { 988f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // These representations have simple checks that cannot deoptimize. 989f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LBranch(UseRegister(value), NULL, NULL); 990f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 991e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(r.IsTagged()); 992f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (type.IsBoolean() || type.IsSmi() || type.IsJSArray() || 993f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org type.IsHeapNumber()) { 994f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // These types have simple checks that cannot deoptimize. 995f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LBranch(UseRegister(value), NULL, NULL); 996f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 997f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 998f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (type.IsString()) { 999f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // This type cannot deoptimize, but needs a scratch register. 1000f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LBranch(UseRegister(value), TempRegister(), NULL); 1001f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1002f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1003f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ToBooleanStub::Types expected = instr->expected_input_types(); 1004f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org bool needs_temps = expected.NeedsMap() || expected.IsEmpty(); 1005f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp1 = needs_temps ? TempRegister() : NULL; 1006f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp2 = needs_temps ? TempRegister() : NULL; 1007f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1008f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (expected.IsGeneric() || expected.IsEmpty()) { 1009f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // The generic case cannot deoptimize because it already supports every 1010f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // possible input type. 1011e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(needs_temps); 1012f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LBranch(UseRegister(value), temp1, temp2); 1013f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1014f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment( 1015f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LBranch(UseRegister(value), temp1, temp2)); 1016f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1017f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1018f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1019f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1020f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1021f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction( 1022f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HCallJSFunction* instr) { 1023f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* function = UseFixed(instr->function(), x1); 1024f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1025f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LCallJSFunction* result = new(zone()) LCallJSFunction(function); 1026f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1027f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 1028f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1029f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1030f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1031f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor( 1032f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HCallWithDescriptor* instr) { 10339aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org CallInterfaceDescriptor descriptor = instr->descriptor(); 1034f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1035f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 1036f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 1037f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ops.Add(target, zone()); 1038f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for (int i = 1; i < instr->OperandCount(); i++) { 10399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* op = 10409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1)); 1041f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ops.Add(op, zone()); 1042f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1043f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1044f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(descriptor, 1045f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ops, 1046f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org zone()); 1047f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 1048f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1049f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1050f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1051f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 1052f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1053f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* function = UseFixed(instr->function(), x1); 1054f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LCallFunction* call = new(zone()) LCallFunction(context, function); 1055f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(call, x0), instr); 1056f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1057f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1058f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1059f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { 1060f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1061f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // The call to CallConstructStub will expect the constructor to be in x1. 1062f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* constructor = UseFixed(instr->constructor(), x1); 1063f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LCallNew* result = new(zone()) LCallNew(context, constructor); 1064f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 1065f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1066f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1067f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1068f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 1069f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1070f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // The call to ArrayConstructCode will expect the constructor to be in x1. 1071f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* constructor = UseFixed(instr->constructor(), x1); 1072f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 1073f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 1074f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1075f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1076f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1077f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1078f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1079f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), x0), instr); 1080f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1081f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1082f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1083f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { 1084f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1085f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), x0), instr); 1086f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1087f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1088f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1089f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 1090f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 1091f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1092f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // There are no real uses of a captured object. 1093f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 1094f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1095f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1096f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1097f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) { 1098f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Representation from = instr->from(); 1099f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Representation to = instr->to(); 1100ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org HValue* val = instr->value(); 1101f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (from.IsSmi()) { 1102f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (to.IsTagged()) { 1103ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1104f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1105f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1106f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org from = Representation::Tagged(); 1107f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1108f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (from.IsTagged()) { 1109f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (to.IsDouble()) { 1110ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1111f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 1112ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 1113ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DefineAsRegister(new(zone()) LNumberUntagD(value, temp)); 1114ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1115ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (to.IsSmi()) { 1117ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1118ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (val->type().IsSmi()) { 1119f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1120f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1121f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 1122f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsInteger32()); 1124ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (val->type().IsSmi() || val->representation().IsSmi()) { 1125ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1126ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return DefineAsRegister(new(zone()) LSmiUntag(value, false)); 1127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1128ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1129f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp1 = TempRegister(); 11305924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LOperand* temp2 = instr->CanTruncateToInt32() 11315924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org ? NULL : TempDoubleRegister(); 1132ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 1133ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DefineAsRegister(new(zone()) LTaggedToI(value, temp1, temp2)); 11344edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1135ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1136f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1137f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1138f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (from.IsDouble()) { 1139f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (to.IsTagged()) { 1140f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org info()->MarkAsDeferredCalling(); 1141ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1142f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp1 = TempRegister(); 1143f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp2 = TempRegister(); 1144f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2); 1145f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignPointerMap(DefineAsRegister(result)); 1146f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1147e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsSmi() || to.IsInteger32()); 1148f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->CanTruncateToInt32()) { 1149ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1150ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return DefineAsRegister(new(zone()) LTruncateDoubleToIntOrSmi(value)); 1151f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1152ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1153f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LDoubleToIntOrSmi* result = new(zone()) LDoubleToIntOrSmi(value); 1154f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(DefineAsRegister(result)); 1155f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1156f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1157f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (from.IsInteger32()) { 1158f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org info()->MarkAsDeferredCalling(); 1159f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (to.IsTagged()) { 1160ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (val->CheckFlag(HInstruction::kUint32)) { 1161ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1162ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LNumberTagU* result = 1163ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org new(zone()) LNumberTagU(value, TempRegister(), TempRegister()); 1164ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 1165f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1166f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org STATIC_ASSERT((kMinInt == Smi::kMinValue) && 1167f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (kMaxInt == Smi::kMaxValue)); 1168ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1169f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LSmiTag(value)); 1170f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1171f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (to.IsSmi()) { 1172ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1173381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); 1174ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (val->CheckFlag(HInstruction::kUint32)) { 1175381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1176f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1177381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 1178f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1179e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsDouble()); 1180ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (val->CheckFlag(HInstruction::kUint32)) { 1181f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister( 1182ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org new(zone()) LUint32ToDouble(UseRegisterAtStart(val))); 1183f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1184f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister( 1185ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org new(zone()) LInteger32ToDouble(UseRegisterAtStart(val))); 1186f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1187f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1188f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1189f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UNREACHABLE(); 1190f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 1191f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1192f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1193f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1194f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 11959801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 11969801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org return AssignEnvironment(new(zone()) LCheckValue(value)); 1197f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1198f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1199f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1200f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 1201f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1202f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 1203f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* result = new(zone()) LCheckInstanceType(value, temp); 1204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(result); 1205f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1206f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 1209af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 1210af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1211af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LOperand* temp = TempRegister(); 1212af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value, temp)); 1213af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->HasMigrationTarget()) { 1214af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org info()->MarkAsDeferredCalling(); 1215af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org result = AssignPointerMap(result); 1216ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 1217ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1218f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1219f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1220f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1221f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 1222f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 12238f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org LInstruction* result = new(zone()) LCheckNonSmi(value); 1224eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org if (!instr->value()->type().IsHeapObject()) { 1225eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org result = AssignEnvironment(result); 1226eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 12278f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return result; 1228f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1229f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1230f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1231f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 1232f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1233f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(new(zone()) LCheckSmi(value)); 1234f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1235f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1236f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1237f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 1238f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HValue* value = instr->value(); 1239f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Representation input_rep = value->representation(); 1240f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* reg = UseRegister(value); 1241f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (input_rep.IsDouble()) { 1242f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LClampDToUint8(reg)); 1243f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (input_rep.IsInteger32()) { 1244f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LClampIToUint8(reg)); 1245f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1246e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(input_rep.IsSmiOrTagged()); 1247f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment( 1248f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineAsRegister(new(zone()) LClampTToUint8(reg, 12495924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org TempDoubleRegister()))); 1250f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1251f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1252f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1253f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1254f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 1255f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HClassOfTestAndBranch* instr) { 1256e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1257f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1258f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LClassOfTestAndBranch(value, 1259f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org TempRegister(), 1260f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org TempRegister()); 1261f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1262f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1263f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1264f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1265f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HCompareNumericAndBranch* instr) { 1266f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Representation r = instr->representation(); 1267f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (r.IsSmiOrInteger32()) { 1268e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(r)); 1269e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(r)); 1270f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 1271f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 1272f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 1273f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1274e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(r.IsDouble()); 1275e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1276e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 1277248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org if (instr->left()->IsConstant() && instr->right()->IsConstant()) { 1278248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org LOperand* left = UseConstant(instr->left()); 1279248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org LOperand* right = UseConstant(instr->right()); 1280248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 1281248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org } 1282248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 1283248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 1284f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 1285f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1286f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1287f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1288f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1289f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1290e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 1291e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 1292f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1293f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseFixed(instr->left(), x1); 1294f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = UseFixed(instr->right(), x0); 1295f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LCmpT* result = new(zone()) LCmpT(context, left, right); 1296f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 1297f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1298f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1299f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1300f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 1301f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HCompareHoleAndBranch* instr) { 1302f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegister(instr->value()); 1303f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->representation().IsTagged()) { 1304f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LCmpHoleAndBranchT(value); 1305f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1306f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 1307f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LCmpHoleAndBranchD(value, temp); 1308f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1309f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1310f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1311f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1312f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 1313f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HCompareObjectEqAndBranch* instr) { 1314f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 1315f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 1316f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LCmpObjectEqAndBranch(left, right); 1317f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1318f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1319f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1320f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 1321e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1322f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1323f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 1324f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LCmpMapAndBranch(value, temp); 1325f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1326f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1327f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1328f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 1329f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Representation r = instr->representation(); 1330f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (r.IsSmi()) { 1331f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LConstantS); 1332f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (r.IsInteger32()) { 1333f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LConstantI); 1334f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (r.IsDouble()) { 1335f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LConstantD); 1336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (r.IsExternal()) { 1337f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LConstantE); 1338f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (r.IsTagged()) { 1339f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LConstantT); 1340f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1341f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UNREACHABLE(); 1342f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 1343f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1344f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1345f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1346f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1347f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) { 1348f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->HasNoUses()) return NULL; 1349f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1350f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (info()->IsStub()) { 1351f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineFixed(new(zone()) LContext, cp); 1352f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1353f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1354f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LContext); 1355f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1356f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1357f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1358f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) { 1359f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* object = UseFixed(instr->value(), x0); 1360f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LDateField* result = new(zone()) LDateField(object, instr->index()); 1361f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr, CAN_DEOPTIMIZE_EAGERLY); 1362f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1363f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1364f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1365f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 1366f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LDebugBreak(); 1367f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1368f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1370f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 1371f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1372f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 1373f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1374f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1375f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1376f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 1377f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(new(zone()) LDeoptimize); 1378f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1379f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1380f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1381ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1382e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1383e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1384e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1385ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1386ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1387486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 1388486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1389486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1390486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 1391ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 1392486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org divisor != 1 && divisor != -1)) { 1393486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1394486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1395486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1396ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1397ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1398ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1399bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1400e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1403bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1404bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1405486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LOperand* temp = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) 1406486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org ? NULL : TempRegister(); 1407486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI( 1408486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp)); 1409486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (divisor == 0 || 1410486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1411486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 1412486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1413486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1414486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1415bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 1416bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1417bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1418ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HBinaryOperation* instr) { 1419e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1420e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1421e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1422ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1423ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1424ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* temp = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) 1425ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ? NULL : TempRegister(); 1426ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 1427ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp)); 1428ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) { 1429ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 1430ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 1431ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1432ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1433ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1434ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1435f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 1436ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1437bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1438bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivByPowerOf2I(instr); 1439bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else if (instr->right()->IsConstant()) { 1440bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivByConstI(instr); 1441bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else { 1442bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivI(instr); 1443bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } 1444f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (instr->representation().IsDouble()) { 1445f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticD(Token::DIV, instr); 1446f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1447f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticT(Token::DIV, instr); 1448f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1449f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1450f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1451f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1452f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 1453f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 1454f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1455f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1456f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1457f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 1458f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HEnvironment* outer = current_block_->last_environment(); 1459f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org outer->set_ast_id(instr->ReturnId()); 1460f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HConstant* undefined = graph()->GetConstantUndefined(); 1461f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HEnvironment* inner = outer->CopyForInlining(instr->closure(), 1462f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->arguments_count(), 1463f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->function(), 1464f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org undefined, 1465f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->inlining_kind()); 1466f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Only replay binding of arguments object if it wasn't removed from graph. 1467f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if ((instr->arguments_var() != NULL) && 1468f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->arguments_object()->IsLinked()) { 1469f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org inner->Bind(instr->arguments_var(), instr->arguments_object()); 1470f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1471ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org inner->BindContext(instr->closure_context()); 1472f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org inner->set_entry(instr); 1473f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org current_block_->UpdateEnvironment(inner); 1474f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org chunk_->AddInlinedClosure(instr->closure()); 1475f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 1476f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1477f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1478f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1479f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 1480f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UNREACHABLE(); 1481f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 1482f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1483f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1484f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1485f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation( 1486f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HForceRepresentation* instr) { 1487f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // All HForceRepresentation instructions should be eliminated in the 1488f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // representation change phase of Hydrogen. 1489f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UNREACHABLE(); 1490f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 1491f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1492f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1493f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1494f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 1495f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1496f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall( 1497f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineFixed(new(zone()) LFunctionLiteral(context), x0), instr); 1498f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1499f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1500f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1501f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 1502f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HGetCachedArrayIndex* instr) { 1503e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1504f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1505f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 1506f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1507f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1508f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1509f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 1510f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LGoto(instr->FirstSuccessor()); 1511f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1512f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1513f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1514f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 1515f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HHasCachedArrayIndexAndBranch* instr) { 1516e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1517f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LHasCachedArrayIndexAndBranch( 1518f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UseRegisterAtStart(instr->value()), TempRegister()); 1519f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1520f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1521f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1522f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 1523f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HHasInstanceTypeAndBranch* instr) { 1524e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1525f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1526f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LHasInstanceTypeAndBranch(value, TempRegister()); 1527f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1528f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1529f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1530f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject( 1531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HInnerAllocatedObject* instr) { 1532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* base_object = UseRegisterAtStart(instr->base_object()); 1533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 1534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister( 1535f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LInnerAllocatedObject(base_object, offset)); 1536f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1537f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1538f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1539f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 1540f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstanceOf* result = new(zone()) LInstanceOf( 1542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org context, 1543f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UseFixed(instr->left(), InstanceofStub::left()), 1544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UseFixed(instr->right(), InstanceofStub::right())); 1545f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 1546f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1547f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1548f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1549f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 1550f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HInstanceOfKnownGlobal* instr) { 1551f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstanceOfKnownGlobal* result = new(zone()) LInstanceOfKnownGlobal( 1552f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UseFixed(instr->context(), cp), 1553f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UseFixed(instr->left(), InstanceofStub::left())); 1554f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 1555f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1558e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache( 1559e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org HTailCallThroughMegamorphicCache* instr) { 1560e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1561e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* receiver_register = 1562e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister()); 1563e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* name_register = 1564e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->name(), LoadDescriptor::NameRegister()); 1565e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org // Not marked as call. It can't deoptimize, and it never returns. 1566e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return new (zone()) LTailCallThroughMegamorphicCache( 1567e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org context, receiver_register, name_register); 1568e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org} 1569e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 1570e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 1571f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1572f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1573f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // The function is required (by MacroAssembler::InvokeFunction) to be in x1. 1574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* function = UseFixed(instr->function(), x1); 1575f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 1576f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1577f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1578f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1579f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1580f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 1581f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HIsConstructCallAndBranch* instr) { 1582f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LIsConstructCallAndBranch(TempRegister(), TempRegister()); 1583f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1584f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1585f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1586f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( 1587f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HCompareMinusZeroAndBranch* instr) { 1588f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegister(instr->value()); 1589f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* scratch = TempRegister(); 1590f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LCompareMinusZeroAndBranch(value, scratch); 1591f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1592f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1593f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1594f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 1595e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1596f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1597f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp1 = TempRegister(); 1598f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp2 = TempRegister(); 1599f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LIsObjectAndBranch(value, temp1, temp2); 1600f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1601f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1602f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1603f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 1604e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1605f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1606f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 1607f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LIsStringAndBranch(value, temp); 1608f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1609f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1610f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1611f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1612e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1613f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LIsSmiAndBranch(UseRegisterAtStart(instr->value())); 1614f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1615f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1616f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1617f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 1618f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HIsUndetectableAndBranch* instr) { 1619e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1620f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1621f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LIsUndetectableAndBranch(value, TempRegister()); 1622f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1623f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1624f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1625f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 1626f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* pop = NULL; 1627f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HEnvironment* env = current_block_->last_environment(); 1628f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (env->entry()->arguments_pushed()) { 1630f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int argument_count = env->arguments_environment()->parameter_count(); 1631f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org pop = new(zone()) LDrop(argument_count); 1632e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->argument_delta() == -argument_count); 1633f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1634f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1635f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HEnvironment* outer = 1636f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org current_block_->last_environment()->DiscardInlined(false); 1637f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org current_block_->UpdateEnvironment(outer); 1638f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1639f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return pop; 1640f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1641f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1642f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1643f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 1644f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseRegisterAtStart(instr->value()); 1645f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* result = 1646f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineAsRegister(new(zone()) LLoadContextSlot(context)); 1647ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 1648ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 1649ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 1650ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1651f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1652f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1653f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1654f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 1655f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HLoadFunctionPrototype* instr) { 1656f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* function = UseRegister(instr->function()); 1657f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 1658f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(DefineAsRegister( 1659f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LLoadFunctionPrototype(function, temp))); 1660f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1661f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1662f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1663f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { 1664f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LLoadGlobalCell* result = new(zone()) LLoadGlobalCell(); 1665f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return instr->RequiresHoleCheck() 1666f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ? AssignEnvironment(DefineAsRegister(result)) 1667f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org : DefineAsRegister(result); 1668f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1669f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1670f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1671f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 1672f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1673fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* global_object = 16749aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister()); 16759d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 16769d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 16779aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 16789d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 16799d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 1680f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LLoadGlobalGeneric* result = 16819d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org new(zone()) LLoadGlobalGeneric(context, global_object, vector); 1682f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 1683f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1684f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1685f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1686f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 1687e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->key()->representation().IsSmiOrInteger32()); 1688f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ElementsKind elements_kind = instr->elements_kind(); 1689f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* elements = UseRegister(instr->elements()); 16905924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LOperand* key = UseRegisterOrConstant(instr->key()); 1691f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1692f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (!instr->is_typed_elements()) { 1693f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->representation().IsDouble()) { 1694f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = (!instr->key()->IsConstant() || 1695f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->RequiresHoleCheck()) 1696f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ? TempRegister() 1697f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org : NULL; 1698f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1699f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LLoadKeyedFixedDouble* result = 1700f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LLoadKeyedFixedDouble(elements, key, temp); 1701f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return instr->RequiresHoleCheck() 1702f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ? AssignEnvironment(DefineAsRegister(result)) 1703f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org : DefineAsRegister(result); 1704f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1705e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrTagged() || 1706f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->representation().IsInteger32()); 1707f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = instr->key()->IsConstant() ? NULL : TempRegister(); 1708f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LLoadKeyedFixed* result = 1709f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LLoadKeyedFixed(elements, key, temp); 1710f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return instr->RequiresHoleCheck() 1711f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ? AssignEnvironment(DefineAsRegister(result)) 1712f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org : DefineAsRegister(result); 1713f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1714f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1715e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((instr->representation().IsInteger32() && 1716f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org !IsDoubleOrFloatElementsKind(instr->elements_kind())) || 1717f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (instr->representation().IsDouble() && 1718f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org IsDoubleOrFloatElementsKind(instr->elements_kind()))); 1719f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1720f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = instr->key()->IsConstant() ? NULL : TempRegister(); 1721ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = DefineAsRegister( 1722ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org new(zone()) LLoadKeyedExternal(elements, key, temp)); 1723ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if ((elements_kind == EXTERNAL_UINT32_ELEMENTS || 1724ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org elements_kind == UINT32_ELEMENTS) && 1725ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org !instr->CheckFlag(HInstruction::kUint32)) { 1726ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 1727f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1728ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1729f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1730f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1731f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1732f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1733f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 1734f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1735fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 17369aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 17379aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister()); 17389d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 17399d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 17409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 17419d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 1742f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1743f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* result = 17449d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector), 17459d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org x0); 1746f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(result, instr); 1747f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1748f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1749f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1750f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 1751f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* object = UseRegisterAtStart(instr->object()); 1752f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LLoadNamedField(object)); 1753f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1754f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1755f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1756f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 1757f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1758fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 17599aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 17609d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 17619d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 17629aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 17639d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 17649d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 1765f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* result = 17669d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), x0); 1767f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(result, instr); 1768f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1769f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1770f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1771f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 1772f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LLoadRoot); 1773f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1774f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1775f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1776f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) { 1777f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* map = UseRegisterAtStart(instr->value()); 1778f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LMapEnumLength(map)); 1779f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1780f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1781f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1782ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 1783e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1785e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1786ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1787ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1788381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I( 1789381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org dividend, divisor)); 1790381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1791381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 1792381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1793381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org } 1794381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 1795ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1796ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1797ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1798bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1799e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1800e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1801e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1802bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1803bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 18047010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org LOperand* temp = 18057010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 18067010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 18077010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org NULL : TempRegister(); 18087010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org LInstruction* result = DefineAsRegister( 18097010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org new(zone()) LFlooringDivByConstI(dividend, divisor, temp)); 18107010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org if (divisor == 0 || 18117010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 18127010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org result = AssignEnvironment(result); 18137010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org } 18147010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return result; 1815bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 1816bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1817bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1818ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1819f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* dividend = UseRegister(instr->left()); 1820ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1821f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* remainder = TempRegister(); 1822ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LInstruction* result = 1823ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org DefineAsRegister(new(zone()) LFlooringDivI(dividend, divisor, remainder)); 1824ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return AssignEnvironment(result); 1825ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1826ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1827ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1828ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 1829ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1830ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DoFlooringDivByPowerOf2I(instr); 18317010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org } else if (instr->right()->IsConstant()) { 18327010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return DoFlooringDivByConstI(instr); 1833ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } else { 1834ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DoFlooringDivI(instr); 1835ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } 1836f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1837f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1838f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1839f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 1840f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = NULL; 1841f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = NULL; 1842f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1843e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1844e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1845f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org left = UseRegisterAtStart(instr->BetterLeftOperand()); 1846f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org right = UseRegisterOrConstantAtStart(instr->BetterRightOperand()); 1847f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1848e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1849e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1850e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 1851f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org left = UseRegisterAtStart(instr->left()); 1852f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org right = UseRegisterAtStart(instr->right()); 1853f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1854f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LMathMinMax(left, right)); 1855f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1856f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1857f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1858ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1859e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1860e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1861e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1862ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1863ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1864486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 1865486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1866e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (instr->CheckFlag(HValue::kLeftCanBeNegative) && 1867e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1868486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1869486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1870486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1871ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1872f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1873f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1874bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1875e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1876e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1877e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1878bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1879bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1880bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp = TempRegister(); 1881486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LModByConstI( 1882486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp)); 1883486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1884486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1885486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1886486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1887bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 1888bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1889bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1890ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1891e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1892e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1893e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1894ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1895ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1896486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LModI(dividend, divisor)); 1897486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1898486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1899486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1900486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1901486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1902ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1903f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1904f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1905ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1906ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1907bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1908bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModByPowerOf2I(instr); 1909bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else if (instr->right()->IsConstant()) { 1910bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModByConstI(instr); 1911bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else { 1912bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModI(instr); 1913bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } 1914ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } else if (instr->representation().IsDouble()) { 1915ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DoArithmeticD(Token::MOD, instr); 1916f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1917ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DoArithmeticT(Token::MOD, instr); 1918f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1919f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1920f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1921f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1922f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) { 1923f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1924e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1925e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1926f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1927f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 1928f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero); 1929f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1930f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HValue* least_const = instr->BetterLeftOperand(); 1931f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HValue* most_const = instr->BetterRightOperand(); 1932f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1933f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // LMulConstI can handle a subset of constants: 1934f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // With support for overflow detection: 1935f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // -1, 0, 1, 2 1936f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // 2^n, -(2^n) 19377a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org // Without support for overflow detection: 1938f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // 2^n + 1, -(2^n - 1) 1939f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (most_const->IsConstant()) { 1940f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int32_t constant = HConstant::cast(most_const)->Integer32Value(); 19417a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org bool small_constant = (constant >= -1) && (constant <= 2); 19427a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org bool end_range_constant = (constant <= -kMaxInt) || (constant == kMaxInt); 19437a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org int32_t constant_abs = Abs(constant); 19447a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org 19457a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org if (!end_range_constant && 194621d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org (small_constant || (base::bits::IsPowerOfTwo32(constant_abs)) || 194721d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org (!can_overflow && (base::bits::IsPowerOfTwo32(constant_abs + 1) || 194821d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org base::bits::IsPowerOfTwo32(constant_abs - 1))))) { 1949f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LConstantOperand* right = UseConstant(most_const); 195021d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org bool need_register = 195121d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org base::bits::IsPowerOfTwo32(constant_abs) && !small_constant; 1952ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* left = need_register ? UseRegister(least_const) 1953ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org : UseRegisterAtStart(least_const); 1954ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 1955ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DefineAsRegister(new(zone()) LMulConstIS(left, right)); 1956ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if ((bailout_on_minus_zero && constant <= 0) || can_overflow) { 1957ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 1958ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 1959ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1960f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1961f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1962f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1963f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // LMulI/S can handle all cases, but it requires that a register is 1964f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // allocated for the second operand. 1965ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* left = UseRegisterAtStart(least_const); 1966ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* right = UseRegisterAtStart(most_const); 1967ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = instr->representation().IsSmi() 1968ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org ? DefineAsRegister(new(zone()) LMulS(left, right)) 1969ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org : DefineAsRegister(new(zone()) LMulI(left, right)); 1970ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if ((bailout_on_minus_zero && least_const != most_const) || can_overflow) { 1971ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 1972f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1973f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return result; 1974f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (instr->representation().IsDouble()) { 1975f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticD(Token::MUL, instr); 1976f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1977f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticT(Token::MUL, instr); 1978f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1979f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1980f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1981f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1982f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 1983e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ == 0); 1984f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org allocator_->MarkAsOsrEntry(); 1985f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org current_block_->last_environment()->set_ast_id(instr->ast_id()); 1986f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(new(zone()) LOsrEntry); 1987f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1988f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1989f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1990f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 1991f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LParameter* result = new(zone()) LParameter; 1992f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->kind() == HParameter::STACK_PARAMETER) { 1993f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int spill_index = chunk_->GetParameterStackSlot(instr->index()); 1994f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsSpilled(result, spill_index); 1995f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 1996e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info()->IsStub()); 1997e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CallInterfaceDescriptor descriptor = 1998e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org info()->code_stub()->GetCallInterfaceDescriptor(); 1999f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int index = static_cast<int>(instr->index()); 200042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org Register reg = descriptor.GetEnvironmentParameterRegister(index); 2001f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineFixed(result, reg); 2002f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2003f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2004f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2005f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2006f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) { 2007e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 2008f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // We call a C function for double power. It can't trigger a GC. 2009f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // We need to use fixed result register for the call. 2010f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Representation exponent_type = instr->right()->representation(); 2011e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 2012f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseFixedDouble(instr->left(), d0); 20136313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org LOperand* right; 20146313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org if (exponent_type.IsInteger32()) { 20156313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org right = UseFixed(instr->right(), MathPowIntegerDescriptor::exponent()); 20166313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org } else if (exponent_type.IsDouble()) { 20176313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org right = UseFixedDouble(instr->right(), d1); 20186313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org } else { 20196313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org right = UseFixed(instr->right(), MathPowTaggedDescriptor::exponent()); 20206313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org } 2021f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LPower* result = new(zone()) LPower(left, right); 2022f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixedDouble(result, d0), 2023f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr, 2024f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CAN_DEOPTIMIZE_EAGERLY); 2025f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2026f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2027f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2028011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 2029011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int argc = instr->OperandCount(); 2030011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(new(zone()) LPreparePushArguments(argc), instr); 2031011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 2032011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LPushArguments* push_args = new(zone()) LPushArguments(zone()); 2033011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 2034011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (int i = 0; i < argc; ++i) { 2035011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (push_args->ShouldSplitPush()) { 2036011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(push_args, instr); 2037011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org push_args = new(zone()) LPushArguments(zone()); 2038011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 2039011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org push_args->AddArgument(UseRegister(instr->argument(i))); 2040011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 2041011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 2042011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org return push_args; 2043f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2044f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2045f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2046f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 2047f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2048f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall( 2049f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineFixed(new(zone()) LRegExpLiteral(context), x0), instr); 2050f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2051f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2052f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2053ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { 2054ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org HValue* value = instr->value(); 2055e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(value->representation().IsDouble()); 2056ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); 2057ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2058ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2059ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2060ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { 2061aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org LOperand* lo = UseRegisterAndClobber(instr->lo()); 2062ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* hi = UseRegister(instr->hi()); 2063aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); 2064ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2065ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2066ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2067f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 2068f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = info()->IsStub() 2069f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ? UseFixed(instr->context(), cp) 2070f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org : NULL; 2071f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 2072f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LReturn(UseFixed(instr->value(), x0), context, 2073f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org parameter_count); 2074f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2075f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2076f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2077f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 2078381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 2079381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 2080f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 2081f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LSeqStringGetChar* result = 2082f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LSeqStringGetChar(string, index, temp); 2083f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(result); 2084f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2085f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2086f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2087f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 2088f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* string = UseRegister(instr->string()); 2089f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* index = FLAG_debug_code 2090f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ? UseRegister(instr->index()) 2091f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org : UseRegisterOrConstant(instr->index()); 2092f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegister(instr->value()); 2093f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL; 2094f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 2095f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LSeqStringSetChar* result = 2096f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LSeqStringSetChar(context, string, index, value, temp); 2097f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(result); 2098f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2099f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2100f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 21015924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgHBitwiseBinaryOperation* LChunkBuilder::CanTransformToShiftedOp(HValue* val, 21025924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HValue** left) { 21035924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (!val->representation().IsInteger32()) return NULL; 21045924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (!(val->IsBitwise() || val->IsAdd() || val->IsSub())) return NULL; 21055924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21065924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HBinaryOperation* hinstr = HBinaryOperation::cast(val); 21075924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HValue* hleft = hinstr->left(); 21085924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HValue* hright = hinstr->right(); 2109e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(hleft->representation().Equals(hinstr->representation())); 2110e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(hright->representation().Equals(hinstr->representation())); 21115924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21125924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if ((hright->IsConstant() && 21135924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LikelyFitsImmField(hinstr, HConstant::cast(hright)->Integer32Value())) || 21145924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org (hinstr->IsCommutative() && hleft->IsConstant() && 21155924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LikelyFitsImmField(hinstr, HConstant::cast(hleft)->Integer32Value()))) { 21165924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // The constant operand will likely fit in the immediate field. We are 21175924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // better off with 21185924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // lsl x8, x9, #imm 21195924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // add x0, x8, #imm2 21205924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // than with 21215924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // mov x16, #imm2 21225924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // add x0, x16, x9 LSL #imm 21235924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return NULL; 21245924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21255924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21265924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HBitwiseBinaryOperation* shift = NULL; 21275924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // TODO(aleram): We will miss situations where a shift operation is used by 21285924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // different instructions both as a left and right operands. 21295924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (hright->IsBitwiseBinaryShift() && 21305924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HBitwiseBinaryOperation::cast(hright)->right()->IsConstant()) { 21315924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org shift = HBitwiseBinaryOperation::cast(hright); 21325924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (left != NULL) { 21335924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org *left = hleft; 21345924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21355924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } else if (hinstr->IsCommutative() && 21365924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org hleft->IsBitwiseBinaryShift() && 21375924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HBitwiseBinaryOperation::cast(hleft)->right()->IsConstant()) { 21385924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org shift = HBitwiseBinaryOperation::cast(hleft); 21395924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (left != NULL) { 21405924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org *left = hright; 21415924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21425924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } else { 21435924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return NULL; 21445924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21455924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21465924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if ((JSShiftAmountFromHConstant(shift->right()) == 0) && shift->IsShr()) { 21475924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org // Shifts right by zero can deoptimize. 21485924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return NULL; 21495924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21505924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21515924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return shift; 21525924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org} 21535924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21545924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21555924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgbool LChunkBuilder::ShiftCanBeOptimizedAway(HBitwiseBinaryOperation* shift) { 21565924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (!shift->representation().IsInteger32()) { 21575924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return false; 21585924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21595924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org for (HUseIterator it(shift->uses()); !it.Done(); it.Advance()) { 21605924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (shift != CanTransformToShiftedOp(it.value())) { 21615924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return false; 21625924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21635924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21645924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return true; 21655924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org} 21665924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21675924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21685924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgLInstruction* LChunkBuilder::TryDoOpWithShiftedRightOperand( 21695924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HBinaryOperation* instr) { 21705924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HValue* left; 21715924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HBitwiseBinaryOperation* shift = CanTransformToShiftedOp(instr, &left); 21725924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21735924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if ((shift != NULL) && ShiftCanBeOptimizedAway(shift)) { 21745924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return DoShiftedBinaryOp(instr, left, shift); 21755924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21765924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return NULL; 21775924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org} 21785924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21795924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21805924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgLInstruction* LChunkBuilder::DoShiftedBinaryOp( 21815924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org HBinaryOperation* hinstr, HValue* hleft, HBitwiseBinaryOperation* hshift) { 2182e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(hshift->IsBitwiseBinaryShift()); 2183e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!hshift->IsShr() || (JSShiftAmountFromHConstant(hshift->right()) > 0)); 21845924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21855924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LTemplateResultInstruction<1>* res; 21865924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LOperand* left = UseRegisterAtStart(hleft); 21875924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LOperand* right = UseRegisterAtStart(hshift->left()); 21885924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LOperand* shift_amount = UseConstant(hshift->right()); 21895924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org Shift shift_op; 21905924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org switch (hshift->opcode()) { 21915924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org case HValue::kShl: shift_op = LSL; break; 21925924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org case HValue::kShr: shift_op = LSR; break; 21935924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org case HValue::kSar: shift_op = ASR; break; 21945924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org default: UNREACHABLE(); shift_op = NO_SHIFT; 21955924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 21965924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 21975924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (hinstr->IsBitwise()) { 21985924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org res = new(zone()) LBitI(left, right, shift_op, shift_amount); 21995924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } else if (hinstr->IsAdd()) { 22005924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org res = new(zone()) LAddI(left, right, shift_op, shift_amount); 22015924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } else { 2202e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(hinstr->IsSub()); 22035924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org res = new(zone()) LSubI(left, right, shift_op, shift_amount); 22045924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 22055924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (hinstr->CheckFlag(HValue::kCanOverflow)) { 22065924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org AssignEnvironment(res); 22075924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 22085924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return DefineAsRegister(res); 22095924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org} 22105924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 22115924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 2212f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op, 2213f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HBitwiseBinaryOperation* instr) { 2214f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->representation().IsTagged()) { 2215f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticT(op, instr); 2216f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2217f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2218a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 2219e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 2220e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 2221f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 22225924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (ShiftCanBeOptimizedAway(instr)) { 22235924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return NULL; 22245924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 22255924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 2226f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = instr->representation().IsSmi() 2227f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ? UseRegister(instr->left()) 2228f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org : UseRegisterAtStart(instr->left()); 2229a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 2230a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 2231a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // The only shift that can deoptimize is `left >>> 0`, where left is negative. 2232a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // In these cases, the result is a uint32 that is too large for an int32. 2233a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org bool right_can_be_zero = !instr->right()->IsConstant() || 2234a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org (JSShiftAmountFromHConstant(instr->right()) == 0); 2235a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org bool can_deopt = false; 2236a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org if ((op == Token::SHR) && right_can_be_zero) { 2237f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (FLAG_opt_safe_uint32_operations) { 2238a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org can_deopt = !instr->CheckFlag(HInstruction::kUint32); 2239f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2240a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org can_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32); 2241f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2242f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2243f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2244f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* result; 2245f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->representation().IsInteger32()) { 2246a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org result = DefineAsRegister(new (zone()) LShiftI(op, left, right, can_deopt)); 2247f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2248e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmi()); 2249a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org result = DefineAsRegister(new (zone()) LShiftS(op, left, right, can_deopt)); 2250f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2251f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2252a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return can_deopt ? AssignEnvironment(result) : result; 2253f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2254f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2255f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2256f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) { 2257f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoShift(Token::ROR, instr); 2258f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2259f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2260f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2261f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) { 2262f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoShift(Token::SAR, instr); 2263f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2264f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2265f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2266f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) { 2267f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoShift(Token::SHL, instr); 2268f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2269f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2270f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2271f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) { 2272f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoShift(Token::SHR, instr); 2273f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2274f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2275f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2276f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2277f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 2278f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 2279f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2280f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2281f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2282f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 2283f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->is_function_entry()) { 2284f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2285f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(new(zone()) LStackCheck(context), instr); 2286f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2287e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->is_backwards_branch()); 2288f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseAny(instr->context()); 2289f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment( 2290f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org AssignPointerMap(new(zone()) LStackCheck(context))); 2291f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2292f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2293f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2294f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2295f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry(HStoreCodeEntry* instr) { 2296f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* function = UseRegister(instr->function()); 2297f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* code_object = UseRegisterAtStart(instr->code_object()); 2298f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 2299f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LStoreCodeEntry(function, code_object, temp); 2300f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2301f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2302f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2303f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 2304f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 2305f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context; 2306f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value; 2307f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->NeedsWriteBarrier()) { 2308f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // TODO(all): Replace these constraints when RecordWriteStub has been 2309f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // rewritten. 2310f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org context = UseRegisterAndClobber(instr->context()); 2311f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value = UseRegisterAndClobber(instr->value()); 2312f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2313f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org context = UseRegister(instr->context()); 2314f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org value = UseRegister(instr->value()); 2315f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2316f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp); 2317ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 2318ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 2319ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 2320ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 2321f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2322f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2323f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2324f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { 2325f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegister(instr->value()); 2326f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->RequiresHoleCheck()) { 2327f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(new(zone()) LStoreGlobalCell(value, 2328f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org TempRegister(), 2329f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org TempRegister())); 2330f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2331f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LStoreGlobalCell(value, TempRegister(), NULL); 2332f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2333f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2334f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2335f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 23375924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LOperand* key = UseRegisterOrConstant(instr->key()); 2338f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = NULL; 2339f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* elements = NULL; 2340f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* val = NULL; 2341f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2342f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (!instr->is_typed_elements() && 2343f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->value()->representation().IsTagged() && 2344f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->NeedsWriteBarrier()) { 2345f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // RecordWrite() will clobber all registers. 2346f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org elements = UseRegisterAndClobber(instr->elements()); 2347f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org val = UseRegisterAndClobber(instr->value()); 2348ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org temp = TempRegister(); 2349f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2350f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org elements = UseRegister(instr->elements()); 2351f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org val = UseRegister(instr->value()); 2352ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org temp = instr->key()->IsConstant() ? NULL : TempRegister(); 2353f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2354f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2355f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->is_typed_elements()) { 2356e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((instr->value()->representation().IsInteger32() && 2357f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org !IsDoubleOrFloatElementsKind(instr->elements_kind())) || 2358f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (instr->value()->representation().IsDouble() && 2359f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org IsDoubleOrFloatElementsKind(instr->elements_kind()))); 2360e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((instr->is_fixed_typed_array() && 2361f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->elements()->representation().IsTagged()) || 2362f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org (instr->is_external() && 2363f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->elements()->representation().IsExternal())); 2364f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LStoreKeyedExternal(elements, key, val, temp); 2365f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2366f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (instr->value()->representation().IsDouble()) { 2367e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->elements()->representation().IsTagged()); 2368f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LStoreKeyedFixedDouble(elements, key, val, temp); 2369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2370f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2371e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->elements()->representation().IsTagged()); 2372e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsSmiOrTagged() || 2373f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org instr->value()->representation().IsInteger32()); 2374f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LStoreKeyedFixed(elements, key, val, temp); 2375f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2376f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2377f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2378f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2379f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 2380f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2381fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 23829aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 23839aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister()); 23849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 2385f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2386e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->object()->representation().IsTagged()); 2387e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->key()->representation().IsTagged()); 2388e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 2389f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2390f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall( 2391f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LStoreKeyedGeneric(context, object, key, value), instr); 2392f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2393f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2394f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2395f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 2396f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // TODO(jbramley): It might be beneficial to allow value to be a constant in 2397f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // some cases. x64 makes use of this with FLAG_track_fields, for example. 2398f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2399f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* object = UseRegister(instr->object()); 2400486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LOperand* value; 2401486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LOperand* temp0 = NULL; 2402486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LOperand* temp1 = NULL; 2403486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 2404486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (instr->access().IsExternalMemory() || 2405486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->field_representation().IsDouble()) { 2406486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org value = UseRegister(instr->value()); 2407486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } else if (instr->NeedsWriteBarrier()) { 2408486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org value = UseRegisterAndClobber(instr->value()); 2409486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org temp0 = TempRegister(); 2410486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org temp1 = TempRegister(); 2411486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } else if (instr->NeedsWriteBarrierForMap()) { 2412486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org value = UseRegister(instr->value()); 2413486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org temp0 = TempRegister(); 2414486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org temp1 = TempRegister(); 2415486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } else { 2416486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org value = UseRegister(instr->value()); 2417486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org temp0 = TempRegister(); 2418486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 2419f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2420d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return new(zone()) LStoreNamedField(object, value, temp0, temp1); 2421f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2422f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2423f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2424f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 2425f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2426fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 24279aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 24289aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 242970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 2430f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* result = new(zone()) LStoreNamedGeneric(context, object, value); 2431f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(result, instr); 2432f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2433f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2434f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2435f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2436f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2437f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseFixed(instr->left(), x1); 2438f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = UseFixed(instr->right(), x0); 2439f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2440f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LStringAdd* result = new(zone()) LStringAdd(context, left, right); 2441f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 2442f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2443f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2444f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2445f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 2446f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* string = UseRegisterAndClobber(instr->string()); 2447f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* index = UseRegisterAndClobber(instr->index()); 2448f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseAny(instr->context()); 2449f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LStringCharCodeAt* result = 2450f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LStringCharCodeAt(context, string, index); 2451ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 2452f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2453f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2454f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2455f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 2456f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* char_code = UseRegister(instr->value()); 2457f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseAny(instr->context()); 2458f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LStringCharFromCode* result = 2459f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LStringCharFromCode(context, char_code); 2460f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignPointerMap(DefineAsRegister(result)); 2461f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2462f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2463f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2464f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStringCompareAndBranch( 2465f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HStringCompareAndBranch* instr) { 2466e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 2467e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 2468f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2469f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* left = UseFixed(instr->left(), x1); 2470f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = UseFixed(instr->right(), x0); 2471f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LStringCompareAndBranch* result = 2472f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LStringCompareAndBranch(context, left, right); 2473f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(result, instr); 2474f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2475f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2476f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2477f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) { 2478f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->representation().IsSmiOrInteger32()) { 2479e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 2480e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 24815924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 24825924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LInstruction* shifted_operation = TryDoOpWithShiftedRightOperand(instr); 24835924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org if (shifted_operation != NULL) { 24845924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org return shifted_operation; 24855924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org } 24865924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 2487f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand *left; 2488f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->left()->IsConstant() && 24899801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org (HConstant::cast(instr->left())->Integer32Value() == 0)) { 2490f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org left = UseConstant(instr->left()); 2491f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2492f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org left = UseRegisterAtStart(instr->left()); 2493f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2494f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 2495f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LInstruction* result = instr->representation().IsSmi() ? 2496f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineAsRegister(new(zone()) LSubS(left, right)) : 2497f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org DefineAsRegister(new(zone()) LSubI(left, right)); 2498f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 2499f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org result = AssignEnvironment(result); 2500f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2501f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return result; 2502f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else if (instr->representation().IsDouble()) { 2503f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticD(Token::SUB, instr); 2504f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2505f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DoArithmeticT(Token::SUB, instr); 2506f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2507f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2508f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2509f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2510f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 2511f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->HasNoUses()) { 2512f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 2513f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2514f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LThisFunction); 2515f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2516f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2517f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2518f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2519f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 2520f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* object = UseFixed(instr->value(), x0); 2521f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LToFastProperties* result = new(zone()) LToFastProperties(object); 2522f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 2523f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2524f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2525f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2526f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoTransitionElementsKind( 2527f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HTransitionElementsKind* instr) { 2528f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 25292f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org LOperand* object = UseRegister(instr->object()); 2530f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LTransitionElementsKind* result = 2531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LTransitionElementsKind(object, NULL, 2532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org TempRegister(), TempRegister()); 2533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return result; 2534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 25352f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org LOperand* object = UseFixed(instr->object(), x0); 2536f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2537f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LTransitionElementsKind* result = 25382f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org new(zone()) LTransitionElementsKind(object, context, NULL, NULL); 25392f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return MarkAsCall(result, instr); 2540f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2543f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento( 2545f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HTrapAllocationMemento* instr) { 2546f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* object = UseRegister(instr->object()); 2547f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp1 = TempRegister(); 2548f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp2 = TempRegister(); 2549f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LTrapAllocationMemento* result = 2550f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LTrapAllocationMemento(object, temp1, temp2); 2551f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(result); 2552f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2553f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2554f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2555f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // TODO(jbramley): In ARM, this uses UseFixed to force the input to x0. 2558f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // However, LCodeGen::DoTypeof just pushes it to the stack (for CallRuntime) 2559f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // anyway, so the input doesn't have to be in x0. We might be able to improve 2560f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // the ARM back-end a little by relaxing this restriction. 2561f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LTypeof* result = 2562f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org new(zone()) LTypeof(context, UseRegisterAtStart(instr->value())); 2563f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr); 2564f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2565f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2566f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2567f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 2568f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // We only need temp registers in some cases, but we can't dereference the 2569f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // instr->type_literal() handle to test that here. 2570f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp1 = TempRegister(); 2571f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp2 = TempRegister(); 2572f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2573f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return new(zone()) LTypeofIsAndBranch( 2574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UseRegister(instr->value()), temp1, temp2); 2575f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2576f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2577f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2578f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 2579f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org switch (instr->op()) { 2580f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case kMathAbs: { 2581f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Representation r = instr->representation(); 2582f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (r.IsTagged()) { 2583f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // The tagged case might need to allocate a HeapNumber for the result, 2584f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // so it is handled by a separate LInstruction. 2585f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2586f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegister(instr->value()); 2587f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp1 = TempRegister(); 2588f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp2 = TempRegister(); 2589f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp3 = TempRegister(); 2590ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = DefineAsRegister( 2591ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org new(zone()) LMathAbsTagged(context, input, temp1, temp2, temp3)); 2592ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return AssignEnvironment(AssignPointerMap(result)); 2593f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2594f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 2595ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LMathAbs(input)); 2596ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!r.IsDouble()) result = AssignEnvironment(result); 2597ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 2598f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2599f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2600f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case kMathExp: { 2601e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 2602e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 2603f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegister(instr->value()); 26045924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LOperand* double_temp1 = TempDoubleRegister(); 2605f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp1 = TempRegister(); 2606f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp2 = TempRegister(); 2607f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp3 = TempRegister(); 2608f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LMathExp* result = new(zone()) LMathExp(input, double_temp1, 2609f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org temp1, temp2, temp3); 2610f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(result); 2611f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2612f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case kMathFloor: { 2613e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 2614f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 2615a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org if (instr->representation().IsInteger32()) { 2616a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org LMathFloorI* result = new(zone()) LMathFloorI(input); 2617a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 2618a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org } else { 2619e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 2620a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org LMathFloorD* result = new(zone()) LMathFloorD(input); 2621a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org return DefineAsRegister(result); 2622a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org } 2623f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2624f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case kMathLog: { 2625e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 2626e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 2627f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseFixedDouble(instr->value(), d0); 2628f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LMathLog* result = new(zone()) LMathLog(input); 2629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixedDouble(result, d0), instr); 2630f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2631f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case kMathPowHalf: { 2632e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 2633e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 2634f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegister(instr->value()); 2635f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LMathPowHalf(input)); 2636f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2637f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case kMathRound: { 2638e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 2639f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegister(instr->value()); 2640a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org if (instr->representation().IsInteger32()) { 26415924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LOperand* temp = TempDoubleRegister(); 26425924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org LMathRoundI* result = new(zone()) LMathRoundI(input, temp); 2643a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org return AssignEnvironment(DefineAsRegister(result)); 2644a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org } else { 2645e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 2646a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org LMathRoundD* result = new(zone()) LMathRoundD(input); 2647a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org return DefineAsRegister(result); 2648a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org } 2649f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2650dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathFround: { 2651e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 2652dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LOperand* input = UseRegister(instr->value()); 2653dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LMathFround* result = new (zone()) LMathFround(input); 2654dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DefineAsRegister(result); 2655dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 2656f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case kMathSqrt: { 2657e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 2658e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 2659f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 2660f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LMathSqrt(input)); 2661f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2662f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case kMathClz32: { 2663e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 2664e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsInteger32()); 2665f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 2666f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(new(zone()) LMathClz32(input)); 2667f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2668f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org default: 2669f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org UNREACHABLE(); 2670f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 2671f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2672f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2673f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2674f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2675f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2676f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Use an index that corresponds to the location in the unoptimized frame, 2677f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // which the optimized frame will subsume. 2678f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int env_index = instr->index(); 2679f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int spill_index = 0; 2680f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (instr->environment()->is_parameter_index(env_index)) { 2681f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org spill_index = chunk_->GetParameterStackSlot(env_index); 2682f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } else { 2683f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org spill_index = env_index - instr->environment()->first_local_index(); 2684f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2685b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Retry(kTooManySpillSlotsNeededForOSR); 2686f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org spill_index = 0; 2687f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2688f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 2689f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 2690f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2691f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2692f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2693f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 2694f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return NULL; 2695f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2696f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2697f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2698f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 2699f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2700f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Assign object to a fixed register different from those already used in 2701f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // LForInPrepareMap. 2702f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* object = UseFixed(instr->enumerable(), x0); 2703f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 2704f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return MarkAsCall(DefineFixed(result, x0), instr, CAN_DEOPTIMIZE_EAGERLY); 2705f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2706f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2707f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2708f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 2709f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* map = UseRegister(instr->map()); 2710f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map))); 2711f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2712f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2713f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2714f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 2715f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 2716f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* map = UseRegister(instr->map()); 2717f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* temp = TempRegister(); 2718f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(new(zone()) LCheckMapValue(value, map, temp)); 2719f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2720f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2721f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2722f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 2723f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* object = UseRegisterAtStart(instr->object()); 2724a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org LOperand* index = UseRegisterAndClobber(instr->index()); 272563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 272663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org LInstruction* result = DefineSameAsFirst(load); 272763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org return AssignPointerMap(result); 2728f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2729f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2730f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2731f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 2732f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* receiver = UseRegister(instr->receiver()); 2733f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* function = UseRegister(instr->function()); 2734f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 2735f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return AssignEnvironment(DefineAsRegister(result)); 2736f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 2737f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 2738f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 27391e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { 27401e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseRegisterAtStart(instr->context()); 27411e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return new(zone()) LStoreFrameContext(context); 27421e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 27431e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 27441e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 27451e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext( 27461e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org HAllocateBlockContext* instr) { 27471e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 27481e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 27491e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LAllocateBlockContext* result = 27501e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org new(zone()) LAllocateBlockContext(context, function); 27511e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return MarkAsCall(DefineFixed(result, cp), instr); 27521e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 27531e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 27541e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 2755f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} } // namespace v8::internal 2756