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

Side by Side Diff: src/x64/codegen-x64.cc

Issue 597022: Port FastCloneShallowArrayStub to ARM and x64. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « src/ia32/codegen-ia32.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2477 matching lines...) Expand 10 before | Expand all | Expand 10 after
2488 // Load a writable copy of the function of this activation in a 2488 // Load a writable copy of the function of this activation in a
2489 // register. 2489 // register.
2490 frame_->PushFunction(); 2490 frame_->PushFunction();
2491 Result literals = frame_->Pop(); 2491 Result literals = frame_->Pop();
2492 literals.ToRegister(); 2492 literals.ToRegister();
2493 frame_->Spill(literals.reg()); 2493 frame_->Spill(literals.reg());
2494 2494
2495 // Load the literals array of the function. 2495 // Load the literals array of the function.
2496 __ movq(literals.reg(), 2496 __ movq(literals.reg(),
2497 FieldOperand(literals.reg(), JSFunction::kLiteralsOffset)); 2497 FieldOperand(literals.reg(), JSFunction::kLiteralsOffset));
2498 // Literal array. 2498
2499 frame_->Push(&literals); 2499 frame_->Push(&literals);
2500 // Literal index.
2501 frame_->Push(Smi::FromInt(node->literal_index())); 2500 frame_->Push(Smi::FromInt(node->literal_index()));
2502 // Constant elements.
2503 frame_->Push(node->constant_elements()); 2501 frame_->Push(node->constant_elements());
2502 int length = node->values()->length();
2504 Result clone; 2503 Result clone;
2505 if (node->depth() > 1) { 2504 if (node->depth() > 1) {
2506 clone = frame_->CallRuntime(Runtime::kCreateArrayLiteral, 3); 2505 clone = frame_->CallRuntime(Runtime::kCreateArrayLiteral, 3);
2506 } else if (length > FastCloneShallowArrayStub::kMaximumLength) {
2507 clone = frame_->CallRuntime(Runtime::kCreateArrayLiteralShallow, 3);
2507 } else { 2508 } else {
2508 clone = frame_->CallRuntime(Runtime::kCreateArrayLiteralShallow, 3); 2509 FastCloneShallowArrayStub stub(length);
2510 clone = frame_->CallStub(&stub, 3);
2509 } 2511 }
2510 frame_->Push(&clone); 2512 frame_->Push(&clone);
2511 2513
2512 // Generate code to set the elements in the array that are not 2514 // Generate code to set the elements in the array that are not
2513 // literals. 2515 // literals.
2514 for (int i = 0; i < node->values()->length(); i++) { 2516 for (int i = 0; i < node->values()->length(); i++) {
2515 Expression* value = node->values()->at(i); 2517 Expression* value = node->values()->at(i);
2516 2518
2517 // If value is a literal the property value is already set in the 2519 // If value is a literal the property value is already set in the
2518 // boilerplate object. 2520 // boilerplate object.
(...skipping 3734 matching lines...) Expand 10 before | Expand all | Expand 10 after
6253 // Return and remove the on-stack parameter. 6255 // Return and remove the on-stack parameter.
6254 __ movq(rsi, rax); 6256 __ movq(rsi, rax);
6255 __ ret(1 * kPointerSize); 6257 __ ret(1 * kPointerSize);
6256 6258
6257 // Need to collect. Call into runtime system. 6259 // Need to collect. Call into runtime system.
6258 __ bind(&gc); 6260 __ bind(&gc);
6259 __ TailCallRuntime(ExternalReference(Runtime::kNewContext), 1, 1); 6261 __ TailCallRuntime(ExternalReference(Runtime::kNewContext), 1, 1);
6260 } 6262 }
6261 6263
6262 6264
6265 void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) {
6266 // Stack layout on entry:
6267 //
6268 // [rsp + kPointerSize]: constant elements.
6269 // [rsp + (2 * kPointerSize)]: literal index.
6270 // [rsp + (3 * kPointerSize)]: literals array.
6271
6272 // All sizes here are multiples of kPointerSize.
6273 int elements_size = (length_ > 0) ? FixedArray::SizeFor(length_) : 0;
6274 int size = JSArray::kSize + elements_size;
6275
6276 // Load boilerplate object into rcx and check if we need to create a
6277 // boilerplate.
6278 Label slow_case;
6279 __ movq(rcx, Operand(rsp, 3 * kPointerSize));
6280 __ movq(rax, Operand(rsp, 2 * kPointerSize));
6281 SmiIndex index = masm->SmiToIndex(rax, rax, kPointerSizeLog2);
6282 __ movq(rcx,
6283 FieldOperand(rcx, index.reg, index.scale, FixedArray::kHeaderSize));
6284 __ CompareRoot(rcx, Heap::kUndefinedValueRootIndex);
6285 __ j(equal, &slow_case);
6286
6287 // Allocate both the JS array and the elements array in one big
6288 // allocation. This avoids multiple limit checks.
6289 __ AllocateInNewSpace(size, rax, rbx, rdx, &slow_case, TAG_OBJECT);
6290
6291 // Copy the JS array part.
6292 for (int i = 0; i < JSArray::kSize; i += kPointerSize) {
6293 if ((i != JSArray::kElementsOffset) || (length_ == 0)) {
6294 __ movq(rbx, FieldOperand(rcx, i));
6295 __ movq(FieldOperand(rax, i), rbx);
6296 }
6297 }
6298
6299 if (length_ > 0) {
6300 // Get hold of the elements array of the boilerplate and setup the
6301 // elements pointer in the resulting object.
6302 __ movq(rcx, FieldOperand(rcx, JSArray::kElementsOffset));
6303 __ lea(rdx, Operand(rax, JSArray::kSize));
6304 __ movq(FieldOperand(rax, JSArray::kElementsOffset), rdx);
6305
6306 // Copy the elements array.
6307 for (int i = 0; i < elements_size; i += kPointerSize) {
6308 __ movq(rbx, FieldOperand(rcx, i));
6309 __ movq(FieldOperand(rdx, i), rbx);
6310 }
6311 }
6312
6313 // Return and remove the on-stack parameters.
6314 __ ret(3 * kPointerSize);
6315
6316 __ bind(&slow_case);
6317 ExternalReference runtime(Runtime::kCreateArrayLiteralShallow);
6318 __ TailCallRuntime(runtime, 3, 1);
6319 }
6320
6321
6263 void ToBooleanStub::Generate(MacroAssembler* masm) { 6322 void ToBooleanStub::Generate(MacroAssembler* masm) {
6264 Label false_result, true_result, not_string; 6323 Label false_result, true_result, not_string;
6265 __ movq(rax, Operand(rsp, 1 * kPointerSize)); 6324 __ movq(rax, Operand(rsp, 1 * kPointerSize));
6266 6325
6267 // 'null' => false. 6326 // 'null' => false.
6268 __ CompareRoot(rax, Heap::kNullValueRootIndex); 6327 __ CompareRoot(rax, Heap::kNullValueRootIndex);
6269 __ j(equal, &false_result); 6328 __ j(equal, &false_result);
6270 6329
6271 // Get the map and type of the heap object. 6330 // Get the map and type of the heap object.
6272 // We don't use CmpObjectType because we manipulate the type field. 6331 // We don't use CmpObjectType because we manipulate the type field.
(...skipping 2965 matching lines...) Expand 10 before | Expand all | Expand 10 after
9238 // Call the function from C++. 9297 // Call the function from C++.
9239 return FUNCTION_CAST<ModuloFunction>(buffer); 9298 return FUNCTION_CAST<ModuloFunction>(buffer);
9240 } 9299 }
9241 9300
9242 #endif 9301 #endif
9243 9302
9244 9303
9245 #undef __ 9304 #undef __
9246 9305
9247 } } // namespace v8::internal 9306 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ia32/codegen-ia32.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698