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

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

Issue 100156: Unbreak IA32 generated code coverage. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 7 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 | « no previous file | src/ia32/jump-target-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 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 5247 matching lines...) Expand 10 before | Expand all | Expand 10 after
5258 CodeGenerator* cgen = generator(); 5258 CodeGenerator* cgen = generator();
5259 Result receiver(cgen); 5259 Result receiver(cgen);
5260 enter()->Bind(&receiver); 5260 enter()->Bind(&receiver);
5261 5261
5262 cgen->frame()->Push(&receiver); 5262 cgen->frame()->Push(&receiver);
5263 cgen->frame()->Push(name_); 5263 cgen->frame()->Push(name_);
5264 Result answer = cgen->frame()->CallLoadIC(RelocInfo::CODE_TARGET); 5264 Result answer = cgen->frame()->CallLoadIC(RelocInfo::CODE_TARGET);
5265 // The call must be followed by a test eax instruction to indicate 5265 // The call must be followed by a test eax instruction to indicate
5266 // that the inobject property case was inlined. 5266 // that the inobject property case was inlined.
5267 ASSERT(answer.is_register() && answer.reg().is(eax)); 5267 ASSERT(answer.is_register() && answer.reg().is(eax));
5268 // Store the delta to the map check instruction here in the test 5268 // Store the delta to the map check instruction here in the test instruction.
5269 // instruction. 5269 // Use masm_-> instead of the double underscore macro since the latter can't
5270 int delta_to_patch_site = __ SizeOfCodeGeneratedSince(patch_site()); 5270 // return a value.
5271 int delta_to_patch_site = masm_->SizeOfCodeGeneratedSince(patch_site());
5271 // Here we use masm_-> instead of the double underscore macro because 5272 // Here we use masm_-> instead of the double underscore macro because
5272 // this is the instruction that gets patched and coverage code gets in 5273 // this is the instruction that gets patched and coverage code gets in
5273 // the way. 5274 // the way.
5274 masm_->test(answer.reg(), Immediate(-delta_to_patch_site)); 5275 masm_->test(answer.reg(), Immediate(-delta_to_patch_site));
5275 __ IncrementCounter(&Counters::named_load_inline_miss, 1); 5276 __ IncrementCounter(&Counters::named_load_inline_miss, 1);
5276 receiver = cgen->frame()->Pop(); 5277 receiver = cgen->frame()->Pop();
5277 exit_.Jump(&receiver, &answer); 5278 exit_.Jump(&receiver, &answer);
5278 } 5279 }
5279 5280
5280 5281
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
5410 deferred->enter()->Branch(zero, &receiver, not_taken); 5411 deferred->enter()->Branch(zero, &receiver, not_taken);
5411 5412
5412 // Preallocate the value register to ensure that there is no 5413 // Preallocate the value register to ensure that there is no
5413 // spill emitted between the patch site label and the offset in 5414 // spill emitted between the patch site label and the offset in
5414 // the load instruction. 5415 // the load instruction.
5415 Result value = cgen_->allocator()->Allocate(); 5416 Result value = cgen_->allocator()->Allocate();
5416 ASSERT(value.is_valid()); 5417 ASSERT(value.is_valid());
5417 __ bind(deferred->patch_site()); 5418 __ bind(deferred->patch_site());
5418 // This is the map check instruction that will be patched. 5419 // This is the map check instruction that will be patched.
5419 // Initially use an invalid map to force a failure. 5420 // Initially use an invalid map to force a failure.
5420 __ cmp(FieldOperand(receiver.reg(), HeapObject::kMapOffset), 5421 masm->cmp(FieldOperand(receiver.reg(), HeapObject::kMapOffset),
5421 Immediate(Factory::null_value())); 5422 Immediate(Factory::null_value()));
5423 // This branch is always a forwards branch so it's always a fixed
5424 // size which allows the assert below to succeed and patching to work.
William Hesse 2009/04/29 09:56:46 Should you explain the motivation for these other
5422 deferred->enter()->Branch(not_equal, &receiver, not_taken); 5425 deferred->enter()->Branch(not_equal, &receiver, not_taken);
5423 5426
5424 // The delta from the patch label to the load offset must be 5427 // The delta from the patch label to the load offset must be
5425 // statically known. 5428 // statically known.
5426 ASSERT(masm->SizeOfCodeGeneratedSince(deferred->patch_site()) == 5429 ASSERT(masm->SizeOfCodeGeneratedSince(deferred->patch_site()) ==
5427 LoadIC::kOffsetToLoadInstruction); 5430 LoadIC::kOffsetToLoadInstruction);
5428 // The initial (invalid) offset has to be large enough to force 5431 // The initial (invalid) offset has to be large enough to force
5429 // a 32-bit instruction encoding to allow patching with an 5432 // a 32-bit instruction encoding to allow patching with an
5430 // arbitrary offset. Use kMaxInt (minus kHeapObjectTag). 5433 // arbitrary offset. Use kMaxInt (minus kHeapObjectTag).
5431 int offset = kMaxInt; 5434 int offset = kMaxInt;
5432 __ mov(value.reg(), FieldOperand(receiver.reg(), offset)); 5435 masm->mov(value.reg(), FieldOperand(receiver.reg(), offset));
5433 5436
5434 __ IncrementCounter(&Counters::named_load_inline, 1); 5437 __ IncrementCounter(&Counters::named_load_inline, 1);
5435 deferred->BindExit(&receiver, &value); 5438 deferred->BindExit(&receiver, &value);
5436 cgen_->frame()->Push(&receiver); 5439 cgen_->frame()->Push(&receiver);
5437 cgen_->frame()->Push(&value); 5440 cgen_->frame()->Push(&value);
5438 } 5441 }
5439 break; 5442 break;
5440 } 5443 }
5441 5444
5442 case KEYED: { 5445 case KEYED: {
(...skipping 1770 matching lines...) Expand 10 before | Expand all | Expand 10 after
7213 7216
7214 // Slow-case: Go through the JavaScript implementation. 7217 // Slow-case: Go through the JavaScript implementation.
7215 __ bind(&slow); 7218 __ bind(&slow);
7216 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); 7219 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION);
7217 } 7220 }
7218 7221
7219 7222
7220 #undef __ 7223 #undef __
7221 7224
7222 } } // namespace v8::internal 7225 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/ia32/jump-target-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698