getting to my first branch now

This commit is contained in:
2026-05-12 14:27:59 +02:00
parent e598f02995
commit 2be9570aa9
6 changed files with 50 additions and 5 deletions
+2
View File
@@ -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
View File
@@ -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:");
+4
View File
@@ -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
+8 -1
View File
@@ -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
+11
View File
@@ -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
+19
View File
@@ -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; }