| OLD | NEW | 
|     1 // Copyright 2012 the V8 project authors. All rights reserved. |     1 // Copyright 2012 the V8 project authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include "src/code-stubs.h" |     5 #include "src/code-stubs.h" | 
|     6  |     6  | 
|     7 #include <sstream> |     7 #include <sstream> | 
|     8  |     8  | 
|     9 #include "src/bootstrapper.h" |     9 #include "src/bootstrapper.h" | 
|    10 #include "src/code-factory.h" |    10 #include "src/code-factory.h" | 
| (...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1425  |  1425  | 
|  1426 // static |  1426 // static | 
|  1427 compiler::Node* ModulusStub::Generate(CodeStubAssembler* assembler, |  1427 compiler::Node* ModulusStub::Generate(CodeStubAssembler* assembler, | 
|  1428                                       compiler::Node* left, |  1428                                       compiler::Node* left, | 
|  1429                                       compiler::Node* right, |  1429                                       compiler::Node* right, | 
|  1430                                       compiler::Node* context) { |  1430                                       compiler::Node* context) { | 
|  1431   using compiler::Node; |  1431   using compiler::Node; | 
|  1432   typedef CodeStubAssembler::Label Label; |  1432   typedef CodeStubAssembler::Label Label; | 
|  1433   typedef CodeStubAssembler::Variable Variable; |  1433   typedef CodeStubAssembler::Variable Variable; | 
|  1434  |  1434  | 
 |  1435   Variable var_result(assembler, MachineRepresentation::kTagged); | 
 |  1436   Label return_result(assembler, &var_result); | 
 |  1437  | 
|  1435   // Shared entry point for floating point modulus. |  1438   // Shared entry point for floating point modulus. | 
|  1436   Label do_fmod(assembler); |  1439   Label do_fmod(assembler); | 
|  1437   Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), |  1440   Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), | 
|  1438       var_divisor_float64(assembler, MachineRepresentation::kFloat64); |  1441       var_divisor_float64(assembler, MachineRepresentation::kFloat64); | 
|  1439  |  1442  | 
|  1440   Node* number_map = assembler->HeapNumberMapConstant(); |  1443   Node* number_map = assembler->HeapNumberMapConstant(); | 
|  1441  |  1444  | 
|  1442   // We might need to loop one or two times due to ToNumber conversions. |  1445   // We might need to loop one or two times due to ToNumber conversions. | 
|  1443   Variable var_dividend(assembler, MachineRepresentation::kTagged), |  1446   Variable var_dividend(assembler, MachineRepresentation::kTagged), | 
|  1444       var_divisor(assembler, MachineRepresentation::kTagged); |  1447       var_divisor(assembler, MachineRepresentation::kTagged); | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
|  1458  |  1461  | 
|  1459     assembler->Bind(÷nd_is_smi); |  1462     assembler->Bind(÷nd_is_smi); | 
|  1460     { |  1463     { | 
|  1461       Label dividend_is_not_zero(assembler); |  1464       Label dividend_is_not_zero(assembler); | 
|  1462       Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |  1465       Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 
|  1463       assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, |  1466       assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, | 
|  1464                         &divisor_is_not_smi); |  1467                         &divisor_is_not_smi); | 
|  1465  |  1468  | 
|  1466       assembler->Bind(&divisor_is_smi); |  1469       assembler->Bind(&divisor_is_smi); | 
|  1467       { |  1470       { | 
|  1468         var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); |  1471         // Compute the modulus of two Smis. | 
|  1469         var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); |  1472         var_result.Bind(assembler->SmiMod(dividend, divisor)); | 
|  1470         assembler->Goto(&do_fmod); |  1473         assembler->Goto(&return_result); | 
|  1471       } |  1474       } | 
|  1472  |  1475  | 
|  1473       assembler->Bind(&divisor_is_not_smi); |  1476       assembler->Bind(&divisor_is_not_smi); | 
|  1474       { |  1477       { | 
|  1475         Node* divisor_map = assembler->LoadMap(divisor); |  1478         Node* divisor_map = assembler->LoadMap(divisor); | 
|  1476  |  1479  | 
|  1477         // Check if {divisor} is a HeapNumber. |  1480         // Check if {divisor} is a HeapNumber. | 
|  1478         Label divisor_is_number(assembler), |  1481         Label divisor_is_number(assembler), | 
|  1479             divisor_is_not_number(assembler, Label::kDeferred); |  1482             divisor_is_not_number(assembler, Label::kDeferred); | 
|  1480         assembler->Branch(assembler->WordEqual(divisor_map, number_map), |  1483         assembler->Branch(assembler->WordEqual(divisor_map, number_map), | 
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1564         var_dividend.Bind(assembler->CallStub(callable, context, dividend)); |  1567         var_dividend.Bind(assembler->CallStub(callable, context, dividend)); | 
|  1565         assembler->Goto(&loop); |  1568         assembler->Goto(&loop); | 
|  1566       } |  1569       } | 
|  1567     } |  1570     } | 
|  1568   } |  1571   } | 
|  1569  |  1572  | 
|  1570   assembler->Bind(&do_fmod); |  1573   assembler->Bind(&do_fmod); | 
|  1571   { |  1574   { | 
|  1572     Node* value = assembler->Float64Mod(var_dividend_float64.value(), |  1575     Node* value = assembler->Float64Mod(var_dividend_float64.value(), | 
|  1573                                         var_divisor_float64.value()); |  1576                                         var_divisor_float64.value()); | 
|  1574     Node* result = assembler->ChangeFloat64ToTagged(value); |  1577     var_result.Bind(assembler->ChangeFloat64ToTagged(value)); | 
|  1575     return result; |  1578     assembler->Goto(&return_result); | 
|  1576   } |  1579   } | 
 |  1580  | 
 |  1581   assembler->Bind(&return_result); | 
 |  1582   return var_result.value(); | 
|  1577 } |  1583 } | 
|  1578  |  1584  | 
|  1579 // static |  1585 // static | 
|  1580 compiler::Node* ShiftLeftStub::Generate(CodeStubAssembler* assembler, |  1586 compiler::Node* ShiftLeftStub::Generate(CodeStubAssembler* assembler, | 
|  1581                                         compiler::Node* left, |  1587                                         compiler::Node* left, | 
|  1582                                         compiler::Node* right, |  1588                                         compiler::Node* right, | 
|  1583                                         compiler::Node* context) { |  1589                                         compiler::Node* context) { | 
|  1584   using compiler::Node; |  1590   using compiler::Node; | 
|  1585  |  1591  | 
|  1586   Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); |  1592   Node* lhs_value = assembler->TruncateTaggedToWord32(context, left); | 
| (...skipping 3337 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4924   if (type->Is(Type::UntaggedPointer())) { |  4930   if (type->Is(Type::UntaggedPointer())) { | 
|  4925     return Representation::External(); |  4931     return Representation::External(); | 
|  4926   } |  4932   } | 
|  4927  |  4933  | 
|  4928   DCHECK(!type->Is(Type::Untagged())); |  4934   DCHECK(!type->Is(Type::Untagged())); | 
|  4929   return Representation::Tagged(); |  4935   return Representation::Tagged(); | 
|  4930 } |  4936 } | 
|  4931  |  4937  | 
|  4932 }  // namespace internal |  4938 }  // namespace internal | 
|  4933 }  // namespace v8 |  4939 }  // namespace v8 | 
| OLD | NEW |