Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
| 8 | 8 |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 293 if (scope()->is_function_scope() && scope()->function() != NULL) { | 293 if (scope()->is_function_scope() && scope()->function() != NULL) { |
| 294 VariableDeclaration* function = scope()->function(); | 294 VariableDeclaration* function = scope()->function(); |
| 295 DCHECK(function->proxy()->var()->mode() == CONST || | 295 DCHECK(function->proxy()->var()->mode() == CONST || |
| 296 function->proxy()->var()->mode() == CONST_LEGACY); | 296 function->proxy()->var()->mode() == CONST_LEGACY); |
| 297 DCHECK(function->proxy()->var()->location() != Variable::UNALLOCATED); | 297 DCHECK(function->proxy()->var()->location() != Variable::UNALLOCATED); |
| 298 VisitVariableDeclaration(function); | 298 VisitVariableDeclaration(function); |
| 299 } | 299 } |
| 300 VisitDeclarations(scope()->declarations()); | 300 VisitDeclarations(scope()->declarations()); |
| 301 } | 301 } |
| 302 | 302 |
| 303 { Comment cmnt(masm_, "[ Stack check"); | 303 { |
| 304 Comment cmnt(masm_, "[ Stack check"); | |
| 304 PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS); | 305 PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS); |
| 305 Label ok; | 306 Label ok; |
| 306 DCHECK(jssp.Is(__ StackPointer())); | 307 DCHECK(jssp.Is(__ StackPointer())); |
| 307 __ CompareRoot(jssp, Heap::kStackLimitRootIndex); | 308 __ CompareRoot(jssp, Heap::kStackLimitRootIndex); |
| 308 __ B(hs, &ok); | 309 __ B(hs, &ok); |
| 309 PredictableCodeSizeScope predictable(masm_, | 310 PredictableCodeSizeScope predictable(masm_, |
| 310 Assembler::kCallSizeWithRelocation); | 311 Assembler::kCallSizeWithRelocation); |
| 311 __ Call(isolate()->builtins()->StackCheck(), RelocInfo::CODE_TARGET); | 312 __ Call(isolate()->builtins()->StackCheck(), RelocInfo::CODE_TARGET); |
| 312 __ Bind(&ok); | 313 __ Bind(&ok); |
| 313 } | 314 } |
| 314 | 315 |
| 315 { Comment cmnt(masm_, "[ Body"); | 316 { |
| 317 Comment cmnt(masm_, "[ Body"); | |
| 316 DCHECK(loop_depth() == 0); | 318 DCHECK(loop_depth() == 0); |
| 317 VisitStatements(function()->body()); | 319 VisitStatements(function()->body()); |
| 318 DCHECK(loop_depth() == 0); | 320 DCHECK(loop_depth() == 0); |
| 319 } | 321 } |
| 320 } | 322 } |
| 321 | 323 |
| 322 // Always emit a 'return undefined' in case control fell off the end of | 324 // Always emit a 'return undefined' in case control fell off the end of |
| 323 // the body. | 325 // the body. |
| 324 { Comment cmnt(masm_, "[ return <undefined>;"); | 326 { Comment cmnt(masm_, "[ return <undefined>;"); |
| 325 __ LoadRoot(x0, Heap::kUndefinedValueRootIndex); | 327 __ LoadRoot(x0, Heap::kUndefinedValueRootIndex); |
| (...skipping 1707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2033 DCHECK(!key->value()->IsSmi()); | 2035 DCHECK(!key->value()->IsSmi()); |
| 2034 DCHECK(prop->IsSuperAccess()); | 2036 DCHECK(prop->IsSuperAccess()); |
| 2035 | 2037 |
| 2036 __ Push(key->value()); | 2038 __ Push(key->value()); |
| 2037 __ CallRuntime(Runtime::kLoadFromSuper, 3); | 2039 __ CallRuntime(Runtime::kLoadFromSuper, 3); |
| 2038 } | 2040 } |
| 2039 | 2041 |
| 2040 | 2042 |
| 2041 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { | 2043 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { |
| 2042 SetSourcePosition(prop->position()); | 2044 SetSourcePosition(prop->position()); |
| 2043 // Call keyed load IC. It has arguments key and receiver in r0 and r1. | 2045 // Call keyed load IC. It has arguments key and receiver in x0 and x1. |
| 2044 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); | 2046 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); |
| 2045 if (FLAG_vector_ics) { | 2047 if (FLAG_vector_ics) { |
| 2046 __ Mov(VectorLoadICDescriptor::SlotRegister(), | 2048 __ Mov(VectorLoadICDescriptor::SlotRegister(), |
| 2047 SmiFromSlot(prop->PropertyFeedbackSlot())); | 2049 SmiFromSlot(prop->PropertyFeedbackSlot())); |
| 2048 CallIC(ic); | 2050 CallIC(ic); |
| 2049 } else { | 2051 } else { |
| 2050 CallIC(ic, prop->PropertyFeedbackId()); | 2052 CallIC(ic, prop->PropertyFeedbackId()); |
| 2051 } | 2053 } |
| 2052 } | 2054 } |
| 2053 | 2055 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2168 JumpPatchSite patch_site(masm_); // Unbound, signals no inlined smi code. | 2170 JumpPatchSite patch_site(masm_); // Unbound, signals no inlined smi code. |
| 2169 { | 2171 { |
| 2170 Assembler::BlockPoolsScope scope(masm_); | 2172 Assembler::BlockPoolsScope scope(masm_); |
| 2171 CallIC(code, expr->BinaryOperationFeedbackId()); | 2173 CallIC(code, expr->BinaryOperationFeedbackId()); |
| 2172 patch_site.EmitPatchInfo(); | 2174 patch_site.EmitPatchInfo(); |
| 2173 } | 2175 } |
| 2174 context()->Plug(x0); | 2176 context()->Plug(x0); |
| 2175 } | 2177 } |
| 2176 | 2178 |
| 2177 | 2179 |
| 2180 void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { | |
| 2181 // ctor is in x0. | |
| 2182 DCHECK(lit != NULL); | |
| 2183 __ push(x0); | |
| 2184 | |
| 2185 Register scratch = x1; | |
| 2186 __ Ldr(scratch, | |
| 2187 FieldMemOperand(x0, JSFunction::kPrototypeOrInitialMapOffset)); | |
| 2188 __ Push(scratch); | |
|
Dmitry Lomov (no reviews)
2014/10/27 21:37:13
Comment on why access check is not needed.
arv (Not doing code reviews)
2014/10/28 09:42:00
Done.
Dmitry Lomov (no reviews)
2014/10/28 10:34:08
Acknowledged.
| |
| 2189 | |
| 2190 for (int i = 0; i < lit->properties()->length(); i++) { | |
| 2191 ObjectLiteral::Property* property = lit->properties()->at(i); | |
| 2192 Literal* key = property->key()->AsLiteral(); | |
| 2193 Expression* value = property->value(); | |
| 2194 DCHECK(key != NULL); | |
| 2195 | |
| 2196 if (property->is_static()) { | |
| 2197 __ Peek(x1, kPointerSize); // constructor | |
|
Dmitry Lomov (no reviews)
2014/10/27 21:37:13
Nit: Use scratch register here.
arv (Not doing code reviews)
2014/10/28 09:42:00
Done.
Dmitry Lomov (no reviews)
2014/10/28 10:34:08
Acknowledged.
| |
| 2198 } else { | |
| 2199 __ Peek(x1, 0); // prototype | |
| 2200 } | |
| 2201 __ Push(x1); | |
| 2202 VisitForStackValue(key); | |
| 2203 | |
| 2204 switch (property->kind()) { | |
| 2205 case ObjectLiteral::Property::CONSTANT: | |
| 2206 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | |
| 2207 case ObjectLiteral::Property::COMPUTED: | |
| 2208 case ObjectLiteral::Property::PROTOTYPE: | |
| 2209 VisitForStackValue(value); | |
| 2210 __ Mov(x0, Smi::FromInt(NONE)); | |
| 2211 __ Push(x0); | |
| 2212 __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); | |
| 2213 break; | |
| 2214 | |
| 2215 case ObjectLiteral::Property::GETTER: | |
| 2216 VisitForStackValue(value); | |
| 2217 __ LoadRoot(x0, Heap::kNullValueRootIndex); | |
| 2218 __ push(x0); | |
| 2219 __ Mov(x0, Smi::FromInt(NONE)); | |
| 2220 __ Push(x0); | |
| 2221 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); | |
| 2222 break; | |
| 2223 | |
| 2224 case ObjectLiteral::Property::SETTER: | |
| 2225 __ LoadRoot(x0, Heap::kNullValueRootIndex); | |
| 2226 __ push(x0); | |
| 2227 VisitForStackValue(value); | |
| 2228 __ Mov(x0, Smi::FromInt(NONE)); | |
| 2229 __ Push(x0); | |
| 2230 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); | |
| 2231 break; | |
| 2232 | |
| 2233 default: | |
| 2234 UNREACHABLE(); | |
| 2235 } | |
| 2236 } | |
| 2237 | |
| 2238 // prototype | |
| 2239 __ CallRuntime(Runtime::kToFastProperties, 1); | |
| 2240 | |
| 2241 // constructor | |
| 2242 __ CallRuntime(Runtime::kToFastProperties, 1); | |
| 2243 | |
| 2244 context()->Plug(x0); | |
|
Dmitry Lomov (no reviews)
2014/10/27 21:37:13
The caller plugs context, no need to do this here.
arv (Not doing code reviews)
2014/10/28 09:42:00
Done.
Dmitry Lomov (no reviews)
2014/10/28 10:34:08
Acknowledged.
| |
| 2245 } | |
| 2246 | |
| 2247 | |
| 2178 void FullCodeGenerator::EmitAssignment(Expression* expr) { | 2248 void FullCodeGenerator::EmitAssignment(Expression* expr) { |
| 2179 DCHECK(expr->IsValidReferenceExpression()); | 2249 DCHECK(expr->IsValidReferenceExpression()); |
| 2180 | 2250 |
| 2181 Property* prop = expr->AsProperty(); | 2251 Property* prop = expr->AsProperty(); |
| 2182 LhsKind assign_type = GetAssignType(prop); | 2252 LhsKind assign_type = GetAssignType(prop); |
| 2183 | 2253 |
| 2184 switch (assign_type) { | 2254 switch (assign_type) { |
| 2185 case VARIABLE: { | 2255 case VARIABLE: { |
| 2186 Variable* var = expr->AsVariableProxy()->var(); | 2256 Variable* var = expr->AsVariableProxy()->var(); |
| 2187 EffectContext context(this); | 2257 EffectContext context(this); |
| (...skipping 2663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4851 JSGeneratorObject::ResumeMode resume_mode) { | 4921 JSGeneratorObject::ResumeMode resume_mode) { |
| 4852 ASM_LOCATION("FullCodeGenerator::EmitGeneratorResume"); | 4922 ASM_LOCATION("FullCodeGenerator::EmitGeneratorResume"); |
| 4853 Register value_reg = x0; | 4923 Register value_reg = x0; |
| 4854 Register generator_object = x1; | 4924 Register generator_object = x1; |
| 4855 Register the_hole = x2; | 4925 Register the_hole = x2; |
| 4856 Register operand_stack_size = w3; | 4926 Register operand_stack_size = w3; |
| 4857 Register function = x4; | 4927 Register function = x4; |
| 4858 | 4928 |
| 4859 // The value stays in x0, and is ultimately read by the resumed generator, as | 4929 // The value stays in x0, and is ultimately read by the resumed generator, as |
| 4860 // if CallRuntime(Runtime::kSuspendJSGeneratorObject) returned it. Or it | 4930 // if CallRuntime(Runtime::kSuspendJSGeneratorObject) returned it. Or it |
| 4861 // is read to throw the value when the resumed generator is already closed. r1 | 4931 // is read to throw the value when the resumed generator is already closed. x1 |
| 4862 // will hold the generator object until the activation has been resumed. | 4932 // will hold the generator object until the activation has been resumed. |
| 4863 VisitForStackValue(generator); | 4933 VisitForStackValue(generator); |
| 4864 VisitForAccumulatorValue(value); | 4934 VisitForAccumulatorValue(value); |
| 4865 __ Pop(generator_object); | 4935 __ Pop(generator_object); |
| 4866 | 4936 |
| 4867 // Check generator state. | 4937 // Check generator state. |
| 4868 Label wrong_state, closed_state, done; | 4938 Label wrong_state, closed_state, done; |
| 4869 __ Ldr(x10, FieldMemOperand(generator_object, | 4939 __ Ldr(x10, FieldMemOperand(generator_object, |
| 4870 JSGeneratorObject::kContinuationOffset)); | 4940 JSGeneratorObject::kContinuationOffset)); |
| 4871 STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting < 0); | 4941 STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting < 0); |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5260 return previous_; | 5330 return previous_; |
| 5261 } | 5331 } |
| 5262 | 5332 |
| 5263 | 5333 |
| 5264 #undef __ | 5334 #undef __ |
| 5265 | 5335 |
| 5266 | 5336 |
| 5267 } } // namespace v8::internal | 5337 } } // namespace v8::internal |
| 5268 | 5338 |
| 5269 #endif // V8_TARGET_ARCH_ARM64 | 5339 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |