From 867ee171a5ea0f9595116351419928e7fef27355 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sun, 20 Aug 2023 06:02:18 +0000 Subject: [PATCH] parser: add jump --- ast.cpp | 4 ++-- parser.cpp | 29 ++++++++++++++++++++++++++++- parser.hpp | 1 + stmt.hpp | 6 +++--- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/ast.cpp b/ast.cpp index 6a240dd..f475726 100644 --- a/ast.cpp +++ b/ast.cpp @@ -215,8 +215,8 @@ void ast_printer_t::visit(const jump::jmp_t * jmp) const void ast_printer_t::visit(const jump::jmp_cond_t * jmp_cond) const { parenthesize("jmp", - jmp_cond->imm.expr, - jump::cond_string[static_cast(jmp_cond->cond)]); + jump::cond_string[static_cast(jmp_cond->cond)], + jmp_cond->imm.expr); } void ast_printer_t::visit(const loop::btm_t * btm) const diff --git a/parser.cpp b/parser.cpp index 91ac8bc..e0883e6 100644 --- a/parser.cpp +++ b/parser.cpp @@ -509,9 +509,36 @@ std::optional parser_t::dma() return {}; } +std::optional parser_t::jump_cond() +{ + using namespace dsp::jump; + + if (match(_z)) return {cond_t::z}; + else if (match(_nz)) return {cond_t::nz}; + else if (match(_s)) return {cond_t::s}; + else if (match(_ns)) return {cond_t::ns}; + else if (match(_c)) return {cond_t::c}; + else if (match(_nc)) return {cond_t::nc}; + else if (match(_t0)) return {cond_t::t0}; + else if (match(_nt0)) return {cond_t::nt0}; + else if (match(_zs)) return {cond_t::zs}; + else if (match(_nzs)) return {cond_t::nzs}; + else return {}; +} + std::optional parser_t::jump() { - return {}; + if (match(_jmp)) { + if (auto cond_o = jump_cond()) { + consume(comma, "expected `,` after jump condition"); + uimm_t<8> imm = uimm_t<8>(expression()); + return {new jump::jmp_cond_t(*cond_o, imm)}; + } else { + uimm_t<8> imm = uimm_t<8>(expression()); + return {new jump::jmp_t(imm)}; + } + } else + return {}; } std::optional parser_t::loop() diff --git a/parser.hpp b/parser.hpp index 389594e..1fa6038 100644 --- a/parser.hpp +++ b/parser.hpp @@ -59,6 +59,7 @@ struct parser_t dma::dst_t dma_dst(); std::optional dma_length_ram(); std::optional dma(); + std::optional jump_cond(); std::optional jump(); std::optional loop(); std::optional end(); diff --git a/stmt.hpp b/stmt.hpp index ade8609..9c83246 100644 --- a/stmt.hpp +++ b/stmt.hpp @@ -217,11 +217,11 @@ struct jmp_t : stmt_accept_t struct jmp_cond_t : stmt_accept_t { - jmp_cond_t(uimm_t<8> imm, cond_t cond) - : imm(imm), cond(cond) {} + jmp_cond_t(cond_t cond, uimm_t<8> imm) + : cond(cond), imm(imm) {} - const uimm_t<8> imm; const cond_t cond; + const uimm_t<8> imm; }; } // jump