tcg: Add tcg_high_cond
The table that was recently added for hppa is generally usable. And with the renumbering of the TCG_COND constants it's not too difficult to compute rather than have a table. Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
0aed257f08
commit
d1e321b82a
@ -814,19 +814,6 @@ static void tcg_out_comclr(TCGContext *s, int cond, TCGArg ret,
|
|||||||
tcg_out32(s, op);
|
tcg_out32(s, op);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TCGCond const tcg_high_cond[] = {
|
|
||||||
[TCG_COND_EQ] = TCG_COND_EQ,
|
|
||||||
[TCG_COND_NE] = TCG_COND_NE,
|
|
||||||
[TCG_COND_LT] = TCG_COND_LT,
|
|
||||||
[TCG_COND_LE] = TCG_COND_LT,
|
|
||||||
[TCG_COND_GT] = TCG_COND_GT,
|
|
||||||
[TCG_COND_GE] = TCG_COND_GT,
|
|
||||||
[TCG_COND_LTU] = TCG_COND_LTU,
|
|
||||||
[TCG_COND_LEU] = TCG_COND_LTU,
|
|
||||||
[TCG_COND_GTU] = TCG_COND_GTU,
|
|
||||||
[TCG_COND_GEU] = TCG_COND_GTU
|
|
||||||
};
|
|
||||||
|
|
||||||
static void tcg_out_brcond2(TCGContext *s, int cond, TCGArg al, TCGArg ah,
|
static void tcg_out_brcond2(TCGContext *s, int cond, TCGArg al, TCGArg ah,
|
||||||
TCGArg bl, int blconst, TCGArg bh, int bhconst,
|
TCGArg bl, int blconst, TCGArg bh, int bhconst,
|
||||||
int label_index)
|
int label_index)
|
||||||
@ -841,7 +828,7 @@ static void tcg_out_brcond2(TCGContext *s, int cond, TCGArg al, TCGArg ah,
|
|||||||
tcg_out_brcond(s, TCG_COND_NE, ah, bh, bhconst, label_index);
|
tcg_out_brcond(s, TCG_COND_NE, ah, bh, bhconst, label_index);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tcg_out_brcond(s, tcg_high_cond[cond], ah, bh, bhconst, label_index);
|
tcg_out_brcond(s, tcg_high_cond(cond), ah, bh, bhconst, label_index);
|
||||||
tcg_out_comclr(s, TCG_COND_NE, TCG_REG_R0, ah, bh, bhconst);
|
tcg_out_comclr(s, TCG_COND_NE, TCG_REG_R0, ah, bh, bhconst);
|
||||||
tcg_out_brcond(s, tcg_unsigned_cond(cond),
|
tcg_out_brcond(s, tcg_unsigned_cond(cond),
|
||||||
al, bl, blconst, label_index);
|
al, bl, blconst, label_index);
|
||||||
@ -894,7 +881,7 @@ static void tcg_out_setcond2(TCGContext *s, int cond, TCGArg ret,
|
|||||||
tcg_out_setcond(s, tcg_unsigned_cond(cond), scratch, al, bl, blconst);
|
tcg_out_setcond(s, tcg_unsigned_cond(cond), scratch, al, bl, blconst);
|
||||||
tcg_out_comclr(s, TCG_COND_EQ, TCG_REG_R0, ah, bh, bhconst);
|
tcg_out_comclr(s, TCG_COND_EQ, TCG_REG_R0, ah, bh, bhconst);
|
||||||
tcg_out_movi(s, TCG_TYPE_I32, scratch, 0);
|
tcg_out_movi(s, TCG_TYPE_I32, scratch, 0);
|
||||||
tcg_out_comclr(s, tcg_invert_cond(tcg_high_cond[cond]),
|
tcg_out_comclr(s, tcg_invert_cond(tcg_high_cond(cond)),
|
||||||
TCG_REG_R0, ah, bh, bhconst);
|
TCG_REG_R0, ah, bh, bhconst);
|
||||||
tcg_out_movi(s, TCG_TYPE_I32, scratch, 1);
|
tcg_out_movi(s, TCG_TYPE_I32, scratch, 1);
|
||||||
break;
|
break;
|
||||||
|
17
tcg/tcg.h
17
tcg/tcg.h
@ -302,16 +302,33 @@ static inline TCGCond tcg_swap_cond(TCGCond c)
|
|||||||
return c & 6 ? (TCGCond)(c ^ 9) : c;
|
return c & 6 ? (TCGCond)(c ^ 9) : c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Create an "unsigned" version of a "signed" comparison. */
|
||||||
static inline TCGCond tcg_unsigned_cond(TCGCond c)
|
static inline TCGCond tcg_unsigned_cond(TCGCond c)
|
||||||
{
|
{
|
||||||
return c & 2 ? (TCGCond)(c ^ 6) : c;
|
return c & 2 ? (TCGCond)(c ^ 6) : c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Must a comparison be considered unsigned? */
|
||||||
static inline bool is_unsigned_cond(TCGCond c)
|
static inline bool is_unsigned_cond(TCGCond c)
|
||||||
{
|
{
|
||||||
return (c & 4) != 0;
|
return (c & 4) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Create a "high" version of a double-word comparison.
|
||||||
|
This removes equality from a LTE or GTE comparison. */
|
||||||
|
static inline TCGCond tcg_high_cond(TCGCond c)
|
||||||
|
{
|
||||||
|
switch (c) {
|
||||||
|
case TCG_COND_GE:
|
||||||
|
case TCG_COND_LE:
|
||||||
|
case TCG_COND_GEU:
|
||||||
|
case TCG_COND_LEU:
|
||||||
|
return (TCGCond)(c ^ 8);
|
||||||
|
default:
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define TEMP_VAL_DEAD 0
|
#define TEMP_VAL_DEAD 0
|
||||||
#define TEMP_VAL_REG 1
|
#define TEMP_VAL_REG 1
|
||||||
#define TEMP_VAL_MEM 2
|
#define TEMP_VAL_MEM 2
|
||||||
|
Loading…
Reference in New Issue
Block a user