| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index 4d23cc6ca463ed8627d2145fb126325ca3a54e7c..e41145e69b43bc18bd74ea1769058a51232ea9ed 100644
|
| --- a/src/code-stubs.cc
|
| +++ b/src/code-stubs.cc
|
| @@ -3549,7 +3549,8 @@ void ToBooleanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
| typedef CodeStubAssembler::Label Label;
|
|
|
| Node* value = assembler->Parameter(0);
|
| - Label if_valueissmi(assembler), if_valueisnotsmi(assembler);
|
| + Label if_valueissmi(assembler), if_valueisnotsmi(assembler),
|
| + return_true(assembler), return_false(assembler);
|
|
|
| // Check if {value} is a Smi or a HeapObject.
|
| assembler->Branch(assembler->WordIsSmi(value), &if_valueissmi,
|
| @@ -3558,21 +3559,15 @@ void ToBooleanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
| assembler->Bind(&if_valueissmi);
|
| {
|
| // The {value} is a Smi, only need to check against zero.
|
| - Label if_valueiszero(assembler), if_valueisnotzero(assembler);
|
| assembler->Branch(assembler->SmiEqual(value, assembler->SmiConstant(0)),
|
| - &if_valueiszero, &if_valueisnotzero);
|
| -
|
| - assembler->Bind(&if_valueiszero);
|
| - assembler->Return(assembler->BooleanConstant(false));
|
| -
|
| - assembler->Bind(&if_valueisnotzero);
|
| - assembler->Return(assembler->BooleanConstant(true));
|
| + &return_false, &return_true);
|
| }
|
|
|
| assembler->Bind(&if_valueisnotsmi);
|
| {
|
| - Label if_valueisstring(assembler), if_valueisheapnumber(assembler),
|
| - if_valueisoddball(assembler), if_valueisother(assembler);
|
| + Label if_valueisstring(assembler), if_valueisnotstring(assembler),
|
| + if_valueisheapnumber(assembler), if_valueisoddball(assembler),
|
| + if_valueisother(assembler);
|
|
|
| // The {value} is a HeapObject, load its map.
|
| Node* value_map = assembler->LoadMap(value);
|
| @@ -3584,24 +3579,20 @@ void ToBooleanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
|
|
| // Dispatch based on the instance type; we distinguish all String instance
|
| // types, the HeapNumber type and the Oddball type.
|
| - size_t const kNumCases = FIRST_NONSTRING_TYPE + 2;
|
| + assembler->Branch(assembler->Int32LessThan(
|
| + value_instance_type,
|
| + assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
|
| + &if_valueisstring, &if_valueisnotstring);
|
| + assembler->Bind(&if_valueisnotstring);
|
| + size_t const kNumCases = 2;
|
| Label* case_labels[kNumCases];
|
| int32_t case_values[kNumCases];
|
| - for (int32_t i = 0; i < FIRST_NONSTRING_TYPE; ++i) {
|
| - case_labels[i] = new Label(assembler);
|
| - case_values[i] = i;
|
| - }
|
| - case_labels[FIRST_NONSTRING_TYPE + 0] = &if_valueisheapnumber;
|
| - case_values[FIRST_NONSTRING_TYPE + 0] = HEAP_NUMBER_TYPE;
|
| - case_labels[FIRST_NONSTRING_TYPE + 1] = &if_valueisoddball;
|
| - case_values[FIRST_NONSTRING_TYPE + 1] = ODDBALL_TYPE;
|
| + case_labels[0] = &if_valueisheapnumber;
|
| + case_values[0] = HEAP_NUMBER_TYPE;
|
| + case_labels[1] = &if_valueisoddball;
|
| + case_values[1] = ODDBALL_TYPE;
|
| assembler->Switch(value_instance_type, &if_valueisother, case_values,
|
| case_labels, arraysize(case_values));
|
| - for (int32_t i = 0; i < FIRST_NONSTRING_TYPE; ++i) {
|
| - assembler->Bind(case_labels[i]);
|
| - assembler->Goto(&if_valueisstring);
|
| - delete case_labels[i];
|
| - }
|
|
|
| assembler->Bind(&if_valueisstring);
|
| {
|
| @@ -3610,16 +3601,9 @@ void ToBooleanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
| assembler->LoadObjectField(value, String::kLengthOffset);
|
|
|
| // Check if the {value} is the empty string.
|
| - Label if_valueisempty(assembler), if_valueisnotempty(assembler);
|
| assembler->Branch(
|
| assembler->SmiEqual(value_length, assembler->SmiConstant(0)),
|
| - &if_valueisempty, &if_valueisnotempty);
|
| -
|
| - assembler->Bind(&if_valueisempty);
|
| - assembler->Return(assembler->BooleanConstant(false));
|
| -
|
| - assembler->Bind(&if_valueisnotempty);
|
| - assembler->Return(assembler->BooleanConstant(true));
|
| + &return_false, &return_true);
|
| }
|
|
|
| assembler->Bind(&if_valueisheapnumber);
|
| @@ -3628,25 +3612,15 @@ void ToBooleanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
| MachineType::Float64(), value,
|
| assembler->IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag));
|
|
|
| - Label if_valueispositive(assembler), if_valueisnotpositive(assembler),
|
| - if_valueisnegative(assembler), if_valueisnanorzero(assembler);
|
| + Label if_valueisnotpositive(assembler);
|
| assembler->Branch(assembler->Float64LessThan(
|
| assembler->Float64Constant(0.0), value_value),
|
| - &if_valueispositive, &if_valueisnotpositive);
|
| -
|
| - assembler->Bind(&if_valueispositive);
|
| - assembler->Return(assembler->BooleanConstant(true));
|
| + &return_true, &if_valueisnotpositive);
|
|
|
| assembler->Bind(&if_valueisnotpositive);
|
| assembler->Branch(assembler->Float64LessThan(
|
| value_value, assembler->Float64Constant(0.0)),
|
| - &if_valueisnegative, &if_valueisnanorzero);
|
| -
|
| - assembler->Bind(&if_valueisnegative);
|
| - assembler->Return(assembler->BooleanConstant(true));
|
| -
|
| - assembler->Bind(&if_valueisnanorzero);
|
| - assembler->Return(assembler->BooleanConstant(false));
|
| + &return_true, &return_false);
|
| }
|
|
|
| assembler->Bind(&if_valueisoddball);
|
| @@ -3667,19 +3641,16 @@ void ToBooleanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
| assembler->Int32Constant(1 << Map::kIsUndetectable));
|
|
|
| // Check if the {value} is undetectable.
|
| - Label if_valueisundetectable(assembler),
|
| - if_valueisnotundetectable(assembler);
|
| assembler->Branch(assembler->Word32Equal(value_map_undetectable,
|
| assembler->Int32Constant(0)),
|
| - &if_valueisnotundetectable, &if_valueisundetectable);
|
| -
|
| - assembler->Bind(&if_valueisundetectable);
|
| - assembler->Return(assembler->BooleanConstant(false));
|
| -
|
| - assembler->Bind(&if_valueisnotundetectable);
|
| - assembler->Return(assembler->BooleanConstant(true));
|
| + &return_true, &return_false);
|
| }
|
| }
|
| + assembler->Bind(&return_false);
|
| + assembler->Return(assembler->BooleanConstant(false));
|
| +
|
| + assembler->Bind(&return_true);
|
| + assembler->Return(assembler->BooleanConstant(true));
|
| }
|
|
|
| void ToIntegerStub::GenerateAssembly(CodeStubAssembler* assembler) const {
|
|
|