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

Unified Diff: runtime/vm/assembler_ia32_test.cc

Issue 11016028: Add fast 64-bit integer ADD and SUB to the optimizing compiler. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/assembler_ia32.cc ('k') | runtime/vm/disassembler_ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/assembler_ia32_test.cc
===================================================================
--- runtime/vm/assembler_ia32_test.cc (revision 13168)
+++ runtime/vm/assembler_ia32_test.cc (working copy)
@@ -1500,7 +1500,6 @@
ASSEMBLER_TEST_GENERATE(LongAddAddress, assembler) {
- // Preserve clobbered callee-saved register (EBX).
__ movl(EAX, Address(ESP, 1 * kWordSize)); // left low.
__ movl(EDX, Address(ESP, 2 * kWordSize)); // left high.
__ addl(EAX, Address(ESP, 3 * kWordSize)); // low.
@@ -1552,7 +1551,6 @@
ASSEMBLER_TEST_GENERATE(LongSubAddress, assembler) {
- // Preserve clobbered callee-saved register (EBX).
__ movl(EAX, Address(ESP, 1 * kWordSize)); // left low.
__ movl(EDX, Address(ESP, 2 * kWordSize)); // left high.
__ subl(EAX, Address(ESP, 3 * kWordSize)); // low.
@@ -1575,6 +1573,74 @@
}
+ASSEMBLER_TEST_GENERATE(LongSubAddress2, assembler) {
+ // Preserve clobbered callee-saved register (EBX).
+ __ pushl(EBX);
+ __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low.
+ __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high.
+ __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low.
+ __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high
+ __ subl(ESP, Immediate(2 * kWordSize));
+ __ movl(Address(ESP, 0 * kWordSize), EAX); // left low.
+ __ movl(Address(ESP, 1 * kWordSize), EDX); // left high.
+ __ subl(Address(ESP, 0 * kWordSize), ECX);
+ __ sbbl(Address(ESP, 1 * kWordSize), EBX);
+ __ movl(EAX, Address(ESP, 0 * kWordSize));
+ __ movl(EDX, Address(ESP, 1 * kWordSize));
+ __ addl(ESP, Immediate(2 * kWordSize));
+ __ popl(EBX);
+ // Result is in EAX/EDX.
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LongSubAddress2, entry) {
+ typedef int64_t (*LongSubAddress2Code)(int64_t a, int64_t b);
+ int64_t a = 12;
+ int64_t b = 14;
+ int64_t res = reinterpret_cast<LongSubAddress2Code>(entry)(a, b);
+ EXPECT_EQ((a - b), res);
+ a = 600000;
+ b = 2147483647;
+ res = reinterpret_cast<LongSubAddress2Code>(entry)(a, b);
+ EXPECT_EQ((a - b), res);
+}
+
+
+ASSEMBLER_TEST_GENERATE(LongAddAddress2, assembler) {
+ // Preserve clobbered callee-saved register (EBX).
+ __ pushl(EBX);
+ __ movl(EAX, Address(ESP, 2 * kWordSize)); // left low.
+ __ movl(EDX, Address(ESP, 3 * kWordSize)); // left high.
+ __ movl(ECX, Address(ESP, 4 * kWordSize)); // right low.
+ __ movl(EBX, Address(ESP, 5 * kWordSize)); // right high
+ __ subl(ESP, Immediate(2 * kWordSize));
+ __ movl(Address(ESP, 0 * kWordSize), EAX); // left low.
+ __ movl(Address(ESP, 1 * kWordSize), EDX); // left high.
+ __ addl(Address(ESP, 0 * kWordSize), ECX);
+ __ adcl(Address(ESP, 1 * kWordSize), EBX);
+ __ movl(EAX, Address(ESP, 0 * kWordSize));
+ __ movl(EDX, Address(ESP, 1 * kWordSize));
+ __ addl(ESP, Immediate(2 * kWordSize));
+ __ popl(EBX);
+ // Result is in EAX/EDX.
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LongAddAddress2, entry) {
+ typedef int64_t (*LongAddAddress2Code)(int64_t a, int64_t b);
+ int64_t a = 12;
+ int64_t b = 14;
+ int64_t res = reinterpret_cast<LongAddAddress2Code>(entry)(a, b);
+ EXPECT_EQ((a + b), res);
+ a = 600000;
+ b = 2147483647;
+ res = reinterpret_cast<LongAddAddress2Code>(entry)(a, b);
+ EXPECT_EQ((a + b), res);
+}
+
+
// Testing only the lower 64-bit value of 'cvtdq2pd'.
ASSEMBLER_TEST_GENERATE(IntegerToDoubleConversion, assembler) {
__ movsd(XMM1, Address(ESP, kWordSize));
@@ -1681,8 +1747,8 @@
if (CPUFeatures::sse4_1_supported()) {
__ movsd(XMM0, Address(ESP, kWordSize));
__ pextrd(EAX, XMM0, Immediate(0));
- __ ret();
}
+ __ ret();
}
@@ -1699,8 +1765,8 @@
if (CPUFeatures::sse4_1_supported()) {
__ movsd(XMM0, Address(ESP, kWordSize));
__ pextrd(EAX, XMM0, Immediate(1));
- __ ret();
}
+ __ ret();
}
@@ -1718,8 +1784,8 @@
__ movsd(XMM0, Address(ESP, kWordSize));
__ pmovsxdq(XMM0, XMM0);
__ pextrd(EAX, XMM0, Immediate(1));
- __ ret();
}
+ __ ret();
}
@@ -1738,8 +1804,8 @@
__ xorpd(XMM1, XMM1);
__ pcmpeqq(XMM0, XMM1);
__ movd(EAX, XMM0);
- __ ret();
}
+ __ ret();
}
@@ -1772,6 +1838,23 @@
}
+ASSEMBLER_TEST_GENERATE(Movq, assembler) {
+ __ movq(XMM0, Address(ESP, kWordSize));
+ __ subl(ESP, Immediate(kDoubleSize));
+ __ movq(Address(ESP, 0), XMM0);
+ __ fldl(Address(ESP, 0));
+ __ addl(ESP, Immediate(kDoubleSize));
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movq, entry) {
+ typedef double (*MovqCode)(double d);
+ double res = reinterpret_cast<MovqCode>(entry)(12.34e5);
+ EXPECT_FLOAT_EQ(12.34e5, res, 0.0);
+}
+
+
ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) {
__ movsd(XMM0, Address(ESP, kWordSize));
__ DoubleAbs(XMM0);
« no previous file with comments | « runtime/vm/assembler_ia32.cc ('k') | runtime/vm/disassembler_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698