From b408dcea29318cbc0a2fb1c0852fb54ab21d8d03 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Mon, 20 Apr 2020 20:44:55 +0100 Subject: [PATCH] A64: Specialize sign-extension SBFM aliases --- src/frontend/A64/decoder/a64.inc | 5 +++ .../impl/data_processing_bitfield.cpp | 35 +++++++++++++++++++ src/frontend/A64/translate/impl/impl.h | 5 +++ 3 files changed, 45 insertions(+) diff --git a/src/frontend/A64/decoder/a64.inc b/src/frontend/A64/decoder/a64.inc index 054bcba8..6572d375 100644 --- a/src/frontend/A64/decoder/a64.inc +++ b/src/frontend/A64/decoder/a64.inc @@ -27,6 +27,11 @@ INST(MOVK, "MOVK", "z1110 INST(SBFM, "SBFM", "z00100110Nrrrrrrssssssnnnnnddddd") INST(BFM, "BFM", "z01100110Nrrrrrrssssssnnnnnddddd") INST(UBFM, "UBFM", "z10100110Nrrrrrrssssssnnnnnddddd") +INST(SXTB_1, "SXTB (32-bit)", "0001001100000000000111nnnnnddddd") +INST(SXTB_2, "SXTB (64-bit)", "1001001101000000000111nnnnnddddd") +INST(SXTH_1, "SXTH (32-bit)", "0001001100000000001111nnnnnddddd") +INST(SXTH_2, "SXTH (64-bit)", "1001001101000000001111nnnnnddddd") +INST(SXTW, "SXTW", "1001001101000000011111nnnnnddddd") // Data processing - Immediate - Extract INST(EXTR, "EXTR", "z00100111N0mmmmmssssssnnnnnddddd") diff --git a/src/frontend/A64/translate/impl/data_processing_bitfield.cpp b/src/frontend/A64/translate/impl/data_processing_bitfield.cpp index 5357bb62..48106290 100644 --- a/src/frontend/A64/translate/impl/data_processing_bitfield.cpp +++ b/src/frontend/A64/translate/impl/data_processing_bitfield.cpp @@ -85,6 +85,41 @@ bool TranslatorVisitor::UBFM(bool sf, bool N, Imm<6> immr, Imm<6> imms, Reg Rn, return true; } +bool TranslatorVisitor::SXTB_1(Reg Rn, Reg Rd) { + const auto src = X(32, Rn); + const auto result = ir.SignExtendToWord(ir.LeastSignificantByte(src)); + X(32, Rd, result); + return true; +} + +bool TranslatorVisitor::SXTB_2(Reg Rn, Reg Rd) { + const auto src = X(64, Rn); + const auto result = ir.SignExtendToLong(ir.LeastSignificantByte(src)); + X(64, Rd, result); + return true; +} + +bool TranslatorVisitor::SXTH_1(Reg Rn, Reg Rd) { + const auto src = X(32, Rn); + const auto result = ir.SignExtendToWord(ir.LeastSignificantHalf(src)); + X(32, Rd, result); + return true; +} + +bool TranslatorVisitor::SXTH_2(Reg Rn, Reg Rd) { + const auto src = X(64, Rn); + const auto result = ir.SignExtendToLong(ir.LeastSignificantHalf(src)); + X(64, Rd, result); + return true; +} + +bool TranslatorVisitor::SXTW(Reg Rn, Reg Rd) { + const auto src = X(64, Rn); + const auto result = ir.SignExtendToLong(ir.LeastSignificantWord(src)); + X(64, Rd, result); + return true; +} + bool TranslatorVisitor::EXTR(bool sf, bool N, Reg Rm, Imm<6> imms, Reg Rn, Reg Rd) { if (N != sf) { return UnallocatedEncoding(); diff --git a/src/frontend/A64/translate/impl/impl.h b/src/frontend/A64/translate/impl/impl.h index 52039fc4..77978499 100644 --- a/src/frontend/A64/translate/impl/impl.h +++ b/src/frontend/A64/translate/impl/impl.h @@ -94,6 +94,11 @@ struct TranslatorVisitor final { bool SBFM(bool sf, bool N, Imm<6> immr, Imm<6> imms, Reg Rn, Reg Rd); bool BFM(bool sf, bool N, Imm<6> immr, Imm<6> imms, Reg Rn, Reg Rd); bool UBFM(bool sf, bool N, Imm<6> immr, Imm<6> imms, Reg Rn, Reg Rd); + bool SXTB_1(Reg Rn, Reg Rd); + bool SXTB_2(Reg Rn, Reg Rd); + bool SXTH_1(Reg Rn, Reg Rd); + bool SXTH_2(Reg Rn, Reg Rd); + bool SXTW(Reg Rn, Reg Rd); // Data processing - Immediate - Extract bool EXTR(bool sf, bool N, Reg Rm, Imm<6> imms, Reg Rn, Reg Rd);