Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/asmjit/asmjit.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkobalicek <kobalicek.petr@gmail.com>2022-06-17 13:26:28 +0300
committerkobalicek <kobalicek.petr@gmail.com>2022-06-17 13:26:34 +0300
commitd925605671770b667eefc960de2b50eb07990ecd (patch)
treedc72ed4b79db9f7f40b32621a58974e40ff0b422
parent33a31f04e83845d15effbb9ca27a8f117205baf8 (diff)
[Bug] Fixed incorrect encoding of LDRSB and LDRSH with [base+index] (AArch64) (fixes #370)
-rw-r--r--src/asmjit/arm/a64instdb.cpp8
-rw-r--r--test/asmjit_test_assembler_a64.cpp4
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