Chromium Code Reviews| Index: src/ia32/code-stubs-ia32.cc |
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
| index afa3e1c568bdfadbe9e3feb88d51b2efaa56118a..302062500c0d3f5168193d2084f897bb4ef27b2f 100644 |
| --- a/src/ia32/code-stubs-ia32.cc |
| +++ b/src/ia32/code-stubs-ia32.cc |
| @@ -7474,6 +7474,46 @@ void StoreArrayLiteralElementStub::Generate(MacroAssembler* masm) { |
| __ ret(0); |
| } |
| + |
| +void ProfileEntryHookStub::Generate(MacroAssembler* masm) { |
| + // Grab the cycle counter immediately. |
| + __ db(0x0F); // rdtsc(); |
|
danno
2012/07/10 09:37:13
Any reason to not add this to assembler-ia32.h?
Sigurður Ásgeirsson
2012/07/11 14:50:34
This is already in the assembler, but under a cond
|
| + __ db(0x31); |
| + |
| + // Ecx is the only volatile register we must save. |
| + __ push(ecx); |
| + |
| + // Push the cycle time arg. |
| + __ push(edx); |
| + __ push(eax); |
| + |
| + // Calculate and push the original stack pointer. |
| + __ lea(eax, Operand(esp, 0xC)); |
|
danno
2012/07/10 09:37:13
Constants? (maybe from frame-ia32.h, also applies
Sigurður Ásgeirsson
2012/07/11 14:50:34
Done.
|
| + __ push(eax); |
| + |
| + // Calculate and push the function address. |
| + __ mov(eax, Operand(eax, 0)); |
| + __ sub(eax, Immediate(5)); |
|
danno
2012/07/10 09:37:13
constant?
Sigurður Ásgeirsson
2012/07/11 14:50:34
Done.
|
| + __ push(eax); |
| + |
| + // Call the entry hook. |
| + int32_t hook_location = |
| + reinterpret_cast<int32_t>(V8::GetFunctionEntryHookLocation()); |
| + __ call(Operand(hook_location, RelocInfo::NONE)); |
| + __ add(esp, Immediate(0x10)); |
| + |
| + // Restore ecx. |
| + __ pop(ecx); |
| + __ ret(0); |
| +} |
| + |
| + |
| +void ProfileEntryHookStub::GenerateAheadOfTime() { |
| + ProfileEntryHookStub stub; |
| + Handle<Code> code = stub.GetCode(); |
| + code->set_is_pregenerated(true); |
| +} |
| + |
| #undef __ |
| } } // namespace v8::internal |