Emmmer updated this revision to Diff 483142. Emmmer added a comment. rebase main
CHANGES SINCE LAST ACTION https://reviews.llvm.org/D140092/new/ https://reviews.llvm.org/D140092 Files: lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.cpp lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.h lldb/source/Plugins/Instruction/RISCV/RISCVInstructions.h lldb/unittests/Instruction/RISCV/TestRISCVEmulator.cpp
Index: lldb/unittests/Instruction/RISCV/TestRISCVEmulator.cpp =================================================================== --- lldb/unittests/Instruction/RISCV/TestRISCVEmulator.cpp +++ lldb/unittests/Instruction/RISCV/TestRISCVEmulator.cpp @@ -19,6 +19,7 @@ #include "Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h" #include "Plugins/Process/Utility/lldb-riscv-register-enums.h" +using namespace llvm; using namespace lldb; using namespace lldb_private; @@ -69,7 +70,7 @@ } static size_t ReadMemoryCallback(EmulateInstruction *instruction, void *baton, - const Context &context, lldb::addr_t addr, + const Context &context, addr_t addr, void *dst, size_t length) { RISCVEmulatorTester *tester = (RISCVEmulatorTester *)instruction; assert(addr + length < sizeof(tester->memory)); @@ -79,7 +80,7 @@ static size_t WriteMemoryCallback(EmulateInstruction *instruction, void *baton, const Context &context, - lldb::addr_t addr, const void *dst, + addr_t addr, const void *dst, size_t length) { RISCVEmulatorTester *tester = (RISCVEmulatorTester *)instruction; assert(addr + length < sizeof(tester->memory)); @@ -102,7 +103,7 @@ }; TEST_F(RISCVEmulatorTester, testJAL) { - lldb::addr_t old_pc = 0x114514; + addr_t old_pc = 0x114514; WritePC(old_pc); // jal x1, -6*4 uint32_t inst = 0b11111110100111111111000011101111; @@ -124,8 +125,8 @@ } TEST_F(RISCVEmulatorTester, testJALR) { - lldb::addr_t old_pc = 0x114514; - lldb::addr_t old_x2 = 0x1024; + addr_t old_pc = 0x114514; + addr_t old_x2 = 0x1024; WritePC(old_pc); gpr.gpr[2] = old_x2; // jalr x1, x2(-255) @@ -176,7 +177,7 @@ static void testBranch(RISCVEmulatorTester *tester, EncoderB encoder, bool branched, uint64_t rs1, uint64_t rs2) { // prepare test registers - lldb::addr_t old_pc = 0x114514; + addr_t old_pc = 0x114514; tester->WritePC(old_pc); tester->gpr.gpr[1] = rs1; tester->gpr.gpr[2] = rs2; @@ -216,7 +217,7 @@ static void TestInst(RISCVEmulatorTester *tester, DecodeResult inst, bool has_rs2, RDComputer rd_val) { - lldb::addr_t old_pc = 0x114514; + addr_t old_pc = 0x114514; tester->WritePC(old_pc); uint32_t rd = DecodeRD(inst.inst); uint32_t rs1 = DecodeRS1(inst.inst); @@ -504,9 +505,9 @@ uint32_t rs1 = DecodeRS1(inst.inst); uint32_t rs2 = DecodeRS2(inst.inst); - llvm::APFloat ap_rs1_val(rs1_val); - llvm::APFloat ap_rs2_val(rs2_val); - llvm::APFloat ap_rs3_val(0.5f); + APFloat ap_rs1_val(rs1_val); + APFloat ap_rs2_val(rs2_val); + APFloat ap_rs3_val(0.5f); if (rs1) tester->fpr.fpr[rs1] = ap_rs1_val.bitcastToAPInt().getZExtValue(); @@ -526,8 +527,8 @@ } } - llvm::APInt apInt(32, tester->fpr.fpr[rd]); - llvm::APFloat rd_val(apInt.bitsToFloat()); + APInt apInt(32, tester->fpr.fpr[rd]); + APFloat rd_val(apInt.bitsToFloat()); ASSERT_EQ(rd_val.convertToFloat(), rd_exp); } @@ -578,7 +579,7 @@ for (auto i : FloatToInt) { if (inst.pattern.name == i) { - llvm::APFloat apf_rs1_val(12.0f); + APFloat apf_rs1_val(12.0f); tester->fpr.fpr[rs1] = apf_rs1_val.bitcastToAPInt().getZExtValue(); ASSERT_TRUE(tester->Execute(inst, false)); ASSERT_EQ(tester->gpr.gpr[rd], uint64_t(12)); @@ -590,8 +591,8 @@ if (inst.pattern.name == i) { tester->gpr.gpr[rs1] = 12; ASSERT_TRUE(tester->Execute(inst, false)); - llvm::APInt apInt(32, tester->fpr.fpr[rd]); - llvm::APFloat rd_val(apInt.bitsToFloat()); + APInt apInt(32, tester->fpr.fpr[rd]); + APFloat rd_val(apInt.bitsToFloat()); ASSERT_EQ(rd_val.convertToFloat(), 12.0f); return; } @@ -623,7 +624,7 @@ uint32_t FLWInst = 0x1A207; // imm = 0 uint32_t FSWInst = 0x21A827; // imm = 16 - llvm::APFloat apf(12.0f); + APFloat apf(12.0f); uint64_t bits = apf.bitcastToAPInt().getZExtValue(); *(uint64_t *)this->memory = bits; @@ -646,7 +647,7 @@ TEST_F(RISCVEmulatorTester, TestFMV_X_WInst) { auto FMV_X_WInst = 0xE0018253; - llvm::APFloat apf(12.0f); + APFloat apf(12.0f); auto bits = NanBoxing(apf.bitcastToAPInt().getZExtValue()); this->fpr.fpr[DecodeRS1(FMV_X_WInst)] = bits; auto decode = this->Decode(FMV_X_WInst); @@ -660,7 +661,7 @@ TEST_F(RISCVEmulatorTester, TestFMV_W_XInst) { auto FMV_W_XInst = 0xF0018253; - llvm::APFloat apf(12.0f); + APFloat apf(12.0f); uint64_t bits = NanUnBoxing(apf.bitcastToAPInt().getZExtValue()); this->gpr.gpr[DecodeRS1(FMV_W_XInst)] = bits; auto decode = this->Decode(FMV_W_XInst); Index: lldb/source/Plugins/Instruction/RISCV/RISCVInstructions.h =================================================================== --- lldb/source/Plugins/Instruction/RISCV/RISCVInstructions.h +++ lldb/source/Plugins/Instruction/RISCV/RISCVInstructions.h @@ -16,23 +16,24 @@ #include "llvm/ADT/Optional.h" namespace lldb_private { +using namespace llvm; class EmulateInstructionRISCV; struct Rd { uint32_t rd; bool Write(EmulateInstructionRISCV &emulator, uint64_t value); - bool WriteAPFloat(EmulateInstructionRISCV &emulator, llvm::APFloat value); + bool WriteAPFloat(EmulateInstructionRISCV &emulator, APFloat value); }; struct Rs { uint32_t rs; - llvm::Optional<uint64_t> Read(EmulateInstructionRISCV &emulator); - llvm::Optional<int32_t> ReadI32(EmulateInstructionRISCV &emulator); - llvm::Optional<int64_t> ReadI64(EmulateInstructionRISCV &emulator); - llvm::Optional<uint32_t> ReadU32(EmulateInstructionRISCV &emulator); - llvm::Optional<llvm::APFloat> ReadAPFloat(EmulateInstructionRISCV &emulator, - bool isDouble); + Optional<uint64_t> Read(EmulateInstructionRISCV &emulator); + Optional<int32_t> ReadI32(EmulateInstructionRISCV &emulator); + Optional<int64_t> ReadI64(EmulateInstructionRISCV &emulator); + Optional<uint32_t> ReadU32(EmulateInstructionRISCV &emulator); + Optional<APFloat> ReadAPFloat(EmulateInstructionRISCV &emulator, + bool isDouble); }; #define I_TYPE_INST(NAME) \ Index: lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.h =================================================================== --- lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.h +++ lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.h @@ -18,12 +18,14 @@ #include "lldb/Utility/Status.h" namespace lldb_private { +using namespace llvm; +using namespace lldb; class EmulateInstructionRISCV : public EmulateInstruction { public: - static llvm::StringRef GetPluginNameStatic() { return "riscv"; } + static StringRef GetPluginNameStatic() { return "riscv"; } - static llvm::StringRef GetPluginDescriptionStatic() { + static StringRef GetPluginDescriptionStatic() { return "Emulate instructions for the RISC-V architecture."; } @@ -51,7 +53,7 @@ public: EmulateInstructionRISCV(const ArchSpec &arch) : EmulateInstruction(arch) {} - llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } + StringRef GetPluginName() override { return GetPluginNameStatic(); } bool SupportsEmulatingInstructionsOfType(InstructionType inst_type) override { return SupportsThisInstructionType(inst_type); @@ -62,19 +64,18 @@ bool EvaluateInstruction(uint32_t options) override; bool TestEmulation(Stream *out_stream, ArchSpec &arch, OptionValueDictionary *test_data) override; - llvm::Optional<RegisterInfo> GetRegisterInfo(lldb::RegisterKind reg_kind, - uint32_t reg_num) override; + Optional<RegisterInfo> GetRegisterInfo(RegisterKind reg_kind, + uint32_t reg_num) override; - llvm::Optional<lldb::addr_t> ReadPC(); - bool WritePC(lldb::addr_t pc); + Optional<addr_t> ReadPC(); + bool WritePC(addr_t pc); - llvm::Optional<DecodeResult> ReadInstructionAt(lldb::addr_t addr); - llvm::Optional<DecodeResult> Decode(uint32_t inst); + Optional<DecodeResult> ReadInstructionAt(addr_t addr); + Optional<DecodeResult> Decode(uint32_t inst); bool Execute(DecodeResult inst, bool ignore_cond); template <typename T> - std::enable_if_t<std::is_integral_v<T>, llvm::Optional<T>> - ReadMem(uint64_t addr) { + std::enable_if_t<std::is_integral_v<T>, Optional<T>> ReadMem(uint64_t addr) { EmulateInstructionRISCV::Context ctx; ctx.type = EmulateInstruction::eContextRegisterLoad; ctx.SetNoArgs(); @@ -92,8 +93,8 @@ return WriteMemoryUnsigned(ctx, addr, value, sizeof(T)); } - llvm::RoundingMode GetRoundingMode(); - bool SetAccruedExceptions(llvm::APFloatBase::opStatus); + RoundingMode GetRoundingMode(); + bool SetAccruedExceptions(APFloatBase::opStatus); private: /// Last decoded instruction from m_opcode Index: lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.cpp =================================================================== --- lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.cpp +++ lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.cpp @@ -24,6 +24,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Support/MathExtras.h" +using namespace llvm; using namespace lldb; using namespace lldb_private; @@ -34,10 +35,9 @@ /// Returns all values wrapped in Optional, or std::nullopt if any of the values /// is std::nullopt. template <typename... Ts> -static llvm::Optional<std::tuple<Ts...>> zipOpt(llvm::Optional<Ts> &&...ts) { +static Optional<std::tuple<Ts...>> zipOpt(Optional<Ts> &&...ts) { if ((ts.has_value() && ...)) - return llvm::Optional<std::tuple<Ts...>>( - std::make_tuple(std::move(*ts)...)); + return Optional<std::tuple<Ts...>>(std::make_tuple(std::move(*ts)...)); else return std::nullopt; } @@ -118,7 +118,7 @@ registerValue); } -bool Rd::WriteAPFloat(EmulateInstructionRISCV &emulator, llvm::APFloat value) { +bool Rd::WriteAPFloat(EmulateInstructionRISCV &emulator, APFloat value) { uint32_t lldb_reg = FPREncodingToLLDB(rd); EmulateInstruction::Context ctx; ctx.type = EmulateInstruction::eContextRegisterStore; @@ -129,39 +129,39 @@ registerValue); } -llvm::Optional<uint64_t> Rs::Read(EmulateInstructionRISCV &emulator) { +Optional<uint64_t> Rs::Read(EmulateInstructionRISCV &emulator) { uint32_t lldbReg = GPREncodingToLLDB(rs); RegisterValue value; return emulator.ReadRegister(eRegisterKindLLDB, lldbReg, value) - ? llvm::Optional<uint64_t>(value.GetAsUInt64()) + ? Optional<uint64_t>(value.GetAsUInt64()) : std::nullopt; } -llvm::Optional<int32_t> Rs::ReadI32(EmulateInstructionRISCV &emulator) { - return llvm::transformOptional( +Optional<int32_t> Rs::ReadI32(EmulateInstructionRISCV &emulator) { + return transformOptional( Read(emulator), [](uint64_t value) { return int32_t(uint32_t(value)); }); } -llvm::Optional<int64_t> Rs::ReadI64(EmulateInstructionRISCV &emulator) { - return llvm::transformOptional(Read(emulator), - [](uint64_t value) { return int64_t(value); }); +Optional<int64_t> Rs::ReadI64(EmulateInstructionRISCV &emulator) { + return transformOptional(Read(emulator), + [](uint64_t value) { return int64_t(value); }); } -llvm::Optional<uint32_t> Rs::ReadU32(EmulateInstructionRISCV &emulator) { - return llvm::transformOptional( - Read(emulator), [](uint64_t value) { return uint32_t(value); }); +Optional<uint32_t> Rs::ReadU32(EmulateInstructionRISCV &emulator) { + return transformOptional(Read(emulator), + [](uint64_t value) { return uint32_t(value); }); } -llvm::Optional<llvm::APFloat> Rs::ReadAPFloat(EmulateInstructionRISCV &emulator, - bool isDouble) { +Optional<APFloat> Rs::ReadAPFloat(EmulateInstructionRISCV &emulator, + bool isDouble) { uint32_t lldbReg = FPREncodingToLLDB(rs); RegisterValue value; if (!emulator.ReadRegister(eRegisterKindLLDB, lldbReg, value)) return std::nullopt; uint64_t bits = value.GetAsUInt64(); - llvm::APInt api(64, bits, false); - return llvm::APFloat(isDouble ? llvm::APFloat(api.bitsToDouble()) - : llvm::APFloat(api.bitsToFloat())); + APInt api(64, bits, false); + return APFloat(isDouble ? APFloat(api.bitsToDouble()) + : APFloat(api.bitsToFloat())); } static bool CompareB(uint64_t rs1, uint64_t rs2, uint32_t funct3) { @@ -215,9 +215,9 @@ std::is_same_v<T, AMOMAXU_W> || std::is_same_v<T, AMOMAXU_D>; template <typename I> -static std::enable_if_t<is_load<I> || is_store<I>, llvm::Optional<uint64_t>> +static std::enable_if_t<is_load<I> || is_store<I>, Optional<uint64_t>> LoadStoreAddr(EmulateInstructionRISCV &emulator, I inst) { - return llvm::transformOptional(inst.rs1.Read(emulator), [&](uint64_t rs1) { + return transformOptional(inst.rs1.Read(emulator), [&](uint64_t rs1) { return rs1 + uint64_t(SignExt(inst.imm)); }); } @@ -229,7 +229,7 @@ auto addr = LoadStoreAddr(emulator, inst); if (!addr) return false; - return llvm::transformOptional( + return transformOptional( emulator.ReadMem<T>(*addr), [&](T t) { return inst.rd.Write(emulator, extend(E(t))); }) .value_or(false); @@ -241,7 +241,7 @@ auto addr = LoadStoreAddr(emulator, inst); if (!addr) return false; - return llvm::transformOptional( + return transformOptional( inst.rs2.Read(emulator), [&](uint64_t rs2) { return emulator.WriteMem<T>(*addr, rs2); }) .value_or(false); @@ -250,14 +250,13 @@ template <typename I> static std::enable_if_t<is_amo_add<I> || is_amo_bit_op<I> || is_amo_swap<I> || is_amo_cmp<I>, - llvm::Optional<uint64_t>> + Optional<uint64_t>> AtomicAddr(EmulateInstructionRISCV &emulator, I inst, unsigned int align) { - return llvm::transformOptional(inst.rs1.Read(emulator), - [&](uint64_t rs1) { - return rs1 % align == 0 - ? llvm::Optional<uint64_t>(rs1) - : std::nullopt; - }) + return transformOptional(inst.rs1.Read(emulator), + [&](uint64_t rs1) { + return rs1 % align == 0 ? Optional<uint64_t>(rs1) + : std::nullopt; + }) .value_or(std::nullopt); } @@ -268,7 +267,7 @@ auto addr = AtomicAddr(emulator, inst, align); if (!addr) return false; - return llvm::transformOptional( + return transformOptional( zipOpt(emulator.ReadMem<T>(*addr), inst.rs2.Read(emulator)), [&](auto &&tup) { auto [tmp, rs2] = tup; @@ -285,7 +284,7 @@ auto addr = AtomicAddr(emulator, inst, align); if (!addr) return false; - return llvm::transformOptional( + return transformOptional( zipOpt(emulator.ReadMem<T>(*addr), inst.rs2.Read(emulator)), [&](auto &&tup) { auto [tmp, rs2] = tup; @@ -302,7 +301,7 @@ auto addr = AtomicAddr(emulator, inst, align); if (!addr) return false; - return llvm::transformOptional( + return transformOptional( zipOpt(emulator.ReadMem<T>(*addr), inst.rs2.Read(emulator)), [&](auto &&tup) { auto [value, rs2] = tup; @@ -319,7 +318,7 @@ auto addr = AtomicAddr(emulator, inst, align); if (!addr) return false; - return llvm::transformOptional( + return transformOptional( zipOpt(emulator.ReadMem<T>(*addr), inst.rs2.Read(emulator)), [&](auto &&tup) { auto [value, rs2] = tup; @@ -576,7 +575,7 @@ {"FCVT_S_LU", 0xFFF0007F, 0xD0300053, DecodeIType<FCVT_S_LU>}, }; -llvm::Optional<DecodeResult> EmulateInstructionRISCV::Decode(uint32_t inst) { +Optional<DecodeResult> EmulateInstructionRISCV::Decode(uint32_t inst) { Log *log = GetLog(LLDBLog::Unwind); uint16_t try_rvc = uint16_t(inst & 0x0000ffff); @@ -623,42 +622,41 @@ bool operator()(LUI inst) { return inst.rd.Write(m_emu, SignExt(inst.imm)); } bool operator()(AUIPC inst) { - return llvm::transformOptional(m_emu.ReadPC(), - [&](uint64_t pc) { - return inst.rd.Write( - m_emu, SignExt(inst.imm) + pc); - }) + return transformOptional(m_emu.ReadPC(), + [&](uint64_t pc) { + return inst.rd.Write(m_emu, + SignExt(inst.imm) + pc); + }) .value_or(false); } bool operator()(JAL inst) { - return llvm::transformOptional( - m_emu.ReadPC(), - [&](uint64_t pc) { - return inst.rd.Write(m_emu, pc + delta()) && - m_emu.WritePC(SignExt(inst.imm) + pc); - }) + return transformOptional(m_emu.ReadPC(), + [&](uint64_t pc) { + return inst.rd.Write(m_emu, pc + delta()) && + m_emu.WritePC(SignExt(inst.imm) + pc); + }) .value_or(false); } bool operator()(JALR inst) { - return llvm::transformOptional( - zipOpt(m_emu.ReadPC(), inst.rs1.Read(m_emu)), - [&](auto &&tup) { - auto [pc, rs1] = tup; - return inst.rd.Write(m_emu, pc + delta()) && - m_emu.WritePC((SignExt(inst.imm) + rs1) & ~1); - }) + return transformOptional(zipOpt(m_emu.ReadPC(), inst.rs1.Read(m_emu)), + [&](auto &&tup) { + auto [pc, rs1] = tup; + return inst.rd.Write(m_emu, pc + delta()) && + m_emu.WritePC((SignExt(inst.imm) + rs1) & + ~1); + }) .value_or(false); } bool operator()(B inst) { - return llvm::transformOptional( - zipOpt(m_emu.ReadPC(), inst.rs1.Read(m_emu), - inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [pc, rs1, rs2] = tup; - if (m_ignore_cond || CompareB(rs1, rs2, inst.funct3)) - return m_emu.WritePC(SignExt(inst.imm) + pc); - return true; - }) + return transformOptional(zipOpt(m_emu.ReadPC(), inst.rs1.Read(m_emu), + inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [pc, rs1, rs2] = tup; + if (m_ignore_cond || + CompareB(rs1, rs2, inst.funct3)) + return m_emu.WritePC(SignExt(inst.imm) + pc); + return true; + }) .value_or(false); } bool operator()(LB inst) { @@ -680,82 +678,80 @@ bool operator()(SH inst) { return Store<SH, uint16_t>(m_emu, inst); } bool operator()(SW inst) { return Store<SW, uint32_t>(m_emu, inst); } bool operator()(ADDI inst) { - return llvm::transformOptional( - inst.rs1.ReadI64(m_emu), - [&](int64_t rs1) { - return inst.rd.Write(m_emu, rs1 + int64_t(SignExt(inst.imm))); - }) + return transformOptional(inst.rs1.ReadI64(m_emu), + [&](int64_t rs1) { + return inst.rd.Write( + m_emu, rs1 + int64_t(SignExt(inst.imm))); + }) .value_or(false); } bool operator()(SLTI inst) { - return llvm::transformOptional( - inst.rs1.ReadI64(m_emu), - [&](int64_t rs1) { - return inst.rd.Write(m_emu, rs1 < int64_t(SignExt(inst.imm))); - }) + return transformOptional(inst.rs1.ReadI64(m_emu), + [&](int64_t rs1) { + return inst.rd.Write( + m_emu, rs1 < int64_t(SignExt(inst.imm))); + }) .value_or(false); } bool operator()(SLTIU inst) { - return llvm::transformOptional( - inst.rs1.Read(m_emu), - [&](uint64_t rs1) { - return inst.rd.Write(m_emu, rs1 < uint64_t(SignExt(inst.imm))); - }) + return transformOptional(inst.rs1.Read(m_emu), + [&](uint64_t rs1) { + return inst.rd.Write( + m_emu, rs1 < uint64_t(SignExt(inst.imm))); + }) .value_or(false); } bool operator()(XORI inst) { - return llvm::transformOptional( - inst.rs1.Read(m_emu), - [&](uint64_t rs1) { - return inst.rd.Write(m_emu, rs1 ^ uint64_t(SignExt(inst.imm))); - }) + return transformOptional(inst.rs1.Read(m_emu), + [&](uint64_t rs1) { + return inst.rd.Write( + m_emu, rs1 ^ uint64_t(SignExt(inst.imm))); + }) .value_or(false); } bool operator()(ORI inst) { - return llvm::transformOptional( - inst.rs1.Read(m_emu), - [&](uint64_t rs1) { - return inst.rd.Write(m_emu, rs1 | uint64_t(SignExt(inst.imm))); - }) + return transformOptional(inst.rs1.Read(m_emu), + [&](uint64_t rs1) { + return inst.rd.Write( + m_emu, rs1 | uint64_t(SignExt(inst.imm))); + }) .value_or(false); } bool operator()(ANDI inst) { - return llvm::transformOptional( - inst.rs1.Read(m_emu), - [&](uint64_t rs1) { - return inst.rd.Write(m_emu, rs1 & uint64_t(SignExt(inst.imm))); - }) + return transformOptional(inst.rs1.Read(m_emu), + [&](uint64_t rs1) { + return inst.rd.Write( + m_emu, rs1 & uint64_t(SignExt(inst.imm))); + }) .value_or(false); } bool operator()(ADD inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, rs1 + rs2); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, rs1 + rs2); + }) .value_or(false); } bool operator()(SUB inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, rs1 - rs2); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, rs1 - rs2); + }) .value_or(false); } bool operator()(SLL inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, rs1 << (rs2 & 0b111111)); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, + rs1 << (rs2 & 0b111111)); + }) .value_or(false); } bool operator()(SLT inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadI64(m_emu), inst.rs2.ReadI64(m_emu)), [&](auto &&tup) { auto [rs1, rs2] = tup; @@ -764,34 +760,32 @@ .value_or(false); } bool operator()(SLTU inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, rs1 < rs2); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, rs1 < rs2); + }) .value_or(false); } bool operator()(XOR inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, rs1 ^ rs2); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, rs1 ^ rs2); + }) .value_or(false); } bool operator()(SRL inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, rs1 >> (rs2 & 0b111111)); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, + rs1 >> (rs2 & 0b111111)); + }) .value_or(false); } bool operator()(SRA inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadI64(m_emu), inst.rs2.Read(m_emu)), [&](auto &&tup) { auto [rs1, rs2] = tup; @@ -800,21 +794,19 @@ .value_or(false); } bool operator()(OR inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, rs1 | rs2); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, rs1 | rs2); + }) .value_or(false); } bool operator()(AND inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, rs1 & rs2); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, rs1 & rs2); + }) .value_or(false); } bool operator()(LWU inst) { @@ -825,81 +817,78 @@ } bool operator()(SD inst) { return Store<SD, uint64_t>(m_emu, inst); } bool operator()(SLLI inst) { - return llvm::transformOptional(inst.rs1.Read(m_emu), - [&](uint64_t rs1) { - return inst.rd.Write(m_emu, - rs1 << inst.shamt); - }) + return transformOptional(inst.rs1.Read(m_emu), + [&](uint64_t rs1) { + return inst.rd.Write(m_emu, rs1 << inst.shamt); + }) .value_or(false); } bool operator()(SRLI inst) { - return llvm::transformOptional(inst.rs1.Read(m_emu), - [&](uint64_t rs1) { - return inst.rd.Write(m_emu, - rs1 >> inst.shamt); - }) + return transformOptional(inst.rs1.Read(m_emu), + [&](uint64_t rs1) { + return inst.rd.Write(m_emu, rs1 >> inst.shamt); + }) .value_or(false); } bool operator()(SRAI inst) { - return llvm::transformOptional(inst.rs1.ReadI64(m_emu), - [&](int64_t rs1) { - return inst.rd.Write(m_emu, - rs1 >> inst.shamt); - }) + return transformOptional(inst.rs1.ReadI64(m_emu), + [&](int64_t rs1) { + return inst.rd.Write(m_emu, rs1 >> inst.shamt); + }) .value_or(false); } bool operator()(ADDIW inst) { - return llvm::transformOptional(inst.rs1.ReadI32(m_emu), - [&](int32_t rs1) { - return inst.rd.Write( - m_emu, SextW(rs1 + SignExt(inst.imm))); - }) + return transformOptional(inst.rs1.ReadI32(m_emu), + [&](int32_t rs1) { + return inst.rd.Write( + m_emu, SextW(rs1 + SignExt(inst.imm))); + }) .value_or(false); } bool operator()(SLLIW inst) { - return llvm::transformOptional(inst.rs1.ReadU32(m_emu), - [&](uint32_t rs1) { - return inst.rd.Write( - m_emu, SextW(rs1 << inst.shamt)); - }) + return transformOptional(inst.rs1.ReadU32(m_emu), + [&](uint32_t rs1) { + return inst.rd.Write(m_emu, + SextW(rs1 << inst.shamt)); + }) .value_or(false); } bool operator()(SRLIW inst) { - return llvm::transformOptional(inst.rs1.ReadU32(m_emu), - [&](uint32_t rs1) { - return inst.rd.Write( - m_emu, SextW(rs1 >> inst.shamt)); - }) + return transformOptional(inst.rs1.ReadU32(m_emu), + [&](uint32_t rs1) { + return inst.rd.Write(m_emu, + SextW(rs1 >> inst.shamt)); + }) .value_or(false); } bool operator()(SRAIW inst) { - return llvm::transformOptional(inst.rs1.ReadI32(m_emu), - [&](int32_t rs1) { - return inst.rd.Write( - m_emu, SextW(rs1 >> inst.shamt)); - }) + return transformOptional(inst.rs1.ReadI32(m_emu), + [&](int32_t rs1) { + return inst.rd.Write(m_emu, + SextW(rs1 >> inst.shamt)); + }) .value_or(false); } bool operator()(ADDW inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, SextW(uint32_t(rs1 + rs2))); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, + SextW(uint32_t(rs1 + rs2))); + }) .value_or(false); } bool operator()(SUBW inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, SextW(uint32_t(rs1 - rs2))); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, + SextW(uint32_t(rs1 - rs2))); + }) .value_or(false); } bool operator()(SLLW inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadU32(m_emu), inst.rs2.ReadU32(m_emu)), [&](auto &&tup) { auto [rs1, rs2] = tup; @@ -908,7 +897,7 @@ .value_or(false); } bool operator()(SRLW inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadU32(m_emu), inst.rs2.ReadU32(m_emu)), [&](auto &&tup) { auto [rs1, rs2] = tup; @@ -917,7 +906,7 @@ .value_or(false); } bool operator()(SRAW inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadI32(m_emu), inst.rs2.Read(m_emu)), [&](auto &&tup) { auto [rs1, rs2] = tup; @@ -927,55 +916,52 @@ } // RV32M & RV64M (Integer Multiplication and Division Extension) // bool operator()(MUL inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - return inst.rd.Write(m_emu, rs1 * rs2); - }) + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + return inst.rd.Write(m_emu, rs1 * rs2); + }) .value_or(false); } bool operator()(MULH inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), [&](auto &&tup) { auto [rs1, rs2] = tup; // signed * signed - auto mul = - llvm::APInt(128, rs1, true) * llvm::APInt(128, rs2, true); + auto mul = APInt(128, rs1, true) * APInt(128, rs2, true); return inst.rd.Write(m_emu, mul.ashr(64).trunc(64).getZExtValue()); }) .value_or(false); } bool operator()(MULHSU inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), [&](auto &&tup) { auto [rs1, rs2] = tup; // signed * unsigned - auto mul = llvm::APInt(128, rs1, true).zext(128) * - llvm::APInt(128, rs2, false); + auto mul = + APInt(128, rs1, true).zext(128) * APInt(128, rs2, false); return inst.rd.Write(m_emu, mul.lshr(64).trunc(64).getZExtValue()); }) .value_or(false); } bool operator()(MULHU inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), [&](auto &&tup) { auto [rs1, rs2] = tup; // unsigned * unsigned - auto mul = llvm::APInt(128, rs1, false) * - llvm::APInt(128, rs2, false); + auto mul = APInt(128, rs1, false) * APInt(128, rs2, false); return inst.rd.Write(m_emu, mul.lshr(64).trunc(64).getZExtValue()); }) .value_or(false); } bool operator()(DIV inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadI64(m_emu), inst.rs2.ReadI64(m_emu)), [&](auto &&tup) { auto [dividend, divisor] = tup; @@ -991,20 +977,19 @@ .value_or(false); } bool operator()(DIVU inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [dividend, divisor] = tup; + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [dividend, divisor] = tup; - if (divisor == 0) - return inst.rd.Write(m_emu, UINT64_MAX); + if (divisor == 0) + return inst.rd.Write(m_emu, UINT64_MAX); - return inst.rd.Write(m_emu, dividend / divisor); - }) + return inst.rd.Write(m_emu, dividend / divisor); + }) .value_or(false); } bool operator()(REM inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadI64(m_emu), inst.rs2.ReadI64(m_emu)), [&](auto &&tup) { auto [dividend, divisor] = tup; @@ -1020,20 +1005,19 @@ .value_or(false); } bool operator()(REMU inst) { - return llvm::transformOptional( - zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), - [&](auto &&tup) { - auto [dividend, divisor] = tup; + return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)), + [&](auto &&tup) { + auto [dividend, divisor] = tup; - if (divisor == 0) - return inst.rd.Write(m_emu, dividend); + if (divisor == 0) + return inst.rd.Write(m_emu, dividend); - return inst.rd.Write(m_emu, dividend % divisor); - }) + return inst.rd.Write(m_emu, dividend % divisor); + }) .value_or(false); } bool operator()(MULW inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadI32(m_emu), inst.rs2.ReadI32(m_emu)), [&](auto &&tup) { auto [rs1, rs2] = tup; @@ -1042,7 +1026,7 @@ .value_or(false); } bool operator()(DIVW inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadI32(m_emu), inst.rs2.ReadI32(m_emu)), [&](auto &&tup) { auto [dividend, divisor] = tup; @@ -1058,7 +1042,7 @@ .value_or(false); } bool operator()(DIVUW inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadU32(m_emu), inst.rs2.ReadU32(m_emu)), [&](auto &&tup) { auto [dividend, divisor] = tup; @@ -1071,7 +1055,7 @@ .value_or(false); } bool operator()(REMW inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadI32(m_emu), inst.rs2.ReadI32(m_emu)), [&](auto &&tup) { auto [dividend, divisor] = tup; @@ -1087,7 +1071,7 @@ .value_or(false); } bool operator()(REMUW inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadU32(m_emu), inst.rs2.ReadU32(m_emu)), [&](auto &&tup) { auto [dividend, divisor] = tup; @@ -1189,19 +1173,18 @@ [](uint64_t a, uint64_t b) { return std::max(a, b); }); } bool operator()(FLW inst) { - return llvm::transformOptional( + return transformOptional( inst.rs1.Read(m_emu), [&](auto &&rs1) { uint64_t addr = rs1 + uint64_t(inst.imm); uint64_t bits = m_emu.ReadMem<uint64_t>(addr).value(); - llvm::APFloat f(llvm::APFloat::IEEEsingle(), - llvm::APInt(32, bits)); + APFloat f(APFloat::IEEEsingle(), APInt(32, bits)); return inst.rd.WriteAPFloat(m_emu, f); }) .value_or(false); } bool operator()(FSW inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.Read(m_emu), inst.rs2.ReadAPFloat(m_emu, false)), [&](auto &&tup) { auto [rs1, rs2] = tup; @@ -1212,103 +1195,102 @@ .value_or(false); } bool operator()(FMADD_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false), - inst.rs3.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2, rs3] = tup; - auto res = rs1.fusedMultiplyAdd( - rs2, rs3, m_emu.GetRoundingMode()); - inst.rd.WriteAPFloat(m_emu, rs1); - return m_emu.SetAccruedExceptions(res); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false), + inst.rs3.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2, rs3] = tup; + auto res = rs1.fusedMultiplyAdd( + rs2, rs3, m_emu.GetRoundingMode()); + inst.rd.WriteAPFloat(m_emu, rs1); + return m_emu.SetAccruedExceptions(res); + }) .value_or(false); } bool operator()(FMSUB_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false), - inst.rs3.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2, rs3] = tup; - auto res = rs1.fusedMultiplyAdd( - rs2, -rs3, m_emu.GetRoundingMode()); - inst.rd.WriteAPFloat(m_emu, rs1); - return m_emu.SetAccruedExceptions(res); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false), + inst.rs3.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2, rs3] = tup; + auto res = rs1.fusedMultiplyAdd( + rs2, -rs3, m_emu.GetRoundingMode()); + inst.rd.WriteAPFloat(m_emu, rs1); + return m_emu.SetAccruedExceptions(res); + }) .value_or(false); } bool operator()(FNMSUB_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false), - inst.rs3.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2, rs3] = tup; - auto res = rs1.fusedMultiplyAdd( - -rs2, rs3, m_emu.GetRoundingMode()); - inst.rd.WriteAPFloat(m_emu, rs1); - return m_emu.SetAccruedExceptions(res); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false), + inst.rs3.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2, rs3] = tup; + auto res = rs1.fusedMultiplyAdd( + -rs2, rs3, m_emu.GetRoundingMode()); + inst.rd.WriteAPFloat(m_emu, rs1); + return m_emu.SetAccruedExceptions(res); + }) .value_or(false); } bool operator()(FNMADD_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false), - inst.rs3.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2, rs3] = tup; - auto res = rs1.fusedMultiplyAdd( - -rs2, -rs3, m_emu.GetRoundingMode()); - inst.rd.WriteAPFloat(m_emu, rs1); - return m_emu.SetAccruedExceptions(res); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false), + inst.rs3.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2, rs3] = tup; + auto res = rs1.fusedMultiplyAdd( + -rs2, -rs3, m_emu.GetRoundingMode()); + inst.rd.WriteAPFloat(m_emu, rs1); + return m_emu.SetAccruedExceptions(res); + }) .value_or(false); } bool operator()(FADD_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - auto res = - rs1.add(rs2, m_emu.GetRoundingMode()); - inst.rd.WriteAPFloat(m_emu, rs1); - return m_emu.SetAccruedExceptions(res); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + auto res = rs1.add(rs2, m_emu.GetRoundingMode()); + inst.rd.WriteAPFloat(m_emu, rs1); + return m_emu.SetAccruedExceptions(res); + }) .value_or(false); } bool operator()(FSUB_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - auto res = rs1.subtract( - rs2, m_emu.GetRoundingMode()); - inst.rd.WriteAPFloat(m_emu, rs1); - return m_emu.SetAccruedExceptions(res); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + auto res = + rs1.subtract(rs2, m_emu.GetRoundingMode()); + inst.rd.WriteAPFloat(m_emu, rs1); + return m_emu.SetAccruedExceptions(res); + }) .value_or(false); } bool operator()(FMUL_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - auto res = rs1.multiply( - rs2, m_emu.GetRoundingMode()); - inst.rd.WriteAPFloat(m_emu, rs1); - return m_emu.SetAccruedExceptions(res); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + auto res = + rs1.multiply(rs2, m_emu.GetRoundingMode()); + inst.rd.WriteAPFloat(m_emu, rs1); + return m_emu.SetAccruedExceptions(res); + }) .value_or(false); } bool operator()(FDIV_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - auto res = rs1.divide( - rs2, m_emu.GetRoundingMode()); - inst.rd.WriteAPFloat(m_emu, rs1); - return m_emu.SetAccruedExceptions(res); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + auto res = + rs1.divide(rs2, m_emu.GetRoundingMode()); + inst.rd.WriteAPFloat(m_emu, rs1); + return m_emu.SetAccruedExceptions(res); + }) .value_or(false); } bool operator()(FSQRT_S inst) { @@ -1316,46 +1298,46 @@ return false; } bool operator()(FSGNJ_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - rs1.copySign(rs2); - return inst.rd.WriteAPFloat(m_emu, rs1); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + rs1.copySign(rs2); + return inst.rd.WriteAPFloat(m_emu, rs1); + }) .value_or(false); } bool operator()(FSGNJN_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - rs1.copySign(-rs2); - return inst.rd.WriteAPFloat(m_emu, rs1); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + rs1.copySign(-rs2); + return inst.rd.WriteAPFloat(m_emu, rs1); + }) .value_or(false); } bool operator()(FSGNJX_S inst) { - return llvm::transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), - inst.rs2.ReadAPFloat(m_emu, false)), - [&](auto &&tup) { - auto [rs1, rs2] = tup; - // spec: the sign bit is the XOR of the - // sign bits of rs1 and rs2. if rs1 and rs2 - // have the same signs set rs1 to positive - // else set rs1 to negative - if (rs1.isNegative() == rs2.isNegative()) { - rs1.clearSign(); - } else { - rs1.clearSign(); - rs1.changeSign(); - } - return inst.rd.WriteAPFloat(m_emu, rs1); - }) + return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, false), + inst.rs2.ReadAPFloat(m_emu, false)), + [&](auto &&tup) { + auto [rs1, rs2] = tup; + // spec: the sign bit is the XOR of the + // sign bits of rs1 and rs2. if rs1 and rs2 + // have the same signs set rs1 to positive + // else set rs1 to negative + if (rs1.isNegative() == rs2.isNegative()) { + rs1.clearSign(); + } else { + rs1.clearSign(); + rs1.changeSign(); + } + return inst.rd.WriteAPFloat(m_emu, rs1); + }) .value_or(false); } bool operator()(FMIN_S inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadAPFloat(m_emu, false), inst.rs2.ReadAPFloat(m_emu, false)), [&](auto &&tup) { @@ -1365,10 +1347,9 @@ // operand. Signaling NaN inputs set the invalid operation // exception flag, even when the result is not NaN. if (rs1.isNaN() || rs2.isNaN()) - m_emu.SetAccruedExceptions(llvm::APFloat::opInvalidOp); + m_emu.SetAccruedExceptions(APFloat::opInvalidOp); if (rs1.isNaN() && rs2.isNaN()) { - auto canonicalNaN = - llvm::APFloat::getQNaN(rs1.getSemantics()); + auto canonicalNaN = APFloat::getQNaN(rs1.getSemantics()); return inst.rd.WriteAPFloat(m_emu, canonicalNaN); } return inst.rd.WriteAPFloat(m_emu, minnum(rs1, rs2)); @@ -1376,16 +1357,15 @@ .value_or(false); } bool operator()(FMAX_S inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadAPFloat(m_emu, false), inst.rs2.ReadAPFloat(m_emu, false)), [&](auto &&tup) { auto [rs1, rs2] = tup; if (rs1.isNaN() || rs2.isNaN()) - m_emu.SetAccruedExceptions(llvm::APFloat::opInvalidOp); + m_emu.SetAccruedExceptions(APFloat::opInvalidOp); if (rs1.isNaN() && rs2.isNaN()) { - auto canonicalNaN = - llvm::APFloat::getQNaN(rs1.getSemantics()); + auto canonicalNaN = APFloat::getQNaN(rs1.getSemantics()); return inst.rd.WriteAPFloat(m_emu, canonicalNaN); } return inst.rd.WriteAPFloat(m_emu, maxnum(rs1, rs2)); @@ -1393,172 +1373,168 @@ .value_or(false); } bool operator()(FCVT_W_S inst) { - return llvm::transformOptional(inst.rs1.ReadAPFloat(m_emu, false), - [&](auto &&rs1) { - int32_t res = rs1.convertToFloat(); - return inst.rd.Write(m_emu, uint64_t(res)); - }) + return transformOptional(inst.rs1.ReadAPFloat(m_emu, false), + [&](auto &&rs1) { + int32_t res = rs1.convertToFloat(); + return inst.rd.Write(m_emu, uint64_t(res)); + }) .value_or(false); } bool operator()(FCVT_WU_S inst) { - return llvm::transformOptional(inst.rs1.ReadAPFloat(m_emu, false), - [&](auto &&rs1) { - uint32_t res = rs1.convertToFloat(); - return inst.rd.Write(m_emu, uint64_t(res)); - }) + return transformOptional(inst.rs1.ReadAPFloat(m_emu, false), + [&](auto &&rs1) { + uint32_t res = rs1.convertToFloat(); + return inst.rd.Write(m_emu, uint64_t(res)); + }) .value_or(false); } bool operator()(FMV_X_W inst) { - return llvm::transformOptional( - inst.rs1.ReadAPFloat(m_emu, false), - [&](auto &&rs1) { - if (rs1.isNaN()) - return inst.rd.Write(m_emu, 0x7fc00000); - auto bits = rs1.bitcastToAPInt(); - return inst.rd.Write(m_emu, - NanBoxing(uint64_t(bits.getSExtValue()))); - }) + return transformOptional(inst.rs1.ReadAPFloat(m_emu, false), + [&](auto &&rs1) { + if (rs1.isNaN()) + return inst.rd.Write(m_emu, 0x7fc00000); + auto bits = rs1.bitcastToAPInt(); + return inst.rd.Write( + m_emu, + NanBoxing(uint64_t(bits.getSExtValue()))); + }) .value_or(false); } bool operator()(FEQ_S inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadAPFloat(m_emu, false), inst.rs2.ReadAPFloat(m_emu, false)), [&](auto &&tup) { auto [rs1, rs2] = tup; if (rs1.isNaN() || rs2.isNaN()) { if (rs1.isSignaling() || rs2.isSignaling()) - m_emu.SetAccruedExceptions(llvm::APFloat::opInvalidOp); + m_emu.SetAccruedExceptions(APFloat::opInvalidOp); return inst.rd.Write(m_emu, 0); } - return inst.rd.Write(m_emu, rs1.compare(rs2) == - llvm::APFloat::cmpEqual); + return inst.rd.Write(m_emu, + rs1.compare(rs2) == APFloat::cmpEqual); }) .value_or(false); } bool operator()(FLT_S inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadAPFloat(m_emu, false), inst.rs2.ReadAPFloat(m_emu, false)), [&](auto &&tup) { auto [rs1, rs2] = tup; if (rs1.isNaN() || rs2.isNaN()) { - m_emu.SetAccruedExceptions(llvm::APFloat::opInvalidOp); + m_emu.SetAccruedExceptions(APFloat::opInvalidOp); return inst.rd.Write(m_emu, 0); } - return inst.rd.Write(m_emu, rs1.compare(rs2) == - llvm::APFloat::cmpLessThan); + return inst.rd.Write(m_emu, + rs1.compare(rs2) == APFloat::cmpLessThan); }) .value_or(false); } bool operator()(FLE_S inst) { - return llvm::transformOptional( + return transformOptional( zipOpt(inst.rs1.ReadAPFloat(m_emu, false), inst.rs2.ReadAPFloat(m_emu, false)), [&](auto &&tup) { auto [rs1, rs2] = tup; if (rs1.isNaN() || rs2.isNaN()) { - m_emu.SetAccruedExceptions(llvm::APFloat::opInvalidOp); + m_emu.SetAccruedExceptions(APFloat::opInvalidOp); return inst.rd.Write(m_emu, 0); } return inst.rd.Write(m_emu, rs1.compare(rs2) != - llvm::APFloat::cmpGreaterThan); + APFloat::cmpGreaterThan); }) .value_or(false); } bool operator()(FCLASS_S inst) { - return llvm::transformOptional(inst.rs1.ReadAPFloat(m_emu, false), - [&](auto &&rs1) { - uint64_t result = 0; - if (rs1.isInfinity() && rs1.isNegative()) - result |= 1 << 0; - // neg normal - if (rs1.isNormal() && rs1.isNegative()) - result |= 1 << 1; - // neg subnormal - if (rs1.isDenormal() && rs1.isNegative()) - result |= 1 << 2; - if (rs1.isNegZero()) - result |= 1 << 3; - if (rs1.isPosZero()) - result |= 1 << 4; - // pos normal - if (rs1.isNormal() && !rs1.isNegative()) - result |= 1 << 5; - // pos subnormal - if (rs1.isDenormal() && !rs1.isNegative()) - result |= 1 << 6; - if (rs1.isInfinity() && !rs1.isNegative()) - result |= 1 << 7; - if (rs1.isNaN()) { - if (rs1.isSignaling()) - result |= 1 << 8; - else - result |= 1 << 9; - } - return inst.rd.Write(m_emu, result); - }) + return transformOptional(inst.rs1.ReadAPFloat(m_emu, false), + [&](auto &&rs1) { + uint64_t result = 0; + if (rs1.isInfinity() && rs1.isNegative()) + result |= 1 << 0; + // neg normal + if (rs1.isNormal() && rs1.isNegative()) + result |= 1 << 1; + // neg subnormal + if (rs1.isDenormal() && rs1.isNegative()) + result |= 1 << 2; + if (rs1.isNegZero()) + result |= 1 << 3; + if (rs1.isPosZero()) + result |= 1 << 4; + // pos normal + if (rs1.isNormal() && !rs1.isNegative()) + result |= 1 << 5; + // pos subnormal + if (rs1.isDenormal() && !rs1.isNegative()) + result |= 1 << 6; + if (rs1.isInfinity() && !rs1.isNegative()) + result |= 1 << 7; + if (rs1.isNaN()) { + if (rs1.isSignaling()) + result |= 1 << 8; + else + result |= 1 << 9; + } + return inst.rd.Write(m_emu, result); + }) .value_or(false); } bool operator()(FCVT_S_W inst) { - return llvm::transformOptional(inst.rs1.ReadI32(m_emu), - [&](auto &&rs1) { - llvm::APFloat apf( - llvm::APFloat::IEEEsingle(), rs1); - return inst.rd.WriteAPFloat(m_emu, apf); - }) + return transformOptional(inst.rs1.ReadI32(m_emu), + [&](auto &&rs1) { + APFloat apf(APFloat::IEEEsingle(), rs1); + return inst.rd.WriteAPFloat(m_emu, apf); + }) .value_or(false); } bool operator()(FCVT_S_WU inst) { - return llvm::transformOptional(inst.rs1.ReadU32(m_emu), - [&](auto &&rs1) { - llvm::APFloat apf( - llvm::APFloat::IEEEsingle(), rs1); - return inst.rd.WriteAPFloat(m_emu, apf); - }) + return transformOptional(inst.rs1.ReadU32(m_emu), + [&](auto &&rs1) { + APFloat apf(APFloat::IEEEsingle(), rs1); + return inst.rd.WriteAPFloat(m_emu, apf); + }) .value_or(false); } bool operator()(FMV_W_X inst) { - return llvm::transformOptional(inst.rs1.Read(m_emu), - [&](auto &&rs1) { - llvm::APInt apInt(32, NanUnBoxing(rs1)); - llvm::APFloat apf(apInt.bitsToFloat()); - return inst.rd.WriteAPFloat(m_emu, apf); - }) + return transformOptional(inst.rs1.Read(m_emu), + [&](auto &&rs1) { + APInt apInt(32, NanUnBoxing(rs1)); + APFloat apf(apInt.bitsToFloat()); + return inst.rd.WriteAPFloat(m_emu, apf); + }) .value_or(false); } bool operator()(FCVT_L_S inst) { - return llvm::transformOptional(inst.rs1.ReadAPFloat(m_emu, false), - [&](auto &&rs1) { - int64_t res = rs1.convertToFloat(); - return inst.rd.Write(m_emu, uint64_t(res)); - }) + return transformOptional(inst.rs1.ReadAPFloat(m_emu, false), + [&](auto &&rs1) { + int64_t res = rs1.convertToFloat(); + return inst.rd.Write(m_emu, uint64_t(res)); + }) .value_or(false); } bool operator()(FCVT_LU_S inst) { - return llvm::transformOptional(inst.rs1.ReadAPFloat(m_emu, false), - [&](auto &&rs1) { - uint64_t res = rs1.convertToFloat(); - return inst.rd.Write(m_emu, res); - }) + return transformOptional(inst.rs1.ReadAPFloat(m_emu, false), + [&](auto &&rs1) { + uint64_t res = rs1.convertToFloat(); + return inst.rd.Write(m_emu, res); + }) .value_or(false); } bool operator()(FCVT_S_L inst) { - return llvm::transformOptional(inst.rs1.ReadI64(m_emu), - [&](auto &&rs1) { - llvm::APFloat apf( - llvm::APFloat::IEEEsingle(), rs1); - return inst.rd.WriteAPFloat(m_emu, apf); - }) + return transformOptional(inst.rs1.ReadI64(m_emu), + [&](auto &&rs1) { + APFloat apf(APFloat::IEEEsingle(), rs1); + return inst.rd.WriteAPFloat(m_emu, apf); + }) .value_or(false); } bool operator()(FCVT_S_LU inst) { - return llvm::transformOptional(inst.rs1.Read(m_emu), - [&](auto &&rs1) { - llvm::APFloat apf( - llvm::APFloat::IEEEsingle(), rs1); - return inst.rd.WriteAPFloat(m_emu, apf); - }) + return transformOptional(inst.rs1.Read(m_emu), + [&](auto &&rs1) { + APFloat apf(APFloat::IEEEsingle(), rs1); + return inst.rd.WriteAPFloat(m_emu, apf); + }) .value_or(false); } bool operator()(INVALID inst) { return false; } @@ -1596,10 +1572,9 @@ WritePC(*old_pc + Executor::size(m_decoded.is_rvc)); } -llvm::Optional<DecodeResult> -EmulateInstructionRISCV::ReadInstructionAt(lldb::addr_t addr) { - return llvm::transformOptional(ReadMem<uint32_t>(addr), - [&](uint32_t inst) { return Decode(inst); }) +Optional<DecodeResult> EmulateInstructionRISCV::ReadInstructionAt(addr_t addr) { + return transformOptional(ReadMem<uint32_t>(addr), + [&](uint32_t inst) { return Decode(inst); }) .value_or(std::nullopt); } @@ -1619,14 +1594,14 @@ return true; } -llvm::Optional<lldb::addr_t> EmulateInstructionRISCV::ReadPC() { +Optional<addr_t> EmulateInstructionRISCV::ReadPC() { bool success = false; auto addr = ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_ADDRESS, &success); - return success ? llvm::Optional<lldb::addr_t>(addr) : std::nullopt; + return success ? Optional<addr_t>(addr) : std::nullopt; } -bool EmulateInstructionRISCV::WritePC(lldb::addr_t pc) { +bool EmulateInstructionRISCV::WritePC(addr_t pc) { EmulateInstruction::Context ctx; ctx.type = eContextAdvancePC; ctx.SetNoArgs(); @@ -1634,54 +1609,54 @@ LLDB_REGNUM_GENERIC_PC, pc); } -llvm::RoundingMode EmulateInstructionRISCV::GetRoundingMode() { +RoundingMode EmulateInstructionRISCV::GetRoundingMode() { bool success = false; auto fcsr = ReadRegisterUnsigned(eRegisterKindLLDB, fpr_fcsr_riscv, LLDB_INVALID_ADDRESS, &success); if (!success) - return llvm::RoundingMode::Invalid; + return RoundingMode::Invalid; auto frm = (fcsr >> 5) & 0x7; switch (frm) { case 0b000: - return llvm::RoundingMode::NearestTiesToEven; + return RoundingMode::NearestTiesToEven; case 0b001: - return llvm::RoundingMode::TowardZero; + return RoundingMode::TowardZero; case 0b010: - return llvm::RoundingMode::TowardNegative; + return RoundingMode::TowardNegative; case 0b011: - return llvm::RoundingMode::TowardPositive; + return RoundingMode::TowardPositive; case 0b111: - return llvm::RoundingMode::Dynamic; + return RoundingMode::Dynamic; default: // Reserved for future use. - return llvm::RoundingMode::Invalid; + return RoundingMode::Invalid; } } bool EmulateInstructionRISCV::SetAccruedExceptions( - llvm::APFloatBase::opStatus opStatus) { + APFloatBase::opStatus opStatus) { bool success = false; auto fcsr = ReadRegisterUnsigned(eRegisterKindLLDB, fpr_fcsr_riscv, LLDB_INVALID_ADDRESS, &success); if (!success) return false; switch (opStatus) { - case llvm::APFloatBase::opInvalidOp: + case APFloatBase::opInvalidOp: fcsr |= 1 << 4; break; - case llvm::APFloatBase::opDivByZero: + case APFloatBase::opDivByZero: fcsr |= 1 << 3; break; - case llvm::APFloatBase::opOverflow: + case APFloatBase::opOverflow: fcsr |= 1 << 2; break; - case llvm::APFloatBase::opUnderflow: + case APFloatBase::opUnderflow: fcsr |= 1 << 1; break; - case llvm::APFloatBase::opInexact: + case APFloatBase::opInexact: fcsr |= 1 << 0; break; - case llvm::APFloatBase::opOK: + case APFloatBase::opOK: break; } EmulateInstruction::Context ctx; @@ -1690,8 +1665,8 @@ return WriteRegisterUnsigned(ctx, eRegisterKindLLDB, fpr_fcsr_riscv, fcsr); } -llvm::Optional<RegisterInfo> -EmulateInstructionRISCV::GetRegisterInfo(lldb::RegisterKind reg_kind, +Optional<RegisterInfo> +EmulateInstructionRISCV::GetRegisterInfo(RegisterKind reg_kind, uint32_t reg_index) { if (reg_kind == eRegisterKindGeneric) { switch (reg_index) {
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits