diff options
author | kobalicek <kobalicek.petr@gmail.com> | 2022-06-17 13:26:28 +0300 |
---|---|---|
committer | kobalicek <kobalicek.petr@gmail.com> | 2022-06-17 13:26:34 +0300 |
commit | d925605671770b667eefc960de2b50eb07990ecd (patch) | |
tree | dc72ed4b79db9f7f40b32621a58974e40ff0b422 | |
parent | 33a31f04e83845d15effbb9ca27a8f117205baf8 (diff) |
[Bug] Fixed incorrect encoding of LDRSB and LDRSH with [base+index] (AArch64) (fixes #370)
-rw-r--r-- | src/asmjit/arm/a64instdb.cpp | 8 | ||||
-rw-r--r-- | test/asmjit_test_assembler_a64.cpp | 4 |
2 files changed, 8 insertions, 4 deletions
diff --git a/src/asmjit/arm/a64instdb.cpp b/src/asmjit/arm/a64instdb.cpp index 64709b5..0c32690 100644 --- a/src/asmjit/arm/a64instdb.cpp +++ b/src/asmjit/arm/a64instdb.cpp @@ -226,8 +226,8 @@ const InstInfo _instInfoTable[] = { INST(Ldrab , BaseRM_SImm10 , (0b1111100010100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 1 , 1562), // #156 INST(Ldrb , BaseLdSt , (0b0011100101, 0b00111000010, 0b00111000011, 0 , kW , 0 , 0, Inst::kIdLdurb) , kRWI_W , 0 , 1 , 1568), // #157 INST(Ldrh , BaseLdSt , (0b0111100101, 0b01111000010, 0b01111000011, 0 , kW , 0 , 1, Inst::kIdLdurh) , kRWI_W , 0 , 2 , 1573), // #158 - INST(Ldrsb , BaseLdSt , (0b0011100111, 0b00111000100, 0b00111000101, 0 , kWX, 22, 0, Inst::kIdLdursb) , kRWI_W , 0 , 3 , 1578), // #159 - INST(Ldrsh , BaseLdSt , (0b0111100110, 0b01111000100, 0b01111000101, 0 , kWX, 22, 1, Inst::kIdLdursh) , kRWI_W , 0 , 4 , 1584), // #160 + INST(Ldrsb , BaseLdSt , (0b0011100111, 0b00111000100, 0b00111000111, 0 , kWX, 22, 0, Inst::kIdLdursb) , kRWI_W , 0 , 3 , 1578), // #159 + INST(Ldrsh , BaseLdSt , (0b0111100110, 0b01111000100, 0b01111000111, 0 , kWX, 22, 1, Inst::kIdLdursh) , kRWI_W , 0 , 4 , 1584), // #160 INST(Ldrsw , BaseLdSt , (0b1011100110, 0b10111000100, 0b10111000101, 0b10011000, kX , 0 , 2, Inst::kIdLdursw) , kRWI_W , 0 , 5 , 1590), // #161 INST(Ldset , BaseAtomicOp , (0b1011100000100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 48 , 1596), // #162 INST(Ldseta , BaseAtomicOp , (0b1011100010100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 49 , 1602), // #163 @@ -1132,8 +1132,8 @@ const BaseLdSt baseLdSt[9] = { { 0b1011100101, 0b10111000010, 0b10111000011, 0b00011000, kWX, 30, 2, Inst::kIdLdur }, // ldr { 0b0011100101, 0b00111000010, 0b00111000011, 0 , kW , 0 , 0, Inst::kIdLdurb }, // ldrb { 0b0111100101, 0b01111000010, 0b01111000011, 0 , kW , 0 , 1, Inst::kIdLdurh }, // ldrh - { 0b0011100111, 0b00111000100, 0b00111000101, 0 , kWX, 22, 0, Inst::kIdLdursb }, // ldrsb - { 0b0111100110, 0b01111000100, 0b01111000101, 0 , kWX, 22, 1, Inst::kIdLdursh }, // ldrsh + { 0b0011100111, 0b00111000100, 0b00111000111, 0 , kWX, 22, 0, Inst::kIdLdursb }, // ldrsb + { 0b0111100110, 0b01111000100, 0b01111000111, 0 , kWX, 22, 1, Inst::kIdLdursh }, // ldrsh { 0b1011100110, 0b10111000100, 0b10111000101, 0b10011000, kX , 0 , 2, Inst::kIdLdursw }, // ldrsw { 0b1011100100, 0b10111000000, 0b10111000001, 0 , kWX, 30, 2, Inst::kIdStur }, // str { 0b0011100100, 0b00111000000, 0b00111000001, 0 , kW , 30, 0, Inst::kIdSturb }, // strb diff --git a/test/asmjit_test_assembler_a64.cpp b/test/asmjit_test_assembler_a64.cpp index a1d1178..74a212f 100644 --- a/test/asmjit_test_assembler_a64.cpp +++ b/test/asmjit_test_assembler_a64.cpp @@ -485,15 +485,19 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler> TEST_INSTRUCTION("41104078", ldrh(w1, ptr(x2, 1))); // LDURH TEST_INSTRUCTION("41D05F78", ldrh(w1, ptr(x2, -3))); // LDURH TEST_INSTRUCTION("41705F78", ldrh(w1, ptr(x2, -9))); // LDURH + TEST_INSTRUCTION("4168E338", ldrsb(w1, ptr(x2, x3))); TEST_INSTRUCTION("4104C039", ldrsb(w1, ptr(x2, 1))); TEST_INSTRUCTION("41D0DF38", ldrsb(w1, ptr(x2, -3))); // LDURSB TEST_INSTRUCTION("4170DF38", ldrsb(w1, ptr(x2, -9))); // LDURSB + TEST_INSTRUCTION("4168A338", ldrsb(x1, ptr(x2, x3))); TEST_INSTRUCTION("41048039", ldrsb(x1, ptr(x2, 1))); TEST_INSTRUCTION("41D09F38", ldrsb(x1, ptr(x2, -3))); // LDURSB TEST_INSTRUCTION("41709F38", ldrsb(x1, ptr(x2, -9))); // LDURSB + TEST_INSTRUCTION("4168E378", ldrsh(w1, ptr(x2, x3))); TEST_INSTRUCTION("4110C078", ldrsh(w1, ptr(x2, 1))); // LDURSH TEST_INSTRUCTION("41D0DF78", ldrsh(w1, ptr(x2, -3))); // LDURSH TEST_INSTRUCTION("4170DF78", ldrsh(w1, ptr(x2, -9))); // LDURSH + TEST_INSTRUCTION("4168A378", ldrsh(x1, ptr(x2, x3))); TEST_INSTRUCTION("41108078", ldrsh(x1, ptr(x2, 1))); // LDURSH TEST_INSTRUCTION("41D09F78", ldrsh(x1, ptr(x2, -3))); // LDURSH TEST_INSTRUCTION("41709F78", ldrsh(x1, ptr(x2, -9))); // LDURSH |