Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Side by Side Diff: src/builtins.cc

Issue 1827813004: [turbofan] Introduce proper abstractions for ToNumber truncations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/code-stubs.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/builtins.h" 5 #include "src/builtins.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/api-arguments.h" 8 #include "src/api-arguments.h"
9 #include "src/api-natives.h" 9 #include "src/api-natives.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 2015 matching lines...) Expand 10 before | Expand all | Expand 10 after
2026 Handle<Object> x = args.at<Object>(1); 2026 Handle<Object> x = args.at<Object>(1);
2027 Handle<Object> y = args.at<Object>(2); 2027 Handle<Object> y = args.at<Object>(2);
2028 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x)); 2028 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x));
2029 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, y, Object::ToNumber(y)); 2029 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, y, Object::ToNumber(y));
2030 int product = static_cast<int>(NumberToUint32(*x) * NumberToUint32(*y)); 2030 int product = static_cast<int>(NumberToUint32(*x) * NumberToUint32(*y));
2031 return *isolate->factory()->NewNumberFromInt(product); 2031 return *isolate->factory()->NewNumberFromInt(product);
2032 } 2032 }
2033 2033
2034 // ES6 section 20.2.2.32 Math.sqrt ( x ) 2034 // ES6 section 20.2.2.32 Math.sqrt ( x )
2035 void Builtins::Generate_MathSqrt(compiler::CodeStubAssembler* assembler) { 2035 void Builtins::Generate_MathSqrt(compiler::CodeStubAssembler* assembler) {
2036 typedef compiler::CodeStubAssembler::Label Label; 2036 using compiler::Node;
2037 typedef compiler::Node Node;
2038 typedef compiler::CodeStubAssembler::Variable Variable;
2039 2037
2038 Node* x = assembler->Parameter(1);
2040 Node* context = assembler->Parameter(4); 2039 Node* context = assembler->Parameter(4);
2041 2040 Node* x_value = assembler->TruncateTaggedToFloat64(context, x);
2042 // Shared entry for the floating point sqrt. 2041 Node* value = assembler->Float64Sqrt(x_value);
2043 Label do_fsqrt(assembler); 2042 Node* result = assembler->AllocateHeapNumberWithValue(value);
2044 Variable var_fsqrt_x(assembler, MachineRepresentation::kFloat64); 2043 assembler->Return(result);
2045
2046 // We might need to loop once due to the ToNumber conversion.
2047 Variable var_x(assembler, MachineRepresentation::kTagged);
2048 Label loop(assembler, &var_x);
2049 var_x.Bind(assembler->Parameter(1));
2050 assembler->Goto(&loop);
2051 assembler->Bind(&loop);
2052 {
2053 // Load the current {x} value.
2054 Node* x = var_x.value();
2055
2056 // Check if {x} is a Smi or a HeapObject.
2057 Label if_xissmi(assembler), if_xisnotsmi(assembler);
2058 assembler->Branch(assembler->WordIsSmi(x), &if_xissmi, &if_xisnotsmi);
2059
2060 assembler->Bind(&if_xissmi);
2061 {
2062 // Perform the floating point sqrt.
2063 var_fsqrt_x.Bind(assembler->SmiToFloat64(x));
2064 assembler->Goto(&do_fsqrt);
2065 }
2066
2067 assembler->Bind(&if_xisnotsmi);
2068 {
2069 // Load the map of {x}.
2070 Node* x_map = assembler->LoadMap(x);
2071
2072 // Check if {x} is a HeapNumber.
2073 Label if_xisnumber(assembler),
2074 if_xisnotnumber(assembler, Label::kDeferred);
2075 assembler->Branch(
2076 assembler->WordEqual(x_map, assembler->HeapNumberMapConstant()),
2077 &if_xisnumber, &if_xisnotnumber);
2078
2079 assembler->Bind(&if_xisnumber);
2080 {
2081 // Perform the floating point sqrt.
2082 var_fsqrt_x.Bind(assembler->LoadHeapNumberValue(x));
2083 assembler->Goto(&do_fsqrt);
2084 }
2085
2086 assembler->Bind(&if_xisnotnumber);
2087 {
2088 // Convert {x} to a Number first.
2089 Callable callable =
2090 CodeFactory::NonNumberToNumber(assembler->isolate());
2091 var_x.Bind(assembler->CallStub(callable, context, x));
2092 assembler->Goto(&loop);
2093 }
2094 }
2095 }
2096
2097 assembler->Bind(&do_fsqrt);
2098 {
2099 Node* x = var_fsqrt_x.value();
2100 Node* value = assembler->Float64Sqrt(x);
2101 Node* result = assembler->AllocateHeapNumberWithValue(value);
2102 assembler->Return(result);
2103 }
2104 } 2044 }
2105 2045
2106 // ----------------------------------------------------------------------------- 2046 // -----------------------------------------------------------------------------
2107 // ES6 section 26.1 The Reflect Object 2047 // ES6 section 26.1 The Reflect Object
2108 2048
2109 2049
2110 // ES6 section 26.1.3 Reflect.defineProperty 2050 // ES6 section 26.1.3 Reflect.defineProperty
2111 BUILTIN(ReflectDefineProperty) { 2051 BUILTIN(ReflectDefineProperty) {
2112 HandleScope scope(isolate); 2052 HandleScope scope(isolate);
2113 DCHECK_EQ(4, args.length()); 2053 DCHECK_EQ(4, args.length());
(...skipping 2506 matching lines...) Expand 10 before | Expand all | Expand 10 after
4620 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) 4560 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T)
4621 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 4561 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
4622 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 4562 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
4623 #undef DEFINE_BUILTIN_ACCESSOR_C 4563 #undef DEFINE_BUILTIN_ACCESSOR_C
4624 #undef DEFINE_BUILTIN_ACCESSOR_A 4564 #undef DEFINE_BUILTIN_ACCESSOR_A
4625 #undef DEFINE_BUILTIN_ACCESSOR_T 4565 #undef DEFINE_BUILTIN_ACCESSOR_T
4626 #undef DEFINE_BUILTIN_ACCESSOR_H 4566 #undef DEFINE_BUILTIN_ACCESSOR_H
4627 4567
4628 } // namespace internal 4568 } // namespace internal
4629 } // namespace v8 4569 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698