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

Unified Diff: runtime/vm/assembler_arm64_test.cc

Issue 2452453002: Support unaligned integer loads on ARM and MIPS. (Closed)
Patch Set: review Created 4 years, 1 month 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_arm64.cc ('k') | runtime/vm/assembler_arm_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/assembler_arm64_test.cc
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index 3d95b7cf67785dbed03e20dfddd3c8203b913f46..ea2d2dfc8f8381e7194daceee3521794bf638039 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -1684,6 +1684,191 @@ ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) {
}
+ASSEMBLER_TEST_GENERATE(LoadHalfWordUnaligned, assembler) {
+ __ LoadUnaligned(R1, R0, TMP, kHalfword);
+ __ mov(R0, R1);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LoadHalfWordUnaligned, test) {
+ EXPECT(test != NULL);
+ typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t) DART_UNUSED;
+ uint8_t buffer[4] = {
+ 0x89, 0xAB, 0xCD, 0xEF,
+ };
+
+ EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xAB89)),
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ LoadHalfWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[0])));
+ EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)),
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ LoadHalfWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[1])));
+}
+
+
+ASSEMBLER_TEST_GENERATE(LoadHalfWordUnsignedUnaligned, assembler) {
+ __ LoadUnaligned(R1, R0, TMP, kUnsignedHalfword);
+ __ mov(R0, R1);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LoadHalfWordUnsignedUnaligned, test) {
+ EXPECT(test != NULL);
+ typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t) DART_UNUSED;
+ uint8_t buffer[4] = {
+ 0x89, 0xAB, 0xCD, 0xEF,
+ };
+
+ EXPECT_EQ(0xAB89,
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ LoadHalfWordUnsignedUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[0])));
+ EXPECT_EQ(0xCDAB,
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ LoadHalfWordUnsignedUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[1])));
+}
+
+
+ASSEMBLER_TEST_GENERATE(StoreHalfWordUnaligned, assembler) {
+ __ LoadImmediate(R1, 0xABCD);
+ __ StoreUnaligned(R1, R0, TMP, kHalfword);
+ __ mov(R0, R1);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(StoreHalfWordUnaligned, test) {
+ EXPECT(test != NULL);
+ typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t) DART_UNUSED;
+ uint8_t buffer[4] = {
+ 0, 0, 0, 0,
+ };
+
+ EXPECT_EQ(0xABCD,
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ StoreHalfWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[0])));
+ EXPECT_EQ(0xCD, buffer[0]);
+ EXPECT_EQ(0xAB, buffer[1]);
+ EXPECT_EQ(0, buffer[2]);
+
+ EXPECT_EQ(0xABCD,
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ StoreHalfWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[1])));
+ EXPECT_EQ(0xCD, buffer[1]);
+ EXPECT_EQ(0xAB, buffer[2]);
+ EXPECT_EQ(0, buffer[3]);
+}
+
+
+ASSEMBLER_TEST_GENERATE(LoadWordUnaligned, assembler) {
+ __ LoadUnaligned(R1, R0, TMP, kUnsignedWord);
+ __ mov(R0, R1);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LoadWordUnaligned, test) {
+ EXPECT(test != NULL);
+ typedef int32_t (*LoadWordUnaligned)(intptr_t) DART_UNUSED;
+ uint8_t buffer[8] = {
+ 0x12, 0x34, 0x56, 0x78,
+ 0x9A, 0xBC, 0xDE, 0xF0
+ };
+
+ EXPECT_EQ(static_cast<int32_t>(0x78563412),
+ EXECUTE_TEST_CODE_INT32_INTPTR(
+ LoadWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[0])));
+ EXPECT_EQ(static_cast<int32_t>(0x9A785634),
+ EXECUTE_TEST_CODE_INT32_INTPTR(
+ LoadWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[1])));
+ EXPECT_EQ(static_cast<int32_t>(0xBC9A7856),
+ EXECUTE_TEST_CODE_INT32_INTPTR(
+ LoadWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[2])));
+ EXPECT_EQ(static_cast<int32_t>(0xDEBC9A78),
+ EXECUTE_TEST_CODE_INT32_INTPTR(
+ LoadWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[3])));
+}
+
+
+ASSEMBLER_TEST_GENERATE(StoreWordUnaligned, assembler) {
+ __ LoadImmediate(R1, 0x12345678);
+ __ StoreUnaligned(R1, R0, TMP, kUnsignedWord);
+ __ mov(R0, R1);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(StoreWordUnaligned, test) {
+ EXPECT(test != NULL);
+ typedef intptr_t (*StoreWordUnaligned)(intptr_t) DART_UNUSED;
+ uint8_t buffer[8] = {
+ 0, 0, 0, 0,
+ 0, 0, 0, 0
+ };
+
+ EXPECT_EQ(0x12345678,
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ StoreWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[0])));
+ EXPECT_EQ(0x78, buffer[0]);
+ EXPECT_EQ(0x56, buffer[1]);
+ EXPECT_EQ(0x34, buffer[2]);
+ EXPECT_EQ(0x12, buffer[3]);
+
+ EXPECT_EQ(0x12345678,
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ StoreWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[1])));
+ EXPECT_EQ(0x78, buffer[1]);
+ EXPECT_EQ(0x56, buffer[2]);
+ EXPECT_EQ(0x34, buffer[3]);
+ EXPECT_EQ(0x12, buffer[4]);
+
+ EXPECT_EQ(0x12345678,
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ StoreWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[2])));
+ EXPECT_EQ(0x78, buffer[2]);
+ EXPECT_EQ(0x56, buffer[3]);
+ EXPECT_EQ(0x34, buffer[4]);
+ EXPECT_EQ(0x12, buffer[5]);
+
+ EXPECT_EQ(0x12345678,
+ EXECUTE_TEST_CODE_INTPTR_INTPTR(
+ StoreWordUnaligned,
+ test->entry(),
+ reinterpret_cast<intptr_t>(&buffer[3])));
+ EXPECT_EQ(0x78, buffer[3]);
+ EXPECT_EQ(0x56, buffer[4]);
+ EXPECT_EQ(0x34, buffer[5]);
+ EXPECT_EQ(0x12, buffer[6]);
+}
+
+
static void EnterTestFrame(Assembler* assembler) {
__ EnterFrame(0);
__ Push(CODE_REG);
« no previous file with comments | « runtime/vm/assembler_arm64.cc ('k') | runtime/vm/assembler_arm_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698