From b2802aaf178a6c8bf1ee1b9a93b15ca4c0f9382d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 6 Mar 2021 09:30:46 -0500 Subject: [PATCH] thumb32: Implement PLD variants --- src/CMakeLists.txt | 3 ++ src/frontend/A32/decoder/thumb32.inc | 8 ++-- .../A32/translate/impl/thumb32_load_byte.cpp | 37 +++++++++++++++++++ .../A32/translate/impl/translate_thumb.h | 6 +++ 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1d1dfc74..6f6bdf45 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -160,6 +160,9 @@ if ("A32" IN_LIST DYNARMIC_FRONTENDS) frontend/A32/translate/impl/thumb32_data_processing_register.cpp frontend/A32/translate/impl/thumb32_data_processing_modified_immediate.cpp frontend/A32/translate/impl/thumb32_data_processing_plain_binary_immediate.cpp + frontend/A32/translate/impl/thumb32_load_byte.cpp + frontend/A32/translate/impl/thumb32_load_halfword.cpp + frontend/A32/translate/impl/thumb32_load_word.cpp frontend/A32/translate/impl/thumb32_long_multiply.cpp frontend/A32/translate/impl/thumb32_misc.cpp frontend/A32/translate/impl/thumb32_multiply.cpp diff --git a/src/frontend/A32/decoder/thumb32.inc b/src/frontend/A32/decoder/thumb32.inc index aee79da8..a5660a52 100644 --- a/src/frontend/A32/decoder/thumb32.inc +++ b/src/frontend/A32/decoder/thumb32.inc @@ -145,10 +145,10 @@ INST(thumb32_STRH, "STRH (reg)", "111110000010nnnntttt00 INST(thumb32_STR_reg, "STR (reg)", "111110000100nnnntttt000000iimmmm") // Load Byte and Memory Hints -//INST(thumb32_PLD_lit, "PLD (lit)", "11111000-00111111111------------") -//INST(thumb32_PLD_reg, "PLD (reg)", "111110000001----1111000000------") -//INST(thumb32_PLD_imm8, "PLD (imm8)", "1111100000-1----11111100--------") -//INST(thumb32_PLD_imm12, "PLD (imm12)", "111110001001----1111------------") +INST(thumb32_PLD_lit, "PLD (lit)", "11111000U00111111111iiiiiiiiiiii") +INST(thumb32_PLD_reg, "PLD (reg)", "1111100000W1nnnn1111000000iimmmm") +INST(thumb32_PLD_imm8, "PLD (imm8)", "1111100000W1nnnn11111100iiiiiiii") +INST(thumb32_PLD_imm12, "PLD (imm12)", "1111100010W1nnnn1111iiiiiiiiiiii") //INST(thumb32_PLI_lit, "PLI (lit)", "11111001-00111111111------------") //INST(thumb32_PLI_reg, "PLI (reg)", "111110010001----1111000000------") //INST(thumb32_PLI_imm8, "PLI (imm8)", "111110010001----11111100--------") diff --git a/src/frontend/A32/translate/impl/thumb32_load_byte.cpp b/src/frontend/A32/translate/impl/thumb32_load_byte.cpp index 5f4e4104..40f6a07d 100644 --- a/src/frontend/A32/translate/impl/thumb32_load_byte.cpp +++ b/src/frontend/A32/translate/impl/thumb32_load_byte.cpp @@ -3,9 +3,46 @@ * SPDX-License-Identifier: 0BSD */ +#include #include "frontend/A32/translate/impl/translate_thumb.h" namespace Dynarmic::A32 { +static bool PLDHandler(ThumbTranslatorVisitor& v, bool W) { + if (!v.options.hook_hint_instructions) { + return true; + } + const auto exception = W ? Exception::PreloadDataWithIntentToWrite + : Exception::PreloadData; + return v.RaiseException(exception); +} + +bool ThumbTranslatorVisitor::thumb32_PLD_lit([[maybe_unused]] bool U, + [[maybe_unused]] Imm<12> imm12) { + return PLDHandler(*this, false); +} + +bool ThumbTranslatorVisitor::thumb32_PLD_imm8(bool W, + [[maybe_unused]] Reg n, + [[maybe_unused]] Imm<8> imm8) { + return PLDHandler(*this, W); +} + +bool ThumbTranslatorVisitor::thumb32_PLD_imm12(bool W, + [[maybe_unused]] Reg n, + [[maybe_unused]] Imm<12> imm12) { + return PLDHandler(*this, W); +} + +bool ThumbTranslatorVisitor::thumb32_PLD_reg(bool W, + [[maybe_unused]] Reg n, + [[maybe_unused]] Imm<2> imm2, + Reg m) { + if (m == Reg::PC) { + return UnpredictableInstruction(); + } + + return PLDHandler(*this, W); +} } // namespace Dynarmic::A32 diff --git a/src/frontend/A32/translate/impl/translate_thumb.h b/src/frontend/A32/translate/impl/translate_thumb.h index ddaa7a3e..846c7d35 100644 --- a/src/frontend/A32/translate/impl/translate_thumb.h +++ b/src/frontend/A32/translate/impl/translate_thumb.h @@ -205,6 +205,12 @@ struct ThumbTranslatorVisitor final { bool thumb32_STRH(Reg n, Reg t, Imm<2> imm2, Reg m); bool thumb32_STR_reg(Reg n, Reg t, Imm<2> imm2, Reg m); + // thumb32 load byte and memory hints + bool thumb32_PLD_lit(bool U, Imm<12> imm12); + bool thumb32_PLD_imm8(bool W, Reg n, Imm<8> imm8); + bool thumb32_PLD_imm12(bool W, Reg n, Imm<12> imm12); + bool thumb32_PLD_reg(bool W, Reg n, Imm<2> imm2, Reg m); + // thumb32 data processing (register) instructions bool thumb32_ASR_reg(Reg m, Reg d, Reg s); bool thumb32_LSL_reg(Reg m, Reg d, Reg s);