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/ELFIO)
|
||||||
include_directories(external/capstone/include)
|
include_directories(external/capstone/include)
|
||||||
include_directories(external/cflags/include)
|
include_directories(external/cflags/include)
|
||||||
|
include_directories(external/xbyak)
|
||||||
include_directories(external)
|
include_directories(external)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
||||||
|
add_compile_definitions(NOMINMAX)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CAPSTONE_ARCHITECTURE_DEFAULT OFF)
|
set(CAPSTONE_ARCHITECTURE_DEFAULT OFF)
|
||||||
|
|||||||
+5
-3
@@ -1,4 +1,4 @@
|
|||||||
#include <broadway.hpp>
|
#include <broadway/utils.hpp>
|
||||||
#include <mem.hpp>
|
#include <mem.hpp>
|
||||||
#include <print>
|
#include <print>
|
||||||
#include <ircolib/log.hpp>
|
#include <ircolib/log.hpp>
|
||||||
@@ -29,11 +29,13 @@ ircolib::u32 broadway::fetch(mem &mem) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void broadway::execute(ircolib::u32 instr, mem &mem) {
|
void broadway::execute(ircolib::u32 instr, mem &mem) {
|
||||||
ircolib::u8 primary = (instr >> 26) & 0x3f;
|
switch (utils::primary(instr)) {
|
||||||
switch (primary) {
|
|
||||||
case 15: // addis rd, ra, simm
|
case 15: // addis rd, ra, simm
|
||||||
addis(instr);
|
addis(instr);
|
||||||
break;
|
break;
|
||||||
|
case 24: // ori ra, rs, uimm
|
||||||
|
ori(instr);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
std::println("broadway::execute unimplemented instruction 0x{:08X} / 0b{:032b}", instr, instr);
|
std::println("broadway::execute unimplemented instruction 0x{:08X} / 0b{:032b}", instr, instr);
|
||||||
std::println("disassembly:");
|
std::println("disassembly:");
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <ircolib/types.hpp>
|
#include <ircolib/types.hpp>
|
||||||
#include <capstone/capstone.h>
|
#include <capstone/capstone.h>
|
||||||
|
#include <xbyak/xbyak.h>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
namespace weee::core {
|
namespace weee::core {
|
||||||
@@ -18,9 +19,12 @@ struct broadway {
|
|||||||
bool disasm_available = true;
|
bool disasm_available = true;
|
||||||
ircolib::u32 pc = 0;
|
ircolib::u32 pc = 0;
|
||||||
std::array<ircolib::u32, 32> gpr{};
|
std::array<ircolib::u32, 32> gpr{};
|
||||||
|
// ircolib::u32 const_gpr_lookup{};
|
||||||
csh capstone;
|
csh capstone;
|
||||||
|
// Xbyak::CodeGenerator code;
|
||||||
|
|
||||||
// instructions
|
// instructions
|
||||||
void addis(ircolib::u32);
|
void addis(ircolib::u32);
|
||||||
|
void ori(ircolib::u32);
|
||||||
};
|
};
|
||||||
} // namespace weee::core
|
} // namespace weee::core
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
#include <broadway.hpp>
|
#include <broadway/utils.hpp>
|
||||||
|
|
||||||
namespace weee::core {
|
namespace weee::core {
|
||||||
void broadway::addis(ircolib::u32 instr) {
|
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
|
} // 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 s32 = int32_t;
|
||||||
using s64 = int64_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
|
} // namespace ircolib
|
||||||
|
|
||||||
constexpr ircolib::u32 operator""_kib(const unsigned long long v) { return v * 1024; }
|
constexpr ircolib::u32 operator""_kib(const unsigned long long v) { return v * 1024; }
|
||||||
|
|||||||
Reference in New Issue
Block a user