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
{
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

View File

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

View File

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