Index: src/ic/ic-state.cc |
diff --git a/src/ic/ic-state.cc b/src/ic/ic-state.cc |
index 1c9b7fee23e0cd0537d6e89ad97ea8afb2c5bb68..13c8e64216277e3d67925fde08954bcf8cc3daca 100644 |
--- a/src/ic/ic-state.cc |
+++ b/src/ic/ic-state.cc |
@@ -45,18 +45,17 @@ STATIC_CONST_MEMBER_DEFINITION const int BinaryOpICState::LAST_TOKEN; |
BinaryOpICState::BinaryOpICState(Isolate* isolate, ExtraICState extra_ic_state) |
- : fixed_right_arg_(Nothing<int>()), isolate_(isolate) { |
+ : fixed_right_arg_( |
+ HasFixedRightArgField::decode(extra_ic_state) |
+ ? Just(1 << FixedRightArgValueField::decode(extra_ic_state)) |
+ : Nothing<int>()), |
+ isolate_(isolate) { |
op_ = |
static_cast<Token::Value>(FIRST_TOKEN + OpField::decode(extra_ic_state)); |
- fixed_right_arg_ = |
- Maybe<int>(HasFixedRightArgField::decode(extra_ic_state), |
- 1 << FixedRightArgValueField::decode(extra_ic_state)); |
left_kind_ = LeftKindField::decode(extra_ic_state); |
- if (fixed_right_arg_.has_value) { |
- right_kind_ = Smi::IsValid(fixed_right_arg_.value) ? SMI : INT32; |
- } else { |
- right_kind_ = RightKindField::decode(extra_ic_state); |
- } |
+ right_kind_ = fixed_right_arg_.IsJust() |
+ ? (Smi::IsValid(fixed_right_arg_.FromJust()) ? SMI : INT32) |
+ : RightKindField::decode(extra_ic_state); |
result_kind_ = ResultKindField::decode(extra_ic_state); |
DCHECK_LE(FIRST_TOKEN, op_); |
DCHECK_LE(op_, LAST_TOKEN); |
@@ -67,10 +66,10 @@ ExtraICState BinaryOpICState::GetExtraICState() const { |
ExtraICState extra_ic_state = |
OpField::encode(op_ - FIRST_TOKEN) | LeftKindField::encode(left_kind_) | |
ResultKindField::encode(result_kind_) | |
- HasFixedRightArgField::encode(fixed_right_arg_.has_value); |
- if (fixed_right_arg_.has_value) { |
+ HasFixedRightArgField::encode(fixed_right_arg_.IsJust()); |
+ if (fixed_right_arg_.IsJust()) { |
extra_ic_state = FixedRightArgValueField::update( |
- extra_ic_state, WhichPowerOf2(fixed_right_arg_.value)); |
+ extra_ic_state, WhichPowerOf2(fixed_right_arg_.FromJust())); |
} else { |
extra_ic_state = RightKindField::update(extra_ic_state, right_kind_); |
} |
@@ -89,7 +88,7 @@ void BinaryOpICState::GenerateAheadOfTime( |
do { \ |
BinaryOpICState state(isolate, op); \ |
state.left_kind_ = left_kind; \ |
- state.fixed_right_arg_.has_value = false; \ |
+ state.fixed_right_arg_ = Nothing<int>(); \ |
state.right_kind_ = right_kind; \ |
state.result_kind_ = result_kind; \ |
Generate(isolate, state); \ |
@@ -191,8 +190,7 @@ void BinaryOpICState::GenerateAheadOfTime( |
do { \ |
BinaryOpICState state(isolate, op); \ |
state.left_kind_ = left_kind; \ |
- state.fixed_right_arg_.has_value = true; \ |
- state.fixed_right_arg_.value = fixed_right_arg_value; \ |
+ state.fixed_right_arg_ = Just(fixed_right_arg_value); \ |
state.right_kind_ = SMI; \ |
state.result_kind_ = result_kind; \ |
Generate(isolate, state); \ |
@@ -225,8 +223,8 @@ std::ostream& operator<<(std::ostream& os, const BinaryOpICState& s) { |
os << "(" << Token::Name(s.op_); |
if (s.CouldCreateAllocationMementos()) os << "_CreateAllocationMementos"; |
os << ":" << BinaryOpICState::KindToString(s.left_kind_) << "*"; |
- if (s.fixed_right_arg_.has_value) { |
- os << s.fixed_right_arg_.value; |
+ if (s.fixed_right_arg_.IsJust()) { |
+ os << s.fixed_right_arg_.FromJust(); |
} else { |
os << BinaryOpICState::KindToString(s.right_kind_); |
} |
@@ -248,9 +246,9 @@ void BinaryOpICState::Update(Handle<Object> left, Handle<Object> right, |
base::bits::IsPowerOfTwo32(fixed_right_arg_value) && |
FixedRightArgValueField::is_valid(WhichPowerOf2(fixed_right_arg_value)) && |
(left_kind_ == SMI || left_kind_ == INT32) && |
- (result_kind_ == NONE || !fixed_right_arg_.has_value); |
- fixed_right_arg_ = Maybe<int32_t>(has_fixed_right_arg, fixed_right_arg_value); |
- |
+ (result_kind_ == NONE || !fixed_right_arg_.IsJust()); |
+ fixed_right_arg_ = |
+ has_fixed_right_arg ? Just(fixed_right_arg_value) : Nothing<int32_t>(); |
result_kind_ = UpdateKind(result, result_kind_); |
if (!Token::IsTruncatingBinaryOp(op_)) { |