diff options
author | Richard Henderson <rth@twiddle.net> | 2013-02-19 23:52:22 -0800 |
---|---|---|
committer | Blue Swirl <blauwirbel@gmail.com> | 2013-02-23 17:25:30 +0000 |
commit | 528692a8a4fb6c545d818957e758d6ad70fa255c (patch) | |
tree | 2dacb006dc640b629ed6f9bfbdbcb8b465265f32 /target-sparc | |
parent | 15fe216fc510c2a0ecf39536bbbc92ba75beb963 (diff) | |
download | qemu-528692a8a4fb6c545d818957e758d6ad70fa255c.zip qemu-528692a8a4fb6c545d818957e758d6ad70fa255c.tar.gz qemu-528692a8a4fb6c545d818957e758d6ad70fa255c.tar.bz2 |
target-sparc: Use mul*2 for multiply
Cc: Blue Swirl <blauwirbel@gmail.com>
Signed-off-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Diffstat (limited to 'target-sparc')
-rw-r--r-- | target-sparc/translate.c | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/target-sparc/translate.c b/target-sparc/translate.c index a5678b0..12276d5 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -642,39 +642,30 @@ static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2) static inline void gen_op_multiply(TCGv dst, TCGv src1, TCGv src2, int sign_ext) { - TCGv_i32 r_src1, r_src2; - TCGv_i64 r_temp, r_temp2; - - r_src1 = tcg_temp_new_i32(); - r_src2 = tcg_temp_new_i32(); - - tcg_gen_trunc_tl_i32(r_src1, src1); - tcg_gen_trunc_tl_i32(r_src2, src2); - - r_temp = tcg_temp_new_i64(); - r_temp2 = tcg_temp_new_i64(); - +#if TARGET_LONG_BITS == 32 if (sign_ext) { - tcg_gen_ext_i32_i64(r_temp, r_src2); - tcg_gen_ext_i32_i64(r_temp2, r_src1); + tcg_gen_muls2_tl(dst, cpu_y, src1, src2); } else { - tcg_gen_extu_i32_i64(r_temp, r_src2); - tcg_gen_extu_i32_i64(r_temp2, r_src1); + tcg_gen_mulu2_tl(dst, cpu_y, src1, src2); } +#else + TCGv t0 = tcg_temp_new_i64(); + TCGv t1 = tcg_temp_new_i64(); - tcg_gen_mul_i64(r_temp2, r_temp, r_temp2); - - tcg_gen_shri_i64(r_temp, r_temp2, 32); - tcg_gen_trunc_i64_tl(cpu_y, r_temp); - tcg_temp_free_i64(r_temp); - tcg_gen_andi_tl(cpu_y, cpu_y, 0xffffffff); - - tcg_gen_trunc_i64_tl(dst, r_temp2); + if (sign_ext) { + tcg_gen_ext32s_i64(t0, src1); + tcg_gen_ext32s_i64(t1, src2); + } else { + tcg_gen_ext32u_i64(t0, src1); + tcg_gen_ext32u_i64(t1, src2); + } - tcg_temp_free_i64(r_temp2); + tcg_gen_mul_i64(dst, t0, t1); + tcg_temp_free(t0); + tcg_temp_free(t1); - tcg_temp_free_i32(r_src1); - tcg_temp_free_i32(r_src2); + tcg_gen_shri_i64(cpu_y, dst, 32); +#endif } static inline void gen_op_umul(TCGv dst, TCGv src1, TCGv src2) |