py/asmrv32: Make lt/le comparisons emitter shorter.
This commit simplifies the emitter code in charge of generating opcodes performing less-than and less-than-or-equal comparisons. By rewriting the SLT/SLTU opcode generator (handling less-than comparisons) and de-inlining the less-than comparison generator call in the less-than-or-equal generator, the output binary is ~80 bytes smaller (measurements taken from the QEMU port). Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit is contained in:
parent
b1d5c656de
commit
0ee3f99da2
1 changed files with 3 additions and 11 deletions
14
py/asmrv32.c
14
py/asmrv32.c
|
|
@ -573,12 +573,8 @@ void asm_rv32_meta_comparison_ne(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2
|
||||||
}
|
}
|
||||||
|
|
||||||
void asm_rv32_meta_comparison_lt(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison) {
|
void asm_rv32_meta_comparison_lt(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison) {
|
||||||
// slt(u) rd, rs1, rs2
|
// slt|sltu rd, rs1, rs2
|
||||||
if (unsigned_comparison) {
|
asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, (0x02 | (unsigned_comparison ? 1 : 0)), 0x00, rd, rs1, rs2));
|
||||||
asm_rv32_opcode_sltu(state, rd, rs1, rs2);
|
|
||||||
} else {
|
|
||||||
asm_rv32_opcode_slt(state, rd, rs1, rs2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void asm_rv32_meta_comparison_le(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison) {
|
void asm_rv32_meta_comparison_le(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison) {
|
||||||
|
|
@ -588,11 +584,7 @@ void asm_rv32_meta_comparison_le(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2
|
||||||
// ... ; PC + 8
|
// ... ; PC + 8
|
||||||
asm_rv32_opcode_cli(state, rd, 1);
|
asm_rv32_opcode_cli(state, rd, 1);
|
||||||
asm_rv32_opcode_beq(state, rs1, rs2, 8);
|
asm_rv32_opcode_beq(state, rs1, rs2, 8);
|
||||||
if (unsigned_comparison) {
|
asm_rv32_meta_comparison_lt(state, rs1, rs2, rd, unsigned_comparison);
|
||||||
asm_rv32_opcode_sltu(state, rd, rs1, rs2);
|
|
||||||
} else {
|
|
||||||
asm_rv32_opcode_slt(state, rd, rs1, rs2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // MICROPY_EMIT_RV32
|
#endif // MICROPY_EMIT_RV32
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue