Commit 8c7bfc54 authored by Igor Sheludko's avatar Igor Sheludko Committed by Commit Bot

[csa] Typify CSA::Select() and friends.

Bug: v8:6949, v8:7310
Change-Id: I8647d385355f357e8825648d6da2757efdcbc6c2
Reviewed-on: https://chromium-review.googlesource.com/980496Reviewed-by: 's avatarCamillo Bruni <cbruni@chromium.org>
Reviewed-by: 's avatarRoss McIlroy <rmcilroy@chromium.org>
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#52249}
parent b10f21c6
......@@ -29,13 +29,13 @@ class AsyncGeneratorBuiltinsAssembler : public AsyncBuiltinsAssembler {
: AsyncBuiltinsAssembler(state) {}
inline Node* TaggedIsAsyncGenerator(Node* tagged_object) {
Node* if_notsmi = TaggedIsNotSmi(tagged_object);
return Select(if_notsmi,
[=]() {
return HasInstanceType(tagged_object,
JS_ASYNC_GENERATOR_OBJECT_TYPE);
},
[=]() { return if_notsmi; }, MachineRepresentation::kBit);
TNode<BoolT> if_notsmi = TaggedIsNotSmi(tagged_object);
return Select<BoolT>(if_notsmi,
[=] {
return HasInstanceType(
tagged_object, JS_ASYNC_GENERATOR_OBJECT_TYPE);
},
[=] { return if_notsmi; });
}
inline Node* LoadGeneratorState(Node* const generator) {
return LoadObjectField(generator, JSGeneratorObject::kContinuationOffset);
......
......@@ -333,8 +333,7 @@ TNode<Object> BaseCollectionsAssembler::AllocateJSCollection(
[=] {
return AllocateJSCollectionSlow(context, constructor,
new_target);
},
MachineRepresentation::kTagged);
});
}
TNode<Object> BaseCollectionsAssembler::AllocateJSCollectionFast(
......@@ -456,7 +455,7 @@ TNode<IntPtrT> BaseCollectionsAssembler::EstimatedInitialSize(
return Select<IntPtrT>(
is_fast_jsarray,
[=] { return SmiUntag(LoadFastJSArrayLength(CAST(initial_entries))); },
[=] { return IntPtrConstant(0); }, MachineType::PointerRepresentation());
[=] { return IntPtrConstant(0); });
}
void BaseCollectionsAssembler::GotoIfNotJSReceiver(Node* const obj,
......@@ -494,8 +493,7 @@ TNode<Object> BaseCollectionsAssembler::LoadAndNormalizeFixedArrayElement(
TNode<Object> elements, TNode<IntPtrT> index) {
TNode<Object> element = CAST(LoadFixedArrayElement(elements, index));
return Select<Object>(IsTheHole(element), [=] { return UndefinedConstant(); },
[=] { return element; },
MachineRepresentation::kTagged);
[=] { return element; });
}
TNode<Object> BaseCollectionsAssembler::LoadAndNormalizeFixedDoubleArrayElement(
......
......@@ -126,12 +126,12 @@ TF_BUILTIN(NonNumberToNumeric, CodeStubAssembler) {
}
TF_BUILTIN(ToNumeric, CodeStubAssembler) {
Node* context = Parameter(Descriptor::kContext);
Node* input = Parameter(Descriptor::kArgument);
TNode<Context> context = CAST(Parameter(Descriptor::kContext));
TNode<Object> input = CAST(Parameter(Descriptor::kArgument));
Return(Select(IsNumber(input), [=] { return input; },
[=] { return NonNumberToNumeric(context, input); },
MachineRepresentation::kTagged));
Return(Select<Numeric>(
IsNumber(input), [=] { return CAST(input); },
[=] { return NonNumberToNumeric(context, CAST(input)); }));
}
// ES6 section 7.1.3 ToNumber ( argument )
......
......@@ -75,8 +75,9 @@ TF_BUILTIN(GrowFastSmiOrObjectElements, CodeStubAssembler) {
TF_BUILTIN(NewArgumentsElements, CodeStubAssembler) {
Node* frame = Parameter(Descriptor::kFrame);
Node* length = SmiToIntPtr(Parameter(Descriptor::kLength));
Node* mapped_count = SmiToIntPtr(Parameter(Descriptor::kMappedCount));
TNode<IntPtrT> length = SmiToIntPtr(Parameter(Descriptor::kLength));
TNode<IntPtrT> mapped_count =
SmiToIntPtr(Parameter(Descriptor::kMappedCount));
// Check if we can allocate in new space.
ElementsKind kind = PACKED_ELEMENTS;
......@@ -104,9 +105,7 @@ TF_BUILTIN(NewArgumentsElements, CodeStubAssembler) {
// The elements might be used to back mapped arguments. In that case fill
// the mapped elements (i.e. the first {mapped_count}) with the hole, but
// make sure not to overshoot the {length} if some arguments are missing.
Node* number_of_holes =
SelectConstant(IntPtrLessThan(mapped_count, length), mapped_count,
length, MachineType::PointerRepresentation());
TNode<IntPtrT> number_of_holes = IntPtrMin(mapped_count, length);
Node* the_hole = TheHoleConstant();
// Fill the first elements up to {number_of_holes} with the hole.
......
......@@ -141,14 +141,15 @@ Node* ObjectBuiltinsAssembler::ConstructDataDescriptor(Node* context,
Node* ObjectBuiltinsAssembler::IsSpecialReceiverMap(SloppyTNode<Map> map) {
CSA_SLOW_ASSERT(this, IsMap(map));
Node* is_special = IsSpecialReceiverInstanceType(LoadMapInstanceType(map));
TNode<BoolT> is_special =
IsSpecialReceiverInstanceType(LoadMapInstanceType(map));
uint32_t mask =
Map::HasNamedInterceptorBit::kMask | Map::IsAccessCheckNeededBit::kMask;
USE(mask);
// Interceptors or access checks imply special receiver.
CSA_ASSERT(this,
SelectConstant(IsSetWord32(LoadMapBitField(map), mask), is_special,
Int32Constant(1), MachineRepresentation::kWord32));
SelectConstant<BoolT>(IsSetWord32(LoadMapBitField(map), mask),
is_special, Int32TrueConstant()));
return is_special;
}
......
......@@ -1185,16 +1185,14 @@ Node* RegExpBuiltinsAssembler::RegExpInitialize(Node* const context,
CSA_ASSERT(this, IsJSRegExp(regexp));
// Normalize pattern.
Node* const pattern = Select<Object>(
TNode<Object> const pattern = Select<Object>(
IsUndefined(maybe_pattern), [=] { return EmptyStringConstant(); },
[=] { return ToString_Inline(context, maybe_pattern); },
MachineRepresentation::kTagged);
[=] { return ToString_Inline(context, maybe_pattern); });
// Normalize flags.
Node* const flags = Select<Object>(
TNode<Object> const flags = Select<Object>(
IsUndefined(maybe_flags), [=] { return EmptyStringConstant(); },
[=] { return ToString_Inline(context, maybe_flags); },
MachineRepresentation::kTagged);
[=] { return ToString_Inline(context, maybe_flags); });
// Initialize.
......
......@@ -1468,10 +1468,9 @@ class StringMatchSearchAssembler : public StringBuiltinsAssembler {
RegExpBuiltinsAssembler regexp_asm(state());
Node* const receiver_string = ToString_Inline(context, receiver);
Node* const pattern = Select(
TNode<Object> const pattern = Select<Object>(
IsUndefined(maybe_regexp), [=] { return EmptyStringConstant(); },
[=] { return ToString_Inline(context, maybe_regexp); },
MachineRepresentation::kTagged);
[=] { return ToString_Inline(context, maybe_regexp); });
// Create RegExp
// TODO(pwong): This could be factored out as a helper (RegExpCreate) that
......@@ -1732,10 +1731,9 @@ TF_BUILTIN(StringPrototypeSplit, StringBuiltinsAssembler) {
// String and integer conversions.
Node* const subject_string = ToString_Inline(context, receiver);
Node* const limit_number =
Select(IsUndefined(limit), [=]() { return NumberConstant(kMaxUInt32); },
[=]() { return ToUint32(context, limit); },
MachineRepresentation::kTagged);
TNode<Number> const limit_number = Select<Number>(
IsUndefined(limit), [=] { return NumberConstant(kMaxUInt32); },
[=] { return ToUint32(context, limit); });
Node* const separator_string = ToString_Inline(context, separator);
// Shortcut for {limit} == 0.
......
......@@ -1294,8 +1294,7 @@ TF_BUILTIN(TypedArrayPrototypeSlice, TypedArrayBuiltinsAssembler) {
[=] {
return SmiTag(ConvertToRelativeIndex(
context, end, SmiUntag(source_length)));
},
MachineRepresentation::kTagged);
});
// Create a result array by invoking TypedArraySpeciesCreate.
TNode<Smi> count = SmiMax(SmiSub(end_index, start_index), SmiConstant(0));
......
......@@ -154,10 +154,10 @@ void CodeStubAssembler::Check(const NodeGenerator& condition_body,
extra_node4_name, extra_node5, extra_node5_name);
}
Node* CodeStubAssembler::Select(SloppyTNode<BoolT> condition,
const NodeGenerator& true_body,
const NodeGenerator& false_body,
MachineRepresentation rep) {
Node* CodeStubAssembler::SelectImpl(TNode<BoolT> condition,
const NodeGenerator& true_body,
const NodeGenerator& false_body,
MachineRepresentation rep) {
VARIABLE(value, rep);
Label vtrue(this), vfalse(this), end(this);
Branch(condition, &vtrue, &vfalse);
......@@ -177,37 +177,28 @@ Node* CodeStubAssembler::Select(SloppyTNode<BoolT> condition,
return value.value();
}
Node* CodeStubAssembler::SelectConstant(Node* condition, Node* true_value,
Node* false_value,
MachineRepresentation rep) {
return Select(condition, [=] { return true_value; },
[=] { return false_value; }, rep);
TNode<Int32T> CodeStubAssembler::SelectInt32Constant(
SloppyTNode<BoolT> condition, int true_value, int false_value) {
return SelectConstant<Int32T>(condition, Int32Constant(true_value),
Int32Constant(false_value));
}
Node* CodeStubAssembler::SelectInt32Constant(Node* condition, int true_value,
int false_value) {
return SelectConstant(condition, Int32Constant(true_value),
Int32Constant(false_value),
MachineRepresentation::kWord32);
TNode<IntPtrT> CodeStubAssembler::SelectIntPtrConstant(
SloppyTNode<BoolT> condition, int true_value, int false_value) {
return SelectConstant<IntPtrT>(condition, IntPtrConstant(true_value),
IntPtrConstant(false_value));
}
Node* CodeStubAssembler::SelectIntPtrConstant(Node* condition, int true_value,
int false_value) {
return SelectConstant(condition, IntPtrConstant(true_value),
IntPtrConstant(false_value),
MachineType::PointerRepresentation());
TNode<Oddball> CodeStubAssembler::SelectBooleanConstant(
SloppyTNode<BoolT> condition) {
return SelectConstant<Oddball>(condition, TrueConstant(), FalseConstant());
}
Node* CodeStubAssembler::SelectBooleanConstant(Node* condition) {
return SelectConstant(condition, TrueConstant(), FalseConstant(),
MachineRepresentation::kTagged);
}
Node* CodeStubAssembler::SelectSmiConstant(Node* condition, Smi* true_value,
Smi* false_value) {
return SelectConstant(condition, SmiConstant(true_value),
SmiConstant(false_value),
MachineRepresentation::kTaggedSigned);
TNode<Smi> CodeStubAssembler::SelectSmiConstant(SloppyTNode<BoolT> condition,
Smi* true_value,
Smi* false_value) {
return SelectConstant<Smi>(condition, SmiConstant(true_value),
SmiConstant(false_value));
}
Node* CodeStubAssembler::NoContextConstant() {
......@@ -312,11 +303,10 @@ Node* CodeStubAssembler::MatchesParameterMode(Node* value, ParameterMode mode) {
TNode<BoolT> CodeStubAssembler::WordIsPowerOfTwo(SloppyTNode<IntPtrT> value) {
// value && !(value & (value - 1))
return WordEqual(
Select(
Select<IntPtrT>(
WordEqual(value, IntPtrConstant(0)),
[=] { return IntPtrConstant(1); },
[=] { return WordAnd(value, IntPtrSub(value, IntPtrConstant(1))); },
MachineType::PointerRepresentation()),
[=] { return WordAnd(value, IntPtrSub(value, IntPtrConstant(1))); }),
IntPtrConstant(0));
}
......@@ -633,9 +623,8 @@ TNode<IntPtrT> CodeStubAssembler::ConvertToRelativeIndex(
TNode<Smi> const index_smi = CAST(index_int);
result = Select<IntPtrT>(
IntPtrLessThan(SmiUntag(index_smi), zero),
[&] { return IntPtrMax(IntPtrAdd(length, SmiUntag(index_smi)), zero); },
[&] { return IntPtrMin(SmiUntag(index_smi), length); },
MachineType::PointerRepresentation());
[=] { return IntPtrMax(IntPtrAdd(length, SmiUntag(index_smi)), zero); },
[=] { return IntPtrMin(SmiUntag(index_smi), length); });
Goto(&done);
}
......@@ -647,8 +636,8 @@ TNode<IntPtrT> CodeStubAssembler::ConvertToRelativeIndex(
TNode<HeapNumber> const index_hn = CAST(index_int);
TNode<Float64T> const float_zero = Float64Constant(0.);
TNode<Float64T> const index_float = LoadHeapNumberValue(index_hn);
result = SelectConstant(Float64LessThan(index_float, float_zero), zero,
length, MachineType::PointerRepresentation());
result = SelectConstant<IntPtrT>(Float64LessThan(index_float, float_zero),
zero, length);
Goto(&done);
}
BIND(&done);
......@@ -1402,8 +1391,7 @@ TNode<BoolT> CodeStubAssembler::TaggedDoesntHaveInstanceType(
TNode<BoolT> tagged_is_smi = TaggedIsSmi(any_tagged);
return Select<BoolT>(
tagged_is_smi, [=]() { return tagged_is_smi; },
[=]() { return DoesntHaveInstanceType(any_tagged, type); },
MachineRepresentation::kBit);
[=]() { return DoesntHaveInstanceType(any_tagged, type); });
}
TNode<HeapObject> CodeStubAssembler::LoadFastProperties(
......@@ -1557,11 +1545,11 @@ Node* CodeStubAssembler::LoadMapEnumLength(SloppyTNode<Map> map) {
return DecodeWordFromWord32<Map::EnumLengthBits>(bit_field3);
}
Node* CodeStubAssembler::LoadMapBackPointer(SloppyTNode<Map> map) {
Node* object = LoadObjectField(map, Map::kConstructorOrBackPointerOffset);
return Select(IsMap(object), [=] { return object; },
[=] { return UndefinedConstant(); },
MachineRepresentation::kTagged);
TNode<Object> CodeStubAssembler::LoadMapBackPointer(SloppyTNode<Map> map) {
TNode<Object> object =
LoadObjectField(map, Map::kConstructorOrBackPointerOffset);
return Select<Object>(IsMap(object), [=] { return object; },
[=] { return UndefinedConstant(); });
}
TNode<IntPtrT> CodeStubAssembler::LoadJSReceiverIdentityHash(
......@@ -4380,7 +4368,7 @@ TNode<BoolT> CodeStubAssembler::IsPrototypeTypedArrayPrototype(
TNode<Object> proto = LoadMapPrototype(map);
TNode<Object> proto_of_proto = Select<Object>(
IsJSObject(proto), [=] { return LoadMapPrototype(LoadMap(CAST(proto))); },
[=] { return NullConstant(); }, MachineRepresentation::kTagged);
[=] { return NullConstant(); });
return WordEqual(proto_of_proto, typed_array_prototype);
}
......@@ -4410,7 +4398,8 @@ Node* CodeStubAssembler::IsFunctionWithPrototypeSlotMap(Node* map) {
return IsSetWord32<Map::HasPrototypeSlotBit>(LoadMapBitField(map));
}
Node* CodeStubAssembler::IsSpecialReceiverInstanceType(Node* instance_type) {
TNode<BoolT> CodeStubAssembler::IsSpecialReceiverInstanceType(
Node* instance_type) {
STATIC_ASSERT(JS_GLOBAL_OBJECT_TYPE <= LAST_SPECIAL_RECEIVER_TYPE);
return Int32LessThanOrEqual(instance_type,
Int32Constant(LAST_SPECIAL_RECEIVER_TYPE));
......@@ -4645,7 +4634,7 @@ Node* CodeStubAssembler::IsAnyHeapNumber(Node* object) {
return Word32Or(IsMutableHeapNumber(object), IsHeapNumber(object));
}
Node* CodeStubAssembler::IsHeapNumber(Node* object) {
TNode<BoolT> CodeStubAssembler::IsHeapNumber(Node* object) {
return IsHeapNumberMap(LoadMap(object));
}
......@@ -4691,8 +4680,8 @@ Node* CodeStubAssembler::IsPrimitiveInstanceType(Node* instance_type) {
Int32Constant(LAST_PRIMITIVE_TYPE));
}
Node* CodeStubAssembler::IsPrivateSymbol(Node* object) {
return Select(
TNode<BoolT> CodeStubAssembler::IsPrivateSymbol(Node* object) {
return Select<BoolT>(
IsSymbol(object),
[=] {
TNode<Symbol> symbol = CAST(object);
......@@ -4700,7 +4689,7 @@ Node* CodeStubAssembler::IsPrivateSymbol(Node* object) {
SmiToInt32(LoadObjectField<Smi>(symbol, Symbol::kFlagsOffset));
return IsSetWord32(flags, 1 << Symbol::kPrivateBit);
},
[=] { return Int32Constant(0); }, MachineRepresentation::kWord32);
[=] { return Int32FalseConstant(); });
}
Node* CodeStubAssembler::IsNativeContext(Node* object) {
......@@ -4762,16 +4751,16 @@ Node* CodeStubAssembler::IsJSRegExp(Node* object) {
}
Node* CodeStubAssembler::IsNumeric(Node* object) {
return Select(
TaggedIsSmi(object), [=] { return Int32Constant(1); },
[=] { return Word32Or(IsHeapNumber(object), IsBigInt(object)); },
MachineRepresentation::kWord32);
return Select<BoolT>(TaggedIsSmi(object), [=] { return Int32TrueConstant(); },
[=] {
return UncheckedCast<BoolT>(
Word32Or(IsHeapNumber(object), IsBigInt(object)));
});
}
Node* CodeStubAssembler::IsNumber(Node* object) {
return Select(TaggedIsSmi(object), [=] { return Int32Constant(1); },
[=] { return IsHeapNumber(object); },
MachineRepresentation::kWord32);
return Select<BoolT>(TaggedIsSmi(object), [=] { return Int32TrueConstant(); },
[=] { return IsHeapNumber(object); });
}
Node* CodeStubAssembler::FixedArraySizeDoesntFitInNewSpace(Node* element_count,
......@@ -4809,13 +4798,12 @@ Node* CodeStubAssembler::IsNumberNormalized(Node* number) {
Node* CodeStubAssembler::IsNumberPositive(Node* number) {
CSA_ASSERT(this, IsNumber(number));
Node* const float_zero = Float64Constant(0.);
return Select(TaggedIsSmi(number),
[=] { return TaggedIsPositiveSmi(number); },
[=] {
Node* v = LoadHeapNumberValue(number);
return Float64GreaterThanOrEqual(v, float_zero);
},
MachineRepresentation::kWord32);
return Select<BoolT>(TaggedIsSmi(number),
[=] { return TaggedIsPositiveSmi(number); },
[=] {
Node* v = LoadHeapNumberValue(number);
return Float64GreaterThanOrEqual(v, float_zero);
});
}
Node* CodeStubAssembler::IsNumberArrayIndex(Node* number) {
......@@ -5806,8 +5794,7 @@ TNode<Number> CodeStubAssembler::ToNumber_Inline(SloppyTNode<Context> context,
[=] {
return CAST(CallBuiltin(Builtins::kNonNumberToNumber,
context, input));
},
MachineRepresentation::kTagged);
});
Goto(&end);
}
......@@ -6179,8 +6166,7 @@ TNode<Number> CodeStubAssembler::ToLength_Inline(SloppyTNode<Context> context,
TNode<Smi> smi_zero = SmiConstant(0);
return Select<Number>(
TaggedIsSmi(input), [=] { return SmiMax(CAST(input), smi_zero); },
[=] { return CAST(CallBuiltin(Builtins::kToLength, context, input)); },
MachineRepresentation::kTagged);
[=] { return CAST(CallBuiltin(Builtins::kToLength, context, input)); });
}
TNode<Number> CodeStubAssembler::ToInteger_Inline(
......@@ -6189,9 +6175,9 @@ TNode<Number> CodeStubAssembler::ToInteger_Inline(
Builtins::Name builtin = (mode == kNoTruncation)
? Builtins::kToInteger
: Builtins::kToInteger_TruncateMinusZero;
return CAST(Select(TaggedIsSmi(input), [=] { return input; },
[=] { return CallBuiltin(builtin, context, input); },
MachineRepresentation::kTagged));
return Select<Number>(
TaggedIsSmi(input), [=] { return CAST(input); },
[=] { return CAST(CallBuiltin(builtin, context, input)); });
}
TNode<Number> CodeStubAssembler::ToInteger(SloppyTNode<Context> context,
......@@ -6430,8 +6416,8 @@ TNode<IntPtrT> CodeStubAssembler::IntPtrMax(SloppyTNode<IntPtrT> left,
ToIntPtrConstant(right, right_constant)) {
return IntPtrConstant(std::max(left_constant, right_constant));
}
return SelectConstant(IntPtrGreaterThanOrEqual(left, right), left, right,
MachineType::PointerRepresentation());
return SelectConstant<IntPtrT>(IntPtrGreaterThanOrEqual(left, right), left,
right);
}
TNode<IntPtrT> CodeStubAssembler::IntPtrMin(SloppyTNode<IntPtrT> left,
......@@ -6442,8 +6428,8 @@ TNode<IntPtrT> CodeStubAssembler::IntPtrMin(SloppyTNode<IntPtrT> left,
ToIntPtrConstant(right, right_constant)) {
return IntPtrConstant(std::min(left_constant, right_constant));
}
return SelectConstant(IntPtrLessThanOrEqual(left, right), left, right,
MachineType::PointerRepresentation());
return SelectConstant<IntPtrT>(IntPtrLessThanOrEqual(left, right), left,
right);
}
template <class Dictionary>
......@@ -7834,11 +7820,11 @@ void CodeStubAssembler::CheckForAssociatedProtector(Node* name,
// Fall through if no case matched.
}
Node* CodeStubAssembler::LoadReceiverMap(Node* receiver) {
return Select(TaggedIsSmi(receiver),
[=] { return LoadRoot(Heap::kHeapNumberMapRootIndex); },
[=] { return LoadMap(receiver); },
MachineRepresentation::kTagged);
TNode<Map> CodeStubAssembler::LoadReceiverMap(SloppyTNode<Object> receiver) {
return Select<Map>(
TaggedIsSmi(receiver),
[=] { return CAST(LoadRoot(Heap::kHeapNumberMapRootIndex)); },
[=] { return LoadMap(UncheckedCast<HeapObject>(receiver)); });
}
TNode<IntPtrT> CodeStubAssembler::TryToIntptr(Node* key, Label* miss) {
......
......@@ -353,47 +353,47 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* extra_node4 = nullptr, const char* extra_node4_name = "",
Node* extra_node5 = nullptr, const char* extra_node5_name = "");
Node* Select(SloppyTNode<BoolT> condition, const NodeGenerator& true_body,
const NodeGenerator& false_body, MachineRepresentation rep);
template <class A, class F, class G>
TNode<A> Select(SloppyTNode<BoolT> condition, const F& true_body,
const G& false_body, MachineRepresentation rep) {
return UncheckedCast<A>(Select(
const G& false_body) {
return UncheckedCast<A>(SelectImpl(
condition,
[&]() -> Node* { return base::implicit_cast<TNode<A>>(true_body()); },
[&]() -> Node* { return base::implicit_cast<TNode<A>>(false_body()); },
rep));
MachineRepresentationOf<A>::value));
}
Node* SelectConstant(Node* condition, Node* true_value, Node* false_value,
MachineRepresentation rep);
template <class A>
TNode<A> SelectConstant(TNode<BoolT> condition, TNode<A> true_value,
TNode<A> false_value, MachineRepresentation rep) {
return UncheckedCast<A>(
SelectConstant(condition, static_cast<Node*>(true_value),
static_cast<Node*>(false_value), rep));
TNode<A> false_value) {
return Select<A>(condition, [=] { return true_value; },
[=] { return false_value; });
}
Node* SelectInt32Constant(Node* condition, int true_value, int false_value);
Node* SelectIntPtrConstant(Node* condition, int true_value, int false_value);
Node* SelectBooleanConstant(Node* condition);
TNode<Int32T> SelectInt32Constant(SloppyTNode<BoolT> condition,
int true_value, int false_value);
TNode<IntPtrT> SelectIntPtrConstant(SloppyTNode<BoolT> condition,
int true_value, int false_value);
TNode<Oddball> SelectBooleanConstant(SloppyTNode<BoolT> condition);
template <class A>
TNode<A> SelectTaggedConstant(SloppyTNode<BoolT> condition,
TNode<A> true_value,
SloppyTNode<A> false_value) {
static_assert(std::is_base_of<Object, A>::value, "not a tagged type");
return SelectConstant(condition, true_value, false_value,
MachineRepresentation::kTagged);
return SelectConstant<A>(condition, true_value, false_value);
}
Node* SelectSmiConstant(Node* condition, Smi* true_value, Smi* false_value);
Node* SelectSmiConstant(Node* condition, int true_value, Smi* false_value) {
TNode<Smi> SelectSmiConstant(SloppyTNode<BoolT> condition, Smi* true_value,
Smi* false_value);
TNode<Smi> SelectSmiConstant(SloppyTNode<BoolT> condition, int true_value,
Smi* false_value) {
return SelectSmiConstant(condition, Smi::FromInt(true_value), false_value);
}
Node* SelectSmiConstant(Node* condition, Smi* true_value, int false_value) {
TNode<Smi> SelectSmiConstant(SloppyTNode<BoolT> condition, Smi* true_value,
int false_value) {
return SelectSmiConstant(condition, true_value, Smi::FromInt(false_value));
}
Node* SelectSmiConstant(Node* condition, int true_value, int false_value) {
TNode<Smi> SelectSmiConstant(SloppyTNode<BoolT> condition, int true_value,
int false_value) {
return SelectSmiConstant(condition, Smi::FromInt(true_value),
Smi::FromInt(false_value));
}
......@@ -564,7 +564,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
// Load the EnumLength of a Map.
Node* LoadMapEnumLength(SloppyTNode<Map> map);
// Load the back-pointer of a Map.
Node* LoadMapBackPointer(SloppyTNode<Map> map);
TNode<Object> LoadMapBackPointer(SloppyTNode<Map> map);
// Load the identity hash of a JSRececiver.
TNode<IntPtrT> LoadJSReceiverIdentityHash(SloppyTNode<Object> receiver,
Label* if_no_hash = nullptr);
......@@ -1135,7 +1135,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* IsFixedTypedArray(Node* object);
Node* IsFunctionWithPrototypeSlotMap(Node* map);
Node* IsHashTable(Node* object);
Node* IsHeapNumber(Node* object);
TNode<BoolT> IsHeapNumber(Node* object);
Node* IsIndirectStringInstanceType(Node* instance_type);
Node* IsJSArrayBuffer(Node* object);
Node* IsJSArrayInstanceType(Node* instance_type);
......@@ -1172,7 +1172,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* IsNumberDictionary(Node* object);
Node* IsOneByteStringInstanceType(Node* instance_type);
Node* IsPrimitiveInstanceType(Node* instance_type);
Node* IsPrivateSymbol(Node* object);
TNode<BoolT> IsPrivateSymbol(Node* object);
Node* IsPromiseCapability(Node* object);
Node* IsPropertyArray(Node* object);
Node* IsPropertyCell(Node* object);
......@@ -1181,7 +1181,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
SloppyTNode<Map> map);
Node* IsSequentialStringInstanceType(Node* instance_type);
Node* IsShortExternalStringInstanceType(Node* instance_type);
Node* IsSpecialReceiverInstanceType(Node* instance_type);
TNode<BoolT> IsSpecialReceiverInstanceType(Node* instance_type);
Node* IsSpecialReceiverMap(Node* map);
Node* IsStringInstanceType(Node* instance_type);
Node* IsString(Node* object);
......@@ -1763,7 +1763,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
// used for a property store or deletion.
void CheckForAssociatedProtector(Node* name, Label* if_protector);
Node* LoadReceiverMap(Node* receiver);
TNode<Map> LoadReceiverMap(SloppyTNode<Object> receiver);
// Emits keyed sloppy arguments load. Returns either the loaded value.
Node* LoadKeyedSloppyArguments(Node* receiver, Node* key, Label* bailout) {
......@@ -2057,6 +2057,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
TNode<Smi> length, TNode<String> first,
TNode<String> second, AllocationFlags flags);
Node* SelectImpl(TNode<BoolT> condition, const NodeGenerator& true_body,
const NodeGenerator& false_body, MachineRepresentation rep);
// Implements DescriptorArray::number_of_entries.
// Returns an untagged int32.
Node* DescriptorArrayNumberOfEntries(Node* descriptors);
......
......@@ -17,14 +17,17 @@ namespace internal {
using compiler::CodeAssemblerState;
using compiler::Node;
using compiler::TNode;
using compiler::SloppyTNode;
//////////////////// Private helpers.
// Loads dataX field from the DataHandler object.
Node* AccessorAssembler::LoadHandlerDataField(Node* handler, int data_index) {
TNode<Object> AccessorAssembler::LoadHandlerDataField(
SloppyTNode<DataHandler> handler, int data_index) {
#ifdef DEBUG
Node* handler_map = LoadMap(handler);
Node* instance_type = LoadMapInstanceType(handler_map);
TNode<Map> handler_map = LoadMap(handler);
TNode<Int32T> instance_type = LoadMapInstanceType(handler_map);
#endif
CSA_ASSERT(this,
Word32Or(InstanceTypeEqual(instance_type, LOAD_HANDLER_TYPE),
......@@ -467,11 +470,10 @@ void AccessorAssembler::HandleLoadICSmiHandlerCase(
// Context is stored either in data2 or data3 field depending on whether
// the access check is enabled for this handler or not.
Node* context_cell = Select(
TNode<Object> context_cell = Select<Object>(
IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_word),
[=] { return LoadHandlerDataField(handler, 3); },
[=] { return LoadHandlerDataField(handler, 2); },
MachineRepresentation::kTagged);
[=] { return LoadHandlerDataField(handler, 2); });
Node* context = LoadWeakCellValueUnchecked(context_cell);
Node* foreign =
......@@ -1303,11 +1305,10 @@ void AccessorAssembler::HandleStoreICProtoHandler(
// Context is stored either in data2 or data3 field depending on whether
// the access check is enabled for this handler or not.
Node* context_cell = Select(
TNode<Object> context_cell = Select<Object>(
IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_word),
[=] { return LoadHandlerDataField(handler, 3); },
[=] { return LoadHandlerDataField(handler, 2); },
MachineRepresentation::kTagged);
[=] { return LoadHandlerDataField(handler, 2); });
Node* context = LoadWeakCellValueUnchecked(context_cell);
......
......@@ -18,7 +18,11 @@ class ExitPoint;
class AccessorAssembler : public CodeStubAssembler {
public:
typedef compiler::Node Node;
using Node = compiler::Node;
template <class T>
using TNode = compiler::TNode<T>;
template <class T>
using SloppyTNode = compiler::SloppyTNode<T>;
explicit AccessorAssembler(compiler::CodeAssemblerState* state)
: CodeStubAssembler(state) {}
......@@ -85,7 +89,8 @@ class AccessorAssembler : public CodeStubAssembler {
void LoadIC_BytecodeHandler(const LoadICParameters* p, ExitPoint* exit_point);
// Loads dataX field from the DataHandler object.
Node* LoadHandlerDataField(Node* handler, int data_index);
TNode<Object> LoadHandlerDataField(SloppyTNode<DataHandler> handler,
int data_index);
protected:
struct StoreICParameters : public LoadICParameters {
......
......@@ -20,6 +20,7 @@ namespace internal {
namespace interpreter {
using compiler::Node;
using compiler::TNode;
class IntrinsicsGenerator {
public:
......@@ -132,23 +133,21 @@ Node* IntrinsicsGenerator::CompareInstanceType(Node* object, int type,
}
Node* IntrinsicsGenerator::IsInstanceType(Node* input, int type) {
Node* result =
__ Select(__ TaggedIsSmi(input), [=] { return __ FalseConstant(); },
[=] {
return __ SelectBooleanConstant(
CompareInstanceType(input, type, kInstanceTypeEqual));
},
MachineRepresentation::kTagged);
TNode<Oddball> result = __ Select<Oddball>(
__ TaggedIsSmi(input), [=] { return __ FalseConstant(); },
[=] {
return __ SelectBooleanConstant(
CompareInstanceType(input, type, kInstanceTypeEqual));
});
return result;
}
Node* IntrinsicsGenerator::IsJSReceiver(
const InterpreterAssembler::RegListNodePair& args, Node* context) {
Node* input = __ LoadRegisterFromRegisterList(args, 0);
Node* result = __ Select(
TNode<Oddball> result = __ Select<Oddball>(
__ TaggedIsSmi(input), [=] { return __ FalseConstant(); },
[=] { return __ SelectBooleanConstant(__ IsJSReceiver(input)); },
MachineRepresentation::kTagged);
[=] { return __ SelectBooleanConstant(__ IsJSReceiver(input)); });
return result;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment