Skip to content

Commit

Permalink
target-lm32: fix cmpgui and cmpgeui opcodes
Browse files Browse the repository at this point in the history
For unsigned compares the immediate has to be zero extended.

Signed-off-by: Michael Walle <michael@walle.cc>
  • Loading branch information
mwalle committed Mar 18, 2013
1 parent 6036e9d commit df5eb7d
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions target-lm32/translate.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,10 +324,20 @@ static inline void gen_compare(DisasContext *dc, int cond)
int rX = (dc->format == OP_FMT_RR) ? dc->r2 : dc->r1;
int rY = (dc->format == OP_FMT_RR) ? dc->r0 : dc->r0;
int rZ = (dc->format == OP_FMT_RR) ? dc->r1 : -1;
int i;

if (dc->format == OP_FMT_RI) {
tcg_gen_setcondi_tl(cond, cpu_R[rX], cpu_R[rY],
sign_extend(dc->imm16, 16));
switch (cond) {
case TCG_COND_GEU:
case TCG_COND_GTU:
i = zero_extend(dc->imm16, 16);
break;
default:
i = sign_extend(dc->imm16, 16);
break;
}

tcg_gen_setcondi_tl(cond, cpu_R[rX], cpu_R[rY], i);
} else {
tcg_gen_setcond_tl(cond, cpu_R[rX], cpu_R[rY], cpu_R[rZ]);
}
Expand Down Expand Up @@ -373,7 +383,7 @@ static void dec_cmpgeu(DisasContext *dc)
{
if (dc->format == OP_FMT_RI) {
LOG_DIS("cmpgeui r%d, r%d, %d\n", dc->r0, dc->r1,
sign_extend(dc->imm16, 16));
zero_extend(dc->imm16, 16));
} else {
LOG_DIS("cmpgeu r%d, r%d, r%d\n", dc->r2, dc->r0, dc->r1);
}
Expand All @@ -385,7 +395,7 @@ static void dec_cmpgu(DisasContext *dc)
{
if (dc->format == OP_FMT_RI) {
LOG_DIS("cmpgui r%d, r%d, %d\n", dc->r0, dc->r1,
sign_extend(dc->imm16, 16));
zero_extend(dc->imm16, 16));
} else {
LOG_DIS("cmpgu r%d, r%d, r%d\n", dc->r2, dc->r0, dc->r1);
}
Expand Down

0 comments on commit df5eb7d

Please sign in to comment.