| 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);
|
|
|