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

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

Issue 34753004: Make macro-assembler-x64 deal with handles to objects in new space by default. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 2 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/lithium-gap-resolver-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 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after
1549 } 1549 }
1550 1550
1551 1551
1552 void LCodeGen::DoConstantE(LConstantE* instr) { 1552 void LCodeGen::DoConstantE(LConstantE* instr) {
1553 __ LoadAddress(ToRegister(instr->result()), instr->value()); 1553 __ LoadAddress(ToRegister(instr->result()), instr->value());
1554 } 1554 }
1555 1555
1556 1556
1557 void LCodeGen::DoConstantT(LConstantT* instr) { 1557 void LCodeGen::DoConstantT(LConstantT* instr) {
1558 Handle<Object> value = instr->value(isolate()); 1558 Handle<Object> value = instr->value(isolate());
1559 AllowDeferredHandleDereference smi_check; 1559 __ Move(ToRegister(instr->result()), value);
1560 __ LoadObject(ToRegister(instr->result()), value);
1561 } 1560 }
1562 1561
1563 1562
1564 void LCodeGen::DoMapEnumLength(LMapEnumLength* instr) { 1563 void LCodeGen::DoMapEnumLength(LMapEnumLength* instr) {
1565 Register result = ToRegister(instr->result()); 1564 Register result = ToRegister(instr->result());
1566 Register map = ToRegister(instr->value()); 1565 Register map = ToRegister(instr->value());
1567 __ EnumLength(result, map); 1566 __ EnumLength(result, map);
1568 } 1567 }
1569 1568
1570 1569
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
2122 EmitBranch(instr, cc); 2121 EmitBranch(instr, cc);
2123 } 2122 }
2124 } 2123 }
2125 2124
2126 2125
2127 void LCodeGen::DoCmpObjectEqAndBranch(LCmpObjectEqAndBranch* instr) { 2126 void LCodeGen::DoCmpObjectEqAndBranch(LCmpObjectEqAndBranch* instr) {
2128 Register left = ToRegister(instr->left()); 2127 Register left = ToRegister(instr->left());
2129 2128
2130 if (instr->right()->IsConstantOperand()) { 2129 if (instr->right()->IsConstantOperand()) {
2131 Handle<Object> right = ToHandle(LConstantOperand::cast(instr->right())); 2130 Handle<Object> right = ToHandle(LConstantOperand::cast(instr->right()));
2132 __ CmpObject(left, right); 2131 __ Cmp(left, right);
2133 } else { 2132 } else {
2134 Register right = ToRegister(instr->right()); 2133 Register right = ToRegister(instr->right());
2135 __ cmpq(left, right); 2134 __ cmpq(left, right);
2136 } 2135 }
2137 EmitBranch(instr, equal); 2136 EmitBranch(instr, equal);
2138 } 2137 }
2139 2138
2140 2139
2141 void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) { 2140 void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) {
2142 if (instr->hydrogen()->representation().IsTagged()) { 2141 if (instr->hydrogen()->representation().IsTagged()) {
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
2490 2489
2491 void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, 2490 void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
2492 Label* map_check) { 2491 Label* map_check) {
2493 { 2492 {
2494 PushSafepointRegistersScope scope(this); 2493 PushSafepointRegistersScope scope(this);
2495 InstanceofStub::Flags flags = static_cast<InstanceofStub::Flags>( 2494 InstanceofStub::Flags flags = static_cast<InstanceofStub::Flags>(
2496 InstanceofStub::kNoFlags | InstanceofStub::kCallSiteInlineCheck); 2495 InstanceofStub::kNoFlags | InstanceofStub::kCallSiteInlineCheck);
2497 InstanceofStub stub(flags); 2496 InstanceofStub stub(flags);
2498 2497
2499 __ push(ToRegister(instr->value())); 2498 __ push(ToRegister(instr->value()));
2500 __ PushHeapObject(instr->function()); 2499 __ Push(instr->function());
2501 2500
2502 static const int kAdditionalDelta = 10; 2501 static const int kAdditionalDelta = 10;
2503 int delta = 2502 int delta =
2504 masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta; 2503 masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta;
2505 ASSERT(delta >= 0); 2504 ASSERT(delta >= 0);
2506 __ push_imm32(delta); 2505 __ push_imm32(delta);
2507 2506
2508 // We are pushing three values on the stack but recording a 2507 // We are pushing three values on the stack but recording a
2509 // safepoint with two arguments because stub is going to 2508 // safepoint with two arguments because stub is going to
2510 // remove the third argument from the stack before jumping 2509 // remove the third argument from the stack before jumping
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after
3201 void LCodeGen::DoOuterContext(LOuterContext* instr) { 3200 void LCodeGen::DoOuterContext(LOuterContext* instr) {
3202 Register context = ToRegister(instr->context()); 3201 Register context = ToRegister(instr->context());
3203 Register result = ToRegister(instr->result()); 3202 Register result = ToRegister(instr->result());
3204 __ movq(result, 3203 __ movq(result,
3205 Operand(context, Context::SlotOffset(Context::PREVIOUS_INDEX))); 3204 Operand(context, Context::SlotOffset(Context::PREVIOUS_INDEX)));
3206 } 3205 }
3207 3206
3208 3207
3209 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { 3208 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) {
3210 __ push(rsi); // The context is the first argument. 3209 __ push(rsi); // The context is the first argument.
3211 __ PushHeapObject(instr->hydrogen()->pairs()); 3210 __ Push(instr->hydrogen()->pairs());
3212 __ Push(Smi::FromInt(instr->hydrogen()->flags())); 3211 __ Push(Smi::FromInt(instr->hydrogen()->flags()));
3213 CallRuntime(Runtime::kDeclareGlobals, 3, instr); 3212 CallRuntime(Runtime::kDeclareGlobals, 3, instr);
3214 } 3213 }
3215 3214
3216 3215
3217 void LCodeGen::DoGlobalObject(LGlobalObject* instr) { 3216 void LCodeGen::DoGlobalObject(LGlobalObject* instr) {
3218 Register result = ToRegister(instr->result()); 3217 Register result = ToRegister(instr->result());
3219 __ movq(result, GlobalObjectOperand()); 3218 __ movq(result, GlobalObjectOperand());
3220 } 3219 }
3221 3220
(...skipping 13 matching lines...) Expand all
3235 RDIState rdi_state) { 3234 RDIState rdi_state) {
3236 bool dont_adapt_arguments = 3235 bool dont_adapt_arguments =
3237 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; 3236 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel;
3238 bool can_invoke_directly = 3237 bool can_invoke_directly =
3239 dont_adapt_arguments || formal_parameter_count == arity; 3238 dont_adapt_arguments || formal_parameter_count == arity;
3240 3239
3241 LPointerMap* pointers = instr->pointer_map(); 3240 LPointerMap* pointers = instr->pointer_map();
3242 3241
3243 if (can_invoke_directly) { 3242 if (can_invoke_directly) {
3244 if (rdi_state == RDI_UNINITIALIZED) { 3243 if (rdi_state == RDI_UNINITIALIZED) {
3245 __ LoadHeapObject(rdi, function); 3244 __ Move(rdi, function);
3246 } 3245 }
3247 3246
3248 // Change context. 3247 // Change context.
3249 __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); 3248 __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset));
3250 3249
3251 // Set rax to arguments count if adaption is not needed. Assumes that rax 3250 // Set rax to arguments count if adaption is not needed. Assumes that rax
3252 // is available to write to at this point. 3251 // is available to write to at this point.
3253 if (dont_adapt_arguments) { 3252 if (dont_adapt_arguments) {
3254 __ Set(rax, arity); 3253 __ Set(rax, arity);
3255 } 3254 }
(...skipping 1575 matching lines...) Expand 10 before | Expand all | Expand 10 after
4831 __ andb(kScratchRegister, Immediate(mask)); 4830 __ andb(kScratchRegister, Immediate(mask));
4832 __ cmpb(kScratchRegister, Immediate(tag)); 4831 __ cmpb(kScratchRegister, Immediate(tag));
4833 DeoptimizeIf(not_equal, instr->environment()); 4832 DeoptimizeIf(not_equal, instr->environment());
4834 } 4833 }
4835 } 4834 }
4836 } 4835 }
4837 4836
4838 4837
4839 void LCodeGen::DoCheckValue(LCheckValue* instr) { 4838 void LCodeGen::DoCheckValue(LCheckValue* instr) {
4840 Register reg = ToRegister(instr->value()); 4839 Register reg = ToRegister(instr->value());
4841 Handle<HeapObject> object = instr->hydrogen()->object().handle(); 4840 __ Cmp(reg, instr->hydrogen()->object().handle());
4842 __ CmpHeapObject(reg, object);
4843 DeoptimizeIf(not_equal, instr->environment()); 4841 DeoptimizeIf(not_equal, instr->environment());
4844 } 4842 }
4845 4843
4846 4844
4847 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { 4845 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) {
4848 { 4846 {
4849 PushSafepointRegistersScope scope(this); 4847 PushSafepointRegistersScope scope(this);
4850 __ push(object); 4848 __ push(object);
4851 CallRuntimeFromDeferred(Runtime::kMigrateInstance, 1, instr); 4849 CallRuntimeFromDeferred(Runtime::kMigrateInstance, 1, instr);
4852 __ testq(rax, Immediate(kSmiTagMask)); 4850 __ testq(rax, Immediate(kSmiTagMask));
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
5059 5057
5060 5058
5061 void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) { 5059 void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) {
5062 Label materialized; 5060 Label materialized;
5063 // Registers will be used as follows: 5061 // Registers will be used as follows:
5064 // rcx = literals array. 5062 // rcx = literals array.
5065 // rbx = regexp literal. 5063 // rbx = regexp literal.
5066 // rax = regexp literal clone. 5064 // rax = regexp literal clone.
5067 int literal_offset = 5065 int literal_offset =
5068 FixedArray::OffsetOfElementAt(instr->hydrogen()->literal_index()); 5066 FixedArray::OffsetOfElementAt(instr->hydrogen()->literal_index());
5069 __ LoadHeapObject(rcx, instr->hydrogen()->literals()); 5067 __ Move(rcx, instr->hydrogen()->literals());
5070 __ movq(rbx, FieldOperand(rcx, literal_offset)); 5068 __ movq(rbx, FieldOperand(rcx, literal_offset));
5071 __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex); 5069 __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex);
5072 __ j(not_equal, &materialized, Label::kNear); 5070 __ j(not_equal, &materialized, Label::kNear);
5073 5071
5074 // Create regexp literal using runtime function 5072 // Create regexp literal using runtime function
5075 // Result will be in rax. 5073 // Result will be in rax.
5076 __ push(rcx); 5074 __ push(rcx);
5077 __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); 5075 __ Push(Smi::FromInt(instr->hydrogen()->literal_index()));
5078 __ Push(instr->hydrogen()->pattern()); 5076 __ Push(instr->hydrogen()->pattern());
5079 __ Push(instr->hydrogen()->flags()); 5077 __ Push(instr->hydrogen()->flags());
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
5130 void LCodeGen::DoTypeof(LTypeof* instr) { 5128 void LCodeGen::DoTypeof(LTypeof* instr) {
5131 LOperand* input = instr->value(); 5129 LOperand* input = instr->value();
5132 EmitPushTaggedOperand(input); 5130 EmitPushTaggedOperand(input);
5133 CallRuntime(Runtime::kTypeof, 1, instr); 5131 CallRuntime(Runtime::kTypeof, 1, instr);
5134 } 5132 }
5135 5133
5136 5134
5137 void LCodeGen::EmitPushTaggedOperand(LOperand* operand) { 5135 void LCodeGen::EmitPushTaggedOperand(LOperand* operand) {
5138 ASSERT(!operand->IsDoubleRegister()); 5136 ASSERT(!operand->IsDoubleRegister());
5139 if (operand->IsConstantOperand()) { 5137 if (operand->IsConstantOperand()) {
5140 Handle<Object> object = ToHandle(LConstantOperand::cast(operand)); 5138 __ Push(ToHandle(LConstantOperand::cast(operand)));
5141 AllowDeferredHandleDereference smi_check;
5142 if (object->IsSmi()) {
5143 __ Push(Handle<Smi>::cast(object));
5144 } else {
5145 __ PushHeapObject(Handle<HeapObject>::cast(object));
5146 }
5147 } else if (operand->IsRegister()) { 5139 } else if (operand->IsRegister()) {
5148 __ push(ToRegister(operand)); 5140 __ push(ToRegister(operand));
5149 } else { 5141 } else {
5150 __ push(ToOperand(operand)); 5142 __ push(ToOperand(operand));
5151 } 5143 }
5152 } 5144 }
5153 5145
5154 5146
5155 void LCodeGen::DoTypeofIsAndBranch(LTypeofIsAndBranch* instr) { 5147 void LCodeGen::DoTypeofIsAndBranch(LTypeofIsAndBranch* instr) {
5156 Register input = ToRegister(instr->value()); 5148 Register input = ToRegister(instr->value());
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
5470 FixedArray::kHeaderSize - kPointerSize)); 5462 FixedArray::kHeaderSize - kPointerSize));
5471 __ bind(&done); 5463 __ bind(&done);
5472 } 5464 }
5473 5465
5474 5466
5475 #undef __ 5467 #undef __
5476 5468
5477 } } // namespace v8::internal 5469 } } // namespace v8::internal
5478 5470
5479 #endif // V8_TARGET_ARCH_X64 5471 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/full-codegen-x64.cc ('k') | src/x64/lithium-gap-resolver-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698