CR16C: Fix brcond with negative displacement

Co-authored-by: fridtjof <fridtjof@das-labor.org>
This commit is contained in:
Jonas Bewig 2025-08-14 20:36:11 +02:00
parent a7f71a31c2
commit 9bfee3cda8
No known key found for this signature in database
GPG key ID: 8D99867797A4886F
2 changed files with 10 additions and 13 deletions

View file

@ -158,9 +158,9 @@ LSHD_rp 0100 0111 .... .... @shiftd_rp
### Jumps and Linkeage ###
%br_disp8 56:4 48:4 !function=get_disp8
%br_disp8 56:s4 48:4 !function=disp8_get_dest
BRCOND 0001 .... cond:4 .... disp=%br_disp8
BRCOND 0001 .... cond:4 .... dest=%br_disp8
JCOND 0000 1010 cond:4 ra:4

View file

@ -106,15 +106,16 @@ static uint8_t get_disp4(DisasContext *ctx, uint8_t disp) {
return disp << 1;
}
static uint16_t get_disp8(DisasContext* ctx, uint8_t disp) {
if (disp == 0x80) {
uint16_t disp_esc = cpu_lduw_code(ctx->env, ctx->base.pc_next) >> 1;
static int32_t disp8_get_dest(DisasContext* ctx, int32_t disp) {
int32_t dest = ctx->base.pc_next - 2;
if (disp == 0xFFFFFF80) {
dest += cpu_ldsw_le_data(ctx->env, ctx->base.pc_next);
ctx->base.pc_next += 2;
return disp_esc;
}
else {
return disp;
dest += disp << 1;
}
return dest;
};
static uint32_t reloc_abs20(DisasContext *ctx, uint32_t addr) {
@ -280,7 +281,7 @@ static void gen_ADDD_imm(int regnl, int32_t imm) {
}
tcg_gen_extu_i32_i64(temp_res, temp_h);
tcg_gen_addi_i64(temp_res, temp_res, imm);
tcg_gen_addi_i64(temp_res, temp_res, imm & 0xFFFFFFFF);
tcg_gen_extrl_i64_i32(regl, temp_res);
/* Carry flag */
@ -1127,17 +1128,13 @@ static void gen_br_cond(DisasContext* ctx, int cond, TCGLabel* l) {
static bool trans_BRCOND(DisasContext* ctx, arg_BRCOND *a) {
TCGLabel* l = gen_new_label();
gen_br_cond(ctx, a->cond, l);
uint32_t pc_this = ctx->base.pc_next - 2;
uint32_t dest = pc_this + a->disp*2;
gen_goto(&ctx->base, ctx->base.pc_next, 0);
gen_set_label(l);
gen_goto(&ctx->base, dest, 1);
gen_goto(&ctx->base, a->dest, 1);
ctx->base.is_jmp = DISAS_NORETURN;
return true;