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