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

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

Issue 212163004: Hide some runtime functions. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 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 | Annotate | Revision Log
« no previous file with comments | « src/x64/full-codegen-x64.cc ('k') | src/x64/macro-assembler-x64.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 // 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 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 // Possibly allocate a local context. 216 // Possibly allocate a local context.
217 int heap_slots = info_->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; 217 int heap_slots = info_->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
218 if (heap_slots > 0) { 218 if (heap_slots > 0) {
219 Comment(";;; Allocate local context"); 219 Comment(";;; Allocate local context");
220 // Argument to NewContext is the function, which is still in rdi. 220 // Argument to NewContext is the function, which is still in rdi.
221 if (heap_slots <= FastNewContextStub::kMaximumSlots) { 221 if (heap_slots <= FastNewContextStub::kMaximumSlots) {
222 FastNewContextStub stub(heap_slots); 222 FastNewContextStub stub(heap_slots);
223 __ CallStub(&stub); 223 __ CallStub(&stub);
224 } else { 224 } else {
225 __ Push(rdi); 225 __ Push(rdi);
226 __ CallRuntime(Runtime::kNewFunctionContext, 1); 226 __ CallRuntime(Runtime::kHiddenNewFunctionContext, 1);
227 } 227 }
228 RecordSafepoint(Safepoint::kNoLazyDeopt); 228 RecordSafepoint(Safepoint::kNoLazyDeopt);
229 // Context is returned in rax. It replaces the context passed to us. 229 // Context is returned in rax. It replaces the context passed to us.
230 // It's saved in the stack and kept live in rsi. 230 // It's saved in the stack and kept live in rsi.
231 __ movp(rsi, rax); 231 __ movp(rsi, rax);
232 __ movp(Operand(rbp, StandardFrameConstants::kContextOffset), rax); 232 __ movp(Operand(rbp, StandardFrameConstants::kContextOffset), rax);
233 233
234 // Copy any necessary parameters into the context. 234 // Copy any necessary parameters into the context.
235 int num_parameters = scope()->num_parameters(); 235 int num_parameters = scope()->num_parameters();
236 for (int i = 0; i < num_parameters; i++) { 236 for (int i = 0; i < num_parameters; i++) {
(...skipping 3104 matching lines...) Expand 10 before | Expand all | Expand 10 after
3341 ASSERT(result.is(rsi)); 3341 ASSERT(result.is(rsi));
3342 } 3342 }
3343 } 3343 }
3344 3344
3345 3345
3346 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { 3346 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) {
3347 ASSERT(ToRegister(instr->context()).is(rsi)); 3347 ASSERT(ToRegister(instr->context()).is(rsi));
3348 __ Push(rsi); // The context is the first argument. 3348 __ Push(rsi); // The context is the first argument.
3349 __ Push(instr->hydrogen()->pairs()); 3349 __ Push(instr->hydrogen()->pairs());
3350 __ Push(Smi::FromInt(instr->hydrogen()->flags())); 3350 __ Push(Smi::FromInt(instr->hydrogen()->flags()));
3351 CallRuntime(Runtime::kDeclareGlobals, 3, instr); 3351 CallRuntime(Runtime::kHiddenDeclareGlobals, 3, instr);
3352 } 3352 }
3353 3353
3354 3354
3355 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, 3355 void LCodeGen::CallKnownFunction(Handle<JSFunction> function,
3356 int formal_parameter_count, 3356 int formal_parameter_count,
3357 int arity, 3357 int arity,
3358 LInstruction* instr, 3358 LInstruction* instr,
3359 RDIState rdi_state) { 3359 RDIState rdi_state) {
3360 bool dont_adapt_arguments = 3360 bool dont_adapt_arguments =
3361 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; 3361 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
3473 // unchanged by popping safepoint registers. 3473 // unchanged by popping safepoint registers.
3474 __ testl(tmp, Immediate(HeapNumber::kSignMask)); 3474 __ testl(tmp, Immediate(HeapNumber::kSignMask));
3475 __ j(zero, &done); 3475 __ j(zero, &done);
3476 3476
3477 __ AllocateHeapNumber(tmp, tmp2, &slow); 3477 __ AllocateHeapNumber(tmp, tmp2, &slow);
3478 __ jmp(&allocated, Label::kNear); 3478 __ jmp(&allocated, Label::kNear);
3479 3479
3480 // Slow case: Call the runtime system to do the number allocation. 3480 // Slow case: Call the runtime system to do the number allocation.
3481 __ bind(&slow); 3481 __ bind(&slow);
3482 CallRuntimeFromDeferred( 3482 CallRuntimeFromDeferred(
3483 Runtime::kAllocateHeapNumber, 0, instr, instr->context()); 3483 Runtime::kHiddenAllocateHeapNumber, 0, instr, instr->context());
3484 // Set the pointer to the new heap number in tmp. 3484 // Set the pointer to the new heap number in tmp.
3485 if (!tmp.is(rax)) __ movp(tmp, rax); 3485 if (!tmp.is(rax)) __ movp(tmp, rax);
3486 // Restore input_reg after call to runtime. 3486 // Restore input_reg after call to runtime.
3487 __ LoadFromSafepointRegisterSlot(input_reg, input_reg); 3487 __ LoadFromSafepointRegisterSlot(input_reg, input_reg);
3488 3488
3489 __ bind(&allocated); 3489 __ bind(&allocated);
3490 __ movq(tmp2, FieldOperand(input_reg, HeapNumber::kValueOffset)); 3490 __ movq(tmp2, FieldOperand(input_reg, HeapNumber::kValueOffset));
3491 __ shl(tmp2, Immediate(1)); 3491 __ shl(tmp2, Immediate(1));
3492 __ shr(tmp2, Immediate(1)); 3492 __ shr(tmp2, Immediate(1));
3493 __ movq(FieldOperand(tmp, HeapNumber::kValueOffset), tmp2); 3493 __ movq(FieldOperand(tmp, HeapNumber::kValueOffset), tmp2);
(...skipping 1106 matching lines...) Expand 10 before | Expand all | Expand 10 after
4600 // Put a valid pointer value in the stack slot where the result 4600 // Put a valid pointer value in the stack slot where the result
4601 // register is stored, as this register is in the pointer map, but contains 4601 // register is stored, as this register is in the pointer map, but contains
4602 // an integer value. 4602 // an integer value.
4603 __ Set(reg, 0); 4603 __ Set(reg, 0);
4604 4604
4605 // Preserve the value of all registers. 4605 // Preserve the value of all registers.
4606 PushSafepointRegistersScope scope(this); 4606 PushSafepointRegistersScope scope(this);
4607 4607
4608 // NumberTagU uses the context from the frame, rather than 4608 // NumberTagU uses the context from the frame, rather than
4609 // the environment's HContext or HInlinedContext value. 4609 // the environment's HContext or HInlinedContext value.
4610 // They only call Runtime::kAllocateHeapNumber. 4610 // They only call Runtime::kHiddenAllocateHeapNumber.
4611 // The corresponding HChange instructions are added in a phase that does 4611 // The corresponding HChange instructions are added in a phase that does
4612 // not have easy access to the local context. 4612 // not have easy access to the local context.
4613 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); 4613 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
4614 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); 4614 __ CallRuntimeSaveDoubles(Runtime::kHiddenAllocateHeapNumber);
4615 RecordSafepointWithRegisters( 4615 RecordSafepointWithRegisters(
4616 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4616 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
4617 __ StoreToSafepointRegisterSlot(reg, rax); 4617 __ StoreToSafepointRegisterSlot(reg, rax);
4618 } 4618 }
4619 4619
4620 // Done. Put the value in temp_xmm into the value of the allocated heap 4620 // Done. Put the value in temp_xmm into the value of the allocated heap
4621 // number. 4621 // number.
4622 __ bind(&done); 4622 __ bind(&done);
4623 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), temp_xmm); 4623 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), temp_xmm);
4624 } 4624 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
4656 // TODO(3095996): Get rid of this. For now, we need to make the 4656 // TODO(3095996): Get rid of this. For now, we need to make the
4657 // result register contain a valid pointer because it is already 4657 // result register contain a valid pointer because it is already
4658 // contained in the register pointer map. 4658 // contained in the register pointer map.
4659 Register reg = ToRegister(instr->result()); 4659 Register reg = ToRegister(instr->result());
4660 __ Move(reg, Smi::FromInt(0)); 4660 __ Move(reg, Smi::FromInt(0));
4661 4661
4662 { 4662 {
4663 PushSafepointRegistersScope scope(this); 4663 PushSafepointRegistersScope scope(this);
4664 // NumberTagD uses the context from the frame, rather than 4664 // NumberTagD uses the context from the frame, rather than
4665 // the environment's HContext or HInlinedContext value. 4665 // the environment's HContext or HInlinedContext value.
4666 // They only call Runtime::kAllocateHeapNumber. 4666 // They only call Runtime::kHiddenAllocateHeapNumber.
4667 // The corresponding HChange instructions are added in a phase that does 4667 // The corresponding HChange instructions are added in a phase that does
4668 // not have easy access to the local context. 4668 // not have easy access to the local context.
4669 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); 4669 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
4670 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); 4670 __ CallRuntimeSaveDoubles(Runtime::kHiddenAllocateHeapNumber);
4671 RecordSafepointWithRegisters( 4671 RecordSafepointWithRegisters(
4672 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4672 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
4673 __ movp(kScratchRegister, rax); 4673 __ movp(kScratchRegister, rax);
4674 } 4674 }
4675 __ movp(reg, kScratchRegister); 4675 __ movp(reg, kScratchRegister);
4676 } 4676 }
4677 4677
4678 4678
4679 void LCodeGen::DoSmiTag(LSmiTag* instr) { 4679 void LCodeGen::DoSmiTag(LSmiTag* instr) {
4680 HChange* hchange = instr->hydrogen(); 4680 HChange* hchange = instr->hydrogen();
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
5212 flags = AllocateTargetSpace::update(flags, OLD_POINTER_SPACE); 5212 flags = AllocateTargetSpace::update(flags, OLD_POINTER_SPACE);
5213 } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) { 5213 } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) {
5214 ASSERT(!instr->hydrogen()->IsNewSpaceAllocation()); 5214 ASSERT(!instr->hydrogen()->IsNewSpaceAllocation());
5215 flags = AllocateTargetSpace::update(flags, OLD_DATA_SPACE); 5215 flags = AllocateTargetSpace::update(flags, OLD_DATA_SPACE);
5216 } else { 5216 } else {
5217 flags = AllocateTargetSpace::update(flags, NEW_SPACE); 5217 flags = AllocateTargetSpace::update(flags, NEW_SPACE);
5218 } 5218 }
5219 __ Push(Smi::FromInt(flags)); 5219 __ Push(Smi::FromInt(flags));
5220 5220
5221 CallRuntimeFromDeferred( 5221 CallRuntimeFromDeferred(
5222 Runtime::kAllocateInTargetSpace, 2, instr, instr->context()); 5222 Runtime::kHiddenAllocateInTargetSpace, 2, instr, instr->context());
5223 __ StoreToSafepointRegisterSlot(result, rax); 5223 __ StoreToSafepointRegisterSlot(result, rax);
5224 } 5224 }
5225 5225
5226 5226
5227 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { 5227 void LCodeGen::DoToFastProperties(LToFastProperties* instr) {
5228 ASSERT(ToRegister(instr->value()).is(rax)); 5228 ASSERT(ToRegister(instr->value()).is(rax));
5229 __ Push(rax); 5229 __ Push(rax);
5230 CallRuntime(Runtime::kToFastProperties, 1, instr); 5230 CallRuntime(Runtime::kToFastProperties, 1, instr);
5231 } 5231 }
5232 5232
(...skipping 11 matching lines...) Expand all
5244 __ movp(rbx, FieldOperand(rcx, literal_offset)); 5244 __ movp(rbx, FieldOperand(rcx, literal_offset));
5245 __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex); 5245 __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex);
5246 __ j(not_equal, &materialized, Label::kNear); 5246 __ j(not_equal, &materialized, Label::kNear);
5247 5247
5248 // Create regexp literal using runtime function 5248 // Create regexp literal using runtime function
5249 // Result will be in rax. 5249 // Result will be in rax.
5250 __ Push(rcx); 5250 __ Push(rcx);
5251 __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); 5251 __ Push(Smi::FromInt(instr->hydrogen()->literal_index()));
5252 __ Push(instr->hydrogen()->pattern()); 5252 __ Push(instr->hydrogen()->pattern());
5253 __ Push(instr->hydrogen()->flags()); 5253 __ Push(instr->hydrogen()->flags());
5254 CallRuntime(Runtime::kMaterializeRegExpLiteral, 4, instr); 5254 CallRuntime(Runtime::kHiddenMaterializeRegExpLiteral, 4, instr);
5255 __ movp(rbx, rax); 5255 __ movp(rbx, rax);
5256 5256
5257 __ bind(&materialized); 5257 __ bind(&materialized);
5258 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; 5258 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize;
5259 Label allocated, runtime_allocate; 5259 Label allocated, runtime_allocate;
5260 __ Allocate(size, rax, rcx, rdx, &runtime_allocate, TAG_OBJECT); 5260 __ Allocate(size, rax, rcx, rdx, &runtime_allocate, TAG_OBJECT);
5261 __ jmp(&allocated, Label::kNear); 5261 __ jmp(&allocated, Label::kNear);
5262 5262
5263 __ bind(&runtime_allocate); 5263 __ bind(&runtime_allocate);
5264 __ Push(rbx); 5264 __ Push(rbx);
5265 __ Push(Smi::FromInt(size)); 5265 __ Push(Smi::FromInt(size));
5266 CallRuntime(Runtime::kAllocateInNewSpace, 1, instr); 5266 CallRuntime(Runtime::kHiddenAllocateInNewSpace, 1, instr);
5267 __ Pop(rbx); 5267 __ Pop(rbx);
5268 5268
5269 __ bind(&allocated); 5269 __ bind(&allocated);
5270 // Copy the content into the newly allocated memory. 5270 // Copy the content into the newly allocated memory.
5271 // (Unroll copy loop once for better throughput). 5271 // (Unroll copy loop once for better throughput).
5272 for (int i = 0; i < size - kPointerSize; i += 2 * kPointerSize) { 5272 for (int i = 0; i < size - kPointerSize; i += 2 * kPointerSize) {
5273 __ movp(rdx, FieldOperand(rbx, i)); 5273 __ movp(rdx, FieldOperand(rbx, i));
5274 __ movp(rcx, FieldOperand(rbx, i + kPointerSize)); 5274 __ movp(rcx, FieldOperand(rbx, i + kPointerSize));
5275 __ movp(FieldOperand(rax, i), rdx); 5275 __ movp(FieldOperand(rax, i), rdx);
5276 __ movp(FieldOperand(rax, i + kPointerSize), rcx); 5276 __ movp(FieldOperand(rax, i + kPointerSize), rcx);
(...skipping 13 matching lines...) Expand all
5290 if (!pretenure && instr->hydrogen()->has_no_literals()) { 5290 if (!pretenure && instr->hydrogen()->has_no_literals()) {
5291 FastNewClosureStub stub(instr->hydrogen()->strict_mode(), 5291 FastNewClosureStub stub(instr->hydrogen()->strict_mode(),
5292 instr->hydrogen()->is_generator()); 5292 instr->hydrogen()->is_generator());
5293 __ Move(rbx, instr->hydrogen()->shared_info()); 5293 __ Move(rbx, instr->hydrogen()->shared_info());
5294 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 5294 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
5295 } else { 5295 } else {
5296 __ Push(rsi); 5296 __ Push(rsi);
5297 __ Push(instr->hydrogen()->shared_info()); 5297 __ Push(instr->hydrogen()->shared_info());
5298 __ PushRoot(pretenure ? Heap::kTrueValueRootIndex : 5298 __ PushRoot(pretenure ? Heap::kTrueValueRootIndex :
5299 Heap::kFalseValueRootIndex); 5299 Heap::kFalseValueRootIndex);
5300 CallRuntime(Runtime::kNewClosure, 3, instr); 5300 CallRuntime(Runtime::kHiddenNewClosure, 3, instr);
5301 } 5301 }
5302 } 5302 }
5303 5303
5304 5304
5305 void LCodeGen::DoTypeof(LTypeof* instr) { 5305 void LCodeGen::DoTypeof(LTypeof* instr) {
5306 ASSERT(ToRegister(instr->context()).is(rsi)); 5306 ASSERT(ToRegister(instr->context()).is(rsi));
5307 LOperand* input = instr->value(); 5307 LOperand* input = instr->value();
5308 EmitPushTaggedOperand(input); 5308 EmitPushTaggedOperand(input);
5309 CallRuntime(Runtime::kTypeof, 1, instr); 5309 CallRuntime(Runtime::kTypeof, 1, instr);
5310 } 5310 }
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
5485 5485
5486 5486
5487 void LCodeGen::DoDummyUse(LDummyUse* instr) { 5487 void LCodeGen::DoDummyUse(LDummyUse* instr) {
5488 // Nothing to see here, move on! 5488 // Nothing to see here, move on!
5489 } 5489 }
5490 5490
5491 5491
5492 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { 5492 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) {
5493 PushSafepointRegistersScope scope(this); 5493 PushSafepointRegistersScope scope(this);
5494 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); 5494 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
5495 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); 5495 __ CallRuntimeSaveDoubles(Runtime::kHiddenStackGuard);
5496 RecordSafepointWithLazyDeopt(instr, RECORD_SAFEPOINT_WITH_REGISTERS, 0); 5496 RecordSafepointWithLazyDeopt(instr, RECORD_SAFEPOINT_WITH_REGISTERS, 0);
5497 ASSERT(instr->HasEnvironment()); 5497 ASSERT(instr->HasEnvironment());
5498 LEnvironment* env = instr->environment(); 5498 LEnvironment* env = instr->environment();
5499 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 5499 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
5500 } 5500 }
5501 5501
5502 5502
5503 void LCodeGen::DoStackCheck(LStackCheck* instr) { 5503 void LCodeGen::DoStackCheck(LStackCheck* instr) {
5504 class DeferredStackCheck V8_FINAL : public LDeferredCode { 5504 class DeferredStackCheck V8_FINAL : public LDeferredCode {
5505 public: 5505 public:
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
5650 FixedArray::kHeaderSize - kPointerSize)); 5650 FixedArray::kHeaderSize - kPointerSize));
5651 __ bind(&done); 5651 __ bind(&done);
5652 } 5652 }
5653 5653
5654 5654
5655 #undef __ 5655 #undef __
5656 5656
5657 } } // namespace v8::internal 5657 } } // namespace v8::internal
5658 5658
5659 #endif // V8_TARGET_ARCH_X64 5659 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/full-codegen-x64.cc ('k') | src/x64/macro-assembler-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698