Revision: 9749
Author: [email protected]
Date: Mon Oct 24 02:33:11 2011
Log: Handlify call cases for pre-monomorphic, normal, and miss.
These cases turn out to be easy. There is a lingering raw pointer
implementation of TryCompileCallMiss because it's need by some of the
unconverted call stubs.
[email protected]
BUG=
TEST=
Review URL: http://codereview.chromium.org/8366036
http://code.google.com/p/v8/source/detail?r=9749
Modified:
/branches/bleeding_edge/src/arm/ic-arm.cc
/branches/bleeding_edge/src/ia32/ic-ia32.cc
/branches/bleeding_edge/src/ic.h
/branches/bleeding_edge/src/mips/ic-mips.cc
/branches/bleeding_edge/src/stub-cache.cc
/branches/bleeding_edge/src/stub-cache.h
/branches/bleeding_edge/src/x64/ic-x64.cc
=======================================
--- /branches/bleeding_edge/src/arm/ic-arm.cc Fri Oct 21 03:19:16 2011
+++ /branches/bleeding_edge/src/arm/ic-arm.cc Mon Oct 24 02:33:11 2011
@@ -464,7 +464,7 @@
}
-static void GenerateCallNormal(MacroAssembler* masm, int argc) {
+void CallICBase::GenerateNormal(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// -- r2 : name
// -- lr : return address
@@ -566,17 +566,6 @@
GenerateMonomorphicCacheProbe(masm, argc, Code::CALL_IC, extra_ic_state);
GenerateMiss(masm, argc, extra_ic_state);
}
-
-
-void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
- // ----------- S t a t e -------------
- // -- r2 : name
- // -- lr : return address
- // -----------------------------------
-
- GenerateCallNormal(masm, argc);
- GenerateMiss(masm, argc, Code::kNoExtraICState);
-}
void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
@@ -696,7 +685,7 @@
__ JumpIfSmi(r2, &miss);
__ IsObjectJSStringType(r2, r0, &miss);
- GenerateCallNormal(masm, argc);
+ CallICBase::GenerateNormal(masm, argc);
__ bind(&miss);
GenerateMiss(masm, argc);
}
=======================================
--- /branches/bleeding_edge/src/ia32/ic-ia32.cc Fri Oct 21 03:19:16 2011
+++ /branches/bleeding_edge/src/ia32/ic-ia32.cc Mon Oct 24 02:33:11 2011
@@ -943,9 +943,10 @@
__ InvokeFunction(edi, actual, JUMP_FUNCTION,
NullCallWrapper(), CALL_AS_METHOD);
}
+
// The generated code falls through if the call should be handled by
runtime.
-static void GenerateCallNormal(MacroAssembler* masm, int argc) {
+void CallICBase::GenerateNormal(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// -- ecx : name
// -- esp[0] : return address
@@ -1058,20 +1059,6 @@
GenerateMiss(masm, argc, extra_ic_state);
}
-
-
-void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
- // ----------- S t a t e -------------
- // -- ecx : name
- // -- esp[0] : return address
- // -- esp[(argc - n) * 4] : arg[n] (zero-based)
- // -- ...
- // -- esp[(argc + 1) * 4] : receiver
- // -----------------------------------
-
- GenerateCallNormal(masm, argc);
- GenerateMiss(masm, argc, Code::kNoExtraICState);
-}
void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
@@ -1238,7 +1225,7 @@
__ JumpIfSmi(ecx, &miss);
Condition cond = masm->IsObjectStringType(ecx, eax, eax);
__ j(NegateCondition(cond), &miss);
- GenerateCallNormal(masm, argc);
+ CallICBase::GenerateNormal(masm, argc);
__ bind(&miss);
GenerateMiss(masm, argc);
}
=======================================
--- /branches/bleeding_edge/src/ic.h Fri Oct 21 04:42:54 2011
+++ /branches/bleeding_edge/src/ic.h Mon Oct 24 02:33:11 2011
@@ -236,12 +236,15 @@
static void Clear(Address address, Code* target);
- // Platform-specific generation of misses for call and keyed call.
+ // Platform-specific code generation functions used by both call and
+ // keyed call.
static void GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state);
+ static void GenerateNormal(MacroAssembler* masm, int argc);
+
Code::Kind kind_;
friend class IC;
@@ -271,7 +274,10 @@
int argc,
Code::ExtraICState extra_ic_state);
- static void GenerateNormal(MacroAssembler* masm, int argc);
+ static void GenerateNormal(MacroAssembler* masm, int argc) {
+ CallICBase::GenerateNormal(masm, argc);
+ GenerateMiss(masm, argc, Code::kNoExtraICState);
+ }
};
=======================================
--- /branches/bleeding_edge/src/mips/ic-mips.cc Fri Oct 21 11:40:36 2011
+++ /branches/bleeding_edge/src/mips/ic-mips.cc Mon Oct 24 02:33:11 2011
@@ -463,7 +463,7 @@
}
-static void GenerateCallNormal(MacroAssembler* masm, int argc) {
+void CallICBase::GenerateNormal(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// -- a2 : name
// -- ra : return address
@@ -565,17 +565,6 @@
GenerateMonomorphicCacheProbe(masm, argc, Code::CALL_IC, extra_ic_state);
GenerateMiss(masm, argc, extra_ic_state);
}
-
-
-void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
- // ----------- S t a t e -------------
- // -- a2 : name
- // -- ra : return address
- // -----------------------------------
-
- GenerateCallNormal(masm, argc);
- GenerateMiss(masm, argc, Code::kNoExtraICState);
-}
void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
@@ -694,7 +683,7 @@
__ JumpIfSmi(a2, &miss);
__ IsObjectJSStringType(a2, a0, &miss);
- GenerateCallNormal(masm, argc);
+ CallICBase::GenerateNormal(masm, argc);
__ bind(&miss);
GenerateMiss(masm, argc);
}
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc Fri Oct 21 04:42:54 2011
+++ /branches/bleeding_edge/src/stub-cache.cc Mon Oct 24 02:33:11 2011
@@ -1466,14 +1466,6 @@
Handle<Code> StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) {
- CALL_HEAP_FUNCTION(isolate(),
- (set_failure(NULL),
TryCompileCallPreMonomorphic(flags)),
- Code);
-}
-
-
-MaybeObject* StubCompiler::TryCompileCallPreMonomorphic(Code::Flags flags)
{
- HandleScope scope(isolate());
int argc = Code::ExtractArgumentsCountFromFlags(flags);
// The code of the PreMonomorphic stub is the same as the code
// of the Initialized stub. They just differ on the code object flags.
@@ -1484,31 +1476,17 @@
} else {
KeyedCallIC::GenerateInitialize(masm(), argc);
}
- Object* result;
- { MaybeObject* maybe_result =
- TryGetCodeWithFlags(flags, "CompileCallPreMonomorphic");
- if (!maybe_result->ToObject(&result)) return maybe_result;
- }
+ Handle<Code> code = GetCodeWithFlags(flags, "CompileCallPreMonomorphic");
isolate()->counters()->call_premonomorphic_stubs()->Increment();
- Code* code = Code::cast(result);
- USE(code);
PROFILE(isolate(),
CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG),
- code, code->arguments_count()));
- GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, Code::cast(code)));
- return result;
+ *code, code->arguments_count()));
+ GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, *code));
+ return code;
}
Handle<Code> StubCompiler::CompileCallNormal(Code::Flags flags) {
- CALL_HEAP_FUNCTION(isolate(),
- (set_failure(NULL), TryCompileCallNormal(flags)),
- Code);
-}
-
-
-MaybeObject* StubCompiler::TryCompileCallNormal(Code::Flags flags) {
- HandleScope scope(isolate());
int argc = Code::ExtractArgumentsCountFromFlags(flags);
Code::Kind kind = Code::ExtractKindFromFlags(flags);
if (kind == Code::CALL_IC) {
@@ -1519,18 +1497,13 @@
} else {
KeyedCallIC::GenerateNormal(masm(), argc);
}
- Object* result;
- { MaybeObject* maybe_result =
TryGetCodeWithFlags(flags, "CompileCallNormal");
- if (!maybe_result->ToObject(&result)) return maybe_result;
- }
+ Handle<Code> code = GetCodeWithFlags(flags, "CompileCallNormal");
isolate()->counters()->call_normal_stubs()->Increment();
- Code* code = Code::cast(result);
- USE(code);
PROFILE(isolate(),
CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG),
- code, code->arguments_count()));
- GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, Code::cast(code)));
- return result;
+ *code, code->arguments_count()));
+ GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, *code));
+ return code;
}
@@ -1595,12 +1568,26 @@
Handle<Code> StubCompiler::CompileCallMiss(Code::Flags flags) {
- CALL_HEAP_FUNCTION(isolate(),
- (set_failure(NULL), TryCompileCallMiss(flags)),
- Code);
+ int argc = Code::ExtractArgumentsCountFromFlags(flags);
+ Code::Kind kind = Code::ExtractKindFromFlags(flags);
+ Code::ExtraICState extra_state =
Code::ExtractExtraICStateFromFlags(flags);
+ if (kind == Code::CALL_IC) {
+ CallIC::GenerateMiss(masm(), argc, extra_state);
+ } else {
+ KeyedCallIC::GenerateMiss(masm(), argc);
+ }
+ Handle<Code> code = GetCodeWithFlags(flags, "CompileCallMiss");
+ isolate()->counters()->call_megamorphic_stubs()->Increment();
+ PROFILE(isolate(),
+ CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG),
+ *code, code->arguments_count()));
+ GDBJIT(AddCode(GDBJITInterface::CALL_MISS, *code));
+ return code;
}
+// TODO(kmillikin): This annoying raw pointer implementation should be
+// eliminated when the stub compiler no longer needs it.
MaybeObject* StubCompiler::TryCompileCallMiss(Code::Flags flags) {
HandleScope scope(isolate());
int argc = Code::ExtractArgumentsCountFromFlags(flags);
=======================================
--- /branches/bleeding_edge/src/stub-cache.h Fri Oct 21 04:42:54 2011
+++ /branches/bleeding_edge/src/stub-cache.h Mon Oct 24 02:33:11 2011
@@ -392,8 +392,6 @@
Handle<Code> CompileCallArguments(Code::Flags flags);
Handle<Code> CompileCallMiss(Code::Flags flags);
- MUST_USE_RESULT MaybeObject* TryCompileCallPreMonomorphic(Code::Flags
flags);
- MUST_USE_RESULT MaybeObject* TryCompileCallNormal(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallMegamorphic(Code::Flags
flags);
MUST_USE_RESULT MaybeObject* TryCompileCallArguments(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallMiss(Code::Flags flags);
=======================================
--- /branches/bleeding_edge/src/x64/ic-x64.cc Fri Oct 21 03:19:16 2011
+++ /branches/bleeding_edge/src/x64/ic-x64.cc Mon Oct 24 02:33:11 2011
@@ -821,7 +821,7 @@
// The generated code falls through if the call should be handled by
runtime.
-static void GenerateCallNormal(MacroAssembler* masm, int argc) {
+void CallICBase::GenerateNormal(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// rcx : function name
// rsp[0] : return address
@@ -939,22 +939,6 @@
GenerateMonomorphicCacheProbe(masm, argc, Code::CALL_IC, extra_ic_state);
GenerateMiss(masm, argc, extra_ic_state);
}
-
-
-void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
- // ----------- S t a t e -------------
- // rcx : function name
- // rsp[0] : return address
- // rsp[8] : argument argc
- // rsp[16] : argument argc - 1
- // ...
- // rsp[argc * 8] : argument 1
- // rsp[(argc + 1) * 8] : argument 0 = receiver
- // -----------------------------------
-
- GenerateCallNormal(masm, argc);
- GenerateMiss(masm, argc, Code::kNoExtraICState);
-}
void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
@@ -1084,7 +1068,7 @@
__ JumpIfSmi(rcx, &miss);
Condition cond = masm->IsObjectStringType(rcx, rax, rax);
__ j(NegateCondition(cond), &miss);
- GenerateCallNormal(masm, argc);
+ CallICBase::GenerateNormal(masm, argc);
__ bind(&miss);
GenerateMiss(masm, argc);
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev