From: Richard Henderson <rth@twiddle.net>
To: Palle Lyckegaard <palle@lyckegaard.dk>
Cc: Blue Swirl <blauwirbel@gmail.com>,
Laurent Desnogues <laurent.desnogues@gmail.com>,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] mulu2 not implemented for tcg target sparc
Date: Mon, 11 Jan 2010 08:48:10 -0800 [thread overview]
Message-ID: <4B4B564A.1000207@twiddle.net> (raw)
In-Reply-To: <alpine.NEB.2.01.1001102113220.12274@otaku.freeshell.org>
[-- Attachment #1: Type: text/plain, Size: 719 bytes --]
On 01/10/2010 01:17 PM, Palle Lyckegaard wrote:
> On Sun, 10 Jan 2010, Blue Swirl wrote:
>
>>>>
>>>> Is it needed somewhere?
>>>
>
> I was trying to run qemu-system-mips with a NetBSD malta kernel that
> generates a MIPS mult operation. Tracing the code through tcg points at
> a missing mulu2 opreration for sparc.
>
> >> It will be generated for instance for some muls when the target >>
> is i386 (not even x86_64) on a 32-bit host.
>>
>> In that case mulu2 support would be useful for Sparc32 host too.
>> Palle, are you planning to dig into this?
>
> Yes I will try even if my tcg and SPARC assembly skills and very limited
> (so far...)
Try this. You're also missing double-word addition and subtraction.
r~
[-- Attachment #2: z --]
[-- Type: text/plain, Size: 2785 bytes --]
diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c
index 8f094e5..003f084 100644
--- a/tcg/sparc/tcg-target.c
+++ b/tcg/sparc/tcg-target.c
@@ -215,6 +215,7 @@ static inline int tcg_target_const_match(tcg_target_long val,
#define BA (INSN_OP(0) | INSN_COND(COND_A, 0) | INSN_OP2(0x2))
#define ARITH_ADD (INSN_OP(2) | INSN_OP3(0x00))
+#define ARITH_ADDCC (INSN_OP(2) | INSN_OP3(0x10))
#define ARITH_AND (INSN_OP(2) | INSN_OP3(0x01))
#define ARITH_OR (INSN_OP(2) | INSN_OP3(0x02))
#define ARITH_ORCC (INSN_OP(2) | INSN_OP3(0x12))
@@ -238,6 +239,7 @@ static inline int tcg_target_const_match(tcg_target_long val,
#define SHIFT_SRLX (INSN_OP(2) | INSN_OP3(0x26) | (1 << 12))
#define SHIFT_SRAX (INSN_OP(2) | INSN_OP3(0x27) | (1 << 12))
+#define RDY (INSN_OP(2) | INSN_OP3(0x28) | INSN_RS1(0))
#define WRY (INSN_OP(2) | INSN_OP3(0x30))
#define JMPL (INSN_OP(2) | INSN_OP3(0x38))
#define SAVE (INSN_OP(2) | INSN_OP3(0x3c))
@@ -403,6 +405,11 @@ static inline void tcg_out_sety(TCGContext *s, tcg_target_long val)
fprintf(stderr, "unimplemented sety %ld\n", (long)val);
}
+static inline void tcg_out_rdy(TCGContext *s, int rd)
+{
+ tcg_out32(s, RDY | INSN_RD(rd));
+}
+
static inline void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val)
{
if (val != 0) {
@@ -1128,6 +1135,38 @@ static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args,
args[2], const_args[2],
args[3], const_args[3], args[5]);
break;
+ case INDEX_op_add2_i32:
+ if (const_args[4]) {
+ tcg_out_arithi(s, args[0], args[2], args[4], ARITH_ADDCC);
+ } else {
+ tcg_out_arith(s, args[0], args[2], args[4], ARITH_ADDCC);
+ }
+ if (const_args[5]) {
+ tcg_out_arithi(s, args[1], args[3], args[5], ARITH_ADDX);
+ } else {
+ tcg_out_arithi(s, args[1], args[3], args[5], ARITH_ADDX);
+ }
+ break;
+ case INDEX_op_sub2_i32:
+ if (const_args[4]) {
+ tcg_out_arithi(s, args[0], args[2], args[4], ARITH_SUBCC);
+ } else {
+ tcg_out_arith(s, args[0], args[2], args[4], ARITH_SUBCC);
+ }
+ if (const_args[5]) {
+ tcg_out_arithi(s, args[1], args[3], args[5], ARITH_SUBX);
+ } else {
+ tcg_out_arithi(s, args[1], args[3], args[5], ARITH_SUBX);
+ }
+ break;
+ case INDEX_op_mulu2_i32:
+ if (const_args[3]) {
+ tcg_out_arithi(s, args[0], args[2], args[3], ARITH_UMUL);
+ } else {
+ tcg_out_arith(s, args[0], args[2], args[3], ARITH_UMUL);
+ }
+ tcg_out_rdy(s, args[1]);
+ break;
#endif
case INDEX_op_qemu_ld8u:
prev parent reply other threads:[~2010-01-11 16:48 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-10 20:20 [Qemu-devel] mulu2 not implemented for tcg target sparc Palle Lyckegaard
2010-01-10 20:46 ` Blue Swirl
2010-01-10 20:50 ` Laurent Desnogues
2010-01-10 21:03 ` Blue Swirl
2010-01-10 21:17 ` Palle Lyckegaard
2010-01-11 16:48 ` Richard Henderson [this message]
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=4B4B564A.1000207@twiddle.net \
--to=rth@twiddle.net \
--cc=blauwirbel@gmail.com \
--cc=laurent.desnogues@gmail.com \
--cc=palle@lyckegaard.dk \
--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.