parser: add jump
This commit is contained in:
parent
b97abc776c
commit
867ee171a5
4
ast.cpp
4
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<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
|
||||
|
29
parser.cpp
29
parser.cpp
@ -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()
|
||||
|
@ -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();
|
||||
|
6
stmt.hpp
6
stmt.hpp
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user