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:
Richard Henderson 2012-09-24 14:21:41 -07:00 committed by Aurelien Jarno
parent 0aed257f08
commit d1e321b82a
2 changed files with 19 additions and 15 deletions

View File

@ -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;

View File

@ -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