13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without 3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are 4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met: 5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions of source code must retain the above copyright 7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// notice, this list of conditions and the following disclaimer. 8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions in binary form must reproduce the above 9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// copyright notice, this list of conditions and the following 10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// disclaimer in the documentation and/or other materials provided 11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// with the distribution. 12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contributors may be used to endorse or promote products derived 14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// from this software without specific prior written permission. 15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "v8.h" 29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "factory.h" 31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "hydrogen.h" 32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if V8_TARGET_ARCH_IA32 34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "ia32/lithium-ia32.h" 35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#elif V8_TARGET_ARCH_X64 36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "x64/lithium-x64.h" 37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#elif V8_TARGET_ARCH_ARM 38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "arm/lithium-arm.h" 3944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#elif V8_TARGET_ARCH_MIPS 4044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "mips/lithium-mips.h" 41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#else 42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#error Unsupported target architecture. 43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 { 46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal { 47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define DEFINE_COMPILE(type) \ 49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LInstruction* H##type::CompileToLithium(LChunkBuilder* builder) { \ 50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return builder->Do##type(this); \ 51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHYDROGEN_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DEFINE_COMPILE 54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* Representation::Mnemonic() const { 57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (kind_) { 58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kNone: return "v"; 59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTagged: return "t"; 60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kDouble: return "d"; 61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kInteger32: return "i"; 62e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch case kExternal: return "x"; 63257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch default: 64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 67257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 68257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 69257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint HValue::LoopWeight() const { 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const int w = FLAG_loop_weight; 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int weights[] = { 1, w, w*w, w*w*w, w*w*w*w }; 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return weights[Min(block()->LoopNestingDepth(), 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static_cast<int>(ARRAY_SIZE(weights)-1))]; 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::AssumeRepresentation(Representation r) { 79257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (CheckFlag(kFlexibleRepresentation)) { 80257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ChangeRepresentation(r); 81257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // The representation of the value is dictated by type feedback and 82257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // will not be changed later. 83257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ClearFlag(kFlexibleRepresentation); 84257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t ConvertAndSetOverflow(int64_t result, bool* overflow) { 89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (result > kMaxInt) { 90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *overflow = true; 91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kMaxInt; 92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (result < kMinInt) { 94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *overflow = true; 95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kMinInt; 96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 97b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return static_cast<int32_t>(result); 98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t AddWithoutOverflow(int32_t a, int32_t b, bool* overflow) { 102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int64_t result = static_cast<int64_t>(a) + static_cast<int64_t>(b); 103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ConvertAndSetOverflow(result, overflow); 104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t SubWithoutOverflow(int32_t a, int32_t b, bool* overflow) { 108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int64_t result = static_cast<int64_t>(a) - static_cast<int64_t>(b); 109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ConvertAndSetOverflow(result, overflow); 110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t MulWithoutOverflow(int32_t a, int32_t b, bool* overflow) { 114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int64_t result = static_cast<int64_t>(a) * static_cast<int64_t>(b); 115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ConvertAndSetOverflow(result, overflow); 116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochint32_t Range::Mask() const { 120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (lower_ == upper_) return lower_; 121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (lower_ >= 0) { 122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t res = 1; 123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while (res < upper_) { 124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch res = (res << 1) | 1; 125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return res; 127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return 0xffffffff; 129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::AddConstant(int32_t value) { 133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value == 0) return; 134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool may_overflow = false; // Overflow is ignored here. 135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = AddWithoutOverflow(lower_, value, &may_overflow); 136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = AddWithoutOverflow(upper_, value, &may_overflow); 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Verify(); 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 143e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Intersect(Range* other) { 144e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = Min(upper_, other->upper_); 145e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = Max(lower_, other->lower_); 146e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool b = CanBeMinusZero() && other->CanBeMinusZero(); 147e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_can_be_minus_zero(b); 148e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 149e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 150e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 151e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Union(Range* other) { 152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = Max(upper_, other->upper_); 153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = Min(lower_, other->lower_); 154e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool b = CanBeMinusZero() || other->CanBeMinusZero(); 155e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_can_be_minus_zero(b); 156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 159e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Sar(int32_t value) { 160e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t bits = value & 0x1F; 161e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = lower_ >> bits; 162e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = upper_ >> bits; 163e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_can_be_minus_zero(false); 164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 165e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 166e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 167e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Shl(int32_t value) { 168e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t bits = value & 0x1F; 169e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int old_lower = lower_; 170e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int old_upper = upper_; 171e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = lower_ << bits; 172e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = upper_ << bits; 173e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (old_lower != lower_ >> bits || old_upper != upper_ >> bits) { 174e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = kMaxInt; 175e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = kMinInt; 176e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 177e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_can_be_minus_zero(false); 178e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 179e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 180e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::AddAndCheckOverflow(Range* other) { 182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool may_overflow = false; 183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = AddWithoutOverflow(lower_, other->lower(), &may_overflow); 184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = AddWithoutOverflow(upper_, other->upper(), &may_overflow); 185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch KeepOrder(); 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Verify(); 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return may_overflow; 190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::SubAndCheckOverflow(Range* other) { 194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool may_overflow = false; 195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = SubWithoutOverflow(lower_, other->upper(), &may_overflow); 196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = SubWithoutOverflow(upper_, other->lower(), &may_overflow); 197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch KeepOrder(); 1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Verify(); 2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return may_overflow; 202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::KeepOrder() { 206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (lower_ > upper_) { 207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t tmp = lower_; 208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = upper_; 209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = tmp; 210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::Verify() const { 216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(lower_ <= upper_); 217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::MulAndCheckOverflow(Range* other) { 222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool may_overflow = false; 223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int v1 = MulWithoutOverflow(lower_, other->lower(), &may_overflow); 224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int v2 = MulWithoutOverflow(lower_, other->upper(), &may_overflow); 225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int v3 = MulWithoutOverflow(upper_, other->lower(), &may_overflow); 226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int v4 = MulWithoutOverflow(upper_, other->upper(), &may_overflow); 227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = Min(Min(v1, v2), Min(v3, v4)); 228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = Max(Max(v1, v2), Max(v3, v4)); 2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Verify(); 2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return may_overflow; 233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HType::ToString() { 237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (type_) { 238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTagged: return "tagged"; 239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTaggedPrimitive: return "primitive"; 240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTaggedNumber: return "number"; 241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kSmi: return "smi"; 242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kHeapNumber: return "heap-number"; 243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kString: return "string"; 244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kBoolean: return "boolean"; 245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kNonPrimitive: return "non-primitive"; 246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kJSArray: return "array"; 247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kJSObject: return "object"; 248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kUninitialized: return "uninitialized"; 249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return "Unreachable code"; 252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHType HType::TypeFromValue(Handle<Object> value) { 256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType result = HType::Tagged(); 257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value->IsSmi()) { 258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::Smi(); 259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsHeapNumber()) { 260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::HeapNumber(); 261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsString()) { 262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::String(); 263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsBoolean()) { 264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::Boolean(); 265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsJSObject()) { 266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::JSObject(); 267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsJSArray()) { 268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::JSArray(); 269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbool HValue::IsDefinedAfter(HBasicBlock* other) const { 275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return block()->block_id() > other->block_id(); 276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 277257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 278257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHUseListNode* HUseListNode::tail() { 2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Skip and remove dead items in the use list. 2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch while (tail_ != NULL && tail_->value()->CheckFlag(HValue::kIsDead)) { 2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch tail_ = tail_->tail_; 2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return tail_; 2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool HValue::CheckUsesForFlag(Flag f) { 2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (HUseIterator it(uses()); !it.Done(); it.Advance()) { 2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!it.value()->CheckFlag(f)) return false; 2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 296257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHUseIterator::HUseIterator(HUseListNode* head) : next_(head) { 297257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Advance(); 298257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 300257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 301257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HUseIterator::Advance() { 302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch current_ = next_; 303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (current_ != NULL) { 304257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch next_ = current_->tail(); 305257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_ = current_->value(); 306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch index_ = current_->index(); 307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint HValue::UseCount() const { 312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int count = 0; 313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (HUseIterator it(uses()); !it.Done(); it.Advance()) ++count; 314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return count; 315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHUseListNode* HValue::RemoveUse(HValue* value, int index) { 319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* previous = NULL; 320257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* current = use_list_; 321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch while (current != NULL) { 322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (current->value() == value && current->index() == index) { 323257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (previous == NULL) { 324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch use_list_ = current->tail(); 325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 326257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch previous->set_tail(current->tail()); 327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 328257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch break; 329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 331257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch previous = current; 332257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch current = current->tail(); 333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 335257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG 336257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Do not reuse use list nodes in debug mode, zap them. 337257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (current != NULL) { 338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* temp = 339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch new HUseListNode(current->value(), current->index(), NULL); 340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch current->Zap(); 341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch current = temp; 342257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif 344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return current; 345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 348e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochbool HValue::Equals(HValue* other) { 349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (other->opcode() != opcode()) return false; 350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!other->representation().Equals(representation())) return false; 351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!other->type_.Equals(type_)) return false; 3521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (other->flags() != flags()) return false; 353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OperandCount() != other->OperandCount()) return false; 354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OperandAt(i)->id() != other->OperandAt(i)->id()) return false; 356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool result = DataEquals(other); 358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!result || Hashcode() == other->Hashcode()); 359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochintptr_t HValue::Hashcode() { 364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch intptr_t result = opcode(); 365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int count = OperandCount(); 366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < count; ++i) { 367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = result * 19 + OperandAt(i)->id() + (result >> 7); 368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 373257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochconst char* HValue::Mnemonic() const { 374257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch switch (opcode()) { 375257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define MAKE_CASE(type) case k##type: return #type; 376257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_CONCRETE_INSTRUCTION_LIST(MAKE_CASE) 377257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#undef MAKE_CASE 378257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case kPhi: return "Phi"; 379257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch default: return ""; 380257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 381257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 382257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 383257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::SetOperandAt(int index, HValue* value) { 385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch RegisterUse(index, value); 386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InternalSetOperandAt(index, value); 387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::DeleteAndReplaceWith(HValue* other) { 391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // We replace all uses first, so Delete can assert that there are none. 392257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (other != NULL) ReplaceAllUsesWith(other); 393257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(HasNoUses()); 3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Kill(); 395257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DeleteFromGraph(); 396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::ReplaceAllUsesWith(HValue* other) { 400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch while (use_list_ != NULL) { 401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* list_node = use_list_; 402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value = list_node->value(); 403257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!value->block()->IsStartBlock()); 404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value->InternalSetOperandAt(list_node->index(), other); 405257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch use_list_ = list_node->tail(); 406257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch list_node->set_tail(other->use_list_); 407257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch other->use_list_ = list_node; 408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HValue::Kill() { 4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Instead of going through the entire use list of each operand, we only 4143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // check the first item in each use list and rely on the tail() method to 4153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // skip dead items, removing them lazily next time we traverse the list. 4163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetFlag(kIsDead); 417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* operand = OperandAt(i); 4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HUseListNode* first = operand->use_list_; 4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (first != NULL && first->value() == this && first->index() == i) { 4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->use_list_ = first->tail(); 4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 427257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::SetBlock(HBasicBlock* block) { 428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(block_ == NULL || block == NULL); 429257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch block_ = block; 430257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (id_ == kNoNumber && block != NULL) { 431257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch id_ = block->graph()->GetNextValueID(this); 432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::PrintTypeTo(StringStream* stream) { 437257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!representation().IsTagged() || type().Equals(HType::Tagged())) return; 438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(" type[%s]", type().ToString()); 439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::PrintRangeTo(StringStream* stream) { 443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (range() == NULL || range()->IsMostGeneric()) return; 444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(" range[%d,%d,m0=%d]", 445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch range()->lower(), 446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch range()->upper(), 447257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static_cast<int>(range()->CanBeMinusZero())); 448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::PrintChangesTo(StringStream* stream) { 4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet changes_flags = ChangesFlags(); 4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (changes_flags.IsEmpty()) return; 454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(" changes["); 4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (changes_flags == AllSideEffectsFlagSet()) { 456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("*"); 457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool add_comma = false; 4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define PRINT_DO(type) \ 4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (changes_flags.Contains(kChanges##type)) { \ 4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (add_comma) stream->Add(","); \ 4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch add_comma = true; \ 4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(#type); \ 464257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch GVN_FLAG_LIST(PRINT_DO); 466257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#undef PRINT_DO 467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("]"); 469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::PrintNameTo(StringStream* stream) { 473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("%s%d", representation_.Mnemonic(), id()); 474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HValue::UpdateInferredType() { 478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type = CalculateInferredType(); 479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool result = (!type.Equals(type_)); 480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch type_ = type; 481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::RegisterUse(int index, HValue* new_value) { 486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* old_value = OperandAt(index); 487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (old_value == new_value) return; 488257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 489257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* removed = NULL; 490257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (old_value != NULL) { 491257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch removed = old_value->RemoveUse(this, index); 492257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (new_value != NULL) { 495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (removed == NULL) { 496257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch new_value->use_list_ = 497257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch new HUseListNode(this, index, new_value->use_list_); 498257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch removed->set_tail(new_value->use_list_); 500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch new_value->use_list_ = removed; 501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HValue::AddNewRange(Range* r, Zone* zone) { 5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!HasRange()) ComputeInitialRange(zone); 5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!HasRange()) range_ = new(zone) Range(); 509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasRange()); 510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch r->StackUpon(range_); 511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range_ = r; 512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::RemoveLastAddedRange() { 516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasRange()); 517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(range_->next() != NULL); 518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range_ = range_->next(); 519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HValue::ComputeInitialRange(Zone* zone) { 523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!HasRange()); 5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch range_ = InferRange(zone); 525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasRange()); 526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 529e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HInstruction::PrintTo(StringStream* stream) { 530257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PrintMnemonicTo(stream); 531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch PrintDataTo(stream); 532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PrintRangeTo(stream); 533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PrintChangesTo(stream); 534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PrintTypeTo(stream); 535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HInstruction::PrintMnemonicTo(StringStream* stream) { 539589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch stream->Add("%s ", Mnemonic()); 540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::Unlink() { 544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(IsLinked()); 545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsControlInstruction()); // Must never move control instructions. 546e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(!IsBlockEntry()); // Doesn't make sense to delete these. 547e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(previous_ != NULL); 548e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch previous_->next_ = next_; 549e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (next_ == NULL) { 550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(block()->last() == this); 551e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch block()->set_last(previous_); 552e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 553e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_->previous_ = previous_; 554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch clear_block(); 556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::InsertBefore(HInstruction* next) { 560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsLinked()); 561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!next->IsBlockEntry()); 562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsControlInstruction()); 563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!next->block()->IsStartBlock()); 564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(next->previous_ != NULL); 565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* prev = next->previous(); 566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch prev->next_ = this; 567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next->previous_ = this; 568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next_ = next; 569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous_ = prev; 570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetBlock(next->block()); 571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::InsertAfter(HInstruction* previous) { 575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsLinked()); 576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!previous->IsControlInstruction()); 577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsControlInstruction() || previous->next_ == NULL); 578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block = previous->block(); 579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Never insert anything except constants into the start block after finishing 580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it. 581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (block->IsStartBlock() && block->IsFinished() && !IsConstant()) { 582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block->end()->SecondSuccessor() == NULL); 583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InsertAfter(block->end()->FirstSuccessor()->first()); 584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return; 585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If we're inserting after an instruction with side-effects that is 588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // followed by a simulate instruction, we need to insert after the 589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // simulate instruction instead. 590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* next = previous->next_; 5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (previous->HasObservableSideEffects() && next != NULL) { 592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(next->IsSimulate()); 593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous = next; 594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next = previous->next_; 595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous_ = previous; 598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next_ = next; 599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetBlock(block); 600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous->next_ = this; 601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (next != NULL) next->previous_ = this; 602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 6061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HInstruction::Verify() { 607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Verify that input operands are defined before use. 608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* cur_block = block(); 609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* other_operand = OperandAt(i); 611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* other_block = other_operand->block(); 612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (cur_block == other_block) { 613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!other_operand->IsPhi()) { 6143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* cur = this->previous(); 615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while (cur != NULL) { 616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (cur == other_operand) break; 6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cur = cur->previous(); 618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Must reach other operand in the same block! 620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(cur == other_operand); 621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 623257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // If the following assert fires, you may have forgotten an 624257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // AddInstruction. 625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(other_block->Dominates(cur_block)); 626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Verify that instructions that may have side-effects are followed 630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // by a simulate instruction. 6313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (HasObservableSideEffects() && !IsOsrEntry()) { 632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(next()->IsSimulate()); 633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Verify that instructions that can be eliminated by GVN have overridden 6361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // HValue::DataEquals. The default implementation is UNREACHABLE. We 6371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // don't actually care whether DataEquals returns true or false here. 6381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (CheckFlag(kUseGVN)) DataEquals(this); 639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 643e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryCall::PrintDataTo(StringStream* stream) { 6441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block value()->PrintNameTo(stream); 6451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 646e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 6471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 6481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 650e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HBinaryCall::PrintDataTo(StringStream* stream) { 6511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block first()->PrintNameTo(stream); 6521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 6531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block second()->PrintNameTo(stream); 6541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 6561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 6571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 65969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid HBoundsCheck::PrintDataTo(StringStream* stream) { 66069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch index()->PrintNameTo(stream); 66169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stream->Add(" "); 66269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch length()->PrintNameTo(stream); 66369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 66469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 66569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 666e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallConstantFunction::PrintDataTo(StringStream* stream) { 6671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (IsApplyFunction()) { 6681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("optimized apply "); 6691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 6701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%o ", function()->shared()->DebugName()); 671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 672e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 676e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallNamed::PrintDataTo(StringStream* stream) { 6771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%o ", *name()); 6781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall::PrintDataTo(stream); 679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 682e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallGlobal::PrintDataTo(StringStream* stream) { 6831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%o ", *name()); 6841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall::PrintDataTo(stream); 685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 688e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallKnownGlobal::PrintDataTo(StringStream* stream) { 6891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("o ", target()->shared()->DebugName()); 690e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 694e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallRuntime::PrintDataTo(StringStream* stream) { 6951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%o ", *name()); 696e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 7011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("class_of_test("); 702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 7031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(", \"%o\")", *class_name()); 704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 707e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HAccessArgumentsAt::PrintDataTo(StringStream* stream) { 7081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block arguments()->PrintNameTo(stream); 7091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("["); 7101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block index()->PrintNameTo(stream); 7111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("], length "); 7121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block length()->PrintNameTo(stream); 713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 716e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HControlInstruction::PrintDataTo(StringStream* stream) { 7173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add(" goto ("); 7183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool first_block = true; 7193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (HSuccessorIterator it(this); !it.Done(); it.Advance()) { 7203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add(first_block ? "B%d" : ", B%d", it.Current()->block_id()); 7213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch first_block = false; 7221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 7233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add(")"); 724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryControlInstruction::PrintDataTo(StringStream* stream) { 728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 7291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HControlInstruction::PrintDataTo(stream); 730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HIsNilAndBranch::PrintDataTo(StringStream* stream) { 7343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintNameTo(stream); 7353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(kind() == kStrictEquality ? " === " : " == "); 7363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(nil() == kNullValue ? "null" : "undefined"); 7373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HControlInstruction::PrintDataTo(stream); 7383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HReturn::PrintDataTo(StringStream* stream) { 7423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch value()->PrintNameTo(stream); 7433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 7443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 746e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCompareMap::PrintDataTo(StringStream* stream) { 747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 7481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" (%p)", *map()); 7491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HControlInstruction::PrintDataTo(stream); 750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HUnaryMathOperation::OpName() const { 754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (op()) { 755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathFloor: return "floor"; 756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathRound: return "round"; 757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCeil: return "ceil"; 758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathAbs: return "abs"; 759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathLog: return "log"; 760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSin: return "sin"; 761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCos: return "cos"; 762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathTan: return "tan"; 763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathASin: return "asin"; 764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathACos: return "acos"; 765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathATan: return "atan"; 766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathExp: return "exp"; 767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSqrt: return "sqrt"; 768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: break; 769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return "(unknown operation)"; 771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 774e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryMathOperation::PrintDataTo(StringStream* stream) { 775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* name = OpName(); 776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("%s ", name); 777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 781e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryOperation::PrintDataTo(StringStream* stream) { 782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (from_) { 7893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case FIRST_JS_RECEIVER_TYPE: 790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (to_ == LAST_TYPE) stream->Add(" spec_object"); 791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case JS_REGEXP_TYPE: 793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (to_ == JS_REGEXP_TYPE) stream->Add(" reg_exp"); 794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case JS_ARRAY_TYPE: 796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (to_ == JS_ARRAY_TYPE) stream->Add(" array"); 797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case JS_FUNCTION_TYPE: 799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (to_ == JS_FUNCTION_TYPE) stream->Add(" function"); 800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" == %o", *type_literal_); 8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HControlInstruction::PrintDataTo(stream); 8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HCheckMapValue::PrintDataTo(StringStream* stream) { 8153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintNameTo(stream); 8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map()->PrintNameTo(stream); 8183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HForInPrepareMap::PrintDataTo(StringStream* stream) { 8223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enumerable()->PrintNameTo(stream); 8233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HForInCacheArray::PrintDataTo(StringStream* stream) { 8273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enumerable()->PrintNameTo(stream); 8283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 8293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map()->PrintNameTo(stream); 8303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("[%d]", idx_); 8313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HLoadFieldByIndex::PrintDataTo(StringStream* stream) { 8353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintNameTo(stream); 8363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 8373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index()->PrintNameTo(stream); 8383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HConstant::Canonicalize() { 8423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HasNoUses() ? NULL : this; 8433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HTypeof::Canonicalize() { 8473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HasNoUses() ? NULL : this; 8483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HBitwise::Canonicalize() { 8523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!representation().IsInteger32()) return this; 8533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If x is an int32, then x & -1 == x, x | 0 == x and x ^ 0 == x. 8543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t nop_constant = (op() == Token::BIT_AND) ? -1 : 0; 8553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (left()->IsConstant() && 8563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant::cast(left())->HasInteger32Value() && 8573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant::cast(left())->Integer32Value() == nop_constant) { 8583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return right(); 8593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (right()->IsConstant() && 8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant::cast(right())->HasInteger32Value() && 8623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant::cast(right())->Integer32Value() == nop_constant) { 8633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return left(); 8643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 8663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8693ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HAdd::Canonicalize() { 8703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!representation().IsInteger32()) return this; 8713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (CheckUsesForFlag(kTruncatingToInt32)) ClearFlag(kCanOverflow); 8723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 8733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HSub::Canonicalize() { 8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!representation().IsInteger32()) return this; 8783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (CheckUsesForFlag(kTruncatingToInt32)) ClearFlag(kCanOverflow); 8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 8803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HChange::Canonicalize() { 8843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (from().Equals(to())) ? value() : this; 8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HWrapReceiver::Canonicalize() { 8893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (HasNoUses()) return NULL; 8903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (receiver()->type().IsJSObject()) { 8913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return receiver(); 8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 8943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HTypeof::PrintDataTo(StringStream* stream) { 8983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintNameTo(stream); 899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 902e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HChange::PrintDataTo(StringStream* stream) { 903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HUnaryOperation::PrintDataTo(stream); 9043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" %s to %s", from().Mnemonic(), to().Mnemonic()); 905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CanTruncateToInt32()) stream->Add(" truncating-int32"); 907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?"); 9083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (CheckFlag(kDeoptimizeOnUndefined)) stream->Add(" deopt-on-undefined"); 909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 912589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid HJSArrayLength::PrintDataTo(StringStream* stream) { 913589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch value()->PrintNameTo(stream); 914589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch stream->Add(" "); 915589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch typecheck()->PrintNameTo(stream); 916589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 917589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 918589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 9193fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHValue* HCheckInstanceType::Canonicalize() { 9203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (check_ == IS_STRING && 9213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch !value()->type().IsUninitialized() && 9223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch value()->type().IsString()) { 9233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return NULL; 9243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 9253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (check_ == IS_SYMBOL && 9263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch value()->IsConstant() && 9273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HConstant::cast(value())->handle()->IsSymbol()) { 9283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return NULL; 9293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 9303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this; 9313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 9323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 934257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HCheckInstanceType::GetCheckInterval(InstanceType* first, 935257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch InstanceType* last) { 936257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(is_interval_check()); 937257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch switch (check_) { 9383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case IS_SPEC_OBJECT: 9393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch *first = FIRST_SPEC_OBJECT_TYPE; 9403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch *last = LAST_SPEC_OBJECT_TYPE; 941257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return; 942257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case IS_JS_ARRAY: 943257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch *first = *last = JS_ARRAY_TYPE; 944257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return; 945257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch default: 946257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch UNREACHABLE(); 947257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 948257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 949257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 950257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HCheckInstanceType::GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag) { 952257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!is_interval_check()); 953257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch switch (check_) { 954257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case IS_STRING: 955257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch *mask = kIsNotStringMask; 956257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch *tag = kStringTag; 957257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return; 958257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case IS_SYMBOL: 959257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch *mask = kIsSymbolMask; 960257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch *tag = kSymbolTag; 961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return; 962257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch default: 963257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch UNREACHABLE(); 964257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCheckMap::PrintDataTo(StringStream* stream) { 969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" %p", *map()); 9713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (mode() == REQUIRE_EXACT_MAP) { 9723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" [EXACT]"); 9733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (!has_element_transitions_) { 9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" [EXACT*]"); 9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 9763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" [MATCH ELEMENTS]"); 9773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 981e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCheckFunction::PrintDataTo(StringStream* stream) { 982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" %p", *target()); 984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* HCheckInstanceType::GetCheckName() { 9883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (check_) { 9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case IS_SPEC_OBJECT: return "object"; 9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case IS_JS_ARRAY: return "array"; 9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case IS_STRING: return "string"; 9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case IS_SYMBOL: return "symbol"; 9933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ""; 9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HCheckInstanceType::PrintDataTo(StringStream* stream) { 9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("%s ", GetCheckName()); 10003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HUnaryOperation::PrintDataTo(stream); 10013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1004e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallStub::PrintDataTo(StringStream* stream) { 10051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%s ", 10061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CodeStub::MajorName(major_key_, false)); 10071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall::PrintDataTo(stream); 1008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1011e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HInstanceOf::PrintDataTo(StringStream* stream) { 10121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block left()->PrintNameTo(stream); 10131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 10141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block right()->PrintNameTo(stream); 10151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 10161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block context()->PrintNameTo(stream); 1017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HValue::InferRange(Zone* zone) { 102169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Untagged integer32 cannot be -0, all other representations can. 10223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* result = new(zone) Range(); 102369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch result->set_can_be_minus_zero(!representation().IsInteger32()); 102469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return result; 102569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 102669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 102769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HChange::InferRange(Zone* zone) { 102969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Range* input_range = value()->range(); 103069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (from().IsInteger32() && 103169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch to().IsTagged() && 103269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch input_range != NULL && input_range->IsInSmiRange()) { 103369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch set_type(HType::Smi()); 1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 103569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Range* result = (input_range != NULL) 10363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? input_range->Copy(zone) 10373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HValue::InferRange(zone); 103869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (to().IsInteger32()) result->set_can_be_minus_zero(false); 103969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return result; 1040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HConstant::InferRange(Zone* zone) { 1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (has_int32_value_) { 10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* result = new(zone) Range(int32_value_, int32_value_); 1046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result->set_can_be_minus_zero(false); 1047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 10493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10533ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HPhi::InferRange(Zone* zone) { 1054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 1055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (block()->IsLoopHeader()) { 10563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* range = new(zone) Range(kMinInt, kMaxInt); 1057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return range; 1058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 10593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* range = OperandAt(0)->range()->Copy(zone); 1060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 1; i < OperandCount(); ++i) { 1061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range->Union(OperandAt(i)->range()); 1062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return range; 1064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 10663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 1067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10713ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HAdd::InferRange(Zone* zone) { 1072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 1073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* a = left()->range(); 1074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* b = right()->range(); 10753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* res = a->Copy(zone); 1076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!res->AddAndCheckOverflow(b)) { 1077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(kCanOverflow); 1078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool m0 = a->CanBeMinusZero() && b->CanBeMinusZero(); 1080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch res->set_can_be_minus_zero(m0); 1081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return res; 1082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 10833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 1084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HSub::InferRange(Zone* zone) { 1089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 1090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* a = left()->range(); 1091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* b = right()->range(); 10923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* res = a->Copy(zone); 1093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!res->SubAndCheckOverflow(b)) { 1094b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(kCanOverflow); 1095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch res->set_can_be_minus_zero(a->CanBeMinusZero() && b->CanBeZero()); 1097b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return res; 1098b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 10993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 1100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 11043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HMul::InferRange(Zone* zone) { 1105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 1106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* a = left()->range(); 1107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* b = right()->range(); 11083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* res = a->Copy(zone); 1109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!res->MulAndCheckOverflow(b)) { 1110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(kCanOverflow); 1111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool m0 = (a->CanBeZero() && b->CanBeNegative()) || 1113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch (a->CanBeNegative() && b->CanBeZero()); 1114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch res->set_can_be_minus_zero(m0); 1115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return res; 1116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 11173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 1118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HDiv::InferRange(Zone* zone) { 1123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 11243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* result = new(zone) Range(); 1125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (left()->range()->CanBeMinusZero()) { 1126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result->set_can_be_minus_zero(true); 1127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (left()->range()->CanBeZero() && right()->range()->CanBeNegative()) { 1130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result->set_can_be_minus_zero(true); 1131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (right()->range()->Includes(-1) && left()->range()->Includes(kMinInt)) { 1134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(HValue::kCanOverflow); 1135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!right()->range()->CanBeZero()) { 1138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(HValue::kCanBeDivByZero); 1139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 1141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 1143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HMod::InferRange(Zone* zone) { 1148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 1149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* a = left()->range(); 11503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* result = new(zone) Range(); 1151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (a->CanBeMinusZero() || a->CanBeNegative()) { 1152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result->set_can_be_minus_zero(true); 1153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!right()->range()->CanBeZero()) { 1155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(HValue::kCanBeDivByZero); 1156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 1158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 11593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 1160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HPhi::PrintTo(StringStream* stream) { 1165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("["); 1166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 1167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* value = OperandAt(i); 1168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" "); 1169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value->PrintNameTo(stream); 1170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" "); 1171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1172589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch stream->Add(" uses%d_%di_%dd_%dt", 1173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch UseCount(), 1174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_non_phi_uses() + int32_indirect_uses(), 1175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double_non_phi_uses() + double_indirect_uses(), 1176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch tagged_non_phi_uses() + tagged_indirect_uses()); 1177589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch stream->Add("%s%s]", 1178589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch is_live() ? "_live" : "", 1179589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch IsConvertibleToInteger() ? "" : "_ncti"); 1180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddInput(HValue* value) { 1184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inputs_.Add(NULL); 1185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(OperandCount() - 1, value); 1186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Mark phis that may have 'arguments' directly or indirectly as an operand. 1187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!CheckFlag(kIsArguments) && value->CheckFlag(kIsArguments)) { 1188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kIsArguments); 1189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 119344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool HPhi::HasRealUses() { 1194257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (HUseIterator it(uses()); !it.Done(); it.Advance()) { 1195257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!it.value()->IsPhi()) return true; 119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return false; 119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1201e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHValue* HPhi::GetRedundantReplacement() { 1202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* candidate = NULL; 1203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int count = OperandCount(); 1204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int position = 0; 1205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while (position < count && candidate == NULL) { 1206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* current = OperandAt(position++); 1207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (current != this) candidate = current; 1208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while (position < count) { 1210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* current = OperandAt(position++); 1211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (current != this && current != candidate) return NULL; 1212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(candidate != this); 1214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return candidate; 1215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::DeleteFromGraph() { 1219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block() != NULL); 1220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch block()->RemovePhi(this); 1221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block() == NULL); 1222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::InitRealUses(int phi_id) { 1226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Initialize real uses. 1227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch phi_id_ = phi_id; 1228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (HUseIterator it(uses()); !it.Done(); it.Advance()) { 1229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value = it.value(); 1230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!value->IsPhi()) { 1231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Representation rep = value->RequiredInputRepresentation(it.index()); 12323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch non_phi_uses_[rep.kind()] += value->LoopWeight(); 1233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddNonPhiUsesFrom(HPhi* other) { 1239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < Representation::kNumRepresentations; i++) { 1240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch indirect_uses_[i] += other->non_phi_uses_[i]; 1241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddIndirectUsesTo(int* dest) { 1246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < Representation::kNumRepresentations; i++) { 1247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch dest[i] += indirect_uses_[i]; 1248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1252e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HSimulate::PrintDataTo(StringStream* stream) { 12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("id=%d", ast_id()); 12543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (pop_count_ > 0) stream->Add(" pop %d", pop_count_); 1255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (values_.length() > 0) { 1256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (pop_count_ > 0) stream->Add(" /"); 1257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < values_.length(); ++i) { 12583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (i > 0) stream->Add(","); 12593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (HasAssignedIndexAt(i)) { 126085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch stream->Add(" var[%d] = ", GetAssignedIndexAt(i)); 12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 12623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" push "); 1263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_[i]->PrintNameTo(stream); 1265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 12703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HDeoptimize::PrintDataTo(StringStream* stream) { 12713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (OperandCount() == 0) return; 12723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch OperandAt(0)->PrintNameTo(stream); 12733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (int i = 1; i < OperandCount(); ++i) { 12743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add(" "); 12753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch OperandAt(i)->PrintNameTo(stream); 12763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 12773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 12783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 12793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HEnterInlined::PrintDataTo(StringStream* stream) { 1281589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch SmartArrayPointer<char> name = function()->debug_name()->ToCString(); 1282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("%s, id=%d", *name, function()->id()); 1283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant::HConstant(Handle<Object> handle, Representation r) 1287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : handle_(handle), 1288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch has_int32_value_(false), 1289053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block has_double_value_(false), 1290257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int32_value_(0), 1291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double_value_(0) { 1292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(r); 1293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (handle_->IsNumber()) { 1295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double n = handle_->Number(); 1296b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch double roundtrip_value = static_cast<double>(static_cast<int32_t>(n)); 1297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch has_int32_value_ = BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(n); 1298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (has_int32_value_) int32_value_ = static_cast<int32_t>(n); 1299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double_value_ = n; 1300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch has_double_value_ = true; 1301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant* HConstant::CopyToRepresentation(Representation r) const { 1306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (r.IsInteger32() && !has_int32_value_) return NULL; 1307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (r.IsDouble() && !has_double_value_) return NULL; 1308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return new HConstant(handle_, r); 1309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant* HConstant::CopyToTruncatedInt32() const { 1313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!has_double_value_) return NULL; 1314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t truncated = NumberToInt32(*handle_); 131544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return new HConstant(FACTORY->NewNumberFromInt(truncated), 1316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation::Integer32()); 1317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochbool HConstant::ToBoolean() const { 13218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Converts the constant's boolean value according to 13228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // ECMAScript section 9.2 ToBoolean conversion. 13238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (HasInteger32Value()) return Integer32Value() != 0; 13248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (HasDoubleValue()) { 13258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch double v = DoubleValue(); 13268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return v != 0 && !isnan(v); 13278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 13288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsTrue()) return true; 13298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsFalse()) return false; 13308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsUndefined()) return false; 13318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsNull()) return false; 13328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsString() && 13338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch String::cast(*handle())->length() == 0) return false; 13348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return true; 13358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 13368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HConstant::PrintDataTo(StringStream* stream) { 1338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch handle()->ShortPrint(stream); 1339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HArrayLiteral::IsCopyOnWrite() const { 13433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!boilerplate_object_->IsJSObject()) return false; 13443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Handle<JSObject>::cast(boilerplate_object_)->elements()->map() == 13453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEAP->fixed_cow_array_map(); 1346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1349e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HBinaryOperation::PrintDataTo(StringStream* stream) { 1350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch left()->PrintNameTo(stream); 1351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" "); 1352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch right()->PrintNameTo(stream); 1353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CheckFlag(kCanOverflow)) stream->Add(" !"); 1354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?"); 1355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HBitwise::InferRange(Zone* zone) { 13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (op() == Token::BIT_XOR) return HValue::InferRange(zone); 13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const int32_t kDefaultMask = static_cast<int32_t>(0xffffffff); 1361e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t left_mask = (left()->range() != NULL) 1362e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? left()->range()->Mask() 13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : kDefaultMask; 1364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t right_mask = (right()->range() != NULL) 1365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? right()->range()->Mask() 13663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : kDefaultMask; 13673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t result_mask = (op() == Token::BIT_AND) 13683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? left_mask & right_mask 13693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : left_mask | right_mask; 1370e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return (result_mask >= 0) 13713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? new(zone) Range(0, result_mask) 13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HValue::InferRange(zone); 1373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HSar::InferRange(Zone* zone) { 1377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (right()->IsConstant()) { 1378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* c = HConstant::cast(right()); 1379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (c->HasInteger32Value()) { 1380e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Range* result = (left()->range() != NULL) 13813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? left()->range()->Copy(zone) 13823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : new(zone) Range(); 1383e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch result->Sar(c->Integer32Value()); 138469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch result->set_can_be_minus_zero(false); 1385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 1386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 13883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 1389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13923ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HShr::InferRange(Zone* zone) { 139369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (right()->IsConstant()) { 139469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HConstant* c = HConstant::cast(right()); 139569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (c->HasInteger32Value()) { 139669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch int shift_count = c->Integer32Value() & 0x1f; 139769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (left()->range()->CanBeNegative()) { 139869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Only compute bounds if the result always fits into an int32. 139969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return (shift_count >= 1) 14003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? new(zone) Range(0, 14013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static_cast<uint32_t>(0xffffffff) >> shift_count) 14023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : new(zone) Range(); 140369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else { 140469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // For positive inputs we can use the >> operator. 140569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Range* result = (left()->range() != NULL) 14063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? left()->range()->Copy(zone) 14073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : new(zone) Range(); 140869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch result->Sar(c->Integer32Value()); 140969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch result->set_can_be_minus_zero(false); 141069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return result; 141169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 141269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 141369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 14143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 141569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 141669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 141769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 14183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HShl::InferRange(Zone* zone) { 1419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (right()->IsConstant()) { 1420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* c = HConstant::cast(right()); 1421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (c->HasInteger32Value()) { 1422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Range* result = (left()->range() != NULL) 14233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? left()->range()->Copy(zone) 14243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : new(zone) Range(); 1425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch result->Shl(c->Integer32Value()); 142669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch result->set_can_be_minus_zero(false); 1427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 1428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 14303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 1431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HLoadKeyedSpecializedArrayElement::InferRange(Zone* zone) { 14353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (elements_kind()) { 14363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case EXTERNAL_PIXEL_ELEMENTS: 14373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(0, 255); 14383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case EXTERNAL_BYTE_ELEMENTS: 14393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(-128, 127); 14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(0, 255); 14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case EXTERNAL_SHORT_ELEMENTS: 14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(-32768, 32767); 14443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 14453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(0, 65535); 14463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 14473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HValue::InferRange(zone); 14483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HCompareGeneric::PrintDataTo(StringStream* stream) { 1453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(Token::Name(token())); 1454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" "); 1455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBinaryOperation::PrintDataTo(stream); 1456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HStringCompareAndBranch::PrintDataTo(StringStream* stream) { 14603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(Token::Name(token())); 14613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 14623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HControlInstruction::PrintDataTo(stream); 14633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HCompareIDAndBranch::PrintDataTo(StringStream* stream) { 14673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add(Token::Name(token())); 14683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add(" "); 14693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch left()->PrintNameTo(stream); 14703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add(" "); 14713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch right()->PrintNameTo(stream); 1472589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch HControlInstruction::PrintDataTo(stream); 1473589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1474589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1475589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HCompareObjectEqAndBranch::PrintDataTo(StringStream* stream) { 14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left()->PrintNameTo(stream); 14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right()->PrintNameTo(stream); 14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HControlInstruction::PrintDataTo(stream); 14813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1484589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid HGoto::PrintDataTo(StringStream* stream) { 1485589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch stream->Add("B%d", SuccessorAt(0)->block_id()); 14863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 14873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HCompareIDAndBranch::SetInputRepresentation(Representation r) { 1490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch input_representation_ = r; 14913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (r.IsDouble()) { 14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // According to the ES5 spec (11.9.3, 11.8.5), Equality comparisons (==, === 14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // and !=) have special handling of undefined, e.g. undefined == undefined 14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // is 'true'. Relational comparisons have a different semantic, first 14953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // calling ToPrimitive() on their arguments. The standard Crankshaft 14963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // tagged-to-double conversion to ensure the HCompareIDAndBranch's inputs 14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // are doubles caused 'undefined' to be converted to NaN. That's compatible 14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // out-of-the box with ordered relational comparisons (<, >, <=, 14993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // >=). However, for equality comparisons (and for 'in' and 'instanceof'), 15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // it is not consistent with the spec. For example, it would cause undefined 15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // == undefined (should be true) to be evaluated as NaN == NaN 15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // (false). Therefore, any comparisons other than ordered relational 15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // comparisons must cause a deopt when one of their arguments is undefined. 15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // See also v8:1434 15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!Token::IsOrderedRelationalCompareOp(token_)) { 15063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetFlag(kDeoptimizeOnUndefined); 15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 15093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(r.IsInteger32()); 1510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1514e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HParameter::PrintDataTo(StringStream* stream) { 1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("%u", index()); 1516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1519e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadNamedField::PrintDataTo(StringStream* stream) { 1520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch object()->PrintNameTo(stream); 1521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : ""); 1522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15253fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context, 15263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* object, 152769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList* types, 152844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name) 15293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : types_(Min(types->length(), kMaxLoadPolymorphism)), 153044f0eee88ff00398ff7f715fab053374d808c90dSteve Block name_(name), 153144f0eee88ff00398ff7f715fab053374d808c90dSteve Block need_generic_(false) { 15323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 15333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, object); 153444f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Tagged()); 15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnMaps); 153644f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (int i = 0; 153744f0eee88ff00398ff7f715fab053374d808c90dSteve Block i < types->length() && types_.length() < kMaxLoadPolymorphism; 153844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ++i) { 153944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Map> map = types->at(i); 15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LookupResult lookup(map->GetIsolate()); 154144f0eee88ff00398ff7f715fab053374d808c90dSteve Block map->LookupInDescriptors(NULL, *name, &lookup); 15423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (lookup.IsFound()) { 1543257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch switch (lookup.type()) { 1544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case FIELD: { 1545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index = lookup.GetLocalFieldIndexFromMap(*map); 1546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (index < 0) { 15473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnInobjectFields); 1548257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 15493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnBackingStoreFields); 1550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1551257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch types_.Add(types->at(i)); 1552257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch break; 1553257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1554257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case CONSTANT_FUNCTION: 1555257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch types_.Add(types->at(i)); 1556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch break; 1557257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch default: 1558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch break; 155944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 156044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 156144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 156244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 156344f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (types_.length() == types->length() && FLAG_deoptimize_uncommon_cases) { 156444f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kUseGVN); 156544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 156644f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetAllSideEffects(); 156744f0eee88ff00398ff7f715fab053374d808c90dSteve Block need_generic_ = true; 156844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 156944f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 157044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 157144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 157244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool HLoadNamedFieldPolymorphic::DataEquals(HValue* value) { 157344f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadNamedFieldPolymorphic* other = HLoadNamedFieldPolymorphic::cast(value); 157444f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (types_.length() != other->types()->length()) return false; 157544f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!name_.is_identical_to(other->name())) return false; 157644f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (need_generic_ != other->need_generic_) return false; 157744f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (int i = 0; i < types_.length(); i++) { 157844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool found = false; 157944f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (int j = 0; j < types_.length(); j++) { 158044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (types_.at(j).is_identical_to(other->types()->at(i))) { 158144f0eee88ff00398ff7f715fab053374d808c90dSteve Block found = true; 158244f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 158344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 158444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 158544f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!found) return false; 158644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 158744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return true; 158844f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 158944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 159044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 159169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid HLoadNamedFieldPolymorphic::PrintDataTo(StringStream* stream) { 159269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch object()->PrintNameTo(stream); 15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("."); 159469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stream->Add(*String::cast(*name())->ToCString()); 159569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 159669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 159769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 159869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid HLoadNamedGeneric::PrintDataTo(StringStream* stream) { 159969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch object()->PrintNameTo(stream); 16003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("."); 160169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stream->Add(*String::cast(*name())->ToCString()); 160269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 160369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 160469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1605e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadKeyedFastElement::PrintDataTo(StringStream* stream) { 1606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch object()->PrintNameTo(stream); 1607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("["); 1608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch key()->PrintNameTo(stream); 1609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("]"); 1610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool HLoadKeyedFastElement::RequiresHoleCheck() { 16143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hole_check_mode_ == OMIT_HOLE_CHECK) { 16153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 16163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1618257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (HUseIterator it(uses()); !it.Done(); it.Advance()) { 1619257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* use = it.value(); 1620257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!use->IsChange()) return true; 1621257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 16223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1623257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return false; 1624257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1625257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1626257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 16273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HLoadKeyedFastDoubleElement::PrintDataTo(StringStream* stream) { 16283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch elements()->PrintNameTo(stream); 16293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add("["); 16303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch key()->PrintNameTo(stream); 16313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add("]"); 16323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadKeyedGeneric::PrintDataTo(StringStream* stream) { 1636e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintNameTo(stream); 1637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("["); 1638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch key()->PrintNameTo(stream); 1639e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("]"); 1640e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1641e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 16433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HLoadKeyedGeneric::Canonicalize() { 16443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Recognize generic keyed loads that use property name generated 16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // by for-in statement as a key and rewrite them into fast property load 16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // by index. 16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (key()->IsLoadKeyedFastElement()) { 16483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadKeyedFastElement* key_load = HLoadKeyedFastElement::cast(key()); 16493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (key_load->object()->IsForInCacheArray()) { 16503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HForInCacheArray* names_cache = 16513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HForInCacheArray::cast(key_load->object()); 16523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (names_cache->enumerable() == object()) { 16543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HForInCacheArray* index_cache = 16553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch names_cache->index_cache(); 16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCheckMapValue* map_check = 16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(block()->zone()) HCheckMapValue(object(), names_cache->map()); 16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* index = new(block()->zone()) HLoadKeyedFastElement( 16593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index_cache, 16603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key_load->key(), 16613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadKeyedFastElement::OMIT_HOLE_CHECK); 16623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex( 16633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object(), index); 16643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map_check->InsertBefore(this); 16653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index->InsertBefore(this); 16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch load->InsertBefore(this); 16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return load; 16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 167644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid HLoadKeyedSpecializedArrayElement::PrintDataTo( 167744f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringStream* stream) { 16781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block external_pointer()->PrintNameTo(stream); 167944f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("."); 16803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch switch (elements_kind()) { 1681589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_BYTE_ELEMENTS: 168244f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("byte"); 168344f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1684589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 168544f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_byte"); 168644f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1687589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_SHORT_ELEMENTS: 168844f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("short"); 168944f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1690589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 169144f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_short"); 169244f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1693589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_INT_ELEMENTS: 169444f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("int"); 169544f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1696589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_INT_ELEMENTS: 169744f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_int"); 169844f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1699589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_FLOAT_ELEMENTS: 170044f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("float"); 170144f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1702589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_DOUBLE_ELEMENTS: 1703257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("double"); 1704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch break; 1705589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_PIXEL_ELEMENTS: 170644f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("pixel"); 170744f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1708589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case FAST_ELEMENTS: 17093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case FAST_SMI_ONLY_ELEMENTS: 1710589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case FAST_DOUBLE_ELEMENTS: 1711589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case DICTIONARY_ELEMENTS: 1712589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case NON_STRICT_ARGUMENTS_ELEMENTS: 17133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 17143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 171544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 17161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("["); 17171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block key()->PrintNameTo(stream); 17181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("]"); 17191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 17201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 17211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1722e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreNamedGeneric::PrintDataTo(StringStream* stream) { 1723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch object()->PrintNameTo(stream); 1724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("."); 1725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(name()->IsString()); 1726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(*String::cast(*name())->ToCString()); 1727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" = "); 1728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 1729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1732e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreNamedField::PrintDataTo(StringStream* stream) { 1733e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintNameTo(stream); 1734e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("."); 1735e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add(*String::cast(*name())->ToCString()); 1736e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add(" = "); 1737e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintNameTo(stream); 17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : ""); 1739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!transition().is_null()) { 1740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" (transition map %p)", *transition()); 1741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1745e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreKeyedFastElement::PrintDataTo(StringStream* stream) { 1746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch object()->PrintNameTo(stream); 1747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("["); 1748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch key()->PrintNameTo(stream); 1749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("] = "); 1750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 1751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) { 17553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch elements()->PrintNameTo(stream); 17563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add("["); 17573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch key()->PrintNameTo(stream); 17583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add("] = "); 17593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch value()->PrintNameTo(stream); 17603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 17613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1763e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 1764e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintNameTo(stream); 1765e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("["); 1766e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch key()->PrintNameTo(stream); 1767e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("] = "); 1768e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintNameTo(stream); 1769e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1770e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1771e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 177244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid HStoreKeyedSpecializedArrayElement::PrintDataTo( 177344f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringStream* stream) { 1774e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch external_pointer()->PrintNameTo(stream); 177544f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("."); 17763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch switch (elements_kind()) { 1777589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_BYTE_ELEMENTS: 177844f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("byte"); 177944f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1780589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 178144f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_byte"); 178244f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1783589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_SHORT_ELEMENTS: 178444f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("short"); 178544f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1786589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 178744f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_short"); 178844f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1789589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_INT_ELEMENTS: 179044f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("int"); 179144f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1792589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_INT_ELEMENTS: 179344f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_int"); 179444f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1795589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_FLOAT_ELEMENTS: 179644f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("float"); 179744f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 1798589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_DOUBLE_ELEMENTS: 1799257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("double"); 1800257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch break; 1801589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_PIXEL_ELEMENTS: 180244f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("pixel"); 180344f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 18043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case FAST_SMI_ONLY_ELEMENTS: 1805589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case FAST_ELEMENTS: 1806589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case FAST_DOUBLE_ELEMENTS: 1807589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case DICTIONARY_ELEMENTS: 1808589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case NON_STRICT_ARGUMENTS_ELEMENTS: 18093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 18103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 181144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1812e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("["); 1813e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch key()->PrintNameTo(stream); 1814e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("] = "); 1815e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintNameTo(stream); 1816e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1818e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 18193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HTransitionElementsKind::PrintDataTo(StringStream* stream) { 18203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintNameTo(stream); 18213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HLoadGlobalCell::PrintDataTo(StringStream* stream) { 1826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("[%p]", *cell()); 18273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!details_.IsDontDelete()) stream->Add(" (deleteable)"); 18283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (details_.IsReadOnly()) stream->Add(" (read-only)"); 18293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool HLoadGlobalCell::RequiresHoleCheck() { 18333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (details_.IsDontDelete() && !details_.IsReadOnly()) return false; 18343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (HUseIterator it(uses()); !it.Done(); it.Advance()) { 18353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* use = it.value(); 18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!use->IsChange()) return true; 18373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 18383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 1839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 18428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HLoadGlobalGeneric::PrintDataTo(StringStream* stream) { 18438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch stream->Add("%o ", *name()); 18448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 18458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 18468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 18478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HStoreGlobalCell::PrintDataTo(StringStream* stream) { 1848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("[%p] = ", *cell()); 1849b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 18503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!details_.IsDontDelete()) stream->Add(" (deleteable)"); 18513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (details_.IsReadOnly()) stream->Add(" (read-only)"); 1852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 18558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HStoreGlobalGeneric::PrintDataTo(StringStream* stream) { 18568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch stream->Add("%o = ", *name()); 18578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch value()->PrintNameTo(stream); 18588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 18598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 18608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1861e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadContextSlot::PrintDataTo(StringStream* stream) { 18621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block value()->PrintNameTo(stream); 18631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("[%d]", slot_index()); 18641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 18651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1867e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreContextSlot::PrintDataTo(StringStream* stream) { 18681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block context()->PrintNameTo(stream); 18691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("[%d] = ", slot_index()); 18701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block value()->PrintNameTo(stream); 1871b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1872b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1873b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Implementation of type inference and type conversions. Calculates 1875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// the inferred type of this instruction based on the input operands. 1876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1877e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HValue::CalculateInferredType() { 1878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return type_; 1879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckMap::CalculateInferredType() { 1883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return value()->type(); 1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1887e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckFunction::CalculateInferredType() { 1888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return value()->type(); 1889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1892e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckNonSmi::CalculateInferredType() { 1893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // TODO(kasperl): Is there any way to signal that this isn't a smi? 1894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Tagged(); 1895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1896b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1898e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckSmi::CalculateInferredType() { 1899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Smi(); 1900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1903e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HPhi::CalculateInferredType() { 1904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType result = HType::Uninitialized(); 1905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 1906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType current = OperandAt(i)->type(); 1907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = result.Combine(current); 1908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 1910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1913e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HConstant::CalculateInferredType() { 1914257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return HType::TypeFromValue(handle_); 1915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19183fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHType HCompareGeneric::CalculateInferredType() { 19193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return HType::Boolean(); 19203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 19213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 19223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 19233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHType HInstanceOf::CalculateInferredType() { 1924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Boolean(); 1925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19283fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHType HDeleteProperty::CalculateInferredType() { 1929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Boolean(); 1930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19333fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHType HInstanceOfKnownGlobal::CalculateInferredType() { 1934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Boolean(); 1935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HChange::CalculateInferredType() { 19393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (from().IsDouble() && to().IsTagged()) return HType::HeapNumber(); 19403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return type(); 19413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitwiseBinaryOperation::CalculateInferredType() { 19451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return HType::TaggedNumber(); 19461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 19471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 19481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1949e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HArithmeticBinaryOperation::CalculateInferredType() { 1950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1954e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HAdd::CalculateInferredType() { 1955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Tagged(); 1956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HBitNot::CalculateInferredType() { 1960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HUnaryMathOperation::CalculateInferredType() { 1965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HStringCharFromCode::CalculateInferredType() { 19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::String(); 1971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HAllocateObject::CalculateInferredType() { 19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::JSObject(); 1976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HFastLiteral::CalculateInferredType() { 19803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // TODO(mstarzinger): Be smarter, could also be JSArray here. 19813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::JSObject(); 19825d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch} 19835d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 19845d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 19853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HArrayLiteral::CalculateInferredType() { 19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::JSArray(); 1987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HObjectLiteral::CalculateInferredType() { 19913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::JSObject(); 1992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HRegExpLiteral::CalculateInferredType() { 19963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::JSObject(); 19973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HFunctionLiteral::CalculateInferredType() { 20013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::JSObject(); 2002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HUnaryMathOperation::EnsureAndPropagateNotMinusZero( 2006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BitVector* visited) { 2007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 2008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32() && 2009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch !value()->representation().IsInteger32()) { 2010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value()->range() == NULL || value()->range()->CanBeMinusZero()) { 2011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 2012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (RequiredInputRepresentation(0).IsInteger32() && 2015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation().IsInteger32()) { 2016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return value(); 2017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HChange::EnsureAndPropagateNotMinusZero(BitVector* visited) { 2024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 2025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (from().IsInteger32()) return NULL; 2026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CanTruncateToInt32()) return NULL; 2027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value()->range() == NULL || value()->range()->CanBeMinusZero()) { 2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 2029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!from().IsInteger32() || !to().IsInteger32()); 2031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 2032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2035257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHValue* HForceRepresentation::EnsureAndPropagateNotMinusZero( 2036257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch BitVector* visited) { 2037257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch visited->Add(id()); 2038257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return value(); 2039257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2040257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2041257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HMod::EnsureAndPropagateNotMinusZero(BitVector* visited) { 2043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 2044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 2045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 2046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left(); 2047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 2049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HDiv::EnsureAndPropagateNotMinusZero(BitVector* visited) { 2053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 2054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 2055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 2056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 2058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HMul::EnsureAndPropagateNotMinusZero(BitVector* visited) { 2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 2063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 2064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 2067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HSub::EnsureAndPropagateNotMinusZero(BitVector* visited) { 2071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 2072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Propagate to the left argument. If the left argument cannot be -0, then 2073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // the result of the add operation cannot be either. 2074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 2075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left(); 2076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 2078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HAdd::EnsureAndPropagateNotMinusZero(BitVector* visited) { 2082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 2083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Propagate to the left argument. If the left argument cannot be -0, then 2084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // the result of the sub operation cannot be either. 2085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 2086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left(); 2087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 20923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define H_CONSTANT_INT32(val) \ 20933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnew(zone) HConstant(FACTORY->NewNumberFromInt(val, TENURED), \ 20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation::Integer32()) 20953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define H_CONSTANT_DOUBLE(val) \ 20963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnew(zone) HConstant(FACTORY->NewNumber(val, TENURED), \ 20973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation::Double()) 20983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HInstr, op) \ 21003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HInstr::New##HInstr(Zone* zone, \ 21013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, \ 21023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, \ 21033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right) { \ 21043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (left->IsConstant() && right->IsConstant()) { \ 21053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_left = HConstant::cast(left); \ 21063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_right = HConstant::cast(right); \ 21073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ 21083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch double double_res = c_left->DoubleValue() op c_right->DoubleValue(); \ 21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (TypeInfo::IsInt32Double(double_res)) { \ 21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_INT32(static_cast<int32_t>(double_res)); \ 21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } \ 21123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_DOUBLE(double_res); \ 21133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } \ 21143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } \ 21153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) HInstr(context, left, right); \ 21163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HAdd, +) 21203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HMul, *) 21213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HSub, -) 21223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR 21243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HMod::NewHMod(Zone* zone, 21273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 21283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 21293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right) { 21303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (left->IsConstant() && right->IsConstant()) { 21313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_left = HConstant::cast(left); 21323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_right = HConstant::cast(right); 21333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (c_left->HasInteger32Value() && c_right->HasInteger32Value()) { 21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t dividend = c_left->Integer32Value(); 21353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t divisor = c_right->Integer32Value(); 21363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (divisor != 0) { 21373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t res = dividend % divisor; 21383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ((res == 0) && (dividend < 0)) { 21393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_DOUBLE(-0.0); 21403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_INT32(res); 21423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) HMod(context, left, right); 21463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21493ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HDiv::NewHDiv(Zone* zone, 21503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 21513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 21523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right) { 21533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If left and right are constant values, try to return a constant value. 21543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (left->IsConstant() && right->IsConstant()) { 21553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_left = HConstant::cast(left); 21563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_right = HConstant::cast(right); 21573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { 21583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (c_right->DoubleValue() != 0) { 21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch double double_res = c_left->DoubleValue() / c_right->DoubleValue(); 21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (TypeInfo::IsInt32Double(double_res)) { 21613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_INT32(static_cast<int32_t>(double_res)); 21623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_DOUBLE(double_res); 21643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) HDiv(context, left, right); 21683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21713ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HBitwise::NewHBitwise(Zone* zone, 21723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value op, 21733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 21743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 21753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right) { 21763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (left->IsConstant() && right->IsConstant()) { 21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_left = HConstant::cast(left); 21783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_right = HConstant::cast(right); 21793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { 21803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t result; 21813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t v_left = c_left->NumberValueAsInteger32(); 21823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t v_right = c_right->NumberValueAsInteger32(); 21833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (op) { 21843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_XOR: 21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = v_left ^ v_right; 21863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 21873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_AND: 21883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = v_left & v_right; 21893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 21903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_OR: 21913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = v_left | v_right; 21923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 21943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = 0; // Please the compiler. 21953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 21963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_INT32(result); 21983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) HBitwise(op, context, left, right); 22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEFINE_NEW_H_BITWISE_INSTR(HInstr, result) \ 22053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HInstr::New##HInstr(Zone* zone, \ 22063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, \ 22073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, \ 22083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right) { \ 22093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (left->IsConstant() && right->IsConstant()) { \ 22103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_left = HConstant::cast(left); \ 22113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_right = HConstant::cast(right); \ 22123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ 22133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_INT32(result); \ 22143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } \ 22153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } \ 22163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) HInstr(context, left, right); \ 22173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_BITWISE_INSTR(HSar, 22213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochc_left->NumberValueAsInteger32() >> (c_right->NumberValueAsInteger32() & 0x1f)) 22223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_BITWISE_INSTR(HShl, 22233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochc_left->NumberValueAsInteger32() << (c_right->NumberValueAsInteger32() & 0x1f)) 22243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEFINE_NEW_H_BITWISE_INSTR 22263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HShr::NewHShr(Zone* zone, 22293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 22303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 22313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right) { 22323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (left->IsConstant() && right->IsConstant()) { 22333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_left = HConstant::cast(left); 22343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* c_right = HConstant::cast(right); 22353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { 22363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t left_val = c_left->NumberValueAsInteger32(); 22373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t right_val = c_right->NumberValueAsInteger32() & 0x1f; 22383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ((right_val == 0) && (left_val < 0)) { 22393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_DOUBLE( 22403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static_cast<double>(static_cast<uint32_t>(left_val))); 22413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return H_CONSTANT_INT32(static_cast<uint32_t>(left_val) >> right_val); 22433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) HShr(context, left, right); 22463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef H_CONSTANT_INT32 22503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef H_CONSTANT_DOUBLE 22513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HIn::PrintDataTo(StringStream* stream) { 2254257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch key()->PrintNameTo(stream); 2255257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(" "); 2256257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch object()->PrintNameTo(stream); 2257257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2258257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2259257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 22603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRepresentation HPhi::InferredRepresentation() { 22613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool double_occurred = false; 22623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool int32_occurred = false; 22633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < OperandCount(); ++i) { 22643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = OperandAt(i); 22653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->IsUnknownOSRValue()) { 22663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhi* hint_value = HUnknownOSRValue::cast(value)->incoming_value(); 22673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hint_value != NULL) { 22683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation hint = hint_value->representation(); 22693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hint.IsDouble()) double_occurred = true; 22703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hint.IsInteger32()) int32_occurred = true; 22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch continue; 22733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->representation().IsDouble()) double_occurred = true; 22753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->representation().IsInteger32()) int32_occurred = true; 22763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->representation().IsTagged()) { 22773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->IsConstant()) { 22783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* constant = HConstant::cast(value); 22793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (constant->IsConvertibleToInteger()) { 22803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_occurred = true; 22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (constant->HasNumberValue()) { 22823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch double_occurred = true; 22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 22843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 22853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 22873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 22883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (double_occurred) return Representation::Double(); 22933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (int32_occurred) return Representation::Integer32(); 22953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::None(); 22973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Node-specific verification code is only included in debug mode. 2301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 2302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HPhi::Verify() { 2304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(OperandCount() == block()->predecessors()->length()); 2305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 2306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* value = OperandAt(i); 2307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* defining_block = value->block(); 2308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* predecessor_block = block()->predecessors()->at(i); 2309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(defining_block == predecessor_block || 2310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch defining_block->Dominates(predecessor_block)); 2311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HSimulate::Verify() { 2316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 2317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasAstId()); 2318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckSmi::Verify() { 2322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 2323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 2324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckNonSmi::Verify() { 2328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 2329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 2330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckFunction::Verify() { 2334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 2335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 2336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckPrototypeMaps::Verify() { 2340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 2341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 2342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} } // namespace v8::internal 2347