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

Side by Side Diff: src/full-codegen/arm64/full-codegen-arm64.cc

Issue 1751613004: Get rid of the different kinds of yield in the AST & full-codegen. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Do an inline call. 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 | « src/full-codegen/arm/full-codegen-arm.cc ('k') | src/full-codegen/ia32/full-codegen-ia32.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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_ARM64 5 #if V8_TARGET_ARCH_ARM64
6 6
7 #include "src/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 3804 matching lines...) Expand 10 before | Expand all | Expand 10 after
3815 SetExpressionPosition(expr); 3815 SetExpressionPosition(expr);
3816 3816
3817 // Evaluate yielded value first; the initial iterator definition depends on 3817 // Evaluate yielded value first; the initial iterator definition depends on
3818 // this. It stays on the stack while we update the iterator. 3818 // this. It stays on the stack while we update the iterator.
3819 VisitForStackValue(expr->expression()); 3819 VisitForStackValue(expr->expression());
3820 3820
3821 // TODO(jbramley): Tidy this up once the merge is done, using named registers 3821 // TODO(jbramley): Tidy this up once the merge is done, using named registers
3822 // and suchlike. The implementation changes a little by bleeding_edge so I 3822 // and suchlike. The implementation changes a little by bleeding_edge so I
3823 // don't want to spend too much time on it now. 3823 // don't want to spend too much time on it now.
3824 3824
3825 switch (expr->yield_kind()) { 3825 Label suspend, continuation, post_runtime, resume;
3826 case Yield::kSuspend:
3827 // Pop value from top-of-stack slot; box result into result register.
3828 EmitCreateIteratorResult(false);
3829 PushOperand(result_register());
3830 // Fall through.
3831 case Yield::kInitial: {
3832 Label suspend, continuation, post_runtime, resume;
3833 3826
3834 __ B(&suspend); 3827 __ B(&suspend);
3835 // TODO(jbramley): This label is bound here because the following code 3828 // TODO(jbramley): This label is bound here because the following code
3836 // looks at its pos(). Is it possible to do something more efficient here, 3829 // looks at its pos(). Is it possible to do something more efficient here,
3837 // perhaps using Adr? 3830 // perhaps using Adr?
3838 __ Bind(&continuation); 3831 __ Bind(&continuation);
3839 // When we arrive here, the stack top is the resume mode and 3832 // When we arrive here, the stack top is the resume mode and
3840 // result_register() holds the input value (the argument given to the 3833 // result_register() holds the input value (the argument given to the
3841 // respective resume operation). 3834 // respective resume operation).
3842 __ RecordGeneratorContinuation(); 3835 __ RecordGeneratorContinuation();
3843 __ Pop(x1); 3836 __ Pop(x1);
3844 __ Cmp(x1, Smi::FromInt(JSGeneratorObject::RETURN)); 3837 __ Cmp(x1, Smi::FromInt(JSGeneratorObject::RETURN));
3845 __ B(ne, &resume); 3838 __ B(ne, &resume);
3846 __ Push(result_register()); 3839 __ Push(result_register());
3847 EmitCreateIteratorResult(true); 3840 EmitCreateIteratorResult(true);
3848 EmitUnwindAndReturn(); 3841 EmitUnwindAndReturn();
3849 3842
3850 __ Bind(&suspend); 3843 __ Bind(&suspend);
3851 OperandStackDepthIncrement(1); // Not popped on this path. 3844 OperandStackDepthIncrement(1); // Not popped on this path.
3852 VisitForAccumulatorValue(expr->generator_object()); 3845 VisitForAccumulatorValue(expr->generator_object());
3853 DCHECK((continuation.pos() > 0) && Smi::IsValid(continuation.pos())); 3846 DCHECK((continuation.pos() > 0) && Smi::IsValid(continuation.pos()));
3854 __ Mov(x1, Smi::FromInt(continuation.pos())); 3847 __ Mov(x1, Smi::FromInt(continuation.pos()));
3855 __ Str(x1, FieldMemOperand(x0, JSGeneratorObject::kContinuationOffset)); 3848 __ Str(x1, FieldMemOperand(x0, JSGeneratorObject::kContinuationOffset));
3856 __ Str(cp, FieldMemOperand(x0, JSGeneratorObject::kContextOffset)); 3849 __ Str(cp, FieldMemOperand(x0, JSGeneratorObject::kContextOffset));
3857 __ Mov(x1, cp); 3850 __ Mov(x1, cp);
3858 __ RecordWriteField(x0, JSGeneratorObject::kContextOffset, x1, x2, 3851 __ RecordWriteField(x0, JSGeneratorObject::kContextOffset, x1, x2,
3859 kLRHasBeenSaved, kDontSaveFPRegs); 3852 kLRHasBeenSaved, kDontSaveFPRegs);
3860 __ Add(x1, fp, StandardFrameConstants::kExpressionsOffset); 3853 __ Add(x1, fp, StandardFrameConstants::kExpressionsOffset);
3861 __ Cmp(__ StackPointer(), x1); 3854 __ Cmp(__ StackPointer(), x1);
3862 __ B(eq, &post_runtime); 3855 __ B(eq, &post_runtime);
3863 __ Push(x0); // generator object 3856 __ Push(x0); // generator object
3864 __ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1); 3857 __ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1);
3865 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 3858 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
3866 __ Bind(&post_runtime); 3859 __ Bind(&post_runtime);
3867 PopOperand(result_register()); 3860 PopOperand(result_register());
3868 EmitReturnSequence(); 3861 EmitReturnSequence();
3869 3862
3870 __ Bind(&resume); 3863 __ Bind(&resume);
3871 context()->Plug(result_register()); 3864 context()->Plug(result_register());
3872 break;
3873 }
3874
3875 case Yield::kFinal: {
3876 // Pop value from top-of-stack slot, box result into result register.
3877 EmitCreateIteratorResult(true);
3878 EmitUnwindAndReturn();
3879 break;
3880 }
3881
3882 case Yield::kDelegating:
3883 UNREACHABLE();
3884 }
3885 } 3865 }
3886 3866
3887 3867
3888 void FullCodeGenerator::EmitGeneratorResume(Expression *generator, 3868 void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
3889 Expression *value, 3869 Expression *value,
3890 JSGeneratorObject::ResumeMode resume_mode) { 3870 JSGeneratorObject::ResumeMode resume_mode) {
3891 ASM_LOCATION("FullCodeGenerator::EmitGeneratorResume"); 3871 ASM_LOCATION("FullCodeGenerator::EmitGeneratorResume");
3892 Register generator_object = x1; 3872 Register generator_object = x1;
3893 Register the_hole = x2; 3873 Register the_hole = x2;
3894 Register operand_stack_size = w3; 3874 Register operand_stack_size = w3;
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
4256 } 4236 }
4257 4237
4258 return INTERRUPT; 4238 return INTERRUPT;
4259 } 4239 }
4260 4240
4261 4241
4262 } // namespace internal 4242 } // namespace internal
4263 } // namespace v8 4243 } // namespace v8
4264 4244
4265 #endif // V8_TARGET_ARCH_ARM64 4245 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/full-codegen/arm/full-codegen-arm.cc ('k') | src/full-codegen/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698