| Index: src/hydrogen-instructions.cc
|
| ===================================================================
|
| --- src/hydrogen-instructions.cc (revision 7031)
|
| +++ src/hydrogen-instructions.cc (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2010 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -57,10 +57,13 @@
|
| case kTagged: return "t";
|
| case kDouble: return "d";
|
| case kInteger32: return "i";
|
| - default:
|
| + case kExternal: return "x";
|
| + case kNumRepresentations:
|
| UNREACHABLE();
|
| return NULL;
|
| }
|
| + UNREACHABLE();
|
| + return NULL;
|
| }
|
|
|
|
|
| @@ -221,7 +224,7 @@
|
| }
|
|
|
|
|
| -int HValue::LookupOperandIndex(int occurrence_index, HValue* op) const {
|
| +int HValue::LookupOperandIndex(int occurrence_index, HValue* op) {
|
| for (int i = 0; i < OperandCount(); ++i) {
|
| if (OperandAt(i) == op) {
|
| if (occurrence_index == 0) return i;
|
| @@ -237,7 +240,7 @@
|
| }
|
|
|
|
|
| -bool HValue::UsesMultipleTimes(HValue* op) const {
|
| +bool HValue::UsesMultipleTimes(HValue* op) {
|
| bool seen = false;
|
| for (int i = 0; i < OperandCount(); ++i) {
|
| if (OperandAt(i) == op) {
|
| @@ -249,7 +252,7 @@
|
| }
|
|
|
|
|
| -bool HValue::Equals(HValue* other) const {
|
| +bool HValue::Equals(HValue* other) {
|
| if (other->opcode() != opcode()) return false;
|
| if (!other->representation().Equals(representation())) return false;
|
| if (!other->type_.Equals(type_)) return false;
|
| @@ -264,7 +267,7 @@
|
| }
|
|
|
|
|
| -intptr_t HValue::Hashcode() const {
|
| +intptr_t HValue::Hashcode() {
|
| intptr_t result = opcode();
|
| int count = OperandCount();
|
| for (int i = 0; i < count; ++i) {
|
| @@ -282,24 +285,19 @@
|
|
|
|
|
| void HValue::ReplaceAndDelete(HValue* other) {
|
| - ReplaceValue(other);
|
| + if (other != NULL) ReplaceValue(other);
|
| Delete();
|
| }
|
|
|
|
|
| void HValue::ReplaceValue(HValue* other) {
|
| - ZoneList<HValue*> start_uses(2);
|
| for (int i = 0; i < uses_.length(); ++i) {
|
| - HValue* use = uses_.at(i);
|
| - if (!use->block()->IsStartBlock()) {
|
| - InternalReplaceAtUse(use, other);
|
| - other->uses_.Add(use);
|
| - } else {
|
| - start_uses.Add(use);
|
| - }
|
| + HValue* use = uses_[i];
|
| + ASSERT(!use->block()->IsStartBlock());
|
| + InternalReplaceAtUse(use, other);
|
| + other->uses_.Add(use);
|
| }
|
| - uses_.Clear();
|
| - uses_.AddAll(start_uses);
|
| + uses_.Rewind(0);
|
| }
|
|
|
|
|
| @@ -411,7 +409,7 @@
|
| }
|
|
|
|
|
| -void HInstruction::PrintTo(StringStream* stream) const {
|
| +void HInstruction::PrintTo(StringStream* stream) {
|
| stream->Add("%s", Mnemonic());
|
| if (HasSideEffects()) stream->Add("*");
|
| stream->Add(" ");
|
| @@ -438,9 +436,16 @@
|
| void HInstruction::Unlink() {
|
| ASSERT(IsLinked());
|
| ASSERT(!IsControlInstruction()); // Must never move control instructions.
|
| + ASSERT(!IsBlockEntry()); // Doesn't make sense to delete these.
|
| + ASSERT(previous_ != NULL);
|
| + previous_->next_ = next_;
|
| + if (next_ == NULL) {
|
| + ASSERT(block()->last() == this);
|
| + block()->set_last(previous_);
|
| + } else {
|
| + next_->previous_ = previous_;
|
| + }
|
| clear_block();
|
| - if (previous_ != NULL) previous_->next_ = next_;
|
| - if (next_ != NULL) next_->previous_ = previous_;
|
| }
|
|
|
|
|
| @@ -527,31 +532,64 @@
|
| #endif
|
|
|
|
|
| -HCall::HCall(int count) : arguments_(ZONE->NewArray<HValue*>(count), count) {
|
| - for (int i = 0; i < count; ++i) arguments_[i] = NULL;
|
| - set_representation(Representation::Tagged());
|
| - SetAllSideEffects();
|
| +void HUnaryCall::PrintDataTo(StringStream* stream) {
|
| + value()->PrintNameTo(stream);
|
| + stream->Add(" ");
|
| + stream->Add("#%d", argument_count());
|
| }
|
|
|
|
|
| -void HCall::PrintDataTo(StringStream* stream) const {
|
| - stream->Add("(");
|
| - for (int i = 0; i < arguments_.length(); ++i) {
|
| - if (i != 0) stream->Add(", ");
|
| - arguments_.at(i)->PrintNameTo(stream);
|
| +void HBinaryCall::PrintDataTo(StringStream* stream) {
|
| + first()->PrintNameTo(stream);
|
| + stream->Add(" ");
|
| + second()->PrintNameTo(stream);
|
| + stream->Add(" ");
|
| + stream->Add("#%d", argument_count());
|
| +}
|
| +
|
| +
|
| +void HCallConstantFunction::PrintDataTo(StringStream* stream) {
|
| + if (IsApplyFunction()) {
|
| + stream->Add("optimized apply ");
|
| + } else {
|
| + stream->Add("%o ", function()->shared()->DebugName());
|
| }
|
| - stream->Add(")");
|
| + stream->Add("#%d", argument_count());
|
| }
|
|
|
|
|
| -void HClassOfTest::PrintDataTo(StringStream* stream) const {
|
| +void HCallNamed::PrintDataTo(StringStream* stream) {
|
| + stream->Add("%o ", *name());
|
| + HUnaryCall::PrintDataTo(stream);
|
| +}
|
| +
|
| +
|
| +void HCallGlobal::PrintDataTo(StringStream* stream) {
|
| + stream->Add("%o ", *name());
|
| + HUnaryCall::PrintDataTo(stream);
|
| +}
|
| +
|
| +
|
| +void HCallKnownGlobal::PrintDataTo(StringStream* stream) {
|
| + stream->Add("o ", target()->shared()->DebugName());
|
| + stream->Add("#%d", argument_count());
|
| +}
|
| +
|
| +
|
| +void HCallRuntime::PrintDataTo(StringStream* stream) {
|
| + stream->Add("%o ", *name());
|
| + stream->Add("#%d", argument_count());
|
| +}
|
| +
|
| +
|
| +void HClassOfTest::PrintDataTo(StringStream* stream) {
|
| stream->Add("class_of_test(");
|
| - value()->PrintTo(stream);
|
| + value()->PrintNameTo(stream);
|
| stream->Add(", \"%o\")", *class_name());
|
| }
|
|
|
|
|
| -void HAccessArgumentsAt::PrintDataTo(StringStream* stream) const {
|
| +void HAccessArgumentsAt::PrintDataTo(StringStream* stream) {
|
| arguments()->PrintNameTo(stream);
|
| stream->Add("[");
|
| index()->PrintNameTo(stream);
|
| @@ -560,23 +598,7 @@
|
| }
|
|
|
|
|
| -void HCall::SetArgumentAt(int index, HPushArgument* push_argument) {
|
| - push_argument->set_argument_index(index);
|
| - SetOperandAt(index, push_argument);
|
| -}
|
| -
|
| -
|
| -void HCallConstantFunction::PrintDataTo(StringStream* stream) const {
|
| - if (IsApplyFunction()) {
|
| - stream->Add("SPECIAL function: apply");
|
| - } else {
|
| - stream->Add("%s", *(function()->shared()->DebugName()->ToCString()));
|
| - }
|
| - HCall::PrintDataTo(stream);
|
| -}
|
| -
|
| -
|
| -void HControlInstruction::PrintDataTo(StringStream* stream) const {
|
| +void HControlInstruction::PrintDataTo(StringStream* stream) {
|
| if (FirstSuccessor() != NULL) {
|
| int first_id = FirstSuccessor()->block_id();
|
| if (SecondSuccessor() == NULL) {
|
| @@ -589,13 +611,13 @@
|
| }
|
|
|
|
|
| -void HUnaryControlInstruction::PrintDataTo(StringStream* stream) const {
|
| +void HUnaryControlInstruction::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| HControlInstruction::PrintDataTo(stream);
|
| }
|
|
|
|
|
| -void HCompareMap::PrintDataTo(StringStream* stream) const {
|
| +void HCompareMap::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| stream->Add(" (%p)", *map());
|
| HControlInstruction::PrintDataTo(stream);
|
| @@ -623,19 +645,19 @@
|
| }
|
|
|
|
|
| -void HUnaryMathOperation::PrintDataTo(StringStream* stream) const {
|
| +void HUnaryMathOperation::PrintDataTo(StringStream* stream) {
|
| const char* name = OpName();
|
| stream->Add("%s ", name);
|
| value()->PrintNameTo(stream);
|
| }
|
|
|
|
|
| -void HUnaryOperation::PrintDataTo(StringStream* stream) const {
|
| +void HUnaryOperation::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| }
|
|
|
|
|
| -void HHasInstanceType::PrintDataTo(StringStream* stream) const {
|
| +void HHasInstanceType::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| switch (from_) {
|
| case FIRST_JS_OBJECT_TYPE:
|
| @@ -656,23 +678,15 @@
|
| }
|
|
|
|
|
| -void HTypeofIs::PrintDataTo(StringStream* stream) const {
|
| +void HTypeofIs::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| stream->Add(" == ");
|
| stream->Add(type_literal_->ToAsciiVector());
|
| }
|
|
|
|
|
| -void HPushArgument::PrintDataTo(StringStream* stream) const {
|
| +void HChange::PrintDataTo(StringStream* stream) {
|
| HUnaryOperation::PrintDataTo(stream);
|
| - if (argument_index() != -1) {
|
| - stream->Add(" [%d]", argument_index_);
|
| - }
|
| -}
|
| -
|
| -
|
| -void HChange::PrintDataTo(StringStream* stream) const {
|
| - HUnaryOperation::PrintDataTo(stream);
|
| stream->Add(" %s to %s", from_.Mnemonic(), to_.Mnemonic());
|
|
|
| if (CanTruncateToInt32()) stream->Add(" truncating-int32");
|
| @@ -687,57 +701,34 @@
|
| }
|
|
|
|
|
| -void HCheckMap::PrintDataTo(StringStream* stream) const {
|
| +void HCheckMap::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| stream->Add(" %p", *map());
|
| }
|
|
|
|
|
| -void HCheckFunction::PrintDataTo(StringStream* stream) const {
|
| +void HCheckFunction::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| stream->Add(" %p", *target());
|
| }
|
|
|
|
|
| -void HCallKeyed::PrintDataTo(StringStream* stream) const {
|
| - stream->Add("[");
|
| - key()->PrintNameTo(stream);
|
| - stream->Add("](");
|
| - for (int i = 1; i < arguments_.length(); ++i) {
|
| - if (i != 1) stream->Add(", ");
|
| - arguments_.at(i)->PrintNameTo(stream);
|
| - }
|
| - stream->Add(")");
|
| +void HCallStub::PrintDataTo(StringStream* stream) {
|
| + stream->Add("%s ",
|
| + CodeStub::MajorName(major_key_, false));
|
| + HUnaryCall::PrintDataTo(stream);
|
| }
|
|
|
|
|
| -void HCallNamed::PrintDataTo(StringStream* stream) const {
|
| - SmartPointer<char> name_string = name()->ToCString();
|
| - stream->Add("%s ", *name_string);
|
| - HCall::PrintDataTo(stream);
|
| +void HInstanceOf::PrintDataTo(StringStream* stream) {
|
| + left()->PrintNameTo(stream);
|
| + stream->Add(" ");
|
| + right()->PrintNameTo(stream);
|
| + stream->Add(" ");
|
| + context()->PrintNameTo(stream);
|
| }
|
|
|
|
|
| -void HCallGlobal::PrintDataTo(StringStream* stream) const {
|
| - SmartPointer<char> name_string = name()->ToCString();
|
| - stream->Add("%s ", *name_string);
|
| - HCall::PrintDataTo(stream);
|
| -}
|
| -
|
| -
|
| -void HCallRuntime::PrintDataTo(StringStream* stream) const {
|
| - SmartPointer<char> name_string = name()->ToCString();
|
| - stream->Add("%s ", *name_string);
|
| - HCall::PrintDataTo(stream);
|
| -}
|
| -
|
| -void HCallStub::PrintDataTo(StringStream* stream) const {
|
| - stream->Add("%s(%d)",
|
| - CodeStub::MajorName(major_key_, false),
|
| - argument_count_);
|
| -}
|
| -
|
| -
|
| Range* HValue::InferRange() {
|
| if (representation().IsTagged()) {
|
| // Tagged values are always in int32 range when converted to integer,
|
| @@ -874,7 +865,7 @@
|
| }
|
|
|
|
|
| -void HPhi::PrintTo(StringStream* stream) const {
|
| +void HPhi::PrintTo(StringStream* stream) {
|
| stream->Add("[");
|
| for (int i = 0; i < OperandCount(); ++i) {
|
| HValue* value = OperandAt(i);
|
| @@ -900,7 +891,7 @@
|
| }
|
|
|
|
|
| -HValue* HPhi::GetRedundantReplacement() const {
|
| +HValue* HPhi::GetRedundantReplacement() {
|
| HValue* candidate = NULL;
|
| int count = OperandCount();
|
| int position = 0;
|
| @@ -952,7 +943,7 @@
|
| }
|
|
|
|
|
| -void HSimulate::PrintDataTo(StringStream* stream) const {
|
| +void HSimulate::PrintDataTo(StringStream* stream) {
|
| stream->Add("id=%d ", ast_id());
|
| if (pop_count_ > 0) stream->Add("pop %d", pop_count_);
|
| if (values_.length() > 0) {
|
| @@ -969,7 +960,7 @@
|
| }
|
|
|
|
|
| -void HEnterInlined::PrintDataTo(StringStream* stream) const {
|
| +void HEnterInlined::PrintDataTo(StringStream* stream) {
|
| SmartPointer<char> name = function()->debug_name()->ToCString();
|
| stream->Add("%s, id=%d", *name, function()->id());
|
| }
|
| @@ -1010,7 +1001,7 @@
|
| }
|
|
|
|
|
| -void HConstant::PrintDataTo(StringStream* stream) const {
|
| +void HConstant::PrintDataTo(StringStream* stream) {
|
| handle()->ShortPrint(stream);
|
| }
|
|
|
| @@ -1020,7 +1011,7 @@
|
| }
|
|
|
|
|
| -void HBinaryOperation::PrintDataTo(StringStream* stream) const {
|
| +void HBinaryOperation::PrintDataTo(StringStream* stream) {
|
| left()->PrintNameTo(stream);
|
| stream->Add(" ");
|
| right()->PrintNameTo(stream);
|
| @@ -1104,7 +1095,7 @@
|
|
|
|
|
|
|
| -void HCompare::PrintDataTo(StringStream* stream) const {
|
| +void HCompare::PrintDataTo(StringStream* stream) {
|
| stream->Add(Token::Name(token()));
|
| stream->Add(" ");
|
| HBinaryOperation::PrintDataTo(stream);
|
| @@ -1123,18 +1114,18 @@
|
| }
|
|
|
|
|
| -void HParameter::PrintDataTo(StringStream* stream) const {
|
| +void HParameter::PrintDataTo(StringStream* stream) {
|
| stream->Add("%u", index());
|
| }
|
|
|
|
|
| -void HLoadNamedField::PrintDataTo(StringStream* stream) const {
|
| +void HLoadNamedField::PrintDataTo(StringStream* stream) {
|
| object()->PrintNameTo(stream);
|
| stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : "");
|
| }
|
|
|
|
|
| -void HLoadKeyed::PrintDataTo(StringStream* stream) const {
|
| +void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) {
|
| object()->PrintNameTo(stream);
|
| stream->Add("[");
|
| key()->PrintNameTo(stream);
|
| @@ -1142,8 +1133,24 @@
|
| }
|
|
|
|
|
| -void HStoreNamed::PrintDataTo(StringStream* stream) const {
|
| +void HLoadKeyedGeneric::PrintDataTo(StringStream* stream) {
|
| object()->PrintNameTo(stream);
|
| + stream->Add("[");
|
| + key()->PrintNameTo(stream);
|
| + stream->Add("]");
|
| +}
|
| +
|
| +
|
| +void HLoadPixelArrayElement::PrintDataTo(StringStream* stream) {
|
| + external_pointer()->PrintNameTo(stream);
|
| + stream->Add("[");
|
| + key()->PrintNameTo(stream);
|
| + stream->Add("]");
|
| +}
|
| +
|
| +
|
| +void HStoreNamedGeneric::PrintDataTo(StringStream* stream) {
|
| + object()->PrintNameTo(stream);
|
| stream->Add(".");
|
| ASSERT(name()->IsString());
|
| stream->Add(*String::cast(*name())->ToCString());
|
| @@ -1152,15 +1159,20 @@
|
| }
|
|
|
|
|
| -void HStoreNamedField::PrintDataTo(StringStream* stream) const {
|
| - HStoreNamed::PrintDataTo(stream);
|
| +void HStoreNamedField::PrintDataTo(StringStream* stream) {
|
| + object()->PrintNameTo(stream);
|
| + stream->Add(".");
|
| + ASSERT(name()->IsString());
|
| + stream->Add(*String::cast(*name())->ToCString());
|
| + stream->Add(" = ");
|
| + value()->PrintNameTo(stream);
|
| if (!transition().is_null()) {
|
| stream->Add(" (transition map %p)", *transition());
|
| }
|
| }
|
|
|
|
|
| -void HStoreKeyed::PrintDataTo(StringStream* stream) const {
|
| +void HStoreKeyedFastElement::PrintDataTo(StringStream* stream) {
|
| object()->PrintNameTo(stream);
|
| stream->Add("[");
|
| key()->PrintNameTo(stream);
|
| @@ -1169,25 +1181,43 @@
|
| }
|
|
|
|
|
| -void HLoadGlobal::PrintDataTo(StringStream* stream) const {
|
| +void HStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
|
| + object()->PrintNameTo(stream);
|
| + stream->Add("[");
|
| + key()->PrintNameTo(stream);
|
| + stream->Add("] = ");
|
| + value()->PrintNameTo(stream);
|
| +}
|
| +
|
| +
|
| +void HStorePixelArrayElement::PrintDataTo(StringStream* stream) {
|
| + external_pointer()->PrintNameTo(stream);
|
| + stream->Add("[");
|
| + key()->PrintNameTo(stream);
|
| + stream->Add("] = ");
|
| + value()->PrintNameTo(stream);
|
| +}
|
| +
|
| +
|
| +void HLoadGlobal::PrintDataTo(StringStream* stream) {
|
| stream->Add("[%p]", *cell());
|
| if (check_hole_value()) stream->Add(" (deleteable/read-only)");
|
| }
|
|
|
|
|
| -void HStoreGlobal::PrintDataTo(StringStream* stream) const {
|
| +void HStoreGlobal::PrintDataTo(StringStream* stream) {
|
| stream->Add("[%p] = ", *cell());
|
| value()->PrintNameTo(stream);
|
| }
|
|
|
|
|
| -void HLoadContextSlot::PrintDataTo(StringStream* stream) const {
|
| +void HLoadContextSlot::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| stream->Add("[%d]", slot_index());
|
| }
|
|
|
|
|
| -void HStoreContextSlot::PrintDataTo(StringStream* stream) const {
|
| +void HStoreContextSlot::PrintDataTo(StringStream* stream) {
|
| context()->PrintNameTo(stream);
|
| stream->Add("[%d] = ", slot_index());
|
| value()->PrintNameTo(stream);
|
| @@ -1197,33 +1227,33 @@
|
| // Implementation of type inference and type conversions. Calculates
|
| // the inferred type of this instruction based on the input operands.
|
|
|
| -HType HValue::CalculateInferredType() const {
|
| +HType HValue::CalculateInferredType() {
|
| return type_;
|
| }
|
|
|
|
|
| -HType HCheckMap::CalculateInferredType() const {
|
| +HType HCheckMap::CalculateInferredType() {
|
| return value()->type();
|
| }
|
|
|
|
|
| -HType HCheckFunction::CalculateInferredType() const {
|
| +HType HCheckFunction::CalculateInferredType() {
|
| return value()->type();
|
| }
|
|
|
|
|
| -HType HCheckNonSmi::CalculateInferredType() const {
|
| +HType HCheckNonSmi::CalculateInferredType() {
|
| // TODO(kasperl): Is there any way to signal that this isn't a smi?
|
| return HType::Tagged();
|
| }
|
|
|
|
|
| -HType HCheckSmi::CalculateInferredType() const {
|
| +HType HCheckSmi::CalculateInferredType() {
|
| return HType::Smi();
|
| }
|
|
|
|
|
| -HType HPhi::CalculateInferredType() const {
|
| +HType HPhi::CalculateInferredType() {
|
| HType result = HType::Uninitialized();
|
| for (int i = 0; i < OperandCount(); ++i) {
|
| HType current = OperandAt(i)->type();
|
| @@ -1233,77 +1263,77 @@
|
| }
|
|
|
|
|
| -HType HConstant::CalculateInferredType() const {
|
| +HType HConstant::CalculateInferredType() {
|
| return constant_type_;
|
| }
|
|
|
|
|
| -HType HCompare::CalculateInferredType() const {
|
| +HType HCompare::CalculateInferredType() {
|
| return HType::Boolean();
|
| }
|
|
|
|
|
| -HType HCompareJSObjectEq::CalculateInferredType() const {
|
| +HType HCompareJSObjectEq::CalculateInferredType() {
|
| return HType::Boolean();
|
| }
|
|
|
|
|
| -HType HUnaryPredicate::CalculateInferredType() const {
|
| +HType HUnaryPredicate::CalculateInferredType() {
|
| return HType::Boolean();
|
| }
|
|
|
|
|
| -HType HBitwiseBinaryOperation::CalculateInferredType() const {
|
| +HType HBitwiseBinaryOperation::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|
| -HType HArithmeticBinaryOperation::CalculateInferredType() const {
|
| +HType HArithmeticBinaryOperation::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|
| -HType HAdd::CalculateInferredType() const {
|
| +HType HAdd::CalculateInferredType() {
|
| return HType::Tagged();
|
| }
|
|
|
|
|
| -HType HBitAnd::CalculateInferredType() const {
|
| +HType HBitAnd::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|
| -HType HBitXor::CalculateInferredType() const {
|
| +HType HBitXor::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|
| -HType HBitOr::CalculateInferredType() const {
|
| +HType HBitOr::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|
| -HType HBitNot::CalculateInferredType() const {
|
| +HType HBitNot::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|
| -HType HUnaryMathOperation::CalculateInferredType() const {
|
| +HType HUnaryMathOperation::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|
| -HType HShl::CalculateInferredType() const {
|
| +HType HShl::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|
| -HType HShr::CalculateInferredType() const {
|
| +HType HShr::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|
| -HType HSar::CalculateInferredType() const {
|
| +HType HSar::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
|
|
|
|