From: Paul Brook <paul@codesourcery.com>
To: qemu-devel@nongnu.org
Cc: Blue Swirl <blauwirbel@gmail.com>
Subject: Re: [Qemu-devel] [5281] Use the new concat_i32_i64 op for std and stda
Date: Sun, 21 Sep 2008 16:01:34 +0100 [thread overview]
Message-ID: <200809211601.35191.paul@codesourcery.com> (raw)
In-Reply-To: <E1KhQFJ-0006tS-Ib@cvs.savannah.gnu.org>
On Sunday 21 September 2008, Blue Swirl wrote:
> + r_low = tcg_temp_new(TCG_TYPE_I32);
> + tcg_gen_trunc_tl_i32(r_low, cpu_tmp0);
> + tcg_gen_trunc_tl_i32(cpu_tmp32, hi);
> + tcg_gen_concat_i32_i64(cpu_tmp64, r_low, cpu_tmp32);
> + tcg_temp_free(r_low);
It's more efficient to not use concat_i32_i64 on 64-bit targets.
See patch below. I'll let you decide if you want to apply or ignore it.
Signed-off-by: Paul Brook <paul@codesourcery.com>
Index: target-sparc/helper.h
===================================================================
--- target-sparc/helper.h (revision 5280)
+++ target-sparc/helper.h (working copy)
@@ -44,7 +44,6 @@ DEF_HELPER(void, helper_restore, (void))
DEF_HELPER(void, helper_flush, (target_ulong addr))
DEF_HELPER(target_ulong, helper_udiv, (target_ulong a, target_ulong b))
DEF_HELPER(target_ulong, helper_sdiv, (target_ulong a, target_ulong b))
-DEF_HELPER(uint64_t, helper_pack64, (target_ulong high, target_ulong low))
DEF_HELPER(void, helper_stdf, (target_ulong addr, int mem_idx))
DEF_HELPER(void, helper_lddf, (target_ulong addr, int mem_idx))
DEF_HELPER(void, helper_ldqf, (target_ulong addr, int mem_idx))
Index: target-sparc/op_helper.c
===================================================================
--- target-sparc/op_helper.c (revision 5280)
+++ target-sparc/op_helper.c (working copy)
@@ -2281,11 +2281,6 @@ target_ulong helper_sdiv(target_ulong a,
}
}
-uint64_t helper_pack64(target_ulong high, target_ulong low)
-{
- return ((uint64_t)high << 32) | (uint64_t)(low & 0xffffffff);
-}
-
void helper_stdf(target_ulong addr, int mem_idx)
{
helper_check_align(addr, 7);
Index: target-sparc/translate.c
===================================================================
--- target-sparc/translate.c (revision 5280)
+++ target-sparc/translate.c (working copy)
@@ -1619,6 +1619,31 @@ static inline void gen_clear_float_excep
tcg_gen_helper_0_0(helper_clear_float_exceptions);
}
+/* May clobber low. */
+static void gen_pack64(TCGv dest, TCGv high, TCGv low)
+{
+#ifdef TARGET_SPARC64
+#if HOST_LONG_BITS == 64
+ tcg_gen_shli_i64(dest, high, 32);
+ tcg_gen_ext32u_i64(low, low);
+ tcg_gen_or_i64(dest, dest, low);
+# else
+ /* We could omit the truncation if we assumed that 64-bit TCG variables
+ can be used in 32-bit ops. Hopefully TCG will be smart enough to
+ eliminate the copy. */
+ TCGv low32 = tcg_temp_new(TCG_TYPE_I32);
+ TCGv high32 = tcg_temp_new(TCG_TYPE_I32);
+ tcg_gen_trunc_i64_i32(low32, low);
+ tcg_gen_trunc_i64_i32(high32, high);
+ tcg_gen_concat_i32_i64(dest, low32, high32);
+ tcg_temp_free(high32);
+ tcg_temp_free(low32);
+# endif
+#else /* !TARGET_SPARC64 */
+ tcg_gen_concat_i32_i64(dest, low, high);
+#endif
+}
+
/* asi moves */
#ifdef TARGET_SPARC64
static inline TCGv gen_get_asi(int insn, TCGv r_addr)
@@ -1719,8 +1744,7 @@ static inline void gen_stda_asi(TCGv hi,
r_temp = tcg_temp_new(TCG_TYPE_TL);
gen_movl_reg_TN(rd + 1, r_temp);
- tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, hi,
- r_temp);
+ gen_pack64(cpu_tmp64, hi, r_temp);
tcg_temp_free(r_temp);
r_asi = gen_get_asi(insn, addr);
r_size = tcg_const_i32(8);
@@ -1821,7 +1845,7 @@ static inline void gen_stda_asi(TCGv hi,
r_temp = tcg_temp_new(TCG_TYPE_TL);
gen_movl_reg_TN(rd + 1, r_temp);
- tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, hi, r_temp);
+ gen_pack64(cpu_tmp64, hi, r_temp);
tcg_temp_free(r_temp);
r_asi = tcg_const_i32(GET_FIELD(insn, 19, 26));
r_size = tcg_const_i32(8);
@@ -4484,8 +4508,7 @@ static void disas_sparc_insn(DisasContex
tcg_temp_free(r_const);
r_low = tcg_temp_new(TCG_TYPE_TL);
gen_movl_reg_TN(rd + 1, r_low);
- tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, cpu_val,
- r_low);
+ gen_pack64(cpu_tmp64, cpu_val, r_low);
tcg_temp_free(r_low);
tcg_gen_qemu_st64(cpu_tmp64, cpu_addr, dc->mem_idx);
}
next prev parent reply other threads:[~2008-09-21 15:01 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-21 14:49 [Qemu-devel] [5281] Use the new concat_i32_i64 op for std and stda Blue Swirl
2008-09-21 15:01 ` Paul Brook [this message]
2008-09-21 16:08 ` Blue Swirl
2008-09-21 16:29 ` Blue Swirl
2008-09-21 16:41 ` Paul Brook
2008-09-21 17:02 ` Blue Swirl
2008-09-21 21:19 ` Thiemo Seufer
2008-09-22 16:14 ` Blue Swirl
2008-09-22 16:47 ` Paul Brook
2008-09-21 16:36 ` Paul Brook
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200809211601.35191.paul@codesourcery.com \
--to=paul@codesourcery.com \
--cc=blauwirbel@gmail.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.