From 4372a4e07c91e405ff1d503bc3ac7caba3f92586 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 25 Aug 2023 20:07:38 -0700 Subject: [PATCH] stmt: factor out bit enumerations to a new file --- .gitignore | 2 + bits.hpp | 222 ++++++++++++++++++++++++++++++++++++++++++++++++++ stmt.hpp | 235 ++++------------------------------------------------- 3 files changed, 242 insertions(+), 217 deletions(-) create mode 100644 bits.hpp diff --git a/.gitignore b/.gitignore index a39bbeb..dd411da 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ main scu-dsp-asm +scu-dsp-asm.* +.~* *.o *.gch *.d diff --git a/bits.hpp b/bits.hpp new file mode 100644 index 0000000..cc6f34d --- /dev/null +++ b/bits.hpp @@ -0,0 +1,222 @@ +namespace dsp { + +namespace op { + +static uint32_t alu_bits(alu_type_t type) +{ + using enum alu_type_t; + 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(); + } +} + +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(); + } +} + +} // 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(); + } +} + +} // load + +namespace dma { + +static uint32_t add_mode_bits(add_mode_t add) +{ + using enum add_mode_t; + + 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 mc0: return 0b000 << 8; + case mc1: return 0b001 << 8; + case mc2: return 0b010 << 8; + case mc3: return 0b011 << 8; + default: __builtin_unreachable(); + } +} + +static uint32_t dst_bits(dst_t dst) +{ + using enum dst_t; + + switch (dst) { + case mc0: return 0b000 << 8; + case mc1: return 0b001 << 8; + case mc2: return 0b010 << 8; + case mc3: 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(); + } +} + +} // dma + +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(); + } +} + +} // jump + +} // dsp diff --git a/stmt.hpp b/stmt.hpp index f504e4e..262166e 100644 --- a/stmt.hpp +++ b/stmt.hpp @@ -6,6 +6,7 @@ #include "stmt_enum.hpp" #include "expr.hpp" +#include "bits.hpp" namespace dsp { @@ -82,42 +83,9 @@ struct alu_t : op_t, stmt_accept_t 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(); - } - } + uint32_t bits() const { return alu_bits(type); } }; -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) @@ -193,48 +161,6 @@ struct mov_ram_a_t : op_t, stmt_accept_t 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(uimm_t<8> imm, d1_dest_t dest) @@ -279,44 +205,6 @@ struct control_word_t : stmt_accept_t 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) @@ -342,82 +230,14 @@ struct mvi_cond_t : stmt_accept_t 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); - } + | cond_bits(cond); + } }; } // load namespace dma { -static uint32_t add_mode_bits(add_mode_t add) -{ - using enum add_mode_t; - - 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 mc0: return 0b000 << 8; - case mc1: return 0b001 << 8; - case mc2: return 0b010 << 8; - case mc3: return 0b011 << 8; - default: __builtin_unreachable(); - } -} - -static uint32_t dst_bits(dst_t dst) -{ - using enum dst_t; - - switch (dst) { - case mc0: return 0b000 << 8; - case mc1: return 0b001 << 8; - case mc2: return 0b010 << 8; - case mc3: 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 { d0_dst_imm_t(bool hold, add_mode_t add, dst_t dst, uimm_t<8> imm) @@ -431,9 +251,9 @@ struct d0_dst_imm_t : stmt_accept_t 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); - } + | hold_bits(hold) + | dst_bits(dst); + } }; struct src_d0_imm_t : stmt_accept_t @@ -449,9 +269,9 @@ struct src_d0_imm_t : stmt_accept_t 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); - } + | hold_bits(hold) + | src_bits(src); + } }; struct d0_dst_ram_t : stmt_accept_t @@ -467,10 +287,10 @@ struct d0_dst_ram_t : stmt_accept_t 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); - } + | hold_bits(hold) + | dst_bits(dst) + | length_ram_bits(ram); + } }; struct src_d0_ram_t : stmt_accept_t @@ -487,10 +307,10 @@ struct src_d0_ram_t : stmt_accept_t 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); - } + | hold_bits(hold) + | src_bits(src) + | length_ram_bits(ram); + } }; } // dma @@ -498,25 +318,6 @@ struct src_d0_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)