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

Unified Diff: runtime/vm/assembler_dbc_test.cc

Issue 2015113002: DBC: Collect type feedback for fastpath smi ops (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Add comment Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | runtime/vm/constants_dbc.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/assembler_dbc_test.cc
diff --git a/runtime/vm/assembler_dbc_test.cc b/runtime/vm/assembler_dbc_test.cc
index 11e579e1caeb8939be57071ee8a495f9d0a5a70d..3d5b7514249bef94e77a36f5181e68c69cebebd4 100644
--- a/runtime/vm/assembler_dbc_test.cc
+++ b/runtime/vm/assembler_dbc_test.cc
@@ -32,6 +32,81 @@ static RawObject* ExecuteTest(const Code& code) {
#define __ assembler->
+static RawClass* CreateDummyClass(const String& class_name,
+ const Script& script) {
+ const Class& cls = Class::Handle(Class::New(
+ Library::Handle(), class_name, script, TokenPosition::kNoSource));
+ cls.set_is_synthesized_class(); // Dummy class for testing.
+ return cls.raw();
+}
+
+
+static RawLibrary* CreateDummyLibrary(const String& library_name) {
+ return Library::New(library_name);
+}
+
+
+static RawFunction* CreateFunction(const char* name) {
+ Thread* thread = Thread::Current();
+ const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
+ const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary"));
+ const Script& script = Script::Handle();
+ const Class& owner_class =
+ Class::Handle(CreateDummyClass(class_name, script));
+ const Library& owner_library =
+ Library::Handle(CreateDummyLibrary(lib_name));
+ owner_class.set_library(owner_library);
+ const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
+ return Function::New(function_name, RawFunction::kRegularFunction,
+ true, false, false, false, false, owner_class,
+ TokenPosition::kMinSource);
+}
+
+
+static void GenerateDummyCode(Assembler* assembler, const Object& result) {
+ __ PushConstant(result);
+ __ ReturnTOS();
+}
+
+
+static void MakeDummyInstanceCall(Assembler* assembler, const Object& result) {
+ // Make a dummy function.
+ Assembler _assembler_;
+ GenerateDummyCode(&_assembler_, result);
+ const char* dummy_function_name = "dummy_instance_function";
+ const Function& dummy_instance_function =
+ Function::Handle(CreateFunction(dummy_function_name));
+ Code& code =
+ Code::Handle(Code::FinalizeCode(dummy_instance_function, &_assembler_));
+ dummy_instance_function.AttachCode(code);
+
+ // Make a dummy ICData.
+ const Array& dummy_arguments_descriptor =
+ Array::Handle(ArgumentsDescriptor::New(2));
+ const ICData& ic_data = ICData::Handle(ICData::New(
+ dummy_instance_function,
+ String::Handle(dummy_instance_function.name()),
+ dummy_arguments_descriptor,
+ Thread::kNoDeoptId,
+ 2));
+
+ // Wire up the Function in the ICData.
+ GrowableArray<intptr_t> cids(2);
+ cids.Add(kSmiCid);
+ cids.Add(kSmiCid);
+ ic_data.AddCheck(cids, dummy_instance_function);
+
+ // For the non-Smi tests.
+ cids[0] = kBigintCid;
+ ic_data.AddCheck(cids, dummy_instance_function);
+ ICData* call_ic_data = &ICData::ZoneHandle(ic_data.Original());
+
+ // Generate the instance call.
+ const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data);
+ __ InstanceCall2(2, call_ic_data_kidx);
+}
+
+
ASSEMBLER_TEST_GENERATE(Simple, assembler) {
__ PushConstant(Smi::Handle(Smi::New(42)));
__ ReturnTOS();
@@ -66,7 +141,8 @@ ASSEMBLER_TEST_GENERATE(AddTOS, assembler) {
__ PushConstant(Smi::Handle(Smi::New(-42)));
__ PushConstant(Smi::Handle(Smi::New(84)));
__ AddTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -80,7 +156,8 @@ ASSEMBLER_TEST_GENERATE(AddTOSOverflow, assembler) {
__ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue)));
__ PushConstant(Smi::Handle(Smi::New(1)));
__ AddTOS();
- __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
__ ReturnTOS();
}
@@ -96,7 +173,8 @@ ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) {
__ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
__ PushConstant(Smi::Handle(Smi::New(1)));
__ AddTOS();
- __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
__ ReturnTOS();
}
@@ -110,7 +188,8 @@ ASSEMBLER_TEST_GENERATE(SubTOS, assembler) {
__ PushConstant(Smi::Handle(Smi::New(30)));
__ PushConstant(Smi::Handle(Smi::New(-12)));
__ SubTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -124,7 +203,8 @@ ASSEMBLER_TEST_GENERATE(SubTOSOverflow, assembler) {
__ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue)));
__ PushConstant(Smi::Handle(Smi::New(1)));
__ SubTOS();
- __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
__ ReturnTOS();
}
@@ -140,7 +220,8 @@ ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) {
__ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
__ PushConstant(Smi::Handle(Smi::New(1)));
__ SubTOS();
- __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
__ ReturnTOS();
}
@@ -154,7 +235,8 @@ ASSEMBLER_TEST_GENERATE(MulTOS, assembler) {
__ PushConstant(Smi::Handle(Smi::New(-6)));
__ PushConstant(Smi::Handle(Smi::New(-7)));
__ MulTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -168,7 +250,8 @@ ASSEMBLER_TEST_GENERATE(MulTOSOverflow, assembler) {
__ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue)));
__ PushConstant(Smi::Handle(Smi::New(-8)));
__ MulTOS();
- __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
__ ReturnTOS();
}
@@ -184,7 +267,8 @@ ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) {
__ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
__ PushConstant(Smi::Handle(Smi::New(1)));
__ MulTOS();
- __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
__ ReturnTOS();
}
@@ -198,7 +282,8 @@ ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) {
__ PushConstant(Smi::Handle(Smi::New(0x22)));
__ PushConstant(Smi::Handle(Smi::New(0x08)));
__ BitOrTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -214,7 +299,8 @@ ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) {
__ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
__ PushConstant(Smi::Handle(Smi::New(0x08)));
__ BitOrTOS();
- __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
__ ReturnTOS();
}
@@ -228,7 +314,8 @@ ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) {
__ PushConstant(Smi::Handle(Smi::New(0x2a)));
__ PushConstant(Smi::Handle(Smi::New(0xaa)));
__ BitAndTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -244,7 +331,8 @@ ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) {
__ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
__ PushConstant(Smi::Handle(Smi::New(0x08)));
__ BitAndTOS();
- __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42)));
__ ReturnTOS();
}
@@ -258,7 +346,8 @@ ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) {
__ PushConstant(Smi::Handle(Smi::New(42)));
__ PushConstant(Smi::Handle(Smi::New(42)));
__ EqualTOS();
- __ PushConstant(Bool::False()); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Bool::False());
__ ReturnTOS();
}
@@ -272,7 +361,8 @@ ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) {
__ PushConstant(Smi::Handle(Smi::New(42)));
__ PushConstant(Smi::Handle(Smi::New(-42)));
__ EqualTOS();
- __ PushConstant(Bool::True()); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Bool::True());
__ ReturnTOS();
}
@@ -288,7 +378,8 @@ ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) {
__ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
__ PushConstant(Smi::Handle(Smi::New(-42)));
__ EqualTOS();
- __ PushConstant(Bool::True()); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Bool::True());
__ ReturnTOS();
}
@@ -302,7 +393,8 @@ ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) {
__ PushConstant(Smi::Handle(Smi::New(-42)));
__ PushConstant(Smi::Handle(Smi::New(42)));
__ LessThanTOS();
- __ PushConstant(Bool::False()); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Bool::False());
__ ReturnTOS();
}
@@ -316,7 +408,8 @@ ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) {
__ PushConstant(Smi::Handle(Smi::New(42)));
__ PushConstant(Smi::Handle(Smi::New(-42)));
__ LessThanTOS();
- __ PushConstant(Bool::False()); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Bool::False());
__ ReturnTOS();
}
@@ -332,7 +425,8 @@ ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) {
__ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
__ PushConstant(Smi::Handle(Smi::New(-42)));
__ LessThanTOS();
- __ PushConstant(Bool::True()); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Bool::True());
__ ReturnTOS();
}
@@ -346,7 +440,8 @@ ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) {
__ PushConstant(Smi::Handle(Smi::New(42)));
__ PushConstant(Smi::Handle(Smi::New(-42)));
__ GreaterThanTOS();
- __ PushConstant(Bool::False()); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Bool::False());
__ ReturnTOS();
}
@@ -360,7 +455,8 @@ ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) {
__ PushConstant(Smi::Handle(Smi::New(-42)));
__ PushConstant(Smi::Handle(Smi::New(42)));
__ GreaterThanTOS();
- __ PushConstant(Bool::False()); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Bool::False());
__ ReturnTOS();
}
@@ -376,7 +472,8 @@ ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) {
__ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld)));
__ PushConstant(Smi::Handle(Smi::New(-42)));
__ GreaterThanTOS();
- __ PushConstant(Bool::True()); // Shouldn't be skipped.
+ // Shouldn't be skipped.
+ MakeDummyInstanceCall(assembler, Bool::True());
__ ReturnTOS();
}
@@ -777,7 +874,7 @@ ASSEMBLER_TEST_GENERATE(DropR, assembler) {
__ PushConstant(Smi::Handle(Smi::New(41)));
__ DropR(11);
__ AddTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -840,11 +937,13 @@ ASSEMBLER_TEST_RUN(FrameInitialized, test) {
// Push FP[rX] to the stack.
ASSEMBLER_TEST_GENERATE(StoreLocalPush, assembler) {
__ Frame(1);
+ __ PushConstant(Smi::Handle(Smi::New(37)));
__ PushConstant(Smi::Handle(Smi::New(21)));
__ StoreLocal(0);
__ Push(0);
__ AddTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -861,7 +960,8 @@ ASSEMBLER_TEST_GENERATE(PopLocalPush, assembler) {
__ Push(0);
__ Push(0);
__ AddTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -877,7 +977,8 @@ ASSEMBLER_TEST_GENERATE(LoadConstantPush, assembler) {
__ Push(0);
__ Push(0);
__ AddTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -900,7 +1001,8 @@ ASSEMBLER_TEST_GENERATE(MoveLocalLocal, assembler) {
__ Push(0);
__ Push(1);
__ AddTOS();
- __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0)));
__ ReturnTOS();
}
@@ -951,14 +1053,16 @@ ASSEMBLER_TEST_GENERATE(Loop, assembler) {
__ PushConstant(Smi::Handle(Smi::New(1)));
__ Push(1);
__ AddTOS();
- __ Jump(&error);
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(-1)));
__ PopLocal(1);
// Subtract 1 from FP[0].
__ Push(0);
__ PushConstant(Smi::Handle(Smi::New(1)));
__ SubTOS();
- __ Jump(&error);
+ // Should be skipped.
+ MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(-1)));
// Jump to loop_entry if FP[0] != 0.
__ StoreLocal(0);
« no previous file with comments | « no previous file | runtime/vm/constants_dbc.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698