1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ic/ic-state.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/ast/ast-types.h" 862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/feedback-vector.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ic/ic.h" 1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// static 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ICUtility::Clear(Isolate* isolate, Address address, 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address constant_pool) { 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IC::Clear(isolate, address, constant_pool); 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const int BinaryOpICState::FIRST_TOKEN; 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const int BinaryOpICState::LAST_TOKEN; 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBinaryOpICState::BinaryOpICState(Isolate* isolate, ExtraICState extra_ic_state) 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : fixed_right_arg_( 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HasFixedRightArgField::decode(extra_ic_state) 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ? Just(1 << FixedRightArgValueField::decode(extra_ic_state)) 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : Nothing<int>()), 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate_(isolate) { 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch op_ = 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<Token::Value>(FIRST_TOKEN + OpField::decode(extra_ic_state)); 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_kind_ = LeftKindField::decode(extra_ic_state); 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch right_kind_ = fixed_right_arg_.IsJust() 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ? (Smi::IsValid(fixed_right_arg_.FromJust()) ? SMI : INT32) 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : RightKindField::decode(extra_ic_state); 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result_kind_ = ResultKindField::decode(extra_ic_state); 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LE(FIRST_TOKEN, op_); 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LE(op_, LAST_TOKEN); 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExtraICState BinaryOpICState::GetExtraICState() const { 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExtraICState extra_ic_state = 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OpField::encode(op_ - FIRST_TOKEN) | LeftKindField::encode(left_kind_) | 51109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ResultKindField::encode(result_kind_) | 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HasFixedRightArgField::encode(fixed_right_arg_.IsJust()); 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (fixed_right_arg_.IsJust()) { 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch extra_ic_state = FixedRightArgValueField::update( 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch extra_ic_state, WhichPowerOf2(fixed_right_arg_.FromJust())); 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch extra_ic_state = RightKindField::update(extra_ic_state, right_kind_); 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return extra_ic_state; 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstd::string BinaryOpICState::ToString() const { 6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch std::string ret = "("; 6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret += Token::Name(op_); 6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (CouldCreateAllocationMementos()) ret += "_CreateAllocationMementos"; 6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret += ":"; 6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret += BinaryOpICState::KindToString(left_kind_); 6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret += "*"; 6962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (fixed_right_arg_.IsJust()) { 7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret += fixed_right_arg_.FromJust(); 7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } else { 7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret += BinaryOpICState::KindToString(right_kind_); 7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret += "->"; 7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret += BinaryOpICState::KindToString(result_kind_); 7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret += ")"; 7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return ret; 7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// static 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid BinaryOpICState::GenerateAheadOfTime( 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, void (*Generate)(Isolate*, const BinaryOpICState&)) { 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(olivf) We should investigate why adding stubs to the snapshot is so 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// expensive at runtime. When solved we should be able to add most binops to 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// the snapshot instead of hand-picking them. 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Generated list of commonly used stubs 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define GENERATE(op, left_kind, right_kind, result_kind) \ 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch do { \ 89109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch BinaryOpICState state(isolate, op); \ 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch state.left_kind_ = left_kind; \ 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch state.fixed_right_arg_ = Nothing<int>(); \ 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch state.right_kind_ = right_kind; \ 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch state.result_kind_ = result_kind; \ 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Generate(isolate, state); \ 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } while (false) 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, INT32, INT32, INT32); 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, INT32, INT32, NUMBER); 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, INT32, NUMBER, NUMBER); 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, INT32, SMI, INT32); 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, NUMBER, INT32, NUMBER); 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, NUMBER, NUMBER, NUMBER); 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, NUMBER, SMI, NUMBER); 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, SMI, INT32, INT32); 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, SMI, INT32, NUMBER); 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, SMI, NUMBER, NUMBER); 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, SMI, SMI, INT32); 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::ADD, SMI, SMI, SMI); 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, INT32, INT32, INT32); 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, INT32, INT32, SMI); 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, INT32, SMI, INT32); 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, INT32, SMI, SMI); 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, NUMBER, INT32, INT32); 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, NUMBER, SMI, SMI); 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, SMI, INT32, INT32); 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, SMI, INT32, SMI); 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, SMI, NUMBER, SMI); 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_AND, SMI, SMI, SMI); 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_OR, INT32, INT32, INT32); 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_OR, INT32, INT32, SMI); 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_OR, INT32, SMI, INT32); 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_OR, INT32, SMI, SMI); 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_OR, NUMBER, SMI, INT32); 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_OR, NUMBER, SMI, SMI); 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_OR, SMI, INT32, INT32); 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_OR, SMI, INT32, SMI); 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_OR, SMI, SMI, SMI); 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, INT32, INT32, INT32); 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, INT32, INT32, SMI); 129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, INT32, NUMBER, SMI); 130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, INT32, SMI, INT32); 131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, NUMBER, INT32, INT32); 132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, NUMBER, SMI, INT32); 133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, NUMBER, SMI, SMI); 134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, SMI, INT32, INT32); 135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, SMI, INT32, SMI); 136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::BIT_XOR, SMI, SMI, SMI); 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, INT32, INT32, INT32); 138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, INT32, INT32, NUMBER); 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, INT32, NUMBER, NUMBER); 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, INT32, SMI, INT32); 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, INT32, SMI, NUMBER); 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, NUMBER, INT32, NUMBER); 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, NUMBER, NUMBER, NUMBER); 144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, NUMBER, SMI, NUMBER); 145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, SMI, INT32, INT32); 146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, SMI, INT32, NUMBER); 147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, SMI, NUMBER, NUMBER); 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, SMI, SMI, NUMBER); 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::DIV, SMI, SMI, SMI); 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MOD, NUMBER, SMI, NUMBER); 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MOD, SMI, SMI, SMI); 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, INT32, INT32, INT32); 153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, INT32, INT32, NUMBER); 154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, INT32, NUMBER, NUMBER); 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, INT32, SMI, INT32); 156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, INT32, SMI, NUMBER); 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, NUMBER, INT32, NUMBER); 158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, NUMBER, NUMBER, NUMBER); 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, NUMBER, SMI, NUMBER); 160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, SMI, INT32, INT32); 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, SMI, INT32, NUMBER); 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, SMI, NUMBER, NUMBER); 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, SMI, SMI, INT32); 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, SMI, SMI, NUMBER); 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MUL, SMI, SMI, SMI); 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SAR, INT32, SMI, INT32); 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SAR, INT32, SMI, SMI); 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SAR, NUMBER, SMI, SMI); 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SAR, SMI, SMI, SMI); 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SHL, INT32, SMI, INT32); 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SHL, INT32, SMI, SMI); 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SHL, NUMBER, SMI, SMI); 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SHL, SMI, SMI, INT32); 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SHL, SMI, SMI, SMI); 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SHR, INT32, SMI, SMI); 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SHR, NUMBER, SMI, INT32); 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SHR, NUMBER, SMI, SMI); 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SHR, SMI, SMI, SMI); 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SUB, INT32, INT32, INT32); 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SUB, INT32, NUMBER, NUMBER); 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SUB, INT32, SMI, INT32); 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SUB, NUMBER, INT32, NUMBER); 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SUB, NUMBER, NUMBER, NUMBER); 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SUB, NUMBER, SMI, NUMBER); 185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SUB, SMI, INT32, INT32); 186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SUB, SMI, NUMBER, NUMBER); 187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::SUB, SMI, SMI, SMI); 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef GENERATE 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define GENERATE(op, left_kind, fixed_right_arg_value, result_kind) \ 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch do { \ 191109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch BinaryOpICState state(isolate, op); \ 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch state.left_kind_ = left_kind; \ 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch state.fixed_right_arg_ = Just(fixed_right_arg_value); \ 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch state.right_kind_ = SMI; \ 195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch state.result_kind_ = result_kind; \ 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Generate(isolate, state); \ 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } while (false) 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MOD, SMI, 2, SMI); 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MOD, SMI, 4, SMI); 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MOD, SMI, 8, SMI); 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MOD, SMI, 16, SMI); 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MOD, SMI, 32, SMI); 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GENERATE(Token::MOD, SMI, 2048, SMI); 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef GENERATE 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 207f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochAstType* BinaryOpICState::GetResultType() const { 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind result_kind = result_kind_; 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasSideEffects()) { 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result_kind = NONE; 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (result_kind == GENERIC && op_ == Token::ADD) { 212f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::NumberOrString(); 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (result_kind == NUMBER && op_ == Token::SHR) { 214f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::Unsigned32(); 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NE(GENERIC, result_kind); 217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return KindToType(result_kind); 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, const BinaryOpICState& s) { 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "(" << Token::Name(s.op_); 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (s.CouldCreateAllocationMementos()) os << "_CreateAllocationMementos"; 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << ":" << BinaryOpICState::KindToString(s.left_kind_) << "*"; 225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (s.fixed_right_arg_.IsJust()) { 226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os << s.fixed_right_arg_.FromJust(); 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << BinaryOpICState::KindToString(s.right_kind_); 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os << "->" << BinaryOpICState::KindToString(s.result_kind_) << ")"; 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid BinaryOpICState::Update(Handle<Object> left, Handle<Object> right, 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> result) { 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExtraICState old_extra_ic_state = GetExtraICState(); 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_kind_ = UpdateKind(left, left_kind_); 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_kind_ = UpdateKind(right, right_kind_); 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t fixed_right_arg_value = 0; 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_fixed_right_arg = 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch op_ == Token::MOD && right->ToInt32(&fixed_right_arg_value) && 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fixed_right_arg_value > 0 && 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::bits::IsPowerOfTwo32(fixed_right_arg_value) && 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedRightArgValueField::is_valid(WhichPowerOf2(fixed_right_arg_value)) && 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (left_kind_ == SMI || left_kind_ == INT32) && 248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (result_kind_ == NONE || !fixed_right_arg_.IsJust()); 249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch fixed_right_arg_ = 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch has_fixed_right_arg ? Just(fixed_right_arg_value) : Nothing<int32_t>(); 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result_kind_ = UpdateKind(result, result_kind_); 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!Token::IsTruncatingBinaryOp(op_)) { 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind input_kind = Max(left_kind_, right_kind_); 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (result_kind_ < input_kind && input_kind <= NUMBER) { 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result_kind_ = input_kind; 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We don't want to distinguish INT32 and NUMBER for string add (because 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // NumberToString can't make use of this anyway). 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (left_kind_ == STRING && right_kind_ == INT32) { 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(STRING, result_kind_); 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(Token::ADD, op_); 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_kind_ = NUMBER; 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (right_kind_ == STRING && left_kind_ == INT32) { 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(STRING, result_kind_); 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(Token::ADD, op_); 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_kind_ = NUMBER; 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (old_extra_ic_state == GetExtraICState()) { 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tagged operations can lead to non-truncating HChanges 274c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (left->IsOddball()) { 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_kind_ = GENERIC; 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 277c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK(right->IsOddball()); 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_kind_ = GENERIC; 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBinaryOpICState::Kind BinaryOpICState::UpdateKind(Handle<Object> object, 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind kind) const { 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind new_kind = GENERIC; 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_truncating = Token::IsTruncatingBinaryOp(op()); 288c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (object->IsOddball() && is_truncating) { 289c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Oddballs will be automatically truncated by HChange. 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_kind = INT32; 29113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } else if (object->IsUndefined(isolate_)) { 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Undefined will be automatically truncated by HChange. 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_kind = is_truncating ? INT32 : NUMBER; 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (object->IsSmi()) { 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_kind = SMI; 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (object->IsHeapNumber()) { 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double value = Handle<HeapNumber>::cast(object)->value(); 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_kind = IsInt32Double(value) ? INT32 : NUMBER; 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (object->IsString() && op() == Token::ADD) { 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_kind = STRING; 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (new_kind == INT32 && SmiValuesAre32Bits()) { 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_kind = NUMBER; 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kind != NONE && ((new_kind <= NUMBER && kind > NUMBER) || 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (new_kind > NUMBER && kind <= NUMBER))) { 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_kind = GENERIC; 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Max(kind, new_kind); 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// static 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst char* BinaryOpICState::KindToString(Kind kind) { 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (kind) { 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NONE: 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "None"; 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SMI: 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "Smi"; 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case INT32: 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "Int32"; 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NUMBER: 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "Number"; 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case STRING: 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "String"; 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case GENERIC: 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "Generic"; 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// static 335f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochAstType* BinaryOpICState::KindToType(Kind kind) { 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (kind) { 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NONE: 338f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::None(); 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SMI: 340f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::SignedSmall(); 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case INT32: 342f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::Signed32(); 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NUMBER: 344f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::Number(); 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case STRING: 346f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::String(); 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case GENERIC: 348f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::Any(); 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst char* CompareICState::GetStateName(State state) { 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (state) { 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case UNINITIALIZED: 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "UNINITIALIZED"; 359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case BOOLEAN: 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "BOOLEAN"; 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SMI: 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "SMI"; 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NUMBER: 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "NUMBER"; 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case INTERNALIZED_STRING: 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "INTERNALIZED_STRING"; 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case STRING: 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "STRING"; 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case UNIQUE_NAME: 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "UNIQUE_NAME"; 371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RECEIVER: 372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "RECEIVER"; 373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case KNOWN_RECEIVER: 374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "KNOWN_RECEIVER"; 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case GENERIC: 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "GENERIC"; 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 382f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochAstType* CompareICState::StateToType(Zone* zone, State state, Handle<Map> map) { 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (state) { 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case UNINITIALIZED: 385f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::None(); 386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case BOOLEAN: 387f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::Boolean(); 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SMI: 389f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::SignedSmall(); 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NUMBER: 391f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::Number(); 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case STRING: 393f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::String(); 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case INTERNALIZED_STRING: 395f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::InternalizedString(); 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case UNIQUE_NAME: 397f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::UniqueName(); 398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RECEIVER: 399f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::Receiver(); 400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case KNOWN_RECEIVER: 401f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return map.is_null() ? AstType::Receiver() : AstType::Class(map, zone); 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case GENERIC: 403f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::Any(); 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCompareICState::State CompareICState::NewInputState(State old_state, 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value) { 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (old_state) { 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case UNINITIALIZED: 414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (value->IsBoolean()) return BOOLEAN; 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsSmi()) return SMI; 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsHeapNumber()) return NUMBER; 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsInternalizedString()) return INTERNALIZED_STRING; 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsString()) return STRING; 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsSymbol()) return UNIQUE_NAME; 4203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (value->IsJSReceiver() && !value->IsUndetectable()) { 4213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return RECEIVER; 4223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case BOOLEAN: 425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (value->IsBoolean()) return BOOLEAN; 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SMI: 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsSmi()) return SMI; 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsHeapNumber()) return NUMBER; 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NUMBER: 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsNumber()) return NUMBER; 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case INTERNALIZED_STRING: 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsInternalizedString()) return INTERNALIZED_STRING; 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsString()) return STRING; 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsSymbol()) return UNIQUE_NAME; 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case STRING: 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsString()) return STRING; 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case UNIQUE_NAME: 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsUniqueName()) return UNIQUE_NAME; 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RECEIVER: 4463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (value->IsJSReceiver() && !value->IsUndetectable()) { 4473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return RECEIVER; 4483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case GENERIC: 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case KNOWN_RECEIVER: 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GENERIC; 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// static 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCompareICState::State CompareICState::TargetState( 46213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* isolate, State old_state, State old_left, State old_right, 46313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Token::Value op, bool has_inlined_smi_code, Handle<Object> x, 46413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<Object> y) { 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (old_state) { 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case UNINITIALIZED: 467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (x->IsBoolean() && y->IsBoolean()) return BOOLEAN; 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x->IsSmi() && y->IsSmi()) return SMI; 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x->IsNumber() && y->IsNumber()) return NUMBER; 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (Token::IsOrderedRelationalCompareOp(op)) { 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ordered comparisons treat undefined as NaN, so the 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // NUMBER stub will do the right thing. 47313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if ((x->IsNumber() && y->IsUndefined(isolate)) || 47413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch (y->IsNumber() && x->IsUndefined(isolate))) { 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NUMBER; 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x->IsInternalizedString() && y->IsInternalizedString()) { 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We compare internalized strings as plain ones if we need to determine 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the order in a non-equality compare. 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Token::IsEqualityOp(op) ? INTERNALIZED_STRING : STRING; 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x->IsString() && y->IsString()) return STRING; 484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (x->IsJSReceiver() && y->IsJSReceiver()) { 4853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (x->IsUndetectable() || y->IsUndetectable()) { 4863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return GENERIC; 4873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (Handle<JSReceiver>::cast(x)->map() == 489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver>::cast(y)->map()) { 490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return KNOWN_RECEIVER; 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Token::IsEqualityOp(op) ? RECEIVER : GENERIC; 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!Token::IsEqualityOp(op)) return GENERIC; 496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (x->IsUniqueName() && y->IsUniqueName()) return UNIQUE_NAME; 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GENERIC; 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SMI: 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return x->IsNumber() && y->IsNumber() ? NUMBER : GENERIC; 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case INTERNALIZED_STRING: 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Token::IsEqualityOp(op)); 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x->IsString() && y->IsString()) return STRING; 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x->IsUniqueName() && y->IsUniqueName()) return UNIQUE_NAME; 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GENERIC; 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NUMBER: 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If the failure was due to one side changing from smi to heap number, 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // then keep the state (if other changed at the same time, we will get 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a second miss and then go to generic). 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (old_left == SMI && x->IsHeapNumber()) return NUMBER; 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (old_right == SMI && y->IsHeapNumber()) return NUMBER; 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GENERIC; 512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case KNOWN_RECEIVER: 513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (x->IsJSReceiver() && y->IsJSReceiver()) { 514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Token::IsEqualityOp(op) ? RECEIVER : GENERIC; 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GENERIC; 517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case BOOLEAN: 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case STRING: 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case UNIQUE_NAME: 520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RECEIVER: 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case GENERIC: 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GENERIC; 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GENERIC; // Make the compiler happy. 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 530