parser: add jump

This commit is contained in:
Zack Buhman 2023-08-20 06:02:18 +00:00
parent b97abc776c
commit 867ee171a5
4 changed files with 34 additions and 6 deletions

View File

@ -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 void ast_printer_t::visit(const jump::jmp_cond_t * jmp_cond) const
{ {
parenthesize("jmp", parenthesize("jmp",
jmp_cond->imm.expr, jump::cond_string[static_cast<int>(jmp_cond->cond)],
jump::cond_string[static_cast<int>(jmp_cond->cond)]); jmp_cond->imm.expr);
} }
void ast_printer_t::visit(const loop::btm_t * btm) const void ast_printer_t::visit(const loop::btm_t * btm) const

View File

@ -509,9 +509,36 @@ std::optional<stmt_t *> parser_t::dma()
return {}; return {};
} }
std::optional<jump::cond_t> 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<stmt_t *> parser_t::jump() std::optional<stmt_t *> 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<stmt_t *> parser_t::loop() std::optional<stmt_t *> parser_t::loop()

View File

@ -59,6 +59,7 @@ struct parser_t
dma::dst_t dma_dst(); dma::dst_t dma_dst();
std::optional<dma::length_ram_t> dma_length_ram(); std::optional<dma::length_ram_t> dma_length_ram();
std::optional<stmt_t *> dma(); std::optional<stmt_t *> dma();
std::optional<jump::cond_t> jump_cond();
std::optional<stmt_t *> jump(); std::optional<stmt_t *> jump();
std::optional<stmt_t *> loop(); std::optional<stmt_t *> loop();
std::optional<stmt_t *> end(); std::optional<stmt_t *> end();

View File

@ -217,11 +217,11 @@ struct jmp_t : stmt_accept_t<jmp_t>
struct jmp_cond_t : stmt_accept_t<jmp_cond_t> struct jmp_cond_t : stmt_accept_t<jmp_cond_t>
{ {
jmp_cond_t(uimm_t<8> imm, cond_t cond) jmp_cond_t(cond_t cond, uimm_t<8> imm)
: imm(imm), cond(cond) {} : cond(cond), imm(imm) {}
const uimm_t<8> imm;
const cond_t cond; const cond_t cond;
const uimm_t<8> imm;
}; };
} // jump } // jump