/* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * This software may be used and distributed according to the terms of the GNU * General Public License version 2 or any later version. */ #pragma once #include "frontend_arm/arm_types.h" #include "frontend_arm/ir/ir.h" #include "frontend_arm/ir/opcodes.h" namespace Dynarmic { namespace Arm { class IREmitter { public: IR::Block block = Dynarmic::IR::Block({0, false, false}); struct ResultAndCarry { IR::ValuePtr result; IR::ValuePtr carry; }; void Unimplemented(); IR::ValuePtr Imm8(u8 value); IR::ValuePtr GetRegister(Reg source_reg); void SetRegister(const Reg dest_reg, IR::ValuePtr value); IR::ValuePtr GetCFlag(); void SetNFlag(IR::ValuePtr value); void SetZFlag(IR::ValuePtr value); void SetCFlag(IR::ValuePtr value); IR::ValuePtr LeastSignificantByte(IR::ValuePtr value); IR::ValuePtr MostSignificantBit(IR::ValuePtr value); IR::ValuePtr IsZero(IR::ValuePtr value); ResultAndCarry LogicalShiftLeft(IR::ValuePtr value_in, IR::ValuePtr shift_amount, IR::ValuePtr carry_in); ResultAndCarry LogicalShiftRight(IR::ValuePtr value_in, IR::ValuePtr shift_amount, IR::ValuePtr carry_in); private: IR::ValuePtr Inst(IR::Opcode op, std::initializer_list args); IR::ValuePtr RegRef(Reg reg); void AddToBlock(IR::ValuePtr value); }; } // namespace Arm } // namespace Dynarmic