summaryrefslogtreecommitdiffhomepage
path: root/CompilerKit/AsmKit
diff options
context:
space:
mode:
Diffstat (limited to 'CompilerKit/AsmKit')
-rw-r--r--CompilerKit/AsmKit/Arch/32k.hpp92
-rw-r--r--CompilerKit/AsmKit/Arch/64k.hpp102
-rw-r--r--CompilerKit/AsmKit/AsmKit.cc47
-rw-r--r--CompilerKit/AsmKit/AsmKit.hpp63
4 files changed, 304 insertions, 0 deletions
diff --git a/CompilerKit/AsmKit/Arch/32k.hpp b/CompilerKit/AsmKit/Arch/32k.hpp
new file mode 100644
index 0000000..460a905
--- /dev/null
+++ b/CompilerKit/AsmKit/Arch/32k.hpp
@@ -0,0 +1,92 @@
+/*
+ * ========================================================
+ *
+ * C++Kit
+ * Copyright Western Company, all rights reserved.
+ *
+ * ========================================================
+ */
+
+#pragma once
+
+#include <CompilerKit/Defines.hpp>
+
+// @brief 32x0 support.
+// @file Arch/64k.hpp
+
+#define kAsmOpcodeDecl(__NAME, __OPCODE, __FUNCT3, __FUNCT7) \
+ { .fName = __NAME, .fOpcode = __OPCODE, .fFunct3 = __FUNCT3, .fFunct7 = __FUNCT7 },
+
+
+
+// placeholder for funct7/funct7-rs2
+#define kAsmImmediate 0x00
+#define kAsmSyscall 0x02
+#define kAsmJump 0x03
+
+#define kAsmByte 0
+#define kAsmHWord 1
+#define kAsmWord 2
+
+struct CpuCode32x0
+{
+ const char fName[16];
+ char fOpcode;
+ char fSize;
+ char fFunct3;
+ char fFunct7;
+};
+
+#define kAsmWordStr ".w"
+#define kAsmHWordStr ".h"
+#define kAsmByteStr ".b"
+
+inline std::vector<CpuCode32x0> kOpcodes32x0 = {
+ kAsmOpcodeDecl("nop", 0b0100011, 0b0000000, kAsmImmediate) // nothing to do.
+ kAsmOpcodeDecl("jmp", 0b1110011, 0b0000011, kAsmJump) // jump to branch
+ kAsmOpcodeDecl("move", 0b0100011, 0b101, kAsmImmediate)
+ kAsmOpcodeDecl("push", 0b0111011, 0b0, kAsmImmediate) // push to sp
+ kAsmOpcodeDecl("pop", 0b0111011, 0b1, kAsmImmediate) // pop from sp.
+ kAsmOpcodeDecl("int", 0b0111111, 0b0, kAsmSyscall) // raise interrupt
+};
+
+// \brief NewCPU register prefix
+// example: r32, r0
+// r32 -> sp
+// r0 -> hw zero
+
+#define kAsmRegisterPrefix "r"
+#define kAsmRegisterLimit 20
+#define kAsmPcRegister 17
+#define kAsmCrRegister 18
+#define kAsmSpRegister 5
+
+/* return address register */
+#define kAsmRetRegister 19
+
+/////////////////////////////////////////////////////////////////////////////
+
+// SYSTEM CALL ADDRESSING
+
+// | OPCODE | FUNCT3 | FUNCT7 | OFF |
+
+// IMMEDIATE ADDRESSING
+
+// | OPCODE | FUNCT3 | FUNCT7 | REG | OFF |
+// | OPCODE | FUNCT3 | FUNCT7 | REG | OFF | REG |
+// | OPCODE | FUNCT3 | FUNCT7 | REG | REG | OFF |
+
+// REG TO REG ADDRESSING
+
+// | OPCODE | FUNCT3 | FUNCT7 | REG | REG2 |
+
+////////////////////////////////
+
+// LOAD/CALL INTERRUPTS
+
+// SET A HANDLER IN ADDRESS: TODO: find one
+// DISABLE INTERRUPTS
+// PROCESS INTERRUPT
+// ENABLE INTERRUPTS
+
+//////////////////////////////// \ No newline at end of file
diff --git a/CompilerKit/AsmKit/Arch/64k.hpp b/CompilerKit/AsmKit/Arch/64k.hpp
new file mode 100644
index 0000000..e5c5253
--- /dev/null
+++ b/CompilerKit/AsmKit/Arch/64k.hpp
@@ -0,0 +1,102 @@
+/*
+ * ========================================================
+ *
+ * C++Kit
+ * Copyright Western Company, all rights reserved.
+ *
+ * ========================================================
+ */
+
+#pragma once
+
+#include <CompilerKit/Defines.hpp>
+
+// @brief 64x0 support.
+// @file Arch/64k.hpp
+
+#define kAsmOpcodeDecl(__NAME, __OPCODE, __FUNCT3, __FUNCT7) \
+ { .fName = __NAME, .fOpcode = __OPCODE, .fFunct3 = __FUNCT3, .fFunct7 = __FUNCT7 },
+
+
+
+// placeholder for funct7/funct7-rs2
+#define kAsmImmediate 0x00
+#define kAsmRegToReg 0x01
+#define kAsmSyscall 0x02
+#define kAsmJump 0x03
+
+struct CpuCode64x0
+{
+ const char fName[16];
+ char fOpcode;
+ char fFunct3;
+ char fFunct7;
+};
+
+inline std::vector<CpuCode64x0> kOpcodes64x0 = {
+ kAsmOpcodeDecl("np", 0b0100011, 0b0000000, kAsmImmediate) // mv r0, r0
+ kAsmOpcodeDecl("jb", 0b1110011, 0b0000011, kAsmJump) // jump to branch
+ kAsmOpcodeDecl("jlr", 0b1110011, 0b0000111, kAsmJump) // jump and link return register
+ kAsmOpcodeDecl("jrl", 0b1110011, 0b0001111, kAsmJump) // jump to register link
+ kAsmOpcodeDecl("jr", 0b1110011, 0b0001011, kAsmJump) // jump to register
+ kAsmOpcodeDecl("jal", 0b1110011, 0b0000001, kAsmJump)
+ kAsmOpcodeDecl("mv", 0b0100011, 0b101, kAsmRegToReg)
+ kAsmOpcodeDecl("psh", 0b0111011, 0b0, kAsmImmediate) // push to sp
+ kAsmOpcodeDecl("pop", 0b0111011, 0b1, kAsmImmediate) // pop from sp.
+ kAsmOpcodeDecl("bg", 0b1100111, 0b111, kAsmRegToReg)
+ kAsmOpcodeDecl("bl", 0b1100111, 0b011, kAsmRegToReg)
+ kAsmOpcodeDecl("beq", 0b1100111, 0b000, kAsmRegToReg)
+ kAsmOpcodeDecl("bne", 0b1100111, 0b001, kAsmRegToReg)
+ kAsmOpcodeDecl("bge", 0b1100111, 0b101, kAsmRegToReg)
+ kAsmOpcodeDecl("ble", 0b1100111, 0b100, kAsmRegToReg)
+ kAsmOpcodeDecl("stw", 0b0001111, 0b100, kAsmImmediate)
+ kAsmOpcodeDecl("ldw", 0b0001111, 0b100, kAsmImmediate)
+ kAsmOpcodeDecl("lda", 0b0001111, 0b101, kAsmImmediate)
+ kAsmOpcodeDecl("sta", 0b0001111, 0b001, kAsmImmediate)
+ kAsmOpcodeDecl("add", 0b0101011, 0b100, kAsmImmediate)
+ kAsmOpcodeDecl("dec", 0b0101011, 0b101, kAsmImmediate)
+ kAsmOpcodeDecl("scall", 0b1110011, 0b00, kAsmSyscall)
+ kAsmOpcodeDecl("sbreak", 0b1110011, 0b01, kAsmSyscall)
+ kAsmOpcodeDecl("mh", 0b1110011, 0b1111111, kAsmJump)
+};
+
+// \brief NewCPU register prefix
+// example: r32, r0
+// r32 -> sp
+// r0 -> hw zero
+
+#define kAsmRegisterPrefix "r"
+#define kAsmRegisterLimit 20
+#define kAsmPcRegister 17
+#define kAsmCrRegister 18
+#define kAsmSpRegister 5
+
+/* return address register */
+#define kAsmRetRegister 19
+
+/////////////////////////////////////////////////////////////////////////////
+
+// SYSTEM CALL ADDRESSING
+
+// | OPCODE | FUNCT3 | FUNCT7 | OFF |
+
+// IMMEDIATE ADDRESSING
+
+// | OPCODE | FUNCT3 | FUNCT7 | REG | OFF |
+// | OPCODE | FUNCT3 | FUNCT7 | REG | OFF | REG |
+// | OPCODE | FUNCT3 | FUNCT7 | REG | REG | OFF |
+
+// REG TO REG ADDRESSING
+
+// | OPCODE | FUNCT3 | FUNCT7 | REG | REG2 |
+
+////////////////////////////////
+
+// LOAD/CALL INTERRUPTS
+
+// SET A HANDLER IN ADDRESS: TODO: find one
+// DISABLE INTERRUPTS
+// PROCESS INTERRUPT
+// ENABLE INTERRUPTS
+
+//////////////////////////////// \ No newline at end of file
diff --git a/CompilerKit/AsmKit/AsmKit.cc b/CompilerKit/AsmKit/AsmKit.cc
new file mode 100644
index 0000000..4ee031f
--- /dev/null
+++ b/CompilerKit/AsmKit/AsmKit.cc
@@ -0,0 +1,47 @@
+/*
+ * ========================================================
+ *
+ * C++Kit
+ * Copyright Western Company, all rights reserved.
+ *
+ * ========================================================
+ */
+
+#include <AsmKit/AsmKit.hpp>
+#include <StdKit/ErrorID.hpp>
+
+#include <iostream>
+
+//! @file AsmKit.cpp
+//! @brief AssemblyKit
+
+namespace CompilerKit
+{
+ //! @brief Compile for specific format (ELF, PEF, ZBIN)
+ Int32 AssemblyFactory::Compile(StringView& sourceFile,
+ const Int32& arch) noexcept
+ {
+ if (sourceFile.Length() < 1 ||
+ !fMounted)
+ return CXXKIT_UNIMPLEMENTED;
+
+ return fMounted->CompileToFormat(sourceFile, arch);
+ }
+
+ //! @brief mount assembly backend.
+ void AssemblyFactory::Mount(AssemblyMountpoint* mountPtr) noexcept
+ {
+ if (mountPtr)
+ fMounted = mountPtr;
+ }
+
+ AssemblyMountpoint* AssemblyFactory::Unmount() noexcept
+ {
+ auto mount_prev = fMounted;
+
+ if (mount_prev)
+ fMounted = nullptr;
+
+ return mount_prev;
+ }
+}
diff --git a/CompilerKit/AsmKit/AsmKit.hpp b/CompilerKit/AsmKit/AsmKit.hpp
new file mode 100644
index 0000000..f512507
--- /dev/null
+++ b/CompilerKit/AsmKit/AsmKit.hpp
@@ -0,0 +1,63 @@
+/*
+ * ========================================================
+ *
+ * C++Kit
+ * Copyright Western Company, all rights reserved.
+ *
+ * ========================================================
+ */
+
+#pragma once
+
+#include <CompilerKit/Compiler.hpp>
+#include <CompilerKit/Defines.hpp>
+#include <CompilerKit/StdKit/String.hpp>
+
+namespace CompilerKit
+{
+ //
+ // @brief Frontend to Assembly mountpoint.
+ //
+ class AssemblyMountpoint
+ {
+ public:
+ explicit AssemblyMountpoint() = default;
+ virtual ~AssemblyMountpoint() = default;
+
+ CXXKIT_COPY_DEFAULT(AssemblyMountpoint);
+
+ //@ brief compile to object file.
+ // Example C++ -> MASM -> AE object.
+ virtual Int32 CompileToFormat(StringView& src, Int32 arch) = 0;
+
+ };
+
+ /// @brief Simple assembly factory
+ class AssemblyFactory final
+ {
+ public:
+ explicit AssemblyFactory() = default;
+ ~AssemblyFactory() = default;
+
+ CXXKIT_COPY_DEFAULT(AssemblyFactory);
+
+ public:
+ enum
+ {
+ kArchAMD64,
+ kArch32x0,
+ kArch64x0,
+ kArchRISCV,
+ kArchUnknown,
+ };
+
+ Int32 Compile(StringView& sourceFile, const Int32& arch) noexcept;
+
+ void Mount(AssemblyMountpoint* mountPtr) noexcept;
+ AssemblyMountpoint* Unmount() noexcept;
+
+ private:
+ AssemblyMountpoint* fMounted{ nullptr };
+
+ };
+}