From d8b8bc7850bd84add02a2c22384dd37128ca6147 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Mon, 21 Aug 2023 05:15:00 +0000 Subject: [PATCH] stmt: add instruction masks and codes The parser now checks for conflicts in op control words. --- ast.cpp | 2 +- dsp-notes.ods | Bin 39589 -> 39107 bytes error.hpp | 2 +- parser.cpp | 71 ++++++---- stmt.hpp | 357 +++++++++++++++++++++++++++++++++++++++++++++++--- stmt_enum.hpp | 13 +- visitable.hpp | 4 +- visitor.hpp | 6 +- 8 files changed, 396 insertions(+), 59 deletions(-) diff --git a/ast.cpp b/ast.cpp index 331687b..b66c579 100644 --- a/ast.cpp +++ b/ast.cpp @@ -155,7 +155,7 @@ void ast_printer_t::visit(const op::control_word_t * control_word) const { os << "(control_word "; for (const auto& op : control_word->ops) { - reinterpret_cast(op)->accept(this); + dynamic_cast(op)->accept(this); os << ' '; } os << ')'; diff --git a/dsp-notes.ods b/dsp-notes.ods index 5cbd3a99f017310b6e97a3bc0a6a38bd7f522b46..ea8087ac5f831c8803795f5058bbb2521226154f 100644 GIT binary patch delta 9654 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 Ze>MO6XF&WP!EYo63QQ-2kxcwU{vS=Sq4od( delta 10135 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 S|Nqx`QVW2j2=p0$kpBZyk!-mD diff --git a/error.hpp b/error.hpp index 3777e72..1dc436c 100644 --- a/error.hpp +++ b/error.hpp @@ -17,7 +17,7 @@ static inline void report(const int line, const int col, const std::string where had_error = true; } -static inline void error(const int line, const int col, std::string message) +static inline void error(const int line, const int col, std::string message) { report(line, col, "", message); } diff --git a/parser.cpp b/parser.cpp index f55cd17..f86157a 100644 --- a/parser.cpp +++ b/parser.cpp @@ -204,33 +204,14 @@ static op::xy_src_t xy_src(const token_t& token) using namespace dsp::op; switch (token.type) { - case _mc0: return xy_src_t::mc0; - case _mc1: return xy_src_t::mc1; - case _mc2: return xy_src_t::mc2; - case _mc3: return xy_src_t::mc3; case _m0: return xy_src_t::m0; case _m1: return xy_src_t::m1; case _m2: return xy_src_t::m2; case _m3: return xy_src_t::m3; - default: assert(false); __builtin_unreachable(); - } -} - -static op::d1_src_t d1_src(const token_t& token) -{ - using namespace dsp::op; - - switch (token.type) { - case _mc0: return d1_src_t::mc0; - case _mc1: return d1_src_t::mc1; - case _mc2: return d1_src_t::mc2; - case _mc3: return d1_src_t::mc3; - case _m0: return d1_src_t::m0; - case _m1: return d1_src_t::m1; - case _m2: return d1_src_t::m2; - case _m3: return d1_src_t::m3; - case _alh: return d1_src_t::alh; - case _all: return d1_src_t::all; + case _mc0: return xy_src_t::mc0; + case _mc1: return xy_src_t::mc1; + case _mc2: return xy_src_t::mc2; + case _mc3: return xy_src_t::mc3; default: assert(false); __builtin_unreachable(); } } @@ -239,7 +220,11 @@ std::optional parser_t::d1_dest() { using namespace dsp::op; - if (match(_rx)) return {d1_dest_t::rx}; + if (match(_mc0)) return {d1_dest_t::mc0}; + else if (match(_mc1)) return {d1_dest_t::mc1}; + else if (match(_mc2)) return {d1_dest_t::mc2}; + else if (match(_mc3)) return {d1_dest_t::mc3}; + else if (match(_rx)) return {d1_dest_t::rx}; else if (match(_pl)) return {d1_dest_t::pl}; else if (match(_ra0)) return {d1_dest_t::ra0}; else if (match(_wa0)) return {d1_dest_t::wa0}; @@ -252,6 +237,25 @@ std::optional parser_t::d1_dest() else return {}; } +static op::d1_src_t d1_src(const token_t& token) +{ + using namespace dsp::op; + + switch (token.type) { + case _m0: return d1_src_t::m0; + case _m1: return d1_src_t::m1; + case _m2: return d1_src_t::m2; + case _m3: return d1_src_t::m3; + case _mc0: return d1_src_t::mc0; + case _mc1: return d1_src_t::mc1; + case _mc2: return d1_src_t::mc2; + case _mc3: return d1_src_t::mc3; + case _all: return d1_src_t::all; + case _alh: return d1_src_t::alh; + default: assert(false); __builtin_unreachable(); + } +} + std::optional parser_t::xyd1_bus() { if (match(_mov)) { @@ -293,10 +297,25 @@ std::optional parser_t::xyd1_bus() std::optional parser_t::op() { std::vector ops; + std::vector tokens; + + auto emplace_op = [&](const token_t& token, const op::op_t * a) { + for (std::vector::size_type i = 0; i < ops.size(); i++) { + const op::op_t * b = ops[i]; + if ((a->mask() & b->mask() & ~(0b11 << 30)) != 0) { + dsp::error(*tokens[i], "conflict"); + throw error(token, "conflict"); + } + } + tokens.emplace_back(&token); + ops.emplace_back(a); + }; + while (true) { // fixme: check for emplacement here - if (auto stmt_o = alu() ) ops.emplace_back(*stmt_o); - else if (auto stmt_o = xyd1_bus()) ops.emplace_back(*stmt_o); + const token_t& token = peek(); + if (auto op_o = alu() ) emplace_op(token, *op_o); + else if (auto op_o = xyd1_bus()) emplace_op(token, *op_o); else break; } if (ops.size() != 0) diff --git a/stmt.hpp b/stmt.hpp index 5ce7c2c..bc326d7 100644 --- a/stmt.hpp +++ b/stmt.hpp @@ -2,6 +2,7 @@ #include #include +#include #include "stmt_enum.hpp" #include "expr.hpp" @@ -45,8 +46,14 @@ using uimm_t = imm_t; namespace op { +static uint32_t op_mask(uint32_t mask) { return (0b11 << 30) | mask; } +static uint32_t op_code(uint32_t code) { return (0b00 << 30) | code; } + struct op_t { + virtual uint32_t mask() const = 0; + virtual uint32_t code() const = 0; + virtual uint32_t bits() const = 0; }; struct alu_t : op_t, stmt_accept_t @@ -55,19 +62,64 @@ struct alu_t : op_t, stmt_accept_t : type(type) {} const alu_type_t type; + + uint32_t mask() const { return op_mask(0b1111 << 26); } + uint32_t code() const { return op_code(0b0000 << 26); } + uint32_t bits() const + { + switch (type) { + case alu_type_t::andl: return 0b0001 << 26; + case alu_type_t::orl: return 0b0010 << 26; + case alu_type_t::xorl: return 0b0011 << 26; + case alu_type_t::add: return 0b0100 << 26; + case alu_type_t::sub: return 0b0101 << 26; + case alu_type_t::ad2: return 0b0110 << 26; + case alu_type_t::sr: return 0b1000 << 26; + case alu_type_t::rr: return 0b1001 << 26; + case alu_type_t::sl: return 0b1010 << 26; + case alu_type_t::rl: return 0b1011 << 26; + case alu_type_t::rl8: return 0b1111 << 26; + default: __builtin_unreachable(); + } + } }; +static uint32_t xy_src_bits(xy_src_t src, int shift) +{ + using enum xy_src_t; + + switch (src) { + case m0: return 0b000 << shift; + case m1: return 0b001 << shift; + case m2: return 0b010 << shift; + case m3: return 0b011 << shift; + case mc0: return 0b100 << shift; + case mc1: return 0b101 << shift; + case mc2: return 0b110 << shift; + case mc3: return 0b111 << shift; + default: __builtin_unreachable(); + } +} + struct mov_ram_x_t : op_t, stmt_accept_t { mov_ram_x_t(xy_src_t src) : src(src) {} const xy_src_t src; + + uint32_t mask() const { return op_mask(0b100'111 << 20); } + uint32_t code() const { return op_code(0b100'000 << 20); } + uint32_t bits() const { return xy_src_bits(src, 20); } }; struct mov_mul_p_t : op_t, stmt_accept_t { mov_mul_p_t() {} + + uint32_t mask() const { return op_mask(0b011'000 << 20); } + uint32_t code() const { return op_code(0b010'000 << 20); } + uint32_t bits() const { return 0; } }; struct mov_ram_p_t : op_t, stmt_accept_t @@ -76,6 +128,10 @@ struct mov_ram_p_t : op_t, stmt_accept_t : src(src) {} const xy_src_t src; + + uint32_t mask() const { return op_mask(0b011'111 << 20); } + uint32_t code() const { return op_code(0b011'000 << 20); } + uint32_t bits() const { return xy_src_bits(src, 20); } }; struct mov_ram_y_t : op_t, stmt_accept_t @@ -84,16 +140,28 @@ struct mov_ram_y_t : op_t, stmt_accept_t : src(src) {} const xy_src_t src; + + uint32_t mask() const { return op_mask(0b100'111 << 14); } + uint32_t code() const { return op_code(0b100'000 << 14); } + uint32_t bits() const { return xy_src_bits(src, 14); } }; struct clr_a_t : op_t, stmt_accept_t { clr_a_t() {} + + uint32_t mask() const { return op_mask(0b011'000 << 14); } + uint32_t code() const { return op_code(0b001'000 << 14); } + uint32_t bits() const { return 0; } }; struct mov_alu_a_t : op_t, stmt_accept_t { mov_alu_a_t() {} + + uint32_t mask() const { return op_mask(0b011'000 << 14); } + uint32_t code() const { return op_code(0b010'000 << 14); } + uint32_t bits() const { return 0; } }; struct mov_ram_a_t : op_t, stmt_accept_t @@ -102,8 +170,54 @@ struct mov_ram_a_t : op_t, stmt_accept_t : src(src) {} const xy_src_t src; + + uint32_t mask() const { return op_mask(0b011'111 << 14); } + uint32_t code() const { return op_code(0b011'000 << 14); } + uint32_t bits() const { return xy_src_bits(src, 14); } }; +static uint32_t d1_dest_bits(d1_dest_t dest) +{ + using enum d1_dest_t; + + switch (dest) { + case mc0: return 0b0000 << 8; + case mc1: return 0b0001 << 8; + case mc2: return 0b0010 << 8; + case mc3: return 0b0011 << 8; + case rx: return 0b0100 << 8; + case pl: return 0b0101 << 8; + case ra0: return 0b0110 << 8; + case wa0: return 0b0111 << 8; + case lop: return 0b1010 << 8; + case top: return 0b1011 << 8; + case ct0: return 0b1100 << 8; + case ct1: return 0b1101 << 8; + case ct2: return 0b1110 << 8; + case ct3: return 0b1111 << 8; + default: __builtin_unreachable(); + } +} + +static uint32_t d1_src_bits(d1_src_t src) +{ + using enum d1_src_t; + + switch (src) { + case m0: return 0b0000 << 0; + case m1: return 0b0001 << 0; + case m2: return 0b0010 << 0; + case m3: return 0b0011 << 0; + case mc0: return 0b0100 << 0; + case mc1: return 0b0101 << 0; + case mc2: return 0b0110 << 0; + case mc3: return 0b0111 << 0; + case all: return 0b1001 << 0; + case alh: return 0b1010 << 0; + default: __builtin_unreachable(); + } +} + struct mov_imm_d1_t : op_t, stmt_accept_t { mov_imm_d1_t(simm_t<8> imm, d1_dest_t dest) @@ -111,6 +225,10 @@ struct mov_imm_d1_t : op_t, stmt_accept_t const simm_t<8> imm; const d1_dest_t dest; + + uint32_t mask() const { return op_mask(0b11'1111'1111'1111 << 0 ); } + uint32_t code() const { return op_code(0b01'0000'0000'0000 << 14); } + uint32_t bits() const { return d1_dest_bits(dest); } }; struct mov_ram_d1_t : op_t, stmt_accept_t @@ -120,25 +238,78 @@ struct mov_ram_d1_t : op_t, stmt_accept_t const d1_src_t src; const d1_dest_t dest; + + uint32_t mask() const { return op_mask(0b11'1111'0000'1111 << 0 ); } + uint32_t code() const { return op_code(0b11'0000'0000'0000 << 14); } + uint32_t bits() const { return d1_dest_bits(dest) | d1_src_bits(src); } }; struct control_word_t : stmt_accept_t { - control_word_t(std::vector ops) - : ops(ops) {} + control_word_t(std::vector ops) + : ops(ops) + { + if (ops.size() == 0) throw std::runtime_error("zero-length ops"); + } const std::vector ops; + + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0; } + uint32_t bits() const { return 0; } }; } // op namespace load { +static uint32_t dest_bits(dest_t dest) +{ + using enum dest_t; + + switch (dest) { + case mc0: return 0b0000 << 26; + case mc1: return 0b0001 << 26; + case mc2: return 0b0010 << 26; + case mc3: return 0b0011 << 26; + case rx: return 0b0100 << 26; + case pl: return 0b0101 << 26; + case ra0: return 0b0110 << 26; + case wa0: return 0b0111 << 26; + case lop: return 0b1010 << 26; + case pc: return 0b1100 << 26; + default: __builtin_unreachable(); + } +} + +static uint32_t cond_bits(cond_t cond) +{ + using enum cond_t; + + switch (cond) { + case z: return 0b1'0'0001 << 19; + case nz: return 0b0'0'0001 << 19; + case s: return 0b1'0'0010 << 19; + case ns: return 0b0'0'0010 << 19; + case c: return 0b1'0'0100 << 19; + case nc: return 0b0'0'0100 << 19; + case t0: return 0b1'0'1000 << 19; + case nt0: return 0b0'0'1000 << 19; + case zs: return 0b1'0'0011 << 19; + case nzs: return 0b0'0'0011 << 19; + default: __builtin_unreachable(); + } +} + struct mvi_t : stmt_accept_t { mvi_t(uimm_t<25> imm, dest_t dest) : imm(imm), dest(dest) {} + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b10'0000'0 << 25; } + uint32_t bits() const { return dest_bits(dest); } + const uimm_t<25> imm; const dest_t dest; }; @@ -151,22 +322,85 @@ struct mvi_cond_t : stmt_accept_t const uimm_t<19> imm; const dest_t dest; const cond_t cond; + + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b10'0000'1 << 25; } + uint32_t bits() const { return dest_bits(dest) + | cond_bits(cond); + } }; } // load namespace dma { -struct src_d0_imm_t : stmt_accept_t +static uint32_t add_mode_bits(add_mode_t add) { - src_d0_imm_t(bool hold, add_mode_t add, src_t src, uimm_t<8> imm) - : hold(hold), add(add), src(src), imm(imm) {} + using enum add_mode_t; - const bool hold; - const add_mode_t add; - const src_t src; - const uimm_t<8> imm; -}; + switch (add) { + case _0 : return 0b000 << 15; + case _1 : return 0b001 << 15; + case _2 : return 0b010 << 15; + case _4 : return 0b011 << 15; + case _8 : return 0b100 << 15; + case _16: return 0b101 << 15; + case _32: return 0b110 << 15; + case _64: return 0b111 << 15; + default: __builtin_unreachable(); + } +} + +static uint32_t hold_bits(bool hold) +{ + return hold ? (1 << 14) + : (0 << 14) + ; +} + +static uint32_t src_bits(src_t src) +{ + using enum src_t; + + switch (src) { + case m0 : return 0b000 << 8; + case m1 : return 0b001 << 8; + case m2 : return 0b010 << 8; + case m3 : return 0b011 << 8; + default: __builtin_unreachable(); + } +} + +static uint32_t dst_bits(dst_t dst) +{ + using enum dst_t; + + switch (dst) { + case m0 : return 0b000 << 8; + case m1 : return 0b001 << 8; + case m2 : return 0b010 << 8; + case m3 : return 0b011 << 8; + case prg: return 0b100 << 8; + default: __builtin_unreachable(); + } +} + +static uint32_t length_ram_bits(length_ram_t ram) +{ + using enum length_ram_t; + + switch (ram) { + case m0 : return 0b000 << 0; + case m1 : return 0b001 << 0; + case m2 : return 0b010 << 0; + case m3 : return 0b011 << 0; + case mc0: return 0b100 << 0; + case mc1: return 0b101 << 0; + case mc2: return 0b110 << 0; + case mc3: return 0b111 << 0; + default: __builtin_unreachable(); + } +} struct d0_dst_imm_t : stmt_accept_t { @@ -177,6 +411,50 @@ struct d0_dst_imm_t : stmt_accept_t const add_mode_t add; const dst_t dst; const uimm_t<8> imm; + + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1100 << 28 | 0b00 << 12; } + uint32_t bits() const { return add_mode_bits(add) + | hold_bits(hold) + | dst_bits(dst); + } +}; + +struct src_d0_imm_t : stmt_accept_t +{ + src_d0_imm_t(bool hold, add_mode_t add, src_t src, uimm_t<8> imm) + : hold(hold), add(add), src(src), imm(imm) {} + + const bool hold; + const add_mode_t add; + const src_t src; + const uimm_t<8> imm; + + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1100 << 28 | 0b01 << 12; } + uint32_t bits() const { return add_mode_bits(add) + | hold_bits(hold) + | src_bits(src); + } +}; + +struct d0_dst_ram_t : stmt_accept_t +{ + d0_dst_ram_t(bool hold, add_mode_t add, dst_t dst, length_ram_t ram) + : hold(hold), add(add), dst(dst), ram(ram) {} + + const bool hold; + const add_mode_t add; + const dst_t dst; + const length_ram_t ram; + + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1100 << 28 | 0b10 << 12; } + uint32_t bits() const { return add_mode_bits(add) + | hold_bits(hold) + | dst_bits(dst) + | length_ram_bits(ram); + } }; struct src_d0_ram_t : stmt_accept_t @@ -189,17 +467,14 @@ struct src_d0_ram_t : stmt_accept_t const add_mode_t add; const src_t src; const length_ram_t ram; -}; -struct d0_dst_ram_t : stmt_accept_t -{ - d0_dst_ram_t(bool hold, add_mode_t add, dst_t dst, length_ram_t ram) - : hold(hold), add(add), dst(dst), ram(ram) {} - - const bool hold; - const add_mode_t add; - const dst_t dst; - const length_ram_t ram; + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1100 << 28 | 0b11 << 12; } + uint32_t bits() const { return add_mode_bits(add) + | hold_bits(hold) + | src_bits(src) + | length_ram_bits(ram); + } }; } // dma @@ -207,12 +482,35 @@ struct d0_dst_ram_t : stmt_accept_t namespace jump { +static uint32_t cond_bits(cond_t cond) +{ + using enum cond_t; + + switch (cond) { + case z : return 0b100'001 << 19; + case nz : return 0b000'001 << 19; + case s : return 0b100'010 << 19; + case ns : return 0b000'010 << 19; + case c : return 0b100'100 << 19; + case nc : return 0b000'100 << 19; + case t0 : return 0b101'000 << 19; + case nt0: return 0b001'000 << 19; + case zs : return 0b100'011 << 19; + case nzs: return 0b000'011 << 19; + default: __builtin_unreachable(); + } +} + struct jmp_t : stmt_accept_t { jmp_t(uimm_t<8> imm) : imm(imm) {} const uimm_t<8> imm; + + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1101'00'0 << 25; } + uint32_t bits() const { return 0; } }; struct jmp_cond_t : stmt_accept_t @@ -222,6 +520,10 @@ struct jmp_cond_t : stmt_accept_t const cond_t cond; const uimm_t<8> imm; + + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1101'00'1 << 25; } + uint32_t bits() const { return cond_bits(cond); } }; } // jump @@ -230,10 +532,16 @@ namespace loop { struct btm_t : stmt_accept_t { + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1110'0 << 27; } + uint32_t bits() const { return 0; } }; struct lps_t : stmt_accept_t { + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1110'1 << 27; } + uint32_t bits() const { return 0; } }; } // loop @@ -242,10 +550,16 @@ namespace end { struct end_t : stmt_accept_t { + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1111'0 << 27; } + uint32_t bits() const { return 0; } }; struct endi_t : stmt_accept_t { + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0b1111'1 << 27; } + uint32_t bits() const { return 0; } }; } // end @@ -254,6 +568,9 @@ namespace nop { struct nop_t : stmt_accept_t { + uint32_t mask() const { return 0xffff'ffff; } + uint32_t code() const { return 0x0000'0000; } + uint32_t bits() const { return 0; } }; } diff --git a/stmt_enum.hpp b/stmt_enum.hpp index 6a00b9f..a7ff3e8 100644 --- a/stmt_enum.hpp +++ b/stmt_enum.hpp @@ -19,11 +19,12 @@ enum struct alu_type_t : int { }; enum struct xy_src_t { + m0 , m1 , m2 , m3 , mc0, mc1, mc2, mc3, - m0 , m1 , m2 , m3, }; enum struct d1_dest_t { + mc0, mc1, mc2, mc3, rx , pl , ra0, wa0, lop, top, @@ -31,9 +32,9 @@ enum struct d1_dest_t { }; enum struct d1_src_t { - mc0, mc1, mc2, mc3, m0 , m1 , m2 , m3 , - alh, all, + mc0, mc1, mc2, mc3, + all, alh, }; } @@ -89,9 +90,9 @@ enum struct length_ram_t { namespace jump { enum struct cond_t { - z , nz, - s , ns, - c , nc, + z , nz , + s , ns , + c , nc , t0, nt0, zs, nzs, }; diff --git a/visitable.hpp b/visitable.hpp index 95aac25..d1001ae 100644 --- a/visitable.hpp +++ b/visitable.hpp @@ -31,10 +31,10 @@ struct mvi_cond_t; } namespace dma { -struct src_d0_imm_t; struct d0_dst_imm_t; -struct src_d0_ram_t; +struct src_d0_imm_t; struct d0_dst_ram_t; +struct src_d0_ram_t; } namespace jump { diff --git a/visitor.hpp b/visitor.hpp index 199a3ee..ddc8a7b 100644 --- a/visitor.hpp +++ b/visitor.hpp @@ -14,7 +14,7 @@ struct visitor_t virtual T visit(const literal_t * expr) const = 0; virtual T visit(const unary_t * expr) const = 0; - virtual T visit(const op::alu_t * stmt) const = 0; + virtual T visit(const op::alu_t * alu) const = 0; virtual T visit(const op::mov_ram_x_t * mov_ram_x) const = 0; virtual T visit(const op::mov_mul_p_t * mov_mul_p) const = 0; virtual T visit(const op::mov_ram_p_t * mov_ram_p) const = 0; @@ -22,8 +22,8 @@ struct visitor_t virtual T visit(const op::clr_a_t * clr_a) const = 0; virtual T visit(const op::mov_alu_a_t * mov_alu_a) const = 0; virtual T visit(const op::mov_ram_a_t * mov_ram_a) const = 0; - virtual T visit(const op::mov_imm_d1_t * mov_imm_) const = 0; - virtual T visit(const op::mov_ram_d1_t * mov_ram_) const = 0; + virtual T visit(const op::mov_imm_d1_t * mov_imm_d1) const = 0; + virtual T visit(const op::mov_ram_d1_t * mov_ram_d1) const = 0; virtual T visit(const op::control_word_t * control_word) const = 0; virtual T visit(const load::mvi_t * mvi) const = 0;