diff options
author | Aurelien Jarno <aurelien@aurel32.net> | 2015-05-18 15:39:59 +0200 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2015-06-05 01:37:57 +0200 |
commit | d30107814c8d02f1896bd57249aef1b5aaed38c9 (patch) | |
tree | 4cc356019145ae017a94c75e5ce4981d470b20a1 /target-s390x/translate.c | |
parent | 2aaa1940684a3bf2b381fd2a8ff26c287a05109d (diff) | |
download | qemu-d30107814c8d02f1896bd57249aef1b5aaed38c9.zip |
target-s390x: optimize (negative-) abs computation
Now that movcond exists, it's easy to write (negative-) absolute value
using TCG code instead of an helper.
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'target-s390x/translate.c')
-rw-r--r-- | target-s390x/translate.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 497733dbcc..0c6d1f6a37 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -1310,7 +1310,13 @@ static ExitStatus help_branch(DisasContext *s, DisasCompare *c, static ExitStatus op_abs(DisasContext *s, DisasOps *o) { - gen_helper_abs_i64(o->out, o->in2); + TCGv_i64 z, n; + z = tcg_const_i64(0); + n = tcg_temp_new_i64(); + tcg_gen_neg_i64(n, o->in2); + tcg_gen_movcond_i64(TCG_COND_LT, o->out, o->in2, z, n, o->in2); + tcg_temp_free_i64(n); + tcg_temp_free_i64(z); return NO_EXIT; } @@ -2680,7 +2686,13 @@ static ExitStatus op_msdb(DisasContext *s, DisasOps *o) static ExitStatus op_nabs(DisasContext *s, DisasOps *o) { - gen_helper_nabs_i64(o->out, o->in2); + TCGv_i64 z, n; + z = tcg_const_i64(0); + n = tcg_temp_new_i64(); + tcg_gen_neg_i64(n, o->in2); + tcg_gen_movcond_i64(TCG_COND_GE, o->out, o->in2, z, n, o->in2); + tcg_temp_free_i64(n); + tcg_temp_free_i64(z); return NO_EXIT; } |