| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index 67438e5ac28932b0ade564aa2a78959dee0a4a19..a100823eec42b8161743d1bbb32f2b62b1e2a681 100644
|
| --- a/src/code-stubs.cc
|
| +++ b/src/code-stubs.cc
|
| @@ -1033,180 +1033,46 @@ void SubtractStub::GenerateAssembly(
|
| }
|
| }
|
|
|
| -namespace {
|
| -
|
| -void GenerateBitwiseOperation(
|
| - compiler::CodeStubAssembler* assembler,
|
| - compiler::Node* (compiler::CodeStubAssembler::*bitop)(compiler::Node*,
|
| - compiler::Node*)) {
|
| - typedef compiler::CodeStubAssembler::Label Label;
|
| - typedef compiler::Node Node;
|
| - typedef compiler::CodeStubAssembler::Variable Variable;
|
| -
|
| - Node* context = assembler->Parameter(2);
|
| -
|
| - // Shared entry for word32 bitwise operation.
|
| - Label do_bitop(assembler);
|
| - Variable var_bitop_lhs(assembler, MachineRepresentation::kWord32),
|
| - var_bitop_rhs(assembler, MachineRepresentation::kWord32);
|
| -
|
| - // We might need to loop several times due to ToNumber conversions.
|
| - Variable var_lhs(assembler, MachineRepresentation::kTagged),
|
| - var_rhs(assembler, MachineRepresentation::kTagged);
|
| - Variable* loop_vars[2] = {&var_lhs, &var_rhs};
|
| - Label loop(assembler, 2, loop_vars);
|
| - var_lhs.Bind(assembler->Parameter(0));
|
| - var_rhs.Bind(assembler->Parameter(1));
|
| - assembler->Goto(&loop);
|
| - assembler->Bind(&loop);
|
| - {
|
| - // Load the current {lhs} and {rhs} values.
|
| - Node* lhs = var_lhs.value();
|
| - Node* rhs = var_rhs.value();
|
| -
|
| - // Check if the {lhs} is a Smi or a HeapObject.
|
| - Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler);
|
| - assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi);
|
| -
|
| - assembler->Bind(&if_lhsissmi);
|
| - {
|
| - // Check if the {rhs} is also a Smi.
|
| - Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
|
| - assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi,
|
| - &if_rhsisnotsmi);
|
| -
|
| - assembler->Bind(&if_rhsissmi);
|
| - {
|
| - // Perform the word32 bitwise operation.
|
| - var_bitop_lhs.Bind(assembler->SmiToInt32(lhs));
|
| - var_bitop_rhs.Bind(assembler->SmiToInt32(rhs));
|
| - assembler->Goto(&do_bitop);
|
| - }
|
| -
|
| - assembler->Bind(&if_rhsisnotsmi);
|
| - {
|
| - // Load the map of the {rhs}.
|
| - Node* rhs_map = assembler->LoadMap(rhs);
|
| -
|
| - // Check if {rhs} is a HeapNumber.
|
| - Label if_rhsisnumber(assembler),
|
| - if_rhsisnotnumber(assembler, Label::kDeferred);
|
| - Node* number_map = assembler->HeapNumberMapConstant();
|
| - assembler->Branch(assembler->WordEqual(rhs_map, number_map),
|
| - &if_rhsisnumber, &if_rhsisnotnumber);
|
| -
|
| - assembler->Bind(&if_rhsisnumber);
|
| - {
|
| - // Perform the word32 bitwise operation.
|
| - var_bitop_lhs.Bind(assembler->SmiToInt32(lhs));
|
| - var_bitop_rhs.Bind(assembler->TruncateHeapNumberValueToInt32(rhs));
|
| - assembler->Goto(&do_bitop);
|
| - }
|
| -
|
| - assembler->Bind(&if_rhsisnotnumber);
|
| - {
|
| - // Convert the {rhs} to a Number first.
|
| - Callable callable =
|
| - CodeFactory::NonNumberToNumber(assembler->isolate());
|
| - var_rhs.Bind(assembler->CallStub(callable, context, rhs));
|
| - assembler->Goto(&loop);
|
| - }
|
| - }
|
| - }
|
| -
|
| - assembler->Bind(&if_lhsisnotsmi);
|
| - {
|
| - // Load the map of the {lhs}.
|
| - Node* lhs_map = assembler->LoadMap(lhs);
|
| -
|
| - // Check if the {lhs} is a HeapNumber.
|
| - Label if_lhsisnumber(assembler),
|
| - if_lhsisnotnumber(assembler, Label::kDeferred);
|
| - Node* number_map = assembler->HeapNumberMapConstant();
|
| - assembler->Branch(assembler->WordEqual(lhs_map, number_map),
|
| - &if_lhsisnumber, &if_lhsisnotnumber);
|
| -
|
| - assembler->Bind(&if_lhsisnumber);
|
| - {
|
| - // Check if the {rhs} is a Smi.
|
| - Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
|
| - assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi,
|
| - &if_rhsisnotsmi);
|
| -
|
| - assembler->Bind(&if_rhsissmi);
|
| - {
|
| - // Perform the word32 bitwise operation.
|
| - var_bitop_lhs.Bind(assembler->TruncateHeapNumberValueToInt32(lhs));
|
| - var_bitop_rhs.Bind(assembler->SmiToInt32(rhs));
|
| - assembler->Goto(&do_bitop);
|
| - }
|
| -
|
| - assembler->Bind(&if_rhsisnotsmi);
|
| - {
|
| - // Load the map of the {rhs}.
|
| - Node* rhs_map = assembler->LoadMap(rhs);
|
| -
|
| - // Check if the {rhs} is a HeapNumber.
|
| - Label if_rhsisnumber(assembler),
|
| - if_rhsisnotnumber(assembler, Label::kDeferred);
|
| - assembler->Branch(assembler->WordEqual(rhs_map, number_map),
|
| - &if_rhsisnumber, &if_rhsisnotnumber);
|
| -
|
| - assembler->Bind(&if_rhsisnumber);
|
| - {
|
| - // Perform the word32 bitwise operation.
|
| - var_bitop_lhs.Bind(assembler->TruncateHeapNumberValueToInt32(lhs));
|
| - var_bitop_rhs.Bind(assembler->TruncateHeapNumberValueToInt32(rhs));
|
| - assembler->Goto(&do_bitop);
|
| - }
|
| -
|
| - assembler->Bind(&if_rhsisnotnumber);
|
| - {
|
| - // Convert the {rhs} to a Number first.
|
| - Callable callable =
|
| - CodeFactory::NonNumberToNumber(assembler->isolate());
|
| - var_rhs.Bind(assembler->CallStub(callable, context, rhs));
|
| - assembler->Goto(&loop);
|
| - }
|
| - }
|
| - }
|
| -
|
| - assembler->Bind(&if_lhsisnotnumber);
|
| - {
|
| - // Convert the {lhs} to a Number first.
|
| - Callable callable =
|
| - CodeFactory::NonNumberToNumber(assembler->isolate());
|
| - var_lhs.Bind(assembler->CallStub(callable, context, lhs));
|
| - assembler->Goto(&loop);
|
| - }
|
| - }
|
| - }
|
| -
|
| - assembler->Bind(&do_bitop);
|
| - {
|
| - Node* lhs_value = var_bitop_lhs.value();
|
| - Node* rhs_value = var_bitop_rhs.value();
|
| - Node* value = (assembler->*bitop)(lhs_value, rhs_value);
|
| - Node* result = assembler->ChangeInt32ToTagged(value);
|
| - assembler->Return(result);
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| void BitwiseAndStub::GenerateAssembly(
|
| compiler::CodeStubAssembler* assembler) const {
|
| - GenerateBitwiseOperation(assembler, &compiler::CodeStubAssembler::Word32And);
|
| + using compiler::Node;
|
| +
|
| + Node* lhs = assembler->Parameter(0);
|
| + Node* rhs = assembler->Parameter(1);
|
| + Node* context = assembler->Parameter(2);
|
| + Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
|
| + Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
|
| + Node* value = assembler->Word32And(lhs_value, rhs_value);
|
| + Node* result = assembler->ChangeInt32ToTagged(value);
|
| + assembler->Return(result);
|
| }
|
|
|
| void BitwiseOrStub::GenerateAssembly(
|
| compiler::CodeStubAssembler* assembler) const {
|
| - GenerateBitwiseOperation(assembler, &compiler::CodeStubAssembler::Word32Or);
|
| + using compiler::Node;
|
| +
|
| + Node* lhs = assembler->Parameter(0);
|
| + Node* rhs = assembler->Parameter(1);
|
| + Node* context = assembler->Parameter(2);
|
| + Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
|
| + Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
|
| + Node* value = assembler->Word32Or(lhs_value, rhs_value);
|
| + Node* result = assembler->ChangeInt32ToTagged(value);
|
| + assembler->Return(result);
|
| }
|
|
|
| void BitwiseXorStub::GenerateAssembly(
|
| compiler::CodeStubAssembler* assembler) const {
|
| - GenerateBitwiseOperation(assembler, &compiler::CodeStubAssembler::Word32Xor);
|
| + using compiler::Node;
|
| +
|
| + Node* lhs = assembler->Parameter(0);
|
| + Node* rhs = assembler->Parameter(1);
|
| + Node* context = assembler->Parameter(2);
|
| + Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
|
| + Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
|
| + Node* value = assembler->Word32Xor(lhs_value, rhs_value);
|
| + Node* result = assembler->ChangeInt32ToTagged(value);
|
| + assembler->Return(result);
|
| }
|
|
|
| namespace {
|
|
|