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

Side by Side Diff: src/builtins.cc

Issue 1875583003: Separate CodeAssembler and CodeStubAssembler (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix gn build 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
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"
8 #include "src/api-arguments.h" 7 #include "src/api-arguments.h"
9 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/api.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
11 #include "src/bootstrapper.h" 11 #include "src/bootstrapper.h"
12 #include "src/code-factory.h" 12 #include "src/code-factory.h"
13 #include "src/compiler/code-stub-assembler.h" 13 #include "src/code-stub-assembler.h"
14 #include "src/dateparser-inl.h" 14 #include "src/dateparser-inl.h"
15 #include "src/elements.h" 15 #include "src/elements.h"
16 #include "src/frames-inl.h" 16 #include "src/frames-inl.h"
17 #include "src/gdb-jit.h" 17 #include "src/gdb-jit.h"
18 #include "src/ic/handler-compiler.h" 18 #include "src/ic/handler-compiler.h"
19 #include "src/ic/ic.h" 19 #include "src/ic/ic.h"
20 #include "src/isolate-inl.h" 20 #include "src/isolate-inl.h"
21 #include "src/messages.h" 21 #include "src/messages.h"
22 #include "src/profiler/cpu-profiler.h" 22 #include "src/profiler/cpu-profiler.h"
23 #include "src/property-descriptor.h" 23 #include "src/property-descriptor.h"
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 345
346 346
347 BUILTIN(Illegal) { 347 BUILTIN(Illegal) {
348 UNREACHABLE(); 348 UNREACHABLE();
349 return isolate->heap()->undefined_value(); // Make compiler happy. 349 return isolate->heap()->undefined_value(); // Make compiler happy.
350 } 350 }
351 351
352 352
353 BUILTIN(EmptyFunction) { return isolate->heap()->undefined_value(); } 353 BUILTIN(EmptyFunction) { return isolate->heap()->undefined_value(); }
354 354
355 void Builtins::Generate_ObjectHasOwnProperty( 355 void Builtins::Generate_ObjectHasOwnProperty(CodeStubAssembler* assembler) {
356 compiler::CodeStubAssembler* assembler) {
357 typedef compiler::Node Node; 356 typedef compiler::Node Node;
358 typedef compiler::CodeStubAssembler::Label Label; 357 typedef CodeStubAssembler::Label Label;
359 typedef compiler::CodeStubAssembler::Variable Variable; 358 typedef CodeStubAssembler::Variable Variable;
360 359
361 Node* object = assembler->Parameter(0); 360 Node* object = assembler->Parameter(0);
362 Node* key = assembler->Parameter(1); 361 Node* key = assembler->Parameter(1);
363 Node* context = assembler->Parameter(4); 362 Node* context = assembler->Parameter(4);
364 363
365 Label call_runtime(assembler), return_true(assembler), 364 Label call_runtime(assembler), return_true(assembler),
366 return_false(assembler); 365 return_false(assembler);
367 366
368 // Smi receivers do not have own properties. 367 // Smi receivers do not have own properties.
369 Label if_objectisnotsmi(assembler); 368 Label if_objectisnotsmi(assembler);
(...skipping 1757 matching lines...) Expand 10 before | Expand all | Expand 10 after
2127 HandleScope scope(isolate); 2126 HandleScope scope(isolate);
2128 DCHECK_EQ(2, args.length()); 2127 DCHECK_EQ(2, args.length());
2129 Handle<Object> x = args.at<Object>(1); 2128 Handle<Object> x = args.at<Object>(1);
2130 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x)); 2129 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x));
2131 return *isolate->factory()->NewHeapNumber(std::atan(x->Number())); 2130 return *isolate->factory()->NewHeapNumber(std::atan(x->Number()));
2132 } 2131 }
2133 2132
2134 namespace { 2133 namespace {
2135 2134
2136 void Generate_MathRoundingOperation( 2135 void Generate_MathRoundingOperation(
2137 compiler::CodeStubAssembler* assembler, 2136 CodeStubAssembler* assembler,
2138 compiler::Node* (compiler::CodeStubAssembler::*float64op)( 2137 compiler::Node* (CodeStubAssembler::*float64op)(compiler::Node*)) {
2139 compiler::Node*)) { 2138 typedef CodeStubAssembler::Label Label;
2140 typedef compiler::CodeStubAssembler::Label Label;
2141 typedef compiler::Node Node; 2139 typedef compiler::Node Node;
2142 typedef compiler::CodeStubAssembler::Variable Variable; 2140 typedef CodeStubAssembler::Variable Variable;
2143 2141
2144 Node* context = assembler->Parameter(4); 2142 Node* context = assembler->Parameter(4);
2145 2143
2146 // We might need to loop once for ToNumber conversion. 2144 // We might need to loop once for ToNumber conversion.
2147 Variable var_x(assembler, MachineRepresentation::kTagged); 2145 Variable var_x(assembler, MachineRepresentation::kTagged);
2148 Label loop(assembler, &var_x); 2146 Label loop(assembler, &var_x);
2149 var_x.Bind(assembler->Parameter(1)); 2147 var_x.Bind(assembler->Parameter(1));
2150 assembler->Goto(&loop); 2148 assembler->Goto(&loop);
2151 assembler->Bind(&loop); 2149 assembler->Bind(&loop);
2152 { 2150 {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2189 var_x.Bind(assembler->CallStub(callable, context, x)); 2187 var_x.Bind(assembler->CallStub(callable, context, x));
2190 assembler->Goto(&loop); 2188 assembler->Goto(&loop);
2191 } 2189 }
2192 } 2190 }
2193 } 2191 }
2194 } 2192 }
2195 2193
2196 } // namespace 2194 } // namespace
2197 2195
2198 // ES6 section 20.2.2.10 Math.ceil ( x ) 2196 // ES6 section 20.2.2.10 Math.ceil ( x )
2199 void Builtins::Generate_MathCeil(compiler::CodeStubAssembler* assembler) { 2197 void Builtins::Generate_MathCeil(CodeStubAssembler* assembler) {
2200 Generate_MathRoundingOperation(assembler, 2198 Generate_MathRoundingOperation(assembler, &CodeStubAssembler::Float64Ceil);
2201 &compiler::CodeStubAssembler::Float64Ceil);
2202 } 2199 }
2203 2200
2204 // ES6 section 20.2.2.11 Math.clz32 ( x ) 2201 // ES6 section 20.2.2.11 Math.clz32 ( x )
2205 void Builtins::Generate_MathClz32(compiler::CodeStubAssembler* assembler) { 2202 void Builtins::Generate_MathClz32(CodeStubAssembler* assembler) {
2206 typedef compiler::CodeStubAssembler::Label Label; 2203 typedef CodeStubAssembler::Label Label;
2207 typedef compiler::Node Node; 2204 typedef compiler::Node Node;
2208 typedef compiler::CodeStubAssembler::Variable Variable; 2205 typedef CodeStubAssembler::Variable Variable;
2209 2206
2210 Node* context = assembler->Parameter(4); 2207 Node* context = assembler->Parameter(4);
2211 2208
2212 // Shared entry point for the clz32 operation. 2209 // Shared entry point for the clz32 operation.
2213 Variable var_clz32_x(assembler, MachineRepresentation::kWord32); 2210 Variable var_clz32_x(assembler, MachineRepresentation::kWord32);
2214 Label do_clz32(assembler); 2211 Label do_clz32(assembler);
2215 2212
2216 // We might need to loop once for ToNumber conversion. 2213 // We might need to loop once for ToNumber conversion.
2217 Variable var_x(assembler, MachineRepresentation::kTagged); 2214 Variable var_x(assembler, MachineRepresentation::kTagged);
2218 Label loop(assembler, &var_x); 2215 Label loop(assembler, &var_x);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2263 assembler->Bind(&do_clz32); 2260 assembler->Bind(&do_clz32);
2264 { 2261 {
2265 Node* x_value = var_clz32_x.value(); 2262 Node* x_value = var_clz32_x.value();
2266 Node* value = assembler->Word32Clz(x_value); 2263 Node* value = assembler->Word32Clz(x_value);
2267 Node* result = assembler->ChangeInt32ToTagged(value); 2264 Node* result = assembler->ChangeInt32ToTagged(value);
2268 assembler->Return(result); 2265 assembler->Return(result);
2269 } 2266 }
2270 } 2267 }
2271 2268
2272 // ES6 section 20.2.2.16 Math.floor ( x ) 2269 // ES6 section 20.2.2.16 Math.floor ( x )
2273 void Builtins::Generate_MathFloor(compiler::CodeStubAssembler* assembler) { 2270 void Builtins::Generate_MathFloor(CodeStubAssembler* assembler) {
2274 Generate_MathRoundingOperation(assembler, 2271 Generate_MathRoundingOperation(assembler, &CodeStubAssembler::Float64Floor);
2275 &compiler::CodeStubAssembler::Float64Floor);
2276 } 2272 }
2277 2273
2278 // ES6 section 20.2.2.17 Math.fround ( x ) 2274 // ES6 section 20.2.2.17 Math.fround ( x )
2279 BUILTIN(MathFround) { 2275 BUILTIN(MathFround) {
2280 HandleScope scope(isolate); 2276 HandleScope scope(isolate);
2281 DCHECK_EQ(2, args.length()); 2277 DCHECK_EQ(2, args.length());
2282 Handle<Object> x = args.at<Object>(1); 2278 Handle<Object> x = args.at<Object>(1);
2283 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x)); 2279 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x));
2284 float x32 = DoubleToFloat32(x->Number()); 2280 float x32 = DoubleToFloat32(x->Number());
2285 return *isolate->factory()->NewNumber(x32); 2281 return *isolate->factory()->NewNumber(x32);
2286 } 2282 }
2287 2283
2288 // ES6 section 20.2.2.19 Math.imul ( x, y ) 2284 // ES6 section 20.2.2.19 Math.imul ( x, y )
2289 BUILTIN(MathImul) { 2285 BUILTIN(MathImul) {
2290 HandleScope scope(isolate); 2286 HandleScope scope(isolate);
2291 DCHECK_EQ(3, args.length()); 2287 DCHECK_EQ(3, args.length());
2292 Handle<Object> x = args.at<Object>(1); 2288 Handle<Object> x = args.at<Object>(1);
2293 Handle<Object> y = args.at<Object>(2); 2289 Handle<Object> y = args.at<Object>(2);
2294 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x)); 2290 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, x, Object::ToNumber(x));
2295 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, y, Object::ToNumber(y)); 2291 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, y, Object::ToNumber(y));
2296 int product = static_cast<int>(NumberToUint32(*x) * NumberToUint32(*y)); 2292 int product = static_cast<int>(NumberToUint32(*x) * NumberToUint32(*y));
2297 return *isolate->factory()->NewNumberFromInt(product); 2293 return *isolate->factory()->NewNumberFromInt(product);
2298 } 2294 }
2299 2295
2300 // ES6 section 20.2.2.28 Math.round ( x ) 2296 // ES6 section 20.2.2.28 Math.round ( x )
2301 void Builtins::Generate_MathRound(compiler::CodeStubAssembler* assembler) { 2297 void Builtins::Generate_MathRound(CodeStubAssembler* assembler) {
2302 Generate_MathRoundingOperation(assembler, 2298 Generate_MathRoundingOperation(assembler, &CodeStubAssembler::Float64Round);
2303 &compiler::CodeStubAssembler::Float64Round);
2304 } 2299 }
2305 2300
2306 // ES6 section 20.2.2.32 Math.sqrt ( x ) 2301 // ES6 section 20.2.2.32 Math.sqrt ( x )
2307 void Builtins::Generate_MathSqrt(compiler::CodeStubAssembler* assembler) { 2302 void Builtins::Generate_MathSqrt(CodeStubAssembler* assembler) {
2308 using compiler::Node; 2303 using compiler::Node;
2309 2304
2310 Node* x = assembler->Parameter(1); 2305 Node* x = assembler->Parameter(1);
2311 Node* context = assembler->Parameter(4); 2306 Node* context = assembler->Parameter(4);
2312 Node* x_value = assembler->TruncateTaggedToFloat64(context, x); 2307 Node* x_value = assembler->TruncateTaggedToFloat64(context, x);
2313 Node* value = assembler->Float64Sqrt(x_value); 2308 Node* value = assembler->Float64Sqrt(x_value);
2314 Node* result = assembler->ChangeFloat64ToTagged(value); 2309 Node* result = assembler->ChangeFloat64ToTagged(value);
2315 assembler->Return(result); 2310 assembler->Return(result);
2316 } 2311 }
2317 2312
2318 // ES6 section 20.2.2.35 Math.trunc ( x ) 2313 // ES6 section 20.2.2.35 Math.trunc ( x )
2319 void Builtins::Generate_MathTrunc(compiler::CodeStubAssembler* assembler) { 2314 void Builtins::Generate_MathTrunc(CodeStubAssembler* assembler) {
2320 Generate_MathRoundingOperation(assembler, 2315 Generate_MathRoundingOperation(assembler, &CodeStubAssembler::Float64Trunc);
2321 &compiler::CodeStubAssembler::Float64Trunc);
2322 } 2316 }
2323 2317
2324 // ----------------------------------------------------------------------------- 2318 // -----------------------------------------------------------------------------
2325 // ES6 section 25.3 Generator Objects 2319 // ES6 section 25.3 Generator Objects
2326 2320
2327 namespace { 2321 namespace {
2328 2322
2329 void Generate_GeneratorPrototypeResume( 2323 void Generate_GeneratorPrototypeResume(
2330 compiler::CodeStubAssembler* assembler, 2324 CodeStubAssembler* assembler, JSGeneratorObject::ResumeMode resume_mode,
2331 JSGeneratorObject::ResumeMode resume_mode, char const* const method_name) { 2325 char const* const method_name) {
2332 typedef compiler::CodeStubAssembler::Label Label; 2326 typedef CodeStubAssembler::Label Label;
2333 typedef compiler::Node Node; 2327 typedef compiler::Node Node;
2334 2328
2335 Node* receiver = assembler->Parameter(0); 2329 Node* receiver = assembler->Parameter(0);
2336 Node* value = assembler->Parameter(1); 2330 Node* value = assembler->Parameter(1);
2337 Node* context = assembler->Parameter(4); 2331 Node* context = assembler->Parameter(4);
2338 Node* zero = assembler->SmiConstant(Smi::FromInt(0)); 2332 Node* zero = assembler->SmiConstant(Smi::FromInt(0));
2339 2333
2340 // Check if the {receiver} is actually a JSGeneratorObject. 2334 // Check if the {receiver} is actually a JSGeneratorObject.
2341 Label if_receiverisincompatible(assembler, Label::kDeferred); 2335 Label if_receiverisincompatible(assembler, Label::kDeferred);
2342 assembler->GotoIf(assembler->WordIsSmi(receiver), &if_receiverisincompatible); 2336 assembler->GotoIf(assembler->WordIsSmi(receiver), &if_receiverisincompatible);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2399 { 2393 {
2400 Node* result = 2394 Node* result =
2401 assembler->CallRuntime(Runtime::kThrowGeneratorRunning, context); 2395 assembler->CallRuntime(Runtime::kThrowGeneratorRunning, context);
2402 assembler->Return(result); // Never reached. 2396 assembler->Return(result); // Never reached.
2403 } 2397 }
2404 } 2398 }
2405 2399
2406 } // namespace 2400 } // namespace
2407 2401
2408 // ES6 section 25.3.1.2 Generator.prototype.next ( value ) 2402 // ES6 section 25.3.1.2 Generator.prototype.next ( value )
2409 void Builtins::Generate_GeneratorPrototypeNext( 2403 void Builtins::Generate_GeneratorPrototypeNext(CodeStubAssembler* assembler) {
2410 compiler::CodeStubAssembler* assembler) {
2411 Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kNext, 2404 Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kNext,
2412 "[Generator].prototype.next"); 2405 "[Generator].prototype.next");
2413 } 2406 }
2414 2407
2415 // ES6 section 25.3.1.3 Generator.prototype.return ( value ) 2408 // ES6 section 25.3.1.3 Generator.prototype.return ( value )
2416 void Builtins::Generate_GeneratorPrototypeReturn( 2409 void Builtins::Generate_GeneratorPrototypeReturn(CodeStubAssembler* assembler) {
2417 compiler::CodeStubAssembler* assembler) {
2418 Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kReturn, 2410 Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kReturn,
2419 "[Generator].prototype.return"); 2411 "[Generator].prototype.return");
2420 } 2412 }
2421 2413
2422 // ES6 section 25.3.1.4 Generator.prototype.throw ( exception ) 2414 // ES6 section 25.3.1.4 Generator.prototype.throw ( exception )
2423 void Builtins::Generate_GeneratorPrototypeThrow( 2415 void Builtins::Generate_GeneratorPrototypeThrow(CodeStubAssembler* assembler) {
2424 compiler::CodeStubAssembler* assembler) {
2425 Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kThrow, 2416 Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kThrow,
2426 "[Generator].prototype.throw"); 2417 "[Generator].prototype.throw");
2427 } 2418 }
2428 2419
2429 // ----------------------------------------------------------------------------- 2420 // -----------------------------------------------------------------------------
2430 // ES6 section 26.1 The Reflect Object 2421 // ES6 section 26.1 The Reflect Object
2431 2422
2432 // ES6 section 26.1.3 Reflect.defineProperty 2423 // ES6 section 26.1.3 Reflect.defineProperty
2433 BUILTIN(ReflectDefineProperty) { 2424 BUILTIN(ReflectDefineProperty) {
2434 HandleScope scope(isolate); 2425 HandleScope scope(isolate);
(...skipping 2352 matching lines...) Expand 10 before | Expand all | Expand 10 after
4787 // Move the code into the object heap. 4778 // Move the code into the object heap.
4788 CodeDesc desc; 4779 CodeDesc desc;
4789 masm.GetCode(&desc); 4780 masm.GetCode(&desc);
4790 Code::Flags flags = builtin_desc->flags; 4781 Code::Flags flags = builtin_desc->flags;
4791 return isolate->factory()->NewCode(desc, flags, masm.CodeObject()); 4782 return isolate->factory()->NewCode(desc, flags, masm.CodeObject());
4792 } 4783 }
4793 4784
4794 Handle<Code> CodeStubAssemblerBuilder(Isolate* isolate, 4785 Handle<Code> CodeStubAssemblerBuilder(Isolate* isolate,
4795 BuiltinDesc const* builtin_desc) { 4786 BuiltinDesc const* builtin_desc) {
4796 Zone zone(isolate->allocator()); 4787 Zone zone(isolate->allocator());
4797 compiler::CodeStubAssembler assembler(isolate, &zone, builtin_desc->argc, 4788 CodeStubAssembler assembler(isolate, &zone, builtin_desc->argc,
4798 builtin_desc->flags, 4789 builtin_desc->flags, builtin_desc->s_name);
4799 builtin_desc->s_name);
4800 // Generate the code/adaptor. 4790 // Generate the code/adaptor.
4801 typedef void (*Generator)(compiler::CodeStubAssembler*); 4791 typedef void (*Generator)(CodeStubAssembler*);
4802 Generator g = FUNCTION_CAST<Generator>(builtin_desc->generator); 4792 Generator g = FUNCTION_CAST<Generator>(builtin_desc->generator);
4803 g(&assembler); 4793 g(&assembler);
4804 return assembler.GenerateCode(); 4794 return assembler.GenerateCode();
4805 } 4795 }
4806 4796
4807 } // namespace 4797 } // namespace
4808 4798
4809 // Define array of pointers to generators and C builtin functions. 4799 // Define array of pointers to generators and C builtin functions.
4810 // We do this in a sort of roundabout way so that we can do the initialization 4800 // We do this in a sort of roundabout way so that we can do the initialization
4811 // within the lexical scope of Builtins:: and within a context where 4801 // within the lexical scope of Builtins:: and within a context where
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
4981 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) 4971 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T)
4982 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 4972 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
4983 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 4973 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
4984 #undef DEFINE_BUILTIN_ACCESSOR_C 4974 #undef DEFINE_BUILTIN_ACCESSOR_C
4985 #undef DEFINE_BUILTIN_ACCESSOR_A 4975 #undef DEFINE_BUILTIN_ACCESSOR_A
4986 #undef DEFINE_BUILTIN_ACCESSOR_T 4976 #undef DEFINE_BUILTIN_ACCESSOR_T
4987 #undef DEFINE_BUILTIN_ACCESSOR_H 4977 #undef DEFINE_BUILTIN_ACCESSOR_H
4988 4978
4989 } // namespace internal 4979 } // namespace internal
4990 } // namespace v8 4980 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698