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

Side by Side Diff: src/builtins.cc

Issue 1828253002: [builtins] Provide Math.floor as TurboFan builtin. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE. Address feedback. Created 4 years, 8 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 | « src/builtins.h ('k') | 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 1989 matching lines...) Expand 10 before | Expand all | Expand 10 after
2000 2000
2001 // ES6 section 20.2.2.6 Math.atan ( x ) 2001 // ES6 section 20.2.2.6 Math.atan ( x )
2002 BUILTIN(MathAtan) { 2002 BUILTIN(MathAtan) {
2003 HandleScope scope(isolate); 2003 HandleScope scope(isolate);
2004 DCHECK_EQ(2, args.length()); 2004 DCHECK_EQ(2, args.length());
2005 Handle<Object> x = args.at<Object>(1); 2005 Handle<Object> x = args.at<Object>(1);
2006 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x)); 2006 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x));
2007 return *isolate->factory()->NewHeapNumber(std::atan(x->Number())); 2007 return *isolate->factory()->NewHeapNumber(std::atan(x->Number()));
2008 } 2008 }
2009 2009
2010 // ES6 section 20.2.2.16 Math.floor ( x )
2011 void Builtins::Generate_MathFloor(compiler::CodeStubAssembler* assembler) {
2012 typedef compiler::CodeStubAssembler::Label Label;
2013 typedef compiler::Node Node;
2014 typedef compiler::CodeStubAssembler::Variable Variable;
2015
2016 Node* context = assembler->Parameter(4);
2017
2018 // We might need to loop once for ToNumber conversion.
2019 Variable var_x(assembler, MachineRepresentation::kTagged);
2020 Label loop(assembler, &var_x);
2021 var_x.Bind(assembler->Parameter(1));
2022 assembler->Goto(&loop);
2023 assembler->Bind(&loop);
2024 {
2025 // Load the current {x} value.
2026 Node* x = var_x.value();
2027
2028 // Check if {x} is a Smi or a HeapObject.
2029 Label if_xissmi(assembler), if_xisnotsmi(assembler);
2030 assembler->Branch(assembler->WordIsSmi(x), &if_xissmi, &if_xisnotsmi);
2031
2032 assembler->Bind(&if_xissmi);
2033 {
2034 // Nothing to do when {x} is a Smi.
2035 assembler->Return(x);
2036 }
2037
2038 assembler->Bind(&if_xisnotsmi);
2039 {
2040 // Check if {x} is a HeapNumber.
2041 Label if_xisheapnumber(assembler),
2042 if_xisnotheapnumber(assembler, Label::kDeferred);
2043 assembler->Branch(
2044 assembler->WordEqual(assembler->LoadMap(x),
2045 assembler->HeapNumberMapConstant()),
2046 &if_xisheapnumber, &if_xisnotheapnumber);
2047
2048 assembler->Bind(&if_xisheapnumber);
2049 {
2050 Node* x_value = assembler->LoadHeapNumberValue(x);
2051 Node* value = assembler->Float64Floor(x_value);
2052 Node* result = assembler->ChangeFloat64ToTagged(value);
2053 assembler->Return(result);
2054 }
2055
2056 assembler->Bind(&if_xisnotheapnumber);
2057 {
2058 // Need to convert {x} to a Number first.
2059 Callable callable =
2060 CodeFactory::NonNumberToNumber(assembler->isolate());
2061 var_x.Bind(assembler->CallStub(callable, context, x));
2062 assembler->Goto(&loop);
2063 }
2064 }
2065 }
2066 }
2010 2067
2011 // ES6 section 20.2.2.17 Math.fround ( x ) 2068 // ES6 section 20.2.2.17 Math.fround ( x )
2012 BUILTIN(MathFround) { 2069 BUILTIN(MathFround) {
2013 HandleScope scope(isolate); 2070 HandleScope scope(isolate);
2014 DCHECK_EQ(2, args.length()); 2071 DCHECK_EQ(2, args.length());
2015 Handle<Object> x = args.at<Object>(1); 2072 Handle<Object> x = args.at<Object>(1);
2016 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x)); 2073 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x));
2017 float x32 = DoubleToFloat32(x->Number()); 2074 float x32 = DoubleToFloat32(x->Number());
2018 return *isolate->factory()->NewNumber(x32); 2075 return *isolate->factory()->NewNumber(x32);
2019 } 2076 }
2020 2077
2021
2022 // ES6 section 20.2.2.19 Math.imul ( x, y ) 2078 // ES6 section 20.2.2.19 Math.imul ( x, y )
2023 BUILTIN(MathImul) { 2079 BUILTIN(MathImul) {
2024 HandleScope scope(isolate); 2080 HandleScope scope(isolate);
2025 DCHECK_EQ(3, args.length()); 2081 DCHECK_EQ(3, args.length());
2026 Handle<Object> x = args.at<Object>(1); 2082 Handle<Object> x = args.at<Object>(1);
2027 Handle<Object> y = args.at<Object>(2); 2083 Handle<Object> y = args.at<Object>(2);
2028 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x)); 2084 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x));
2029 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, y, Object::ToNumber(y)); 2085 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, y, Object::ToNumber(y));
2030 int product = static_cast<int>(NumberToUint32(*x) * NumberToUint32(*y)); 2086 int product = static_cast<int>(NumberToUint32(*x) * NumberToUint32(*y));
2031 return *isolate->factory()->NewNumberFromInt(product); 2087 return *isolate->factory()->NewNumberFromInt(product);
2032 } 2088 }
2033 2089
2034 // ES6 section 20.2.2.32 Math.sqrt ( x ) 2090 // ES6 section 20.2.2.32 Math.sqrt ( x )
2035 void Builtins::Generate_MathSqrt(compiler::CodeStubAssembler* assembler) { 2091 void Builtins::Generate_MathSqrt(compiler::CodeStubAssembler* assembler) {
2036 using compiler::Node; 2092 using compiler::Node;
2037 2093
2038 Node* x = assembler->Parameter(1); 2094 Node* x = assembler->Parameter(1);
2039 Node* context = assembler->Parameter(4); 2095 Node* context = assembler->Parameter(4);
2040 Node* x_value = assembler->TruncateTaggedToFloat64(context, x); 2096 Node* x_value = assembler->TruncateTaggedToFloat64(context, x);
2041 Node* value = assembler->Float64Sqrt(x_value); 2097 Node* value = assembler->Float64Sqrt(x_value);
2042 Node* result = assembler->AllocateHeapNumberWithValue(value); 2098 Node* result = assembler->ChangeFloat64ToTagged(value);
2043 assembler->Return(result); 2099 assembler->Return(result);
2044 } 2100 }
2045 2101
2046 // ----------------------------------------------------------------------------- 2102 // -----------------------------------------------------------------------------
2047 // ES6 section 26.1 The Reflect Object 2103 // ES6 section 26.1 The Reflect Object
2048 2104
2049 2105
2050 // ES6 section 26.1.3 Reflect.defineProperty 2106 // ES6 section 26.1.3 Reflect.defineProperty
2051 BUILTIN(ReflectDefineProperty) { 2107 BUILTIN(ReflectDefineProperty) {
2052 HandleScope scope(isolate); 2108 HandleScope scope(isolate);
(...skipping 2507 matching lines...) Expand 10 before | Expand all | Expand 10 after
4560 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) 4616 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T)
4561 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 4617 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
4562 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 4618 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
4563 #undef DEFINE_BUILTIN_ACCESSOR_C 4619 #undef DEFINE_BUILTIN_ACCESSOR_C
4564 #undef DEFINE_BUILTIN_ACCESSOR_A 4620 #undef DEFINE_BUILTIN_ACCESSOR_A
4565 #undef DEFINE_BUILTIN_ACCESSOR_T 4621 #undef DEFINE_BUILTIN_ACCESSOR_T
4566 #undef DEFINE_BUILTIN_ACCESSOR_H 4622 #undef DEFINE_BUILTIN_ACCESSOR_H
4567 4623
4568 } // namespace internal 4624 } // namespace internal
4569 } // namespace v8 4625 } // namespace v8
OLDNEW
« no previous file with comments | « src/builtins.h ('k') | src/code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698