| 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/ast/ast.h" | 9 #include "src/ast/ast.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 4909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4920 | 4920 |
| 4921 assembler->Bind(&return_two53minus1); | 4921 assembler->Bind(&return_two53minus1); |
| 4922 assembler->Return(assembler->NumberConstant(kMaxSafeInteger)); | 4922 assembler->Return(assembler->NumberConstant(kMaxSafeInteger)); |
| 4923 | 4923 |
| 4924 assembler->Bind(&return_zero); | 4924 assembler->Bind(&return_zero); |
| 4925 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); | 4925 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); |
| 4926 } | 4926 } |
| 4927 } | 4927 } |
| 4928 | 4928 |
| 4929 void ToIntegerStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 4929 void ToIntegerStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 4930 typedef CodeStubAssembler::Label Label; | |
| 4931 typedef compiler::Node Node; | 4930 typedef compiler::Node Node; |
| 4932 typedef CodeStubAssembler::Variable Variable; | |
| 4933 | 4931 |
| 4934 Node* context = assembler->Parameter(1); | 4932 Node* input = assembler->Parameter(Descriptor::kArgument); |
| 4933 Node* context = assembler->Parameter(Descriptor::kContext); |
| 4935 | 4934 |
| 4936 // We might need to loop once for ToNumber conversion. | 4935 assembler->Return(assembler->ToInteger(context, input)); |
| 4937 Variable var_arg(assembler, MachineRepresentation::kTagged); | |
| 4938 Label loop(assembler, &var_arg); | |
| 4939 var_arg.Bind(assembler->Parameter(0)); | |
| 4940 assembler->Goto(&loop); | |
| 4941 assembler->Bind(&loop); | |
| 4942 { | |
| 4943 // Shared entry points. | |
| 4944 Label return_arg(assembler), return_zero(assembler, Label::kDeferred); | |
| 4945 | |
| 4946 // Load the current {arg} value. | |
| 4947 Node* arg = var_arg.value(); | |
| 4948 | |
| 4949 // Check if {arg} is a Smi. | |
| 4950 assembler->GotoIf(assembler->WordIsSmi(arg), &return_arg); | |
| 4951 | |
| 4952 // Check if {arg} is a HeapNumber. | |
| 4953 Label if_argisheapnumber(assembler), | |
| 4954 if_argisnotheapnumber(assembler, Label::kDeferred); | |
| 4955 assembler->Branch(assembler->WordEqual(assembler->LoadMap(arg), | |
| 4956 assembler->HeapNumberMapConstant()), | |
| 4957 &if_argisheapnumber, &if_argisnotheapnumber); | |
| 4958 | |
| 4959 assembler->Bind(&if_argisheapnumber); | |
| 4960 { | |
| 4961 // Load the floating-point value of {arg}. | |
| 4962 Node* arg_value = assembler->LoadHeapNumberValue(arg); | |
| 4963 | |
| 4964 // Check if {arg} is NaN. | |
| 4965 assembler->GotoUnless(assembler->Float64Equal(arg_value, arg_value), | |
| 4966 &return_zero); | |
| 4967 | |
| 4968 // Truncate {arg} towards zero. | |
| 4969 Node* value = assembler->Float64Trunc(arg_value); | |
| 4970 var_arg.Bind(assembler->ChangeFloat64ToTagged(value)); | |
| 4971 assembler->Goto(&return_arg); | |
| 4972 } | |
| 4973 | |
| 4974 assembler->Bind(&if_argisnotheapnumber); | |
| 4975 { | |
| 4976 // Need to convert {arg} to a Number first. | |
| 4977 Callable callable = CodeFactory::NonNumberToNumber(assembler->isolate()); | |
| 4978 var_arg.Bind(assembler->CallStub(callable, context, arg)); | |
| 4979 assembler->Goto(&loop); | |
| 4980 } | |
| 4981 | |
| 4982 assembler->Bind(&return_arg); | |
| 4983 assembler->Return(var_arg.value()); | |
| 4984 | |
| 4985 assembler->Bind(&return_zero); | |
| 4986 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); | |
| 4987 } | |
| 4988 } | 4936 } |
| 4989 | 4937 |
| 4990 void StoreInterceptorStub::GenerateAssembly( | 4938 void StoreInterceptorStub::GenerateAssembly( |
| 4991 CodeStubAssembler* assembler) const { | 4939 CodeStubAssembler* assembler) const { |
| 4992 typedef compiler::Node Node; | 4940 typedef compiler::Node Node; |
| 4993 | 4941 |
| 4994 Node* receiver = assembler->Parameter(Descriptor::kReceiver); | 4942 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
| 4995 Node* name = assembler->Parameter(Descriptor::kName); | 4943 Node* name = assembler->Parameter(Descriptor::kName); |
| 4996 Node* value = assembler->Parameter(Descriptor::kValue); | 4944 Node* value = assembler->Parameter(Descriptor::kValue); |
| 4997 Node* context = assembler->Parameter(Descriptor::kContext); | 4945 Node* context = assembler->Parameter(Descriptor::kContext); |
| (...skipping 1319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6317 | 6265 |
| 6318 if (type == MachineType::Pointer()) { | 6266 if (type == MachineType::Pointer()) { |
| 6319 return Representation::External(); | 6267 return Representation::External(); |
| 6320 } | 6268 } |
| 6321 | 6269 |
| 6322 return Representation::Tagged(); | 6270 return Representation::Tagged(); |
| 6323 } | 6271 } |
| 6324 | 6272 |
| 6325 } // namespace internal | 6273 } // namespace internal |
| 6326 } // namespace v8 | 6274 } // namespace v8 |
| OLD | NEW |