mirror of https://github.com/xemu-project/xemu.git
target-sparc: Optimize CC_OP_LOGIC conditions
Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
0fa2a0660c
commit
96b5a3d3cf
|
@ -1050,7 +1050,7 @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond,
|
||||||
DisasContext *dc)
|
DisasContext *dc)
|
||||||
{
|
{
|
||||||
static int subcc_cond[16] = {
|
static int subcc_cond[16] = {
|
||||||
-1, /* never */
|
TCG_COND_NEVER,
|
||||||
TCG_COND_EQ,
|
TCG_COND_EQ,
|
||||||
TCG_COND_LE,
|
TCG_COND_LE,
|
||||||
TCG_COND_LT,
|
TCG_COND_LT,
|
||||||
|
@ -1058,7 +1058,7 @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond,
|
||||||
TCG_COND_LTU,
|
TCG_COND_LTU,
|
||||||
-1, /* neg */
|
-1, /* neg */
|
||||||
-1, /* overflow */
|
-1, /* overflow */
|
||||||
-1, /* always */
|
TCG_COND_ALWAYS,
|
||||||
TCG_COND_NE,
|
TCG_COND_NE,
|
||||||
TCG_COND_GT,
|
TCG_COND_GT,
|
||||||
TCG_COND_GE,
|
TCG_COND_GE,
|
||||||
|
@ -1068,6 +1068,25 @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond,
|
||||||
-1, /* no overflow */
|
-1, /* no overflow */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int logic_cond[16] = {
|
||||||
|
TCG_COND_NEVER,
|
||||||
|
TCG_COND_EQ, /* eq: Z */
|
||||||
|
TCG_COND_LE, /* le: Z | (N ^ V) -> Z | N */
|
||||||
|
TCG_COND_LT, /* lt: N ^ V -> N */
|
||||||
|
TCG_COND_EQ, /* leu: C | Z -> Z */
|
||||||
|
TCG_COND_NEVER, /* ltu: C -> 0 */
|
||||||
|
TCG_COND_LT, /* neg: N */
|
||||||
|
TCG_COND_NEVER, /* vs: V -> 0 */
|
||||||
|
TCG_COND_ALWAYS,
|
||||||
|
TCG_COND_NE, /* ne: !Z */
|
||||||
|
TCG_COND_GT, /* gt: !(Z | (N ^ V)) -> !(Z | N) */
|
||||||
|
TCG_COND_GE, /* ge: !(N ^ V) -> !N */
|
||||||
|
TCG_COND_NE, /* gtu: !(C | Z) -> !Z */
|
||||||
|
TCG_COND_ALWAYS, /* geu: !C -> 1 */
|
||||||
|
TCG_COND_GE, /* pos: !N */
|
||||||
|
TCG_COND_ALWAYS, /* vc: !V -> 1 */
|
||||||
|
};
|
||||||
|
|
||||||
TCGv_i32 r_src;
|
TCGv_i32 r_src;
|
||||||
TCGv r_dst;
|
TCGv r_dst;
|
||||||
|
|
||||||
|
@ -1082,11 +1101,9 @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (dc->cc_op) {
|
switch (dc->cc_op) {
|
||||||
case CC_OP_SUB:
|
case CC_OP_LOGIC:
|
||||||
switch (cond) {
|
cmp->cond = logic_cond[cond];
|
||||||
case 6: /* neg */
|
do_compare_dst_0:
|
||||||
case 14: /* pos */
|
|
||||||
cmp->cond = (cond == 6 ? TCG_COND_LT : TCG_COND_GE);
|
|
||||||
cmp->is_bool = false;
|
cmp->is_bool = false;
|
||||||
cmp->g2 = false;
|
cmp->g2 = false;
|
||||||
cmp->c2 = tcg_const_tl(0);
|
cmp->c2 = tcg_const_tl(0);
|
||||||
|
@ -1102,8 +1119,13 @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond,
|
||||||
cmp->c1 = cpu_cc_dst;
|
cmp->c1 = cpu_cc_dst;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0: /* never */
|
case CC_OP_SUB:
|
||||||
case 8: /* always */
|
switch (cond) {
|
||||||
|
case 6: /* neg */
|
||||||
|
case 14: /* pos */
|
||||||
|
cmp->cond = (cond == 6 ? TCG_COND_LT : TCG_COND_GE);
|
||||||
|
goto do_compare_dst_0;
|
||||||
|
|
||||||
case 7: /* overflow */
|
case 7: /* overflow */
|
||||||
case 15: /* !overflow */
|
case 15: /* !overflow */
|
||||||
goto do_dynamic;
|
goto do_dynamic;
|
||||||
|
|
Loading…
Reference in New Issue