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
|
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
|
||||||
|
29
parser.cpp
29
parser.cpp
@ -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()
|
||||||
|
@ -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();
|
||||||
|
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>
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user