getting to my first branch now
This commit is contained in:
@@ -9,10 +9,12 @@ option(BUILD_SHARED_LIBS OFF)
|
||||
include_directories(external/ELFIO)
|
||||
include_directories(external/capstone/include)
|
||||
include_directories(external/cflags/include)
|
||||
include_directories(external/xbyak)
|
||||
include_directories(external)
|
||||
|
||||
if(WIN32)
|
||||
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
||||
add_compile_definitions(NOMINMAX)
|
||||
endif()
|
||||
|
||||
set(CAPSTONE_ARCHITECTURE_DEFAULT OFF)
|
||||
|
||||
+5
-3
@@ -1,4 +1,4 @@
|
||||
#include <broadway.hpp>
|
||||
#include <broadway/utils.hpp>
|
||||
#include <mem.hpp>
|
||||
#include <print>
|
||||
#include <ircolib/log.hpp>
|
||||
@@ -29,11 +29,13 @@ ircolib::u32 broadway::fetch(mem &mem) {
|
||||
}
|
||||
|
||||
void broadway::execute(ircolib::u32 instr, mem &mem) {
|
||||
ircolib::u8 primary = (instr >> 26) & 0x3f;
|
||||
switch (primary) {
|
||||
switch (utils::primary(instr)) {
|
||||
case 15: // addis rd, ra, simm
|
||||
addis(instr);
|
||||
break;
|
||||
case 24: // ori ra, rs, uimm
|
||||
ori(instr);
|
||||
break;
|
||||
default:
|
||||
std::println("broadway::execute unimplemented instruction 0x{:08X} / 0b{:032b}", instr, instr);
|
||||
std::println("disassembly:");
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include <ircolib/types.hpp>
|
||||
#include <capstone/capstone.h>
|
||||
#include <xbyak/xbyak.h>
|
||||
#include <array>
|
||||
|
||||
namespace weee::core {
|
||||
@@ -18,9 +19,12 @@ struct broadway {
|
||||
bool disasm_available = true;
|
||||
ircolib::u32 pc = 0;
|
||||
std::array<ircolib::u32, 32> gpr{};
|
||||
// ircolib::u32 const_gpr_lookup{};
|
||||
csh capstone;
|
||||
// Xbyak::CodeGenerator code;
|
||||
|
||||
// instructions
|
||||
void addis(ircolib::u32);
|
||||
void ori(ircolib::u32);
|
||||
};
|
||||
} // namespace weee::core
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
#include <broadway.hpp>
|
||||
#include <broadway/utils.hpp>
|
||||
|
||||
namespace weee::core {
|
||||
void broadway::addis(ircolib::u32 instr) {
|
||||
|
||||
if (utils::RA(instr) == 0) { // lis
|
||||
gpr[utils::RD(instr)] = ircolib::s32(utils::SIMM(instr)) << 16;
|
||||
return;
|
||||
}
|
||||
|
||||
gpr[utils::RD(instr)] = gpr[utils::RA(instr)] + (ircolib::s32(utils::SIMM(instr)) << 16);
|
||||
}
|
||||
|
||||
void broadway::ori(ircolib::u32 instr) { gpr[utils::RA(instr)] = gpr[utils::RS(instr)] | utils::UIMM(instr); }
|
||||
} // namespace weee::core
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
#include <broadway.hpp>
|
||||
|
||||
namespace weee::core::utils {
|
||||
static inline ircolib::u8 primary(ircolib::u32 instr) { return (instr >> 26) & 0x3f; }
|
||||
static inline ircolib::u8 RD(ircolib::u32 instr) { return (instr >> 21) & 0x1f; }
|
||||
static inline ircolib::u8 RS(ircolib::u32 instr) { return RD(instr); }
|
||||
static inline ircolib::u8 RA(ircolib::u32 instr) { return (instr >> 16) & 0x1f; }
|
||||
static inline ircolib::u16 UIMM(ircolib::u32 instr) { return instr & 0xffff; }
|
||||
static inline ircolib::s16 SIMM(ircolib::u32 instr) { return UIMM(instr); }
|
||||
} // namespace weee::core::utils
|
||||
Vendored
+19
@@ -11,6 +11,25 @@ using s16 = int16_t;
|
||||
using s32 = int32_t;
|
||||
using s64 = int64_t;
|
||||
|
||||
template <typename T, size_t bit>
|
||||
static constexpr bool is_bit_set(const T &val) {
|
||||
return val & (1 << bit);
|
||||
}
|
||||
|
||||
template <typename T, size_t bit>
|
||||
static constexpr void set_bit(T &val) {
|
||||
val |= 1 << bit;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline bool is_bit_set(const T &val, const size_t &bit) {
|
||||
return val & (1 << bit);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline void set_bit(T &val, const size_t &bit) {
|
||||
val |= 1 << bit;
|
||||
}
|
||||
} // namespace ircolib
|
||||
|
||||
constexpr ircolib::u32 operator""_kib(const unsigned long long v) { return v * 1024; }
|
||||
|
||||
Reference in New Issue
Block a user