0.4.4 新版本
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
|
||||||
#define __FCORE_VERSION "0.4.3-alpha"
|
#define __FCORE_VERSION "0.4.4-alpha"
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#define __FCORE_PLATFORM "Windows"
|
#define __FCORE_PLATFORM "Windows"
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <Core/fig_string.hpp>
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <cstdint>
|
|
||||||
namespace Fig::IR
|
|
||||||
{
|
|
||||||
using Reg = uint16_t;
|
|
||||||
using Label = uint32_t;
|
|
||||||
|
|
||||||
constexpr Reg INVALID_REG = 0xFFFF;
|
|
||||||
|
|
||||||
enum class Op : uint8_t
|
|
||||||
{
|
|
||||||
// ---- control ----
|
|
||||||
Nop,
|
|
||||||
Jmp,
|
|
||||||
Br, // conditional branch
|
|
||||||
Ret,
|
|
||||||
Call,
|
|
||||||
|
|
||||||
// ---- arithmetic ----
|
|
||||||
Add,
|
|
||||||
Sub,
|
|
||||||
Mul,
|
|
||||||
Div,
|
|
||||||
|
|
||||||
// ---- compare ----
|
|
||||||
Lt,
|
|
||||||
Le,
|
|
||||||
Gt,
|
|
||||||
Ge,
|
|
||||||
Eq,
|
|
||||||
|
|
||||||
// ---- data ----
|
|
||||||
LoadImm, // immediate -> reg
|
|
||||||
Mov,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Inst
|
|
||||||
{
|
|
||||||
Op op;
|
|
||||||
|
|
||||||
Reg dst; // 结果寄存器
|
|
||||||
Reg a; // operand a
|
|
||||||
Reg b; // operand b
|
|
||||||
|
|
||||||
int64_t imm; // immediate / jump offset
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Function
|
|
||||||
{
|
|
||||||
FString name;
|
|
||||||
|
|
||||||
uint16_t paramCount;
|
|
||||||
uint16_t localCount; // 不含参数
|
|
||||||
uint16_t regCount; // param + locals + temps
|
|
||||||
|
|
||||||
std::vector<Inst> code;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <IR/IR.hpp>
|
|
||||||
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
namespace Fig::IR
|
|
||||||
{
|
|
||||||
struct VirtualMachine
|
|
||||||
{
|
|
||||||
std::vector<Function *> functions;
|
|
||||||
|
|
||||||
int64_t execute(Function *fn, const int64_t *args)
|
|
||||||
{
|
|
||||||
assert(fn != nullptr);
|
|
||||||
std::vector<int64_t> regs(fn->regCount);
|
|
||||||
// load params
|
|
||||||
|
|
||||||
size_t ip = 0;
|
|
||||||
|
|
||||||
while (ip < fn->code.size())
|
|
||||||
{
|
|
||||||
const Inst &ins = fn->code[ip++];
|
|
||||||
|
|
||||||
switch (ins.op)
|
|
||||||
{
|
|
||||||
case Op::Nop: break;
|
|
||||||
|
|
||||||
case Op::LoadImm: regs[ins.dst] = ins.imm; break;
|
|
||||||
|
|
||||||
case Op::Mov: regs[ins.dst] = regs[ins.a]; break;
|
|
||||||
|
|
||||||
case Op::Add: regs[ins.dst] = regs[ins.a] + regs[ins.b]; break;
|
|
||||||
|
|
||||||
case Op::Sub: regs[ins.dst] = regs[ins.a] - regs[ins.b]; break;
|
|
||||||
|
|
||||||
case Op::Mul: regs[ins.dst] = regs[ins.a] * regs[ins.b]; break;
|
|
||||||
|
|
||||||
case Op::Div: regs[ins.dst] = regs[ins.a] / regs[ins.b]; break;
|
|
||||||
|
|
||||||
case Op::Lt: regs[ins.dst] = regs[ins.a] < regs[ins.b]; break;
|
|
||||||
|
|
||||||
case Op::Le: regs[ins.dst] = regs[ins.a] <= regs[ins.b]; break;
|
|
||||||
|
|
||||||
case Op::Gt: regs[ins.dst] = regs[ins.a] > regs[ins.b]; break;
|
|
||||||
|
|
||||||
case Op::Ge: regs[ins.dst] = regs[ins.a] >= regs[ins.b]; break;
|
|
||||||
|
|
||||||
case Op::Eq: regs[ins.dst] = regs[ins.a] == regs[ins.b]; break;
|
|
||||||
|
|
||||||
case Op::Jmp: ip = static_cast<size_t>(static_cast<int64_t>(ip) + ins.imm); break;
|
|
||||||
|
|
||||||
case Op::Br:
|
|
||||||
if (regs[ins.a] == 0) { ip = static_cast<size_t>(static_cast<int64_t>(ip) + ins.imm); }
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Op::Call: {
|
|
||||||
// currently supports 1-arg call via reg a
|
|
||||||
Function *callee = functions.at(static_cast<size_t>(ins.imm));
|
|
||||||
int64_t arg0 = regs[ins.a];
|
|
||||||
int64_t ret = execute(callee, &arg0);
|
|
||||||
regs[ins.dst] = ret;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Op::Ret: return regs[ins.a];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// unreachable normally
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}; // namespace Fig::IR
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#include <IR/IRInterpreter.hpp>
|
|
||||||
#include <IR/IR.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
using namespace Fig;
|
|
||||||
IR::VirtualMachine vm;
|
|
||||||
|
|
||||||
using namespace IR;
|
|
||||||
IR::Inst fib_ir[] = {
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
18
xmake.lua
18
xmake.lua
@@ -42,27 +42,25 @@ target("Fig")
|
|||||||
set_kind("binary")
|
set_kind("binary")
|
||||||
|
|
||||||
add_files("src/Evaluator/Core/*.cpp")
|
add_files("src/Evaluator/Core/*.cpp")
|
||||||
add_files("src/VirtualMachine/VirtualMachine.cpp")
|
|
||||||
add_files("src/Evaluator/evaluator.cpp")
|
add_files("src/Evaluator/evaluator.cpp")
|
||||||
add_files("src/Repl/Repl.cpp")
|
add_files("src/Repl/Repl.cpp")
|
||||||
add_files("src/main.cpp")
|
add_files("src/main.cpp")
|
||||||
|
|
||||||
set_warnings("all")
|
set_warnings("all")
|
||||||
|
|
||||||
target("vm_test_main")
|
-- target("vm_test_main")
|
||||||
set_kind("binary")
|
-- set_kind("binary")
|
||||||
|
|
||||||
add_files("src/VirtualMachine/VirtualMachine.cpp")
|
-- add_files("src/Bytecode/vm_test_main.cpp")
|
||||||
add_files("src/Bytecode/vm_test_main.cpp")
|
|
||||||
|
|
||||||
set_warnings("all")
|
-- set_warnings("all")
|
||||||
|
|
||||||
target("ir_test_main")
|
-- target("ir_test_main")
|
||||||
set_kind("binary")
|
-- set_kind("binary")
|
||||||
|
|
||||||
add_files("src/IR/ir_test_main.cpp")
|
-- add_files("src/IR/ir_test_main.cpp")
|
||||||
|
|
||||||
set_warnings("all")
|
-- set_warnings("all")
|
||||||
|
|
||||||
target("StringTest")
|
target("StringTest")
|
||||||
set_kind("binary")
|
set_kind("binary")
|
||||||
|
|||||||
Reference in New Issue
Block a user