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

Side by Side Diff: src/builtins/ppc/builtins-ppc.cc

Issue 2875073003: PPC/s390: [turbofan] [builtins] Unify construct builtins for JS functions and classes and add inlin… (Closed)
Patch Set: added s390 port Created 3 years, 7 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/builtins/s390/builtins-s390.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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 #if V8_TARGET_ARCH_PPC 5 #if V8_TARGET_ARCH_PPC
6 6
7 #include "src/codegen.h" 7 #include "src/codegen.h"
8 #include "src/debug/debug.h" 8 #include "src/debug/debug.h"
9 #include "src/deoptimizer.h" 9 #include "src/deoptimizer.h"
10 #include "src/full-codegen/full-codegen.h" 10 #include "src/full-codegen/full-codegen.h"
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 __ bge(&ok); 439 __ bge(&ok);
440 440
441 GenerateTailCallToReturnedCode(masm, Runtime::kTryInstallOptimizedCode); 441 GenerateTailCallToReturnedCode(masm, Runtime::kTryInstallOptimizedCode);
442 442
443 __ bind(&ok); 443 __ bind(&ok);
444 GenerateTailCallToSharedCode(masm); 444 GenerateTailCallToSharedCode(masm);
445 } 445 }
446 446
447 namespace { 447 namespace {
448 448
449 void Generate_JSConstructStubHelper(MacroAssembler* masm, bool is_api_function, 449 void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) {
450 bool create_implicit_receiver,
451 bool disallow_non_object_return) {
452 Label post_instantiation_deopt_entry; 450 Label post_instantiation_deopt_entry;
453 // ----------- S t a t e ------------- 451 // ----------- S t a t e -------------
454 // -- r3 : number of arguments 452 // -- r3 : number of arguments
455 // -- r4 : constructor function 453 // -- r4 : constructor function
456 // -- r6 : new target 454 // -- r6 : new target
457 // -- cp : context 455 // -- cp : context
458 // -- lr : return address 456 // -- lr : return address
459 // -- sp[...]: constructor arguments 457 // -- sp[...]: constructor arguments
460 // ----------------------------------- 458 // -----------------------------------
461 459
462 Isolate* isolate = masm->isolate();
463
464 // Enter a construct frame. 460 // Enter a construct frame.
465 { 461 {
466 FrameAndConstantPoolScope scope(masm, StackFrame::CONSTRUCT); 462 FrameAndConstantPoolScope scope(masm, StackFrame::CONSTRUCT);
467 463
468 // Preserve the incoming parameters on the stack. 464 // Preserve the incoming parameters on the stack.
469 465
470 if (!create_implicit_receiver) { 466 __ SmiTag(r3);
471 __ SmiTag(r7, r3, SetRC); 467 __ Push(cp, r3);
472 __ Push(cp, r7); 468 __ SmiUntag(r3, SetRC);
473 __ PushRoot(Heap::kTheHoleValueRootIndex); 469 // The receiver for the builtin/api call.
474 } else { 470 __ PushRoot(Heap::kTheHoleValueRootIndex);
475 __ SmiTag(r3);
476 __ Push(cp, r3);
477
478 // Allocate the new receiver object.
479 __ Push(r4, r6);
480 __ Call(CodeFactory::FastNewObject(masm->isolate()).code(),
481 RelocInfo::CODE_TARGET);
482 __ mr(r7, r3);
483 __ Pop(r4, r6);
484
485 // ----------- S t a t e -------------
486 // -- r4: constructor function
487 // -- r6: new target
488 // -- r7: newly allocated object
489 // -----------------------------------
490
491 // Retrieve smi-tagged arguments count from the stack.
492 __ LoadP(r3, MemOperand(sp));
493 __ SmiUntag(r3, SetRC);
494
495 // Push the allocated receiver to the stack. We need two copies
496 // because we may have to return the original one and the calling
497 // conventions dictate that the called function pops the receiver.
498 __ Push(r7, r7);
499 }
500
501 // Deoptimizer re-enters stub code here.
502 __ bind(&post_instantiation_deopt_entry);
503
504 // Set up pointer to last argument. 471 // Set up pointer to last argument.
505 __ addi(r5, fp, Operand(StandardFrameConstants::kCallerSPOffset)); 472 __ addi(r7, fp, Operand(StandardFrameConstants::kCallerSPOffset));
506 473
507 // Copy arguments and receiver to the expression stack. 474 // Copy arguments and receiver to the expression stack.
508 // r3: number of arguments 475
509 // r4: constructor function
510 // r5: address of last argument (caller sp)
511 // r6: new target
512 // cr0: condition indicating whether r3 is zero
513 // sp[0]: receiver
514 // sp[1]: receiver
515 // sp[2]: number of arguments (smi-tagged)
516 Label loop, no_args; 476 Label loop, no_args;
477 // ----------- S t a t e -------------
478 // -- r3: number of arguments (untagged)
479 // -- r4: constructor function
480 // -- r6: new target
481 // -- r7: pointer to last argument
482 // -- cr0: condition indicating whether r3 is zero
483 // -- sp[0*kPointerSize]: the hole (receiver)
484 // -- sp[1*kPointerSize]: number of arguments (tagged)
485 // -- sp[2*kPointerSize]: context
486 // -----------------------------------
517 __ beq(&no_args, cr0); 487 __ beq(&no_args, cr0);
518 __ ShiftLeftImm(ip, r3, Operand(kPointerSizeLog2)); 488 __ ShiftLeftImm(ip, r3, Operand(kPointerSizeLog2));
519 __ sub(sp, sp, ip); 489 __ sub(sp, sp, ip);
520 __ mtctr(r3); 490 __ mtctr(r3);
521 __ bind(&loop); 491 __ bind(&loop);
522 __ subi(ip, ip, Operand(kPointerSize)); 492 __ subi(ip, ip, Operand(kPointerSize));
523 __ LoadPX(r0, MemOperand(r5, ip)); 493 __ LoadPX(r0, MemOperand(r7, ip));
524 __ StorePX(r0, MemOperand(sp, ip)); 494 __ StorePX(r0, MemOperand(sp, ip));
525 __ bdnz(&loop); 495 __ bdnz(&loop);
526 __ bind(&no_args); 496 __ bind(&no_args);
527 497
528 // Call the function. 498 // Call the function.
529 // r3: number of arguments 499 // r3: number of arguments (untagged)
530 // r4: constructor function 500 // r4: constructor function
531 // r6: new target 501 // r6: new target
532 { 502 {
533 ConstantPoolUnavailableScope constant_pool_unavailable(masm); 503 ConstantPoolUnavailableScope constant_pool_unavailable(masm);
534 ParameterCount actual(r3); 504 ParameterCount actual(r3);
505 __ InvokeFunction(r4, r6, actual, CALL_FUNCTION,
506 CheckDebugStepCallWrapper());
507 }
508
509 // Restore context from the frame.
510 __ LoadP(cp, MemOperand(fp, ConstructFrameConstants::kContextOffset));
511 // Restore smi-tagged arguments count from the frame.
512 __ LoadP(r4, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
513
514 // Leave construct frame.
515 }
516 // Remove caller arguments from the stack and return.
517 STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
518
519 __ SmiToPtrArrayOffset(r4, r4);
520 __ add(sp, sp, r4);
521 __ addi(sp, sp, Operand(kPointerSize));
522 __ blr();
523 }
524
525 // The construct stub for ES5 constructor functions and ES6 class constructors.
526 void Generate_JSConstructStubGeneric(MacroAssembler* masm,
527 bool restrict_constructor_return) {
528 // ----------- S t a t e -------------
529 // -- r3: number of arguments (untagged)
530 // -- r4: constructor function
531 // -- r6: new target
532 // -- cp: context
533 // -- lr: return address
534 // -- sp[...]: constructor arguments
535 // -----------------------------------
536
537 // Enter a construct frame.
538 {
539 FrameAndConstantPoolScope scope(masm, StackFrame::CONSTRUCT);
540 Label post_instantiation_deopt_entry, not_create_implicit_receiver;
541
542 // Preserve the incoming parameters on the stack.
543 __ SmiTag(r3);
544 __ Push(cp, r3, r4, r6);
545
546 // ----------- S t a t e -------------
547 // -- sp[0*kPointerSize]: new target
548 // -- r4 and sp[1*kPointerSize]: constructor function
549 // -- sp[2*kPointerSize]: number of arguments (tagged)
550 // -- sp[3*kPointerSize]: context
551 // -----------------------------------
552
553 __ LoadP(r7, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
554 __ lwz(r7, FieldMemOperand(r7, SharedFunctionInfo::kCompilerHintsOffset));
555 __ TestBitMask(r7,
556 FunctionKind::kDerivedConstructor
557 << SharedFunctionInfo::kFunctionKindShift,
558 r0);
559 __ bne(&not_create_implicit_receiver, cr0);
560
561 // If not derived class constructor: Allocate the new receiver object.
562 __ IncrementCounter(masm->isolate()->counters()->constructed_objects(), 1,
563 r7, r8);
564 __ Call(CodeFactory::FastNewObject(masm->isolate()).code(),
565 RelocInfo::CODE_TARGET);
566 __ b(&post_instantiation_deopt_entry);
567
568 // Else: use TheHoleValue as receiver for constructor call
569 __ bind(&not_create_implicit_receiver);
570 __ LoadRoot(r3, Heap::kTheHoleValueRootIndex);
571
572 // ----------- S t a t e -------------
573 // -- r3: receiver
574 // -- Slot 3 / sp[0*kPointerSize]: new target
575 // -- Slot 2 / sp[1*kPointerSize]: constructor function
576 // -- Slot 1 / sp[2*kPointerSize]: number of arguments (tagged)
577 // -- Slot 0 / sp[3*kPointerSize]: context
578 // -----------------------------------
579 // Deoptimizer enters here.
580 masm->isolate()->heap()->SetConstructStubCreateDeoptPCOffset(
581 masm->pc_offset());
582 __ bind(&post_instantiation_deopt_entry);
583
584 // Restore new target.
585 __ Pop(r6);
586 // Push the allocated receiver to the stack. We need two copies
587 // because we may have to return the original one and the calling
588 // conventions dictate that the called function pops the receiver.
589 __ Push(r3, r3);
590
591 // ----------- S t a t e -------------
592 // -- r6: new target
593 // -- sp[0*kPointerSize]: implicit receiver
594 // -- sp[1*kPointerSize]: implicit receiver
595 // -- sp[2*kPointerSize]: constructor function
596 // -- sp[3*kPointerSize]: number of arguments (tagged)
597 // -- sp[4*kPointerSize]: context
598 // -----------------------------------
599
600 // Restore constructor function and argument count.
601 __ LoadP(r4, MemOperand(fp, ConstructFrameConstants::kConstructorOffset));
602 __ LoadP(r3, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
603 __ SmiUntag(r3, SetRC);
604
605 // Set up pointer to last argument.
606 __ addi(r7, fp, Operand(StandardFrameConstants::kCallerSPOffset));
607
608 // Copy arguments and receiver to the expression stack.
609 Label loop, no_args;
610 // ----------- S t a t e -------------
611 // -- r3: number of arguments (untagged)
612 // -- r6: new target
613 // -- r7: pointer to last argument
614 // -- cr0: condition indicating whether r3 is zero
615 // -- sp[0*kPointerSize]: implicit receiver
616 // -- sp[1*kPointerSize]: implicit receiver
617 // -- r4 and sp[2*kPointerSize]: constructor function
618 // -- sp[3*kPointerSize]: number of arguments (tagged)
619 // -- sp[4*kPointerSize]: context
620 // -----------------------------------
621 __ beq(&no_args, cr0);
622 __ ShiftLeftImm(ip, r3, Operand(kPointerSizeLog2));
623 __ sub(sp, sp, ip);
624 __ mtctr(r3);
625 __ bind(&loop);
626 __ subi(ip, ip, Operand(kPointerSize));
627 __ LoadPX(r0, MemOperand(r7, ip));
628 __ StorePX(r0, MemOperand(sp, ip));
629 __ bdnz(&loop);
630 __ bind(&no_args);
631
632 // Call the function.
633 {
634 ConstantPoolUnavailableScope constant_pool_unavailable(masm);
635 ParameterCount actual(r3);
535 __ InvokeFunction(r4, r6, actual, CALL_FUNCTION, 636 __ InvokeFunction(r4, r6, actual, CALL_FUNCTION,
536 CheckDebugStepCallWrapper()); 637 CheckDebugStepCallWrapper());
537 } 638 }
538 639
640 // ----------- S t a t e -------------
641 // -- r0: constructor result
642 // -- sp[0*kPointerSize]: implicit receiver
643 // -- sp[1*kPointerSize]: constructor function
644 // -- sp[2*kPointerSize]: number of arguments
645 // -- sp[3*kPointerSize]: context
646 // -----------------------------------
647
539 // Store offset of return address for deoptimizer. 648 // Store offset of return address for deoptimizer.
540 if (create_implicit_receiver && !disallow_non_object_return && 649 masm->isolate()->heap()->SetConstructStubInvokeDeoptPCOffset(
541 !is_api_function) { 650 masm->pc_offset());
542 masm->isolate()->heap()->SetConstructStubInvokeDeoptPCOffset( 651
543 masm->pc_offset()); 652 // Restore the context from the frame.
653 __ LoadP(cp, MemOperand(fp, ConstructFrameConstants::kContextOffset));
654
655 // If the result is an object (in the ECMA sense), we should get rid
656 // of the receiver and use the result; see ECMA-262 section 13.2.2-7
657 // on page 74.
658 Label use_receiver, do_throw, other_result, leave_frame;
659
660 // If the result is undefined, we jump out to using the implicit receiver.
661 __ JumpIfRoot(r3, Heap::kUndefinedValueRootIndex, &use_receiver);
662
663 // Otherwise we do a smi check and fall through to check if the return value
664 // is a valid receiver.
665
666 // If the result is a smi, it is *not* an object in the ECMA sense.
667 __ JumpIfSmi(r3, &other_result);
668
669 // If the type of the result (stored in its map) is less than
670 // FIRST_JS_RECEIVER_TYPE, it is not an object in the ECMA sense.
671 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
672 __ CompareObjectType(r3, r7, r7, FIRST_JS_RECEIVER_TYPE);
673 __ bge(&leave_frame);
674
675 __ bind(&other_result);
676 // The result is now neither undefined nor an object.
677 if (restrict_constructor_return) {
678 // Throw if constructor function is a class constructor
679 __ LoadP(r7, MemOperand(fp, ConstructFrameConstants::kConstructorOffset));
680 __ LoadP(r7, FieldMemOperand(r7, JSFunction::kSharedFunctionInfoOffset));
681 __ lwz(r7, FieldMemOperand(r7, SharedFunctionInfo::kCompilerHintsOffset));
682 __ TestBitMask(r7,
683 FunctionKind::kClassConstructor
684 << SharedFunctionInfo::kFunctionKindShift,
685 r0);
686 __ beq(&use_receiver, cr0);
687
688 } else {
689 __ b(&use_receiver);
544 } 690 }
545 691
546 // Restore context from the frame.
547 // r3: result
548 // sp[0]: receiver
549 // sp[1]: number of arguments (smi-tagged)
550 __ LoadP(cp, MemOperand(fp, ConstructFrameConstants::kContextOffset));
551
552 if (create_implicit_receiver) {
553 // If the result is an object (in the ECMA sense), we should get rid
554 // of the receiver and use the result; see ECMA-262 section 13.2.2-7
555 // on page 74.
556 Label use_receiver, return_value, do_throw;
557
558 // If the result is a smi, it is *not* an object in the ECMA sense.
559 // r3: result
560 // sp[0]: receiver
561 // sp[1]: number of arguments (smi-tagged)
562 // If the result is undefined, we jump out to using the implicit
563 // receiver, otherwise we do a smi check and fall through to
564 // check if the return value is a valid receiver.
565 if (disallow_non_object_return) {
566 __ CompareRoot(r3, Heap::kUndefinedValueRootIndex);
567 __ beq(&use_receiver);
568 __ JumpIfSmi(r3, &do_throw);
569 } else {
570 __ JumpIfSmi(r3, &use_receiver);
571 }
572
573 // If the type of the result (stored in its map) is less than
574 // FIRST_JS_RECEIVER_TYPE, it is not an object in the ECMA sense.
575 __ CompareObjectType(r3, r4, r6, FIRST_JS_RECEIVER_TYPE);
576 __ bge(&return_value);
577
578 if (disallow_non_object_return) {
579 __ bind(&do_throw);
580 __ CallRuntime(Runtime::kThrowConstructorReturnedNonObject);
581 }
582
583 // Throw away the result of the constructor invocation and use the
584 // on-stack receiver as the result.
585 __ bind(&use_receiver);
586 __ LoadP(r3, MemOperand(sp));
587
588 // Remove receiver from the stack, remove caller arguments, and
589 // return.
590 __ bind(&return_value);
591 // r3: result
592 // sp[0]: receiver (newly allocated object)
593 // sp[1]: number of arguments (smi-tagged)
594 __ LoadP(r4, MemOperand(sp, 1 * kPointerSize));
595 } else {
596 __ LoadP(r4, MemOperand(sp));
597 }
598
599 // Leave construct frame.
600 }
601
602 // ES6 9.2.2. Step 13+
603 // For derived class constructors, throw a TypeError here if the result
604 // is not a JSReceiver. For the base constructor, we've already checked
605 // the result, so we omit the check.
606 if (disallow_non_object_return && !create_implicit_receiver) {
607 Label do_throw, dont_throw;
608 __ JumpIfSmi(r3, &do_throw);
609 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
610 __ CompareObjectType(r3, r6, r6, FIRST_JS_RECEIVER_TYPE);
611 __ bge(&dont_throw);
612 __ bind(&do_throw); 692 __ bind(&do_throw);
613 { 693 {
614 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 694 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
615 __ CallRuntime(Runtime::kThrowConstructorReturnedNonObject); 695 __ CallRuntime(Runtime::kThrowConstructorReturnedNonObject);
616 } 696 }
617 __ bind(&dont_throw); 697
698 // Throw away the result of the constructor invocation and use the
699 // on-stack receiver as the result.
700 __ bind(&use_receiver);
701 __ LoadP(r3, MemOperand(sp));
702 __ JumpIfRoot(r3, Heap::kTheHoleValueRootIndex, &do_throw);
703
704 __ bind(&leave_frame);
705 // Restore smi-tagged arguments count from the frame.
706 __ LoadP(r4, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
707 // Leave construct frame.
618 } 708 }
619 709
710 // Remove caller arguments from the stack and return.
711 STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
712
620 __ SmiToPtrArrayOffset(r4, r4); 713 __ SmiToPtrArrayOffset(r4, r4);
621 __ add(sp, sp, r4); 714 __ add(sp, sp, r4);
622 __ addi(sp, sp, Operand(kPointerSize)); 715 __ addi(sp, sp, Operand(kPointerSize));
623 if (create_implicit_receiver) {
624 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, r4, r5);
625 }
626 __ blr(); 716 __ blr();
627 // Store offset of trampoline address for deoptimizer. This is the bailout
628 // point after the receiver instantiation but before the function invocation.
629 // We need to restore some registers in order to continue the above code.
630 if (create_implicit_receiver && !disallow_non_object_return &&
631 !is_api_function) {
632 masm->isolate()->heap()->SetConstructStubCreateDeoptPCOffset(
633 masm->pc_offset());
634
635 // ----------- S t a t e -------------
636 // -- r3 : newly allocated object
637 // -- sp[0] : constructor function
638 // -----------------------------------
639
640 __ pop(r4);
641 __ Push(r3, r3);
642
643 // Retrieve smi-tagged arguments count from the stack.
644 __ LoadP(r3, MemOperand(fp, ConstructFrameConstants::kLengthOffset));
645 __ SmiUntag(r3);
646
647 // Retrieve the new target value from the stack. This was placed into the
648 // frame description in place of the receiver by the optimizing compiler.
649 __ addi(r6, fp, Operand(StandardFrameConstants::kCallerSPOffset));
650 __ ShiftLeftImm(ip, r3, Operand(kPointerSizeLog2));
651 __ LoadPX(r6, MemOperand(r6, ip));
652
653 // Continue with constructor function invocation.
654 __ b(&post_instantiation_deopt_entry);
655 }
656 } 717 }
657 718
658 } // namespace 719 } // namespace
659 720
660 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { 721 void Builtins::Generate_JSConstructStubGenericRestrictedReturn(
661 Generate_JSConstructStubHelper(masm, false, true, false); 722 MacroAssembler* masm) {
723 Generate_JSConstructStubGeneric(masm, true);
662 } 724 }
663 725 void Builtins::Generate_JSConstructStubGenericUnrestrictedReturn(
726 MacroAssembler* masm) {
727 Generate_JSConstructStubGeneric(masm, false);
728 }
664 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) { 729 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) {
665 Generate_JSConstructStubHelper(masm, true, false, false); 730 Generate_JSBuiltinsConstructStubHelper(masm);
666 } 731 }
667
668 void Builtins::Generate_JSBuiltinsConstructStub(MacroAssembler* masm) { 732 void Builtins::Generate_JSBuiltinsConstructStub(MacroAssembler* masm) {
669 Generate_JSConstructStubHelper(masm, false, false, false); 733 Generate_JSBuiltinsConstructStubHelper(masm);
670 }
671
672 void Builtins::Generate_JSBuiltinsConstructStubForBase(MacroAssembler* masm) {
673 Generate_JSConstructStubHelper(masm, false, true, true);
674 }
675
676 void Builtins::Generate_JSBuiltinsConstructStubForDerived(
677 MacroAssembler* masm) {
678 Generate_JSConstructStubHelper(masm, false, false, true);
679 } 734 }
680 735
681 // static 736 // static
682 void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { 737 void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
683 // ----------- S t a t e ------------- 738 // ----------- S t a t e -------------
684 // -- r3 : the value to pass to the generator 739 // -- r3 : the value to pass to the generator
685 // -- r4 : the JSGeneratorObject to resume 740 // -- r4 : the JSGeneratorObject to resume
686 // -- r5 : the resume mode (tagged) 741 // -- r5 : the resume mode (tagged)
687 // -- r6 : the SuspendFlags of the earlier suspend call (tagged) 742 // -- r6 : the SuspendFlags of the earlier suspend call (tagged)
688 // -- lr : return address 743 // -- lr : return address
(...skipping 2424 matching lines...) Expand 10 before | Expand all | Expand 10 after
3113 } 3168 }
3114 // Now jump to the instructions of the returned code object. 3169 // Now jump to the instructions of the returned code object.
3115 __ Jump(r11); 3170 __ Jump(r11);
3116 } 3171 }
3117 3172
3118 #undef __ 3173 #undef __
3119 } // namespace internal 3174 } // namespace internal
3120 } // namespace v8 3175 } // namespace v8
3121 3176
3122 #endif // V8_TARGET_ARCH_PPC 3177 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « no previous file | src/builtins/s390/builtins-s390.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698