Commit f7307419 authored by jgruber's avatar jgruber Committed by Commit bot

[stubs] Add String and JSReceiver instance type predicates

These improve readability of relevant code passages.

Review-Url: https://codereview.chromium.org/2395453002
Cr-Commit-Position: refs/heads/master@{#39978}
parent 1d40f819
...@@ -1410,9 +1410,7 @@ void Builtins::Generate_ArrayIncludes(CodeStubAssembler* assembler) { ...@@ -1410,9 +1410,7 @@ void Builtins::Generate_ArrayIncludes(CodeStubAssembler* assembler) {
assembler->Bind(&not_heap_num); assembler->Bind(&not_heap_num);
Node* search_type = assembler->LoadMapInstanceType(map); Node* search_type = assembler->LoadMapInstanceType(map);
assembler->GotoIf( assembler->GotoIf(assembler->IsStringInstanceType(search_type),
assembler->Int32LessThan(
search_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&string_loop); &string_loop);
assembler->GotoIf( assembler->GotoIf(
assembler->Word32Equal(search_type, assembler->Word32Equal(search_type,
...@@ -1517,9 +1515,8 @@ void Builtins::Generate_ArrayIncludes(CodeStubAssembler* assembler) { ...@@ -1517,9 +1515,8 @@ void Builtins::Generate_ArrayIncludes(CodeStubAssembler* assembler) {
Node* element_k = assembler->LoadFixedArrayElement( Node* element_k = assembler->LoadFixedArrayElement(
elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS);
assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop);
assembler->GotoUnless(assembler->Int32LessThan( assembler->GotoUnless(assembler->IsStringInstanceType(
assembler->LoadInstanceType(element_k), assembler->LoadInstanceType(element_k)),
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&continue_loop); &continue_loop);
// TODO(bmeurer): Consider inlining the StringEqual logic here. // TODO(bmeurer): Consider inlining the StringEqual logic here.
...@@ -1855,9 +1852,7 @@ void Builtins::Generate_ArrayIndexOf(CodeStubAssembler* assembler) { ...@@ -1855,9 +1852,7 @@ void Builtins::Generate_ArrayIndexOf(CodeStubAssembler* assembler) {
assembler->Bind(&not_heap_num); assembler->Bind(&not_heap_num);
Node* search_type = assembler->LoadMapInstanceType(map); Node* search_type = assembler->LoadMapInstanceType(map);
assembler->GotoIf( assembler->GotoIf(assembler->IsStringInstanceType(search_type),
assembler->Int32LessThan(
search_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&string_loop); &string_loop);
assembler->GotoIf( assembler->GotoIf(
assembler->Word32Equal(search_type, assembler->Word32Equal(search_type,
...@@ -1937,9 +1932,8 @@ void Builtins::Generate_ArrayIndexOf(CodeStubAssembler* assembler) { ...@@ -1937,9 +1932,8 @@ void Builtins::Generate_ArrayIndexOf(CodeStubAssembler* assembler) {
Node* element_k = assembler->LoadFixedArrayElement( Node* element_k = assembler->LoadFixedArrayElement(
elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS);
assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop);
assembler->GotoUnless(assembler->Int32LessThan( assembler->GotoUnless(assembler->IsStringInstanceType(
assembler->LoadInstanceType(element_k), assembler->LoadInstanceType(element_k)),
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&continue_loop); &continue_loop);
// TODO(bmeurer): Consider inlining the StringEqual logic here. // TODO(bmeurer): Consider inlining the StringEqual logic here.
......
...@@ -168,9 +168,7 @@ void Builtins::Generate_ToString(CodeStubAssembler* assembler) { ...@@ -168,9 +168,7 @@ void Builtins::Generate_ToString(CodeStubAssembler* assembler) {
Node* input_instance_type = assembler->LoadMapInstanceType(input_map); Node* input_instance_type = assembler->LoadMapInstanceType(input_map);
Label not_string(assembler); Label not_string(assembler);
assembler->GotoIf( assembler->GotoUnless(assembler->IsStringInstanceType(input_instance_type),
assembler->Int32GreaterThanOrEqual(
input_instance_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&not_string); &not_string);
assembler->Return(input); assembler->Return(input);
......
...@@ -230,10 +230,8 @@ void IsString(CodeStubAssembler* assembler, compiler::Node* object, ...@@ -230,10 +230,8 @@ void IsString(CodeStubAssembler* assembler, compiler::Node* object,
{ {
Node* instance_type = assembler->LoadInstanceType(object); Node* instance_type = assembler->LoadInstanceType(object);
assembler->Branch( assembler->Branch(assembler->IsStringInstanceType(instance_type), if_string,
assembler->Int32LessThan( if_notstring);
instance_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
if_string, if_notstring);
} }
} }
...@@ -259,9 +257,7 @@ void ReturnIfPrimitive(CodeStubAssembler* assembler, ...@@ -259,9 +257,7 @@ void ReturnIfPrimitive(CodeStubAssembler* assembler,
CodeStubAssembler::Label* return_string, CodeStubAssembler::Label* return_string,
CodeStubAssembler::Label* return_boolean, CodeStubAssembler::Label* return_boolean,
CodeStubAssembler::Label* return_number) { CodeStubAssembler::Label* return_number) {
assembler->GotoIf( assembler->GotoIf(assembler->IsStringInstanceType(instance_type),
assembler->Int32LessThan(instance_type,
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
return_string); return_string);
assembler->GotoIf(assembler->Word32Equal( assembler->GotoIf(assembler->Word32Equal(
......
...@@ -760,9 +760,8 @@ void CodeStubAssembler::BranchIfToBooleanIsTrue(Node* value, Label* if_true, ...@@ -760,9 +760,8 @@ void CodeStubAssembler::BranchIfToBooleanIsTrue(Node* value, Label* if_true,
// types, the HeapNumber type and everything else. // types, the HeapNumber type and everything else.
GotoIf(Word32Equal(value_instance_type, Int32Constant(HEAP_NUMBER_TYPE)), GotoIf(Word32Equal(value_instance_type, Int32Constant(HEAP_NUMBER_TYPE)),
&if_valueisheapnumber); &if_valueisheapnumber);
Branch( Branch(IsStringInstanceType(value_instance_type), &if_valueisstring,
Int32LessThan(value_instance_type, Int32Constant(FIRST_NONSTRING_TYPE)), &if_valueisother);
&if_valueisstring, &if_valueisother);
Bind(&if_valueisstring); Bind(&if_valueisstring);
{ {
...@@ -2127,9 +2126,8 @@ Node* CodeStubAssembler::ToThisString(Node* context, Node* value, ...@@ -2127,9 +2126,8 @@ Node* CodeStubAssembler::ToThisString(Node* context, Node* value,
// Check if the {value} is already String. // Check if the {value} is already String.
Label if_valueisnotstring(this, Label::kDeferred); Label if_valueisnotstring(this, Label::kDeferred);
Branch( Branch(IsStringInstanceType(value_instance_type), &if_valueisstring,
Int32LessThan(value_instance_type, Int32Constant(FIRST_NONSTRING_TYPE)), &if_valueisnotstring);
&if_valueisstring, &if_valueisnotstring);
Bind(&if_valueisnotstring); Bind(&if_valueisnotstring);
{ {
// Check if the {value} is null. // Check if the {value} is null.
...@@ -2222,9 +2220,7 @@ Node* CodeStubAssembler::ToThisValue(Node* context, Node* value, ...@@ -2222,9 +2220,7 @@ Node* CodeStubAssembler::ToThisValue(Node* context, Node* value,
&done_loop); &done_loop);
break; break;
case PrimitiveType::kString: case PrimitiveType::kString:
GotoIf(Int32LessThan(value_instance_type, GotoIf(IsStringInstanceType(value_instance_type), &done_loop);
Int32Constant(FIRST_NONSTRING_TYPE)),
&done_loop);
break; break;
case PrimitiveType::kSymbol: case PrimitiveType::kSymbol:
GotoIf(Word32Equal(value_instance_type, Int32Constant(SYMBOL_TYPE)), GotoIf(Word32Equal(value_instance_type, Int32Constant(SYMBOL_TYPE)),
...@@ -2276,6 +2272,17 @@ Node* CodeStubAssembler::ThrowIfNotInstanceType(Node* context, Node* value, ...@@ -2276,6 +2272,17 @@ Node* CodeStubAssembler::ThrowIfNotInstanceType(Node* context, Node* value,
return var_value_map.value(); return var_value_map.value();
} }
Node* CodeStubAssembler::IsStringInstanceType(Node* instance_type) {
STATIC_ASSERT(INTERNALIZED_STRING_TYPE == FIRST_TYPE);
return Int32LessThan(instance_type, Int32Constant(FIRST_NONSTRING_TYPE));
}
Node* CodeStubAssembler::IsJSReceiverInstanceType(Node* instance_type) {
STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
return Int32GreaterThanOrEqual(instance_type,
Int32Constant(FIRST_JS_RECEIVER_TYPE));
}
Node* CodeStubAssembler::StringCharCodeAt(Node* string, Node* index) { Node* CodeStubAssembler::StringCharCodeAt(Node* string, Node* index) {
// Translate the {index} into a Word. // Translate the {index} into a Word.
index = SmiToWord(index); index = SmiToWord(index);
...@@ -2581,9 +2588,7 @@ Node* CodeStubAssembler::SubString(Node* context, Node* string, Node* from, ...@@ -2581,9 +2588,7 @@ Node* CodeStubAssembler::SubString(Node* context, Node* string, Node* from,
var_instance_type.Bind(instance_type); var_instance_type.Bind(instance_type);
// Check if {string} is a String. // Check if {string} is a String.
GotoIf(Int32GreaterThanOrEqual(instance_type, GotoUnless(IsStringInstanceType(instance_type), &runtime);
Int32Constant(FIRST_NONSTRING_TYPE)),
&runtime);
// Make sure that both from and to are non-negative smis. // Make sure that both from and to are non-negative smis.
...@@ -2929,15 +2934,11 @@ Node* CodeStubAssembler::NonNumberToNumber(Node* context, Node* input) { ...@@ -2929,15 +2934,11 @@ Node* CodeStubAssembler::NonNumberToNumber(Node* context, Node* input) {
Label if_inputisstring(this), if_inputisoddball(this), Label if_inputisstring(this), if_inputisoddball(this),
if_inputisreceiver(this, Label::kDeferred), if_inputisreceiver(this, Label::kDeferred),
if_inputisother(this, Label::kDeferred); if_inputisother(this, Label::kDeferred);
GotoIf( GotoIf(IsStringInstanceType(input_instance_type), &if_inputisstring);
Int32LessThan(input_instance_type, Int32Constant(FIRST_NONSTRING_TYPE)),
&if_inputisstring);
GotoIf(Word32Equal(input_instance_type, Int32Constant(ODDBALL_TYPE)), GotoIf(Word32Equal(input_instance_type, Int32Constant(ODDBALL_TYPE)),
&if_inputisoddball); &if_inputisoddball);
STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); Branch(IsJSReceiverInstanceType(input_instance_type), &if_inputisreceiver,
Branch(Int32GreaterThanOrEqual(input_instance_type, &if_inputisother);
Int32Constant(FIRST_JS_RECEIVER_TYPE)),
&if_inputisreceiver, &if_inputisother);
Bind(&if_inputisstring); Bind(&if_inputisstring);
{ {
...@@ -3147,9 +3148,7 @@ void CodeStubAssembler::TryToName(Node* key, Label* if_keyisindex, ...@@ -3147,9 +3148,7 @@ void CodeStubAssembler::TryToName(Node* key, Label* if_keyisindex,
if_keyisunique); if_keyisunique);
// Miss if |key| is not a String. // Miss if |key| is not a String.
STATIC_ASSERT(FIRST_NAME_TYPE == FIRST_TYPE); STATIC_ASSERT(FIRST_NAME_TYPE == FIRST_TYPE);
GotoIf( GotoUnless(IsStringInstanceType(key_instance_type), if_bailout);
Int32GreaterThan(key_instance_type, Int32Constant(FIRST_NONSTRING_TYPE)),
if_bailout);
// |key| is a String. Check if it has a cached array index. // |key| is a String. Check if it has a cached array index.
Node* hash = LoadNameHashField(key); Node* hash = LoadNameHashField(key);
Node* contains_index = Node* contains_index =
...@@ -3796,8 +3795,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map, ...@@ -3796,8 +3795,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map,
{ {
AssertInstanceType(object, JS_VALUE_TYPE); AssertInstanceType(object, JS_VALUE_TYPE);
Node* string = LoadJSValueValue(object); Node* string = LoadJSValueValue(object);
Assert(Int32LessThan(LoadInstanceType(string), Assert(IsStringInstanceType(LoadInstanceType(string)));
Int32Constant(FIRST_NONSTRING_TYPE)));
Node* length = LoadStringLength(string); Node* length = LoadStringLength(string);
GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found); GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found);
Goto(&if_isobjectorsmi); Goto(&if_isobjectorsmi);
...@@ -3806,8 +3804,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map, ...@@ -3806,8 +3804,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map,
{ {
AssertInstanceType(object, JS_VALUE_TYPE); AssertInstanceType(object, JS_VALUE_TYPE);
Node* string = LoadJSValueValue(object); Node* string = LoadJSValueValue(object);
Assert(Int32LessThan(LoadInstanceType(string), Assert(IsStringInstanceType(LoadInstanceType(string)));
Int32Constant(FIRST_NONSTRING_TYPE)));
Node* length = LoadStringLength(string); Node* length = LoadStringLength(string);
GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found); GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found);
Goto(&if_isdictionary); Goto(&if_isdictionary);
......
...@@ -497,6 +497,10 @@ class CodeStubAssembler : public compiler::CodeAssembler { ...@@ -497,6 +497,10 @@ class CodeStubAssembler : public compiler::CodeAssembler {
InstanceType instance_type, InstanceType instance_type,
char const* method_name); char const* method_name);
// Type checks.
compiler::Node* IsStringInstanceType(compiler::Node* instance_type);
compiler::Node* IsJSReceiverInstanceType(compiler::Node* instance_type);
// String helpers. // String helpers.
// Load a character from a String (might flatten a ConsString). // Load a character from a String (might flatten a ConsString).
compiler::Node* StringCharCodeAt(compiler::Node* string, compiler::Node* StringCharCodeAt(compiler::Node* string,
......
...@@ -749,9 +749,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler, ...@@ -749,9 +749,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler,
// Check if the {rhs} is a String. // Check if the {rhs} is a String.
Label if_rhsisstring(assembler, Label::kDeferred), Label if_rhsisstring(assembler, Label::kDeferred),
if_rhsisnotstring(assembler, Label::kDeferred); if_rhsisnotstring(assembler, Label::kDeferred);
assembler->Branch(assembler->Int32LessThan( assembler->Branch(assembler->IsStringInstanceType(rhs_instance_type),
rhs_instance_type,
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&if_rhsisstring, &if_rhsisnotstring); &if_rhsisstring, &if_rhsisnotstring);
assembler->Bind(&if_rhsisstring); assembler->Bind(&if_rhsisstring);
...@@ -767,9 +765,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler, ...@@ -767,9 +765,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler,
Label if_rhsisreceiver(assembler, Label::kDeferred), Label if_rhsisreceiver(assembler, Label::kDeferred),
if_rhsisnotreceiver(assembler, Label::kDeferred); if_rhsisnotreceiver(assembler, Label::kDeferred);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(rhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
rhs_instance_type),
&if_rhsisreceiver, &if_rhsisnotreceiver); &if_rhsisreceiver, &if_rhsisnotreceiver);
assembler->Bind(&if_rhsisreceiver); assembler->Bind(&if_rhsisreceiver);
...@@ -801,9 +797,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler, ...@@ -801,9 +797,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler,
// Check if {lhs} is a String. // Check if {lhs} is a String.
Label if_lhsisstring(assembler), if_lhsisnotstring(assembler); Label if_lhsisstring(assembler), if_lhsisnotstring(assembler);
assembler->Branch(assembler->Int32LessThan( assembler->Branch(assembler->IsStringInstanceType(lhs_instance_type),
lhs_instance_type,
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&if_lhsisstring, &if_lhsisnotstring); &if_lhsisstring, &if_lhsisnotstring);
assembler->Bind(&if_lhsisstring); assembler->Bind(&if_lhsisstring);
...@@ -845,9 +839,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler, ...@@ -845,9 +839,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler,
Label if_lhsisreceiver(assembler, Label::kDeferred), Label if_lhsisreceiver(assembler, Label::kDeferred),
if_lhsisnotreceiver(assembler, Label::kDeferred); if_lhsisnotreceiver(assembler, Label::kDeferred);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(lhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
lhs_instance_type),
&if_lhsisreceiver, &if_lhsisnotreceiver); &if_lhsisreceiver, &if_lhsisnotreceiver);
assembler->Bind(&if_lhsisreceiver); assembler->Bind(&if_lhsisreceiver);
...@@ -877,9 +869,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler, ...@@ -877,9 +869,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler,
// Check if {rhs} is a String. // Check if {rhs} is a String.
Label if_rhsisstring(assembler), if_rhsisnotstring(assembler); Label if_rhsisstring(assembler), if_rhsisnotstring(assembler);
assembler->Branch(assembler->Int32LessThan( assembler->Branch(assembler->IsStringInstanceType(rhs_instance_type),
rhs_instance_type,
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&if_rhsisstring, &if_rhsisnotstring); &if_rhsisstring, &if_rhsisnotstring);
assembler->Bind(&if_rhsisstring); assembler->Bind(&if_rhsisstring);
...@@ -922,9 +912,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler, ...@@ -922,9 +912,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler,
Label if_rhsisreceiver(assembler, Label::kDeferred), Label if_rhsisreceiver(assembler, Label::kDeferred),
if_rhsisnotreceiver(assembler, Label::kDeferred); if_rhsisnotreceiver(assembler, Label::kDeferred);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(rhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
rhs_instance_type),
&if_rhsisreceiver, &if_rhsisnotreceiver); &if_rhsisreceiver, &if_rhsisnotreceiver);
assembler->Bind(&if_rhsisreceiver); assembler->Bind(&if_rhsisreceiver);
...@@ -953,9 +941,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler, ...@@ -953,9 +941,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler,
Label if_lhsisreceiver(assembler, Label::kDeferred), Label if_lhsisreceiver(assembler, Label::kDeferred),
if_lhsisnotreceiver(assembler); if_lhsisnotreceiver(assembler);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(lhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
lhs_instance_type),
&if_lhsisreceiver, &if_lhsisnotreceiver); &if_lhsisreceiver, &if_lhsisnotreceiver);
assembler->Bind(&if_lhsisreceiver); assembler->Bind(&if_lhsisreceiver);
...@@ -973,9 +959,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler, ...@@ -973,9 +959,7 @@ compiler::Node* AddStub::Generate(CodeStubAssembler* assembler,
Label if_rhsisreceiver(assembler, Label::kDeferred), Label if_rhsisreceiver(assembler, Label::kDeferred),
if_rhsisnotreceiver(assembler, Label::kDeferred); if_rhsisnotreceiver(assembler, Label::kDeferred);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(rhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
rhs_instance_type),
&if_rhsisreceiver, &if_rhsisnotreceiver); &if_rhsisreceiver, &if_rhsisnotreceiver);
assembler->Bind(&if_rhsisreceiver); assembler->Bind(&if_rhsisreceiver);
...@@ -2741,9 +2725,7 @@ void ToObjectStub::GenerateAssembly(CodeStubAssembler* assembler) const { ...@@ -2741,9 +2725,7 @@ void ToObjectStub::GenerateAssembly(CodeStubAssembler* assembler) const {
assembler->GotoIf(assembler->IsHeapNumberMap(map), &if_number); assembler->GotoIf(assembler->IsHeapNumberMap(map), &if_number);
Node* instance_type = assembler->LoadMapInstanceType(map); Node* instance_type = assembler->LoadMapInstanceType(map);
assembler->GotoIf( assembler->GotoIf(assembler->IsJSReceiverInstanceType(instance_type),
assembler->Int32GreaterThanOrEqual(
instance_type, assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)),
&if_jsreceiver); &if_jsreceiver);
Node* constructor_function_index = Node* constructor_function_index =
...@@ -2828,14 +2810,10 @@ compiler::Node* TypeofStub::Generate(CodeStubAssembler* assembler, ...@@ -2828,14 +2810,10 @@ compiler::Node* TypeofStub::Generate(CodeStubAssembler* assembler,
assembler->Int32Constant(0)), assembler->Int32Constant(0)),
&return_undefined); &return_undefined);
assembler->GotoIf( assembler->GotoIf(assembler->IsJSReceiverInstanceType(instance_type),
assembler->Int32GreaterThanOrEqual(
instance_type, assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)),
&return_object); &return_object);
assembler->GotoIf( assembler->GotoIf(assembler->IsStringInstanceType(instance_type),
assembler->Int32LessThan(instance_type,
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&return_string); &return_string);
#define SIMD128_BRANCH(TYPE, Type, type, lane_count, lane_type) \ #define SIMD128_BRANCH(TYPE, Type, type, lane_count, lane_type) \
...@@ -3152,9 +3130,7 @@ compiler::Node* GenerateAbstractRelationalComparison( ...@@ -3152,9 +3130,7 @@ compiler::Node* GenerateAbstractRelationalComparison(
// Check if {lhs} is a String. // Check if {lhs} is a String.
Label if_lhsisstring(assembler), Label if_lhsisstring(assembler),
if_lhsisnotstring(assembler, Label::kDeferred); if_lhsisnotstring(assembler, Label::kDeferred);
assembler->Branch(assembler->Int32LessThan( assembler->Branch(assembler->IsStringInstanceType(lhs_instance_type),
lhs_instance_type,
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&if_lhsisstring, &if_lhsisnotstring); &if_lhsisstring, &if_lhsisnotstring);
assembler->Bind(&if_lhsisstring); assembler->Bind(&if_lhsisstring);
...@@ -3165,9 +3141,8 @@ compiler::Node* GenerateAbstractRelationalComparison( ...@@ -3165,9 +3141,8 @@ compiler::Node* GenerateAbstractRelationalComparison(
// Check if {rhs} is also a String. // Check if {rhs} is also a String.
Label if_rhsisstring(assembler, Label::kDeferred), Label if_rhsisstring(assembler, Label::kDeferred),
if_rhsisnotstring(assembler, Label::kDeferred); if_rhsisnotstring(assembler, Label::kDeferred);
assembler->Branch(assembler->Int32LessThan( assembler->Branch(
rhs_instance_type, assembler->Int32Constant( assembler->IsStringInstanceType(rhs_instance_type),
FIRST_NONSTRING_TYPE)),
&if_rhsisstring, &if_rhsisnotstring); &if_rhsisstring, &if_rhsisnotstring);
assembler->Bind(&if_rhsisstring); assembler->Bind(&if_rhsisstring);
...@@ -3212,9 +3187,7 @@ compiler::Node* GenerateAbstractRelationalComparison( ...@@ -3212,9 +3187,7 @@ compiler::Node* GenerateAbstractRelationalComparison(
Label if_rhsisreceiver(assembler, Label::kDeferred), Label if_rhsisreceiver(assembler, Label::kDeferred),
if_rhsisnotreceiver(assembler, Label::kDeferred); if_rhsisnotreceiver(assembler, Label::kDeferred);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(rhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
rhs_instance_type),
&if_rhsisreceiver, &if_rhsisnotreceiver); &if_rhsisreceiver, &if_rhsisnotreceiver);
assembler->Bind(&if_rhsisreceiver); assembler->Bind(&if_rhsisreceiver);
...@@ -3246,9 +3219,7 @@ compiler::Node* GenerateAbstractRelationalComparison( ...@@ -3246,9 +3219,7 @@ compiler::Node* GenerateAbstractRelationalComparison(
Label if_lhsisreceiver(assembler, Label::kDeferred), Label if_lhsisreceiver(assembler, Label::kDeferred),
if_lhsisnotreceiver(assembler, Label::kDeferred); if_lhsisnotreceiver(assembler, Label::kDeferred);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(lhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
lhs_instance_type),
&if_lhsisreceiver, &if_lhsisnotreceiver); &if_lhsisreceiver, &if_lhsisnotreceiver);
assembler->Bind(&if_lhsisreceiver); assembler->Bind(&if_lhsisreceiver);
...@@ -3465,9 +3436,8 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode, ...@@ -3465,9 +3436,8 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode,
// Check if the {rhs} is a String. // Check if the {rhs} is a String.
Label if_rhsisstring(assembler, Label::kDeferred), Label if_rhsisstring(assembler, Label::kDeferred),
if_rhsisnotstring(assembler); if_rhsisnotstring(assembler);
assembler->Branch(assembler->Int32LessThan( assembler->Branch(
rhs_instance_type, assembler->Int32Constant( assembler->IsStringInstanceType(rhs_instance_type),
FIRST_NONSTRING_TYPE)),
&if_rhsisstring, &if_rhsisnotstring); &if_rhsisstring, &if_rhsisnotstring);
assembler->Bind(&if_rhsisstring); assembler->Bind(&if_rhsisstring);
...@@ -3500,9 +3470,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode, ...@@ -3500,9 +3470,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode,
Label if_rhsisreceiver(assembler, Label::kDeferred), Label if_rhsisreceiver(assembler, Label::kDeferred),
if_rhsisnotreceiver(assembler); if_rhsisnotreceiver(assembler);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(rhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
rhs_instance_type),
&if_rhsisreceiver, &if_rhsisnotreceiver); &if_rhsisreceiver, &if_rhsisnotreceiver);
assembler->Bind(&if_rhsisreceiver); assembler->Bind(&if_rhsisreceiver);
...@@ -3584,9 +3552,8 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode, ...@@ -3584,9 +3552,8 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode,
// Check if {rhs} is also a String. // Check if {rhs} is also a String.
Label if_rhsisstring(assembler, Label::kDeferred), Label if_rhsisstring(assembler, Label::kDeferred),
if_rhsisnotstring(assembler); if_rhsisnotstring(assembler);
assembler->Branch(assembler->Int32LessThan( assembler->Branch(
rhs_instance_type, assembler->Int32Constant( assembler->IsStringInstanceType(rhs_instance_type),
FIRST_NONSTRING_TYPE)),
&if_rhsisstring, &if_rhsisnotstring); &if_rhsisstring, &if_rhsisnotstring);
assembler->Bind(&if_rhsisstring); assembler->Bind(&if_rhsisstring);
...@@ -3636,9 +3603,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode, ...@@ -3636,9 +3603,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode,
Label if_rhsisstring(assembler, Label::kDeferred), Label if_rhsisstring(assembler, Label::kDeferred),
if_rhsisnotstring(assembler); if_rhsisnotstring(assembler);
assembler->Branch( assembler->Branch(
assembler->Int32LessThan( assembler->IsStringInstanceType(rhs_instance_type),
rhs_instance_type,
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&if_rhsisstring, &if_rhsisnotstring); &if_rhsisstring, &if_rhsisnotstring);
assembler->Bind(&if_rhsisstring); assembler->Bind(&if_rhsisstring);
...@@ -3656,9 +3621,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode, ...@@ -3656,9 +3621,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode,
if_rhsisnotreceiver(assembler); if_rhsisnotreceiver(assembler);
STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(rhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
rhs_instance_type),
&if_rhsisreceiver, &if_rhsisnotreceiver); &if_rhsisreceiver, &if_rhsisnotreceiver);
assembler->Bind(&if_rhsisreceiver); assembler->Bind(&if_rhsisreceiver);
...@@ -3746,9 +3709,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode, ...@@ -3746,9 +3709,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode,
Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler); Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler);
STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(rhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
rhs_instance_type),
&if_rhsisreceiver, &if_rhsisnotreceiver); &if_rhsisreceiver, &if_rhsisnotreceiver);
assembler->Bind(&if_rhsisreceiver); assembler->Bind(&if_rhsisreceiver);
...@@ -3793,9 +3754,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode, ...@@ -3793,9 +3754,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode,
Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler); Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler);
STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(rhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
rhs_instance_type),
&if_rhsisreceiver, &if_rhsisnotreceiver); &if_rhsisreceiver, &if_rhsisnotreceiver);
assembler->Bind(&if_rhsisreceiver); assembler->Bind(&if_rhsisreceiver);
...@@ -3823,9 +3782,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode, ...@@ -3823,9 +3782,7 @@ compiler::Node* GenerateEqual(CodeStubAssembler* assembler, ResultMode mode,
Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler); Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler);
STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE);
assembler->Branch( assembler->Branch(
assembler->Int32LessThanOrEqual( assembler->IsJSReceiverInstanceType(rhs_instance_type),
assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
rhs_instance_type),
&if_rhsisreceiver, &if_rhsisnotreceiver); &if_rhsisreceiver, &if_rhsisnotreceiver);
assembler->Bind(&if_rhsisreceiver); assembler->Bind(&if_rhsisreceiver);
...@@ -4061,9 +4018,7 @@ compiler::Node* GenerateStrictEqual(CodeStubAssembler* assembler, ...@@ -4061,9 +4018,7 @@ compiler::Node* GenerateStrictEqual(CodeStubAssembler* assembler,
// Check if {lhs} is a String. // Check if {lhs} is a String.
Label if_lhsisstring(assembler), if_lhsisnotstring(assembler); Label if_lhsisstring(assembler), if_lhsisnotstring(assembler);
assembler->Branch(assembler->Int32LessThan( assembler->Branch(assembler->IsStringInstanceType(lhs_instance_type),
lhs_instance_type,
assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&if_lhsisstring, &if_lhsisnotstring); &if_lhsisstring, &if_lhsisnotstring);
assembler->Bind(&if_lhsisstring); assembler->Bind(&if_lhsisstring);
...@@ -4074,9 +4029,8 @@ compiler::Node* GenerateStrictEqual(CodeStubAssembler* assembler, ...@@ -4074,9 +4029,8 @@ compiler::Node* GenerateStrictEqual(CodeStubAssembler* assembler,
// Check if {rhs} is also a String. // Check if {rhs} is also a String.
Label if_rhsisstring(assembler, Label::kDeferred), Label if_rhsisstring(assembler, Label::kDeferred),
if_rhsisnotstring(assembler); if_rhsisnotstring(assembler);
assembler->Branch(assembler->Int32LessThan( assembler->Branch(
rhs_instance_type, assembler->Int32Constant( assembler->IsStringInstanceType(rhs_instance_type),
FIRST_NONSTRING_TYPE)),
&if_rhsisstring, &if_rhsisnotstring); &if_rhsisstring, &if_rhsisnotstring);
assembler->Bind(&if_rhsisstring); assembler->Bind(&if_rhsisstring);
......
...@@ -2371,9 +2371,8 @@ void Interpreter::DoForInPrepare(InterpreterAssembler* assembler) { ...@@ -2371,9 +2371,8 @@ void Interpreter::DoForInPrepare(InterpreterAssembler* assembler) {
if (FLAG_debug_code) { if (FLAG_debug_code) {
Label already_receiver(assembler), abort(assembler); Label already_receiver(assembler), abort(assembler);
Node* instance_type = __ LoadInstanceType(receiver); Node* instance_type = __ LoadInstanceType(receiver);
Node* first_receiver_type = __ Int32Constant(FIRST_JS_RECEIVER_TYPE); __ Branch(__ IsJSReceiverInstanceType(instance_type), &already_receiver,
__ BranchIfInt32GreaterThanOrEqual(instance_type, first_receiver_type, &abort);
&already_receiver, &abort);
__ Bind(&abort); __ Bind(&abort);
{ {
__ Abort(kExpectedJSReceiver); __ Abort(kExpectedJSReceiver);
......
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