11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 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"; 63e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch case kNumRepresentations: 64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 67e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch UNREACHABLE(); 68e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return NULL; 69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t ConvertAndSetOverflow(int64_t result, bool* overflow) { 73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (result > kMaxInt) { 74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *overflow = true; 75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kMaxInt; 76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (result < kMinInt) { 78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *overflow = true; 79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kMinInt; 80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return static_cast<int32_t>(result); 82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t AddWithoutOverflow(int32_t a, int32_t b, bool* overflow) { 86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int64_t result = static_cast<int64_t>(a) + static_cast<int64_t>(b); 87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ConvertAndSetOverflow(result, overflow); 88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t SubWithoutOverflow(int32_t a, int32_t b, bool* overflow) { 92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int64_t result = static_cast<int64_t>(a) - static_cast<int64_t>(b); 93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ConvertAndSetOverflow(result, overflow); 94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 97b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t MulWithoutOverflow(int32_t a, int32_t b, bool* overflow) { 98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int64_t result = static_cast<int64_t>(a) * static_cast<int64_t>(b); 99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ConvertAndSetOverflow(result, overflow); 100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochint32_t Range::Mask() const { 104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (lower_ == upper_) return lower_; 105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (lower_ >= 0) { 106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t res = 1; 107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while (res < upper_) { 108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch res = (res << 1) | 1; 109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return res; 111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return 0xffffffff; 113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::AddConstant(int32_t value) { 117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value == 0) return; 118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool may_overflow = false; // Overflow is ignored here. 119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = AddWithoutOverflow(lower_, value, &may_overflow); 120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = AddWithoutOverflow(upper_, value, &may_overflow); 121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Verify(); 122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 125e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Intersect(Range* other) { 126e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = Min(upper_, other->upper_); 127e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = Max(lower_, other->lower_); 128e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool b = CanBeMinusZero() && other->CanBeMinusZero(); 129e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_can_be_minus_zero(b); 130e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 131e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 132e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 133e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Union(Range* other) { 134e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = Max(upper_, other->upper_); 135e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = Min(lower_, other->lower_); 136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool b = CanBeMinusZero() || other->CanBeMinusZero(); 137e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_can_be_minus_zero(b); 138e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 139e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 140e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 141e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Sar(int32_t value) { 142e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t bits = value & 0x1F; 143e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = lower_ >> bits; 144e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = upper_ >> bits; 145e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_can_be_minus_zero(false); 146e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 147e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 148e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 149e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Shl(int32_t value) { 150e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t bits = value & 0x1F; 151e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int old_lower = lower_; 152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int old_upper = upper_; 153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = lower_ << bits; 154e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = upper_ << bits; 155e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (old_lower != lower_ >> bits || old_upper != upper_ >> bits) { 156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_ = kMaxInt; 157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch lower_ = kMinInt; 158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 159e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_can_be_minus_zero(false); 160e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 161e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 162e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::AddAndCheckOverflow(Range* other) { 164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool may_overflow = false; 165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = AddWithoutOverflow(lower_, other->lower(), &may_overflow); 166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = AddWithoutOverflow(upper_, other->upper(), &may_overflow); 167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch KeepOrder(); 168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Verify(); 169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return may_overflow; 170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::SubAndCheckOverflow(Range* other) { 174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool may_overflow = false; 175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = SubWithoutOverflow(lower_, other->upper(), &may_overflow); 176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = SubWithoutOverflow(upper_, other->lower(), &may_overflow); 177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch KeepOrder(); 178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Verify(); 179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return may_overflow; 180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::KeepOrder() { 184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (lower_ > upper_) { 185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t tmp = lower_; 186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = upper_; 187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = tmp; 188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::Verify() const { 193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(lower_ <= upper_); 194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::MulAndCheckOverflow(Range* other) { 198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool may_overflow = false; 199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int v1 = MulWithoutOverflow(lower_, other->lower(), &may_overflow); 200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int v2 = MulWithoutOverflow(lower_, other->upper(), &may_overflow); 201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int v3 = MulWithoutOverflow(upper_, other->lower(), &may_overflow); 202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int v4 = MulWithoutOverflow(upper_, other->upper(), &may_overflow); 203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch lower_ = Min(Min(v1, v2), Min(v3, v4)); 204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch upper_ = Max(Max(v1, v2), Max(v3, v4)); 205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Verify(); 206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return may_overflow; 207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HType::ToString() { 211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (type_) { 212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTagged: return "tagged"; 213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTaggedPrimitive: return "primitive"; 214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTaggedNumber: return "number"; 215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kSmi: return "smi"; 216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kHeapNumber: return "heap-number"; 217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kString: return "string"; 218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kBoolean: return "boolean"; 219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kNonPrimitive: return "non-primitive"; 220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kJSArray: return "array"; 221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kJSObject: return "object"; 222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kUninitialized: return "uninitialized"; 223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return "Unreachable code"; 226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HType::ToShortString() { 230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (type_) { 231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTagged: return "t"; 232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTaggedPrimitive: return "p"; 233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kTaggedNumber: return "n"; 234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kSmi: return "m"; 235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kHeapNumber: return "h"; 236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kString: return "s"; 237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kBoolean: return "b"; 238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kNonPrimitive: return "r"; 239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kJSArray: return "a"; 240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kJSObject: return "o"; 241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kUninitialized: return "z"; 242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return "Unreachable code"; 245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHType HType::TypeFromValue(Handle<Object> value) { 249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType result = HType::Tagged(); 250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value->IsSmi()) { 251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::Smi(); 252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsHeapNumber()) { 253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::HeapNumber(); 254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsString()) { 255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::String(); 256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsBoolean()) { 257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::Boolean(); 258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsJSObject()) { 259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::JSObject(); 260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (value->IsJSArray()) { 261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = HType::JSArray(); 262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 267e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochint HValue::LookupOperandIndex(int occurrence_index, HValue* op) { 268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OperandAt(i) == op) { 270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (occurrence_index == 0) return i; 271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch --occurrence_index; 272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return -1; 275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HValue::IsDefinedAfter(HBasicBlock* other) const { 279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return block()->block_id() > other->block_id(); 280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 283e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochbool HValue::UsesMultipleTimes(HValue* op) { 284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool seen = false; 285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OperandAt(i) == op) { 287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (seen) return true; 288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch seen = true; 289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return false; 292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 295e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochbool HValue::Equals(HValue* other) { 296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (other->opcode() != opcode()) return false; 297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!other->representation().Equals(representation())) return false; 298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!other->type_.Equals(type_)) return false; 2991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (other->flags() != flags()) return false; 300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OperandCount() != other->OperandCount()) return false; 301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OperandAt(i)->id() != other->OperandAt(i)->id()) return false; 303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool result = DataEquals(other); 305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!result || Hashcode() == other->Hashcode()); 306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochintptr_t HValue::Hashcode() { 311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch intptr_t result = opcode(); 312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int count = OperandCount(); 313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < count; ++i) { 314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = result * 19 + OperandAt(i)->id() + (result >> 7); 315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::SetOperandAt(int index, HValue* value) { 321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(value == NULL || !value->representation().IsNone()); 322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch RegisterUse(index, value); 323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InternalSetOperandAt(index, value); 324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ReplaceAndDelete(HValue* other) { 328e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (other != NULL) ReplaceValue(other); 329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Delete(); 330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ReplaceValue(HValue* other) { 334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < uses_.length(); ++i) { 335e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* use = uses_[i]; 336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(!use->block()->IsStartBlock()); 337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch InternalReplaceAtUse(use, other); 338e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch other->uses_.Add(use); 339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 340e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch uses_.Rewind(0); 341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ClearOperands() { 345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(i, NULL); 347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::Delete() { 352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearOperands(); 354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DeleteFromGraph(); 355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ReplaceAtUse(HValue* use, HValue* other) { 359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < use->OperandCount(); ++i) { 360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (use->OperandAt(i) == this) { 361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch use->SetOperandAt(i, other); 362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ReplaceFirstAtUse(HValue* use, HValue* other, Representation r) { 368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < use->OperandCount(); ++i) { 369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (use->RequiredInputRepresentation(i).Equals(r) && 370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch use->OperandAt(i) == this) { 371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch use->SetOperandAt(i, other); 372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return; 373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::InternalReplaceAtUse(HValue* use, HValue* other) { 379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < use->OperandCount(); ++i) { 380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (use->OperandAt(i) == this) { 381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Call internal method that does not update use lists. The caller is 382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // responsible for doing so. 383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch use->InternalSetOperandAt(i, other); 384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::SetBlock(HBasicBlock* block) { 390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block_ == NULL || block == NULL); 391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch block_ = block; 392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (id_ == kNoNumber && block != NULL) { 393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch id_ = block->graph()->GetNextValueID(this); 394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::PrintTypeTo(HType type, StringStream* stream) { 399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(type.ToShortString()); 400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::PrintNameTo(StringStream* stream) { 404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("%s%d", representation_.Mnemonic(), id()); 405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HValue::UpdateInferredType() { 409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type = CalculateInferredType(); 410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool result = (!type.Equals(type_)); 411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch type_ = type; 412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::RegisterUse(int index, HValue* new_value) { 417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* old_value = OperandAt(index); 418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (old_value == new_value) return; 41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (old_value != NULL) old_value->uses_.RemoveElement(this); 420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (new_value != NULL) { 421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch new_value->uses_.Add(this); 422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::AddNewRange(Range* r) { 427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!HasRange()) ComputeInitialRange(); 428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!HasRange()) range_ = new Range(); 429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasRange()); 430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch r->StackUpon(range_); 431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range_ = r; 432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::RemoveLastAddedRange() { 436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasRange()); 437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(range_->next() != NULL); 438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range_ = range_->next(); 439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ComputeInitialRange() { 443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!HasRange()); 444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range_ = InferRange(); 445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasRange()); 446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 449e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HInstruction::PrintTo(StringStream* stream) { 450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("%s", Mnemonic()); 451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (HasSideEffects()) stream->Add("*"); 452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" "); 453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch PrintDataTo(stream); 454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (range() != NULL && 456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch !range()->IsMostGeneric() && 457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch !range()->CanBeMinusZero()) { 458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" range[%d,%d,m0=%d]", 459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range()->lower(), 460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range()->upper(), 461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static_cast<int>(range()->CanBeMinusZero())); 462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int changes_flags = (flags() & HValue::ChangesFlagsMask()); 465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (changes_flags != 0) { 466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" changes[0x%x]", changes_flags); 467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsTagged() && !type().Equals(HType::Tagged())) { 470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" type[%s]", type().ToString()); 471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::Unlink() { 476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(IsLinked()); 477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsControlInstruction()); // Must never move control instructions. 478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(!IsBlockEntry()); // Doesn't make sense to delete these. 479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(previous_ != NULL); 480e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch previous_->next_ = next_; 481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (next_ == NULL) { 482e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(block()->last() == this); 483e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch block()->set_last(previous_); 484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 485e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_->previous_ = previous_; 486e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch clear_block(); 488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::InsertBefore(HInstruction* next) { 492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsLinked()); 493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!next->IsBlockEntry()); 494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsControlInstruction()); 495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!next->block()->IsStartBlock()); 496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(next->previous_ != NULL); 497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* prev = next->previous(); 498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch prev->next_ = this; 499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next->previous_ = this; 500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next_ = next; 501b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous_ = prev; 502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetBlock(next->block()); 503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::InsertAfter(HInstruction* previous) { 507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsLinked()); 508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!previous->IsControlInstruction()); 509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsControlInstruction() || previous->next_ == NULL); 510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block = previous->block(); 511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Never insert anything except constants into the start block after finishing 512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it. 513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (block->IsStartBlock() && block->IsFinished() && !IsConstant()) { 514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block->end()->SecondSuccessor() == NULL); 515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InsertAfter(block->end()->FirstSuccessor()->first()); 516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return; 517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If we're inserting after an instruction with side-effects that is 520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // followed by a simulate instruction, we need to insert after the 521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // simulate instruction instead. 522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* next = previous->next_; 523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (previous->HasSideEffects() && next != NULL) { 524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(next->IsSimulate()); 525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous = next; 526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next = previous->next_; 527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous_ = previous; 530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next_ = next; 531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetBlock(block); 532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous->next_ = this; 533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (next != NULL) next->previous_ = this; 534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 5381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HInstruction::Verify() { 539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Verify that input operands are defined before use. 540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* cur_block = block(); 541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* other_operand = OperandAt(i); 543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* other_block = other_operand->block(); 544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (cur_block == other_block) { 545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!other_operand->IsPhi()) { 546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* cur = cur_block->first(); 547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while (cur != NULL) { 548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(cur != this); // We should reach other_operand before! 549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (cur == other_operand) break; 550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch cur = cur->next(); 551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Must reach other operand in the same block! 553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(cur == other_operand); 554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(other_block->Dominates(cur_block)); 557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Verify that instructions that may have side-effects are followed 561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // by a simulate instruction. 562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (HasSideEffects() && !IsOsrEntry()) { 563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(next()->IsSimulate()); 564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Verify that instructions that can be eliminated by GVN have overridden 5671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // HValue::DataEquals. The default implementation is UNREACHABLE. We 5681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // don't actually care whether DataEquals returns true or false here. 5691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (CheckFlag(kUseGVN)) DataEquals(this); 570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 574e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryCall::PrintDataTo(StringStream* stream) { 5751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block value()->PrintNameTo(stream); 5761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 5781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 5791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 581e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HBinaryCall::PrintDataTo(StringStream* stream) { 5821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block first()->PrintNameTo(stream); 5831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 5841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block second()->PrintNameTo(stream); 5851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 5871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 5881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 590e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallConstantFunction::PrintDataTo(StringStream* stream) { 5911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (IsApplyFunction()) { 5921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("optimized apply "); 5931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 5941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%o ", function()->shared()->DebugName()); 595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 596e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 600e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallNamed::PrintDataTo(StringStream* stream) { 6011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%o ", *name()); 6021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall::PrintDataTo(stream); 603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallGlobal::PrintDataTo(StringStream* stream) { 6071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%o ", *name()); 6081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall::PrintDataTo(stream); 609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 612e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallKnownGlobal::PrintDataTo(StringStream* stream) { 6131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("o ", target()->shared()->DebugName()); 614e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 618e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallRuntime::PrintDataTo(StringStream* stream) { 6191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%o ", *name()); 620e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("#%d", argument_count()); 621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 624e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HClassOfTest::PrintDataTo(StringStream* stream) { 6251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("class_of_test("); 626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 6271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(", \"%o\")", *class_name()); 628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HAccessArgumentsAt::PrintDataTo(StringStream* stream) { 6321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block arguments()->PrintNameTo(stream); 6331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("["); 6341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block index()->PrintNameTo(stream); 6351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("], length "); 6361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block length()->PrintNameTo(stream); 637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 640e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HControlInstruction::PrintDataTo(StringStream* stream) { 6411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (FirstSuccessor() != NULL) { 6421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int first_id = FirstSuccessor()->block_id(); 6431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (SecondSuccessor() == NULL) { 6441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" B%d", first_id); 6451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 6461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int second_id = SecondSuccessor()->block_id(); 6471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" goto (B%d, B%d)", first_id, second_id); 6481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 6491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 653e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryControlInstruction::PrintDataTo(StringStream* stream) { 654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 6551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HControlInstruction::PrintDataTo(stream); 656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 659e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCompareMap::PrintDataTo(StringStream* stream) { 660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 6611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" (%p)", *map()); 6621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HControlInstruction::PrintDataTo(stream); 663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HUnaryMathOperation::OpName() const { 667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (op()) { 668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathFloor: return "floor"; 669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathRound: return "round"; 670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCeil: return "ceil"; 671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathAbs: return "abs"; 672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathLog: return "log"; 673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSin: return "sin"; 674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCos: return "cos"; 675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathTan: return "tan"; 676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathASin: return "asin"; 677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathACos: return "acos"; 678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathATan: return "atan"; 679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathExp: return "exp"; 680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSqrt: return "sqrt"; 681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: break; 682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 683b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return "(unknown operation)"; 684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 687e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryMathOperation::PrintDataTo(StringStream* stream) { 688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* name = OpName(); 689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("%s ", name); 690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 694e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryOperation::PrintDataTo(StringStream* stream) { 695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 699e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HHasInstanceType::PrintDataTo(StringStream* stream) { 700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (from_) { 702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case FIRST_JS_OBJECT_TYPE: 703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (to_ == LAST_TYPE) stream->Add(" spec_object"); 704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case JS_REGEXP_TYPE: 706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (to_ == JS_REGEXP_TYPE) stream->Add(" reg_exp"); 707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case JS_ARRAY_TYPE: 709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (to_ == JS_ARRAY_TYPE) stream->Add(" array"); 710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case JS_FUNCTION_TYPE: 712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (to_ == JS_FUNCTION_TYPE) stream->Add(" function"); 713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 720e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HTypeofIs::PrintDataTo(StringStream* stream) { 721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" == "); 723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(type_literal_->ToAsciiVector()); 724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HChange::PrintDataTo(StringStream* stream) { 728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HUnaryOperation::PrintDataTo(stream); 7298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch stream->Add(" %s to %s", from_.Mnemonic(), to().Mnemonic()); 730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CanTruncateToInt32()) stream->Add(" truncating-int32"); 732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?"); 733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHCheckInstanceType* HCheckInstanceType::NewIsJSObjectOrJSFunction( 737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* value) { 738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch STATIC_ASSERT((LAST_JS_OBJECT_TYPE + 1) == JS_FUNCTION_TYPE); 739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return new HCheckInstanceType(value, FIRST_JS_OBJECT_TYPE, JS_FUNCTION_TYPE); 740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 743e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCheckMap::PrintDataTo(StringStream* stream) { 744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" %p", *map()); 746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCheckFunction::PrintDataTo(StringStream* stream) { 750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" %p", *target()); 752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 755e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallStub::PrintDataTo(StringStream* stream) { 7561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("%s ", 7571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CodeStub::MajorName(major_key_, false)); 7581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall::PrintDataTo(stream); 759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 762e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HInstanceOf::PrintDataTo(StringStream* stream) { 7631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block left()->PrintNameTo(stream); 7641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 7651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block right()->PrintNameTo(stream); 7661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add(" "); 7671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block context()->PrintNameTo(stream); 768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HValue::InferRange() { 772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsTagged()) { 773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Tagged values are always in int32 range when converted to integer, 774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // but they can contain -0. 775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* result = new Range(); 776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result->set_can_be_minus_zero(true); 777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else if (representation().IsNone()) { 779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 781e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Untagged integer32 cannot be -0 and we don't compute ranges for 782e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // untagged doubles. 783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return new Range(); 784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HConstant::InferRange() { 789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (has_int32_value_) { 790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* result = new Range(int32_value_, int32_value_); 791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result->set_can_be_minus_zero(false); 792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 794e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return HValue::InferRange(); 795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HPhi::InferRange() { 799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (block()->IsLoopHeader()) { 801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* range = new Range(kMinInt, kMaxInt); 802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return range; 803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* range = OperandAt(0)->range()->Copy(); 805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 1; i < OperandCount(); ++i) { 806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range->Union(OperandAt(i)->range()); 807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return range; 809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HValue::InferRange(); 812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HAdd::InferRange() { 817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* a = left()->range(); 819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* b = right()->range(); 820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* res = a->Copy(); 821b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!res->AddAndCheckOverflow(b)) { 822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(kCanOverflow); 823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool m0 = a->CanBeMinusZero() && b->CanBeMinusZero(); 825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch res->set_can_be_minus_zero(m0); 826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return res; 827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return HValue::InferRange(); 829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HSub::InferRange() { 834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* a = left()->range(); 836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* b = right()->range(); 837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* res = a->Copy(); 838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!res->SubAndCheckOverflow(b)) { 839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(kCanOverflow); 840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch res->set_can_be_minus_zero(a->CanBeMinusZero() && b->CanBeZero()); 842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return res; 843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 844e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return HValue::InferRange(); 845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 849b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HMul::InferRange() { 850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* a = left()->range(); 852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* b = right()->range(); 853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* res = a->Copy(); 854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!res->MulAndCheckOverflow(b)) { 855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(kCanOverflow); 856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool m0 = (a->CanBeZero() && b->CanBeNegative()) || 858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch (a->CanBeNegative() && b->CanBeZero()); 859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch res->set_can_be_minus_zero(m0); 860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return res; 861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 862e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return HValue::InferRange(); 863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HDiv::InferRange() { 868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* result = new Range(); 870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (left()->range()->CanBeMinusZero()) { 871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result->set_can_be_minus_zero(true); 872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (left()->range()->CanBeZero() && right()->range()->CanBeNegative()) { 875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result->set_can_be_minus_zero(true); 876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (right()->range()->Includes(-1) && left()->range()->Includes(kMinInt)) { 879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(HValue::kCanOverflow); 880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!right()->range()->CanBeZero()) { 883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(HValue::kCanBeDivByZero); 884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 887e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return HValue::InferRange(); 888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HMod::InferRange() { 893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32()) { 894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* a = left()->range(); 895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* result = new Range(); 896b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (a->CanBeMinusZero() || a->CanBeNegative()) { 897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result->set_can_be_minus_zero(true); 898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!right()->range()->CanBeZero()) { 900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(HValue::kCanBeDivByZero); 901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 904e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return HValue::InferRange(); 905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 909e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HPhi::PrintTo(StringStream* stream) { 910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("["); 911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* value = OperandAt(i); 913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" "); 914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value->PrintNameTo(stream); 915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" "); 916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" uses%d_%di_%dd_%dt]", 918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch uses()->length(), 919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_non_phi_uses() + int32_indirect_uses(), 920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double_non_phi_uses() + double_indirect_uses(), 921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch tagged_non_phi_uses() + tagged_indirect_uses()); 922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddInput(HValue* value) { 926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inputs_.Add(NULL); 927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(OperandCount() - 1, value); 928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Mark phis that may have 'arguments' directly or indirectly as an operand. 929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!CheckFlag(kIsArguments) && value->CheckFlag(kIsArguments)) { 930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kIsArguments); 931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 93544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool HPhi::HasRealUses() { 93644f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (int i = 0; i < uses()->length(); i++) { 93744f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!uses()->at(i)->IsPhi()) return true; 93844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 93944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return false; 94044f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 94144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 94244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 943e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHValue* HPhi::GetRedundantReplacement() { 944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* candidate = NULL; 945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int count = OperandCount(); 946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int position = 0; 947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while (position < count && candidate == NULL) { 948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* current = OperandAt(position++); 949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (current != this) candidate = current; 950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while (position < count) { 952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* current = OperandAt(position++); 953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (current != this && current != candidate) return NULL; 954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(candidate != this); 956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return candidate; 957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::DeleteFromGraph() { 961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block() != NULL); 962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch block()->RemovePhi(this); 963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block() == NULL); 964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::InitRealUses(int phi_id) { 968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Initialize real uses. 969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch phi_id_ = phi_id; 970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int j = 0; j < uses()->length(); j++) { 971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* use = uses()->at(j); 972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!use->IsPhi()) { 973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int index = use->LookupOperandIndex(0, this); 974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation req_rep = use->RequiredInputRepresentation(index); 975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch non_phi_uses_[req_rep.kind()]++; 976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 981b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddNonPhiUsesFrom(HPhi* other) { 982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < Representation::kNumRepresentations; i++) { 983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch indirect_uses_[i] += other->non_phi_uses_[i]; 984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddIndirectUsesTo(int* dest) { 989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < Representation::kNumRepresentations; i++) { 990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch dest[i] += indirect_uses_[i]; 991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 995e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HSimulate::PrintDataTo(StringStream* stream) { 996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("id=%d ", ast_id()); 997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (pop_count_ > 0) stream->Add("pop %d", pop_count_); 998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (values_.length() > 0) { 999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (pop_count_ > 0) stream->Add(" /"); 1000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < values_.length(); ++i) { 1001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!HasAssignedIndexAt(i)) { 1002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" push "); 1003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 1004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" var[%d] = ", GetAssignedIndexAt(i)); 1005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_[i]->PrintNameTo(stream); 1007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1012e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HEnterInlined::PrintDataTo(StringStream* stream) { 1013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SmartPointer<char> name = function()->debug_name()->ToCString(); 1014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("%s, id=%d", *name, function()->id()); 1015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant::HConstant(Handle<Object> handle, Representation r) 1019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : handle_(handle), 1020053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block constant_type_(HType::TypeFromValue(handle)), 1021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch has_int32_value_(false), 10228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int32_value_(0), 1023053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block has_double_value_(false), 1024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double_value_(0) { 1025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(r); 1026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (handle_->IsNumber()) { 1028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double n = handle_->Number(); 1029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch double roundtrip_value = static_cast<double>(static_cast<int32_t>(n)); 1030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch has_int32_value_ = BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(n); 1031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (has_int32_value_) int32_value_ = static_cast<int32_t>(n); 1032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double_value_ = n; 1033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch has_double_value_ = true; 1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant* HConstant::CopyToRepresentation(Representation r) const { 1039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (r.IsInteger32() && !has_int32_value_) return NULL; 1040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (r.IsDouble() && !has_double_value_) return NULL; 1041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return new HConstant(handle_, r); 1042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant* HConstant::CopyToTruncatedInt32() const { 1046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!has_double_value_) return NULL; 1047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t truncated = NumberToInt32(*handle_); 104844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return new HConstant(FACTORY->NewNumberFromInt(truncated), 1049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation::Integer32()); 1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochbool HConstant::ToBoolean() const { 10548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Converts the constant's boolean value according to 10558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // ECMAScript section 9.2 ToBoolean conversion. 10568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (HasInteger32Value()) return Integer32Value() != 0; 10578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (HasDoubleValue()) { 10588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch double v = DoubleValue(); 10598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return v != 0 && !isnan(v); 10608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 10618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsTrue()) return true; 10628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsFalse()) return false; 10638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsUndefined()) return false; 10648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsNull()) return false; 10658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (handle()->IsString() && 10668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch String::cast(*handle())->length() == 0) return false; 10678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return true; 10688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 10698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1070e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HConstant::PrintDataTo(StringStream* stream) { 1071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch handle()->ShortPrint(stream); 1072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HArrayLiteral::IsCopyOnWrite() const { 107644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return constant_elements()->map() == HEAP->fixed_cow_array_map(); 1077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1080e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HBinaryOperation::PrintDataTo(StringStream* stream) { 1081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch left()->PrintNameTo(stream); 1082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" "); 1083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch right()->PrintNameTo(stream); 1084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CheckFlag(kCanOverflow)) stream->Add(" !"); 1085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?"); 1086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HBitAnd::InferRange() { 1090e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t left_mask = (left()->range() != NULL) 1091e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? left()->range()->Mask() 1092e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : 0xffffffff; 1093e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t right_mask = (right()->range() != NULL) 1094e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? right()->range()->Mask() 1095e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : 0xffffffff; 1096e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t result_mask = left_mask & right_mask; 1097e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return (result_mask >= 0) 1098e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? new Range(0, result_mask) 1099e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HValue::InferRange(); 1100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HBitOr::InferRange() { 1104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t left_mask = (left()->range() != NULL) 1105e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? left()->range()->Mask() 1106e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : 0xffffffff; 1107e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t right_mask = (right()->range() != NULL) 1108e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? right()->range()->Mask() 1109e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : 0xffffffff; 1110e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int32_t result_mask = left_mask | right_mask; 1111e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return (result_mask >= 0) 1112e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? new Range(0, result_mask) 1113e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HValue::InferRange(); 1114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HSar::InferRange() { 1118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (right()->IsConstant()) { 1119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* c = HConstant::cast(right()); 1120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (c->HasInteger32Value()) { 1121e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Range* result = (left()->range() != NULL) 1122e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? left()->range()->Copy() 1123e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : new Range(); 1124e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch result->Sar(c->Integer32Value()); 1125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 1126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1128e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return HValue::InferRange(); 1129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HShl::InferRange() { 1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (right()->IsConstant()) { 1134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* c = HConstant::cast(right()); 1135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (c->HasInteger32Value()) { 1136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Range* result = (left()->range() != NULL) 1137e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? left()->range()->Copy() 1138e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : new Range(); 1139e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch result->Shl(c->Integer32Value()); 1140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 1141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1143e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return HValue::InferRange(); 1144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1148e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCompare::PrintDataTo(StringStream* stream) { 1149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(Token::Name(token())); 1150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" "); 1151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBinaryOperation::PrintDataTo(stream); 1152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HCompare::SetInputRepresentation(Representation r) { 1156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch input_representation_ = r; 1157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (r.IsTagged()) { 11581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 1159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ClearFlag(kUseGVN); 11607d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch } else if (r.IsDouble()) { 11617d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch SetFlag(kDeoptimizeOnUndefined); 11627d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch ClearAllSideEffects(); 11637d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch SetFlag(kUseGVN); 1164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 11651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ClearAllSideEffects(); 1166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1171e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HParameter::PrintDataTo(StringStream* stream) { 1172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("%u", index()); 1173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1176e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadNamedField::PrintDataTo(StringStream* stream) { 1177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch object()->PrintNameTo(stream); 1178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : ""); 1179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 118244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockHLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* object, 118344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneMapList* types, 118444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name) 118544f0eee88ff00398ff7f715fab053374d808c90dSteve Block : HUnaryOperation(object), 118644f0eee88ff00398ff7f715fab053374d808c90dSteve Block types_(Min(types->length(), kMaxLoadPolymorphism)), 118744f0eee88ff00398ff7f715fab053374d808c90dSteve Block name_(name), 118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block need_generic_(false) { 118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Tagged()); 119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 119144f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (int i = 0; 119244f0eee88ff00398ff7f715fab053374d808c90dSteve Block i < types->length() && types_.length() < kMaxLoadPolymorphism; 119344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ++i) { 119444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Map> map = types->at(i); 119544f0eee88ff00398ff7f715fab053374d808c90dSteve Block LookupResult lookup; 119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block map->LookupInDescriptors(NULL, *name, &lookup); 119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (lookup.IsProperty() && lookup.type() == FIELD) { 119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block types_.Add(types->at(i)); 119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block int index = lookup.GetLocalFieldIndexFromMap(*map); 120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (index < 0) { 120144f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnInobjectFields); 120244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 120344f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnBackingStoreFields); 120444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 120544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 120644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 120744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 120844f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (types_.length() == types->length() && FLAG_deoptimize_uncommon_cases) { 120944f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kUseGVN); 121044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 121144f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetAllSideEffects(); 121244f0eee88ff00398ff7f715fab053374d808c90dSteve Block need_generic_ = true; 121344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 121444f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 121544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 121644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 121744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool HLoadNamedFieldPolymorphic::DataEquals(HValue* value) { 121844f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadNamedFieldPolymorphic* other = HLoadNamedFieldPolymorphic::cast(value); 121944f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (types_.length() != other->types()->length()) return false; 122044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!name_.is_identical_to(other->name())) return false; 122144f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (need_generic_ != other->need_generic_) return false; 122244f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (int i = 0; i < types_.length(); i++) { 122344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool found = false; 122444f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (int j = 0; j < types_.length(); j++) { 122544f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (types_.at(j).is_identical_to(other->types()->at(i))) { 122644f0eee88ff00398ff7f715fab053374d808c90dSteve Block found = true; 122744f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 122844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 122944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 123044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!found) return false; 123144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 123244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return true; 123344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 123444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 123544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1236e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadKeyedFastElement::PrintDataTo(StringStream* stream) { 1237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch object()->PrintNameTo(stream); 1238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("["); 1239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch key()->PrintNameTo(stream); 1240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("]"); 1241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1244e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadKeyedGeneric::PrintDataTo(StringStream* stream) { 1245e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintNameTo(stream); 1246e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("["); 1247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch key()->PrintNameTo(stream); 1248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("]"); 1249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1250e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1251e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 125244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid HLoadKeyedSpecializedArrayElement::PrintDataTo( 125344f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringStream* stream) { 12541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block external_pointer()->PrintNameTo(stream); 125544f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("."); 125644f0eee88ff00398ff7f715fab053374d808c90dSteve Block switch (array_type()) { 125744f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalByteArray: 125844f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("byte"); 125944f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 126044f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalUnsignedByteArray: 126144f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_byte"); 126244f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 126344f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalShortArray: 126444f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("short"); 126544f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 126644f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalUnsignedShortArray: 126744f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_short"); 126844f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 126944f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalIntArray: 127044f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("int"); 127144f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 127244f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalUnsignedIntArray: 127344f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_int"); 127444f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 127544f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalFloatArray: 127644f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("float"); 127744f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 127844f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalPixelArray: 127944f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("pixel"); 128044f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 128144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 12821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("["); 12831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block key()->PrintNameTo(stream); 12841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("]"); 12851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 12861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 12871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreNamedGeneric::PrintDataTo(StringStream* stream) { 1289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch object()->PrintNameTo(stream); 1290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("."); 1291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(name()->IsString()); 1292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(*String::cast(*name())->ToCString()); 1293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" = "); 1294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 1295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreNamedField::PrintDataTo(StringStream* stream) { 1299e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintNameTo(stream); 1300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("."); 1301e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(name()->IsString()); 1302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add(*String::cast(*name())->ToCString()); 1303e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add(" = "); 1304e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintNameTo(stream); 1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!transition().is_null()) { 1306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add(" (transition map %p)", *transition()); 1307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1311e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreKeyedFastElement::PrintDataTo(StringStream* stream) { 1312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch object()->PrintNameTo(stream); 1313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("["); 1314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch key()->PrintNameTo(stream); 1315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("] = "); 1316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 1317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1320e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 1321e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintNameTo(stream); 1322e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("["); 1323e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch key()->PrintNameTo(stream); 1324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("] = "); 1325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintNameTo(stream); 1326e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1328e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 132944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid HStoreKeyedSpecializedArrayElement::PrintDataTo( 133044f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringStream* stream) { 1331e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch external_pointer()->PrintNameTo(stream); 133244f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("."); 133344f0eee88ff00398ff7f715fab053374d808c90dSteve Block switch (array_type()) { 133444f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalByteArray: 133544f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("byte"); 133644f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 133744f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalUnsignedByteArray: 133844f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_byte"); 133944f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 134044f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalShortArray: 134144f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("short"); 134244f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 134344f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalUnsignedShortArray: 134444f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_short"); 134544f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 134644f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalIntArray: 134744f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("int"); 134844f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 134944f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalUnsignedIntArray: 135044f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("u_int"); 135144f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 135244f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalFloatArray: 135344f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("float"); 135444f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 135544f0eee88ff00398ff7f715fab053374d808c90dSteve Block case kExternalPixelArray: 135644f0eee88ff00398ff7f715fab053374d808c90dSteve Block stream->Add("pixel"); 135744f0eee88ff00398ff7f715fab053374d808c90dSteve Block break; 135844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1359e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("["); 1360e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch key()->PrintNameTo(stream); 1361e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("] = "); 1362e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintNameTo(stream); 1363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 13668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HLoadGlobalCell::PrintDataTo(StringStream* stream) { 1367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("[%p]", *cell()); 1368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (check_hole_value()) stream->Add(" (deleteable/read-only)"); 1369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HLoadGlobalGeneric::PrintDataTo(StringStream* stream) { 13738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch stream->Add("%o ", *name()); 13748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 13758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 13768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 13778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HStoreGlobalCell::PrintDataTo(StringStream* stream) { 1378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch stream->Add("[%p] = ", *cell()); 1379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value()->PrintNameTo(stream); 1380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HStoreGlobalGeneric::PrintDataTo(StringStream* stream) { 13848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch stream->Add("%o = ", *name()); 13858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch value()->PrintNameTo(stream); 13868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 13878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 13888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1389e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadContextSlot::PrintDataTo(StringStream* stream) { 13901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block value()->PrintNameTo(stream); 13911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("[%d]", slot_index()); 13921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 13931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 13941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreContextSlot::PrintDataTo(StringStream* stream) { 13961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block context()->PrintNameTo(stream); 13971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("[%d] = ", slot_index()); 13981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block value()->PrintNameTo(stream); 1399b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1400b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1401b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Implementation of type inference and type conversions. Calculates 1403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// the inferred type of this instruction based on the input operands. 1404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1405e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HValue::CalculateInferredType() { 1406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return type_; 1407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1410e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckMap::CalculateInferredType() { 1411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return value()->type(); 1412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1415e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckFunction::CalculateInferredType() { 1416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return value()->type(); 1417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckNonSmi::CalculateInferredType() { 1421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // TODO(kasperl): Is there any way to signal that this isn't a smi? 1422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Tagged(); 1423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckSmi::CalculateInferredType() { 1427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Smi(); 1428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1431e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HPhi::CalculateInferredType() { 1432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType result = HType::Uninitialized(); 1433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 1434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType current = OperandAt(i)->type(); 1435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = result.Combine(current); 1436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 1438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1441e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HConstant::CalculateInferredType() { 1442053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block return constant_type_; 1443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCompare::CalculateInferredType() { 1447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Boolean(); 1448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1451e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCompareJSObjectEq::CalculateInferredType() { 1452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Boolean(); 1453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HUnaryPredicate::CalculateInferredType() { 1457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Boolean(); 1458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1461e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitwiseBinaryOperation::CalculateInferredType() { 14621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return HType::TaggedNumber(); 14631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 14641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1466e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HArithmeticBinaryOperation::CalculateInferredType() { 1467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HAdd::CalculateInferredType() { 1472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::Tagged(); 1473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitAnd::CalculateInferredType() { 1477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitXor::CalculateInferredType() { 1482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1486e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitOr::CalculateInferredType() { 1487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitNot::CalculateInferredType() { 1492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1496e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HUnaryMathOperation::CalculateInferredType() { 1497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HShl::CalculateInferredType() { 1502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1506e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HShr::CalculateInferredType() { 1507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HSar::CalculateInferredType() { 1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType::TaggedNumber(); 1513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HUnaryMathOperation::EnsureAndPropagateNotMinusZero( 1517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BitVector* visited) { 1518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 1519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (representation().IsInteger32() && 1520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch !value()->representation().IsInteger32()) { 1521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value()->range() == NULL || value()->range()->CanBeMinusZero()) { 1522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 1523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (RequiredInputRepresentation(0).IsInteger32() && 1526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation().IsInteger32()) { 1527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return value(); 1528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 1530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HChange::EnsureAndPropagateNotMinusZero(BitVector* visited) { 1535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 1536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (from().IsInteger32()) return NULL; 1537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (CanTruncateToInt32()) return NULL; 1538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value()->range() == NULL || value()->range()->CanBeMinusZero()) { 1539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 1540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!from().IsInteger32() || !to().IsInteger32()); 1542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 1543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HMod::EnsureAndPropagateNotMinusZero(BitVector* visited) { 1547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 1548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 1549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 1550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left(); 1551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 1553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HDiv::EnsureAndPropagateNotMinusZero(BitVector* visited) { 1557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 1558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 1559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 1560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 1562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HMul::EnsureAndPropagateNotMinusZero(BitVector* visited) { 1566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 1567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 1568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kBailoutOnMinusZero); 1569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 1571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HSub::EnsureAndPropagateNotMinusZero(BitVector* visited) { 1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 1576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Propagate to the left argument. If the left argument cannot be -0, then 1577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // the result of the add operation cannot be either. 1578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 1579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left(); 1580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 1582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HAdd::EnsureAndPropagateNotMinusZero(BitVector* visited) { 1586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 1587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Propagate to the left argument. If the left argument cannot be -0, then 1588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // the result of the sub operation cannot be either. 1589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (range() == NULL || range()->CanBeMinusZero()) { 1590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left(); 1591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 1593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Node-specific verification code is only included in debug mode. 1597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 1598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HPhi::Verify() { 1600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(OperandCount() == block()->predecessors()->length()); 1601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 1602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* value = OperandAt(i); 1603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* defining_block = value->block(); 1604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* predecessor_block = block()->predecessors()->at(i); 1605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(defining_block == predecessor_block || 1606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch defining_block->Dominates(predecessor_block)); 1607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HSimulate::Verify() { 1612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 1613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasAstId()); 1614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HBoundsCheck::Verify() { 1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 1619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckSmi::Verify() { 1623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 1624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 1625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckNonSmi::Verify() { 1629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 1630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 1631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckInstanceType::Verify() { 1635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 1637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckMap::Verify() { 1641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 1642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckFunction::Verify() { 1647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 1648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 1649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckPrototypeMaps::Verify() { 1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction::Verify(); 1654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasNoUses()); 1655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} } // namespace v8::internal 1660