diff --git a/src/Assembler/Core/BinaryTransformer.cpp b/src/Assembler/Core/BinaryTransformer.cpp index 55840af9..9499da93 100644 --- a/src/Assembler/Core/BinaryTransformer.cpp +++ b/src/Assembler/Core/BinaryTransformer.cpp @@ -153,13 +153,24 @@ void HCAsm::BinaryTransformer::EncodeInstruction(HCAsm::Instruction& instr) { case HyperCPU::OperandTypes::RM_IMM: case HyperCPU::OperandTypes::R_IMM: res.push(static_cast(instr.op1.reg)); - switch (md) { - case HCAsm::Mode::b8: res.push(static_cast(std::get(instr.op2.variant))); break; - case HCAsm::Mode::b16: res.push(static_cast(std::get(instr.op2.variant))); break; - case HCAsm::Mode::b32: res.push(static_cast(std::get(instr.op2.variant))); break; - case HCAsm::Mode::b64: res.push(static_cast(std::get(instr.op2.variant))); break; - default: - UNREACHABLE(); + if (std::holds_alternative(instr.op2.variant)) { + switch (md) { + case HCAsm::Mode::b8: res.push(static_cast(std::get(instr.op2.variant))); break; + case HCAsm::Mode::b16: res.push(static_cast(std::get(instr.op2.variant))); break; + case HCAsm::Mode::b32: res.push(static_cast(std::get(instr.op2.variant))); break; + case HCAsm::Mode::b64: res.push(static_cast(std::get(instr.op2.variant))); break; + default: + UNREACHABLE(); + } + } else { + switch (md) { + case HCAsm::Mode::b8: res.push(static_cast(std::get(instr.op2.variant))); break; + case HCAsm::Mode::b16: res.push(static_cast(std::get(instr.op2.variant))); break; + case HCAsm::Mode::b32: res.push(static_cast(std::get(instr.op2.variant))); break; + case HCAsm::Mode::b64: res.push(static_cast(std::get(instr.op2.variant))); break; + default: + UNREACHABLE(); + } } break; case HyperCPU::OperandTypes::R: @@ -169,13 +180,24 @@ void HCAsm::BinaryTransformer::EncodeInstruction(HCAsm::Instruction& instr) { res.push(std::get(instr.op2.variant)); break; case HyperCPU::OperandTypes::IMM: - switch (md) { - case HCAsm::Mode::b8: res.push(static_cast(std::get(instr.op1.variant))); break; - case HCAsm::Mode::b16: res.push(static_cast(std::get(instr.op1.variant))); break; - case HCAsm::Mode::b32: res.push(static_cast(std::get(instr.op1.variant))); break; - case HCAsm::Mode::b64: res.push(static_cast(std::get(instr.op1.variant))); break; - default: - UNREACHABLE(); + if (std::holds_alternative(instr.op2.variant)) { + switch (md) { + case HCAsm::Mode::b8: res.push(static_cast(std::get(instr.op1.variant))); break; + case HCAsm::Mode::b16: res.push(static_cast(std::get(instr.op1.variant))); break; + case HCAsm::Mode::b32: res.push(static_cast(std::get(instr.op1.variant))); break; + case HCAsm::Mode::b64: res.push(static_cast(std::get(instr.op1.variant))); break; + default: + UNREACHABLE(); + } + } else { + switch (md) { + case HCAsm::Mode::b8: res.push(static_cast(std::get(instr.op1.variant))); break; + case HCAsm::Mode::b16: res.push(static_cast(std::get(instr.op1.variant))); break; + case HCAsm::Mode::b32: res.push(static_cast(std::get(instr.op1.variant))); break; + case HCAsm::Mode::b64: res.push(static_cast(std::get(instr.op1.variant))); break; + default: + UNREACHABLE(); + } } break; case HyperCPU::OperandTypes::M_R: diff --git a/src/Assembler/Core/Compiler.hpp b/src/Assembler/Core/Compiler.hpp index c3aad60a..3e3ec031 100644 --- a/src/Assembler/Core/Compiler.hpp +++ b/src/Assembler/Core/Compiler.hpp @@ -79,7 +79,7 @@ namespace HCAsm { }; template - concept UnsignedIntegral = std::is_integral_v && std::is_unsigned_v; + concept Integral = std::is_integral_v; struct BinaryResult { BinaryResult() : binary(nullptr), ptr(0), entry_point(0) { } @@ -89,7 +89,7 @@ namespace HCAsm { std::uint64_t ptr; std::uint32_t entry_point; - template + template constexpr inline void push(T data) { std::memcpy(binary + ptr, &data, sizeof(data)); ptr += sizeof(data); @@ -153,6 +153,7 @@ namespace HCAsm { case Registers::X7: case Registers::XBP: case Registers::XSP: + case Registers::XIP: return Mode::b64; case Registers::XH0: case Registers::XH1: