From: Julian Seward <jseward@acm.org>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] ppc32 guests: fix computation of XER.{CA, OV} in addme, subfme, mullwo
Date: Sun, 11 May 2008 02:04:47 +0200 [thread overview]
Message-ID: <200805110204.47184.jseward@acm.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 535 bytes --]
For ppc32 guests, computation of XER.CA and XER.OV in some obscure
cases is incorrect. At least, it doesn't produce the same results
as a real MPC7447, and doesn't appear to be in accordance with the
instruction set documentation.
The attached patch fixes it:
* addme{o}{.}, subfme{o}{.}: compute XER.CA correctly
* mullwo{.}: sign extend arguments before doing 64-bit
multiply, so as to make the XER.OV computation correct
I suspect the handling of the 64-bit equivalents is similarly borked,
but I haven't checked so far.
J
[-- Attachment #2: qemu-ppc32-fix-xer-ca-obscure-cases.diff --]
[-- Type: text/x-diff, Size: 2323 bytes --]
Index: target-ppc/op_helper.c
===================================================================
--- target-ppc/op_helper.c (revision 4422)
+++ target-ppc/op_helper.c (working copy)
@@ -147,11 +147,14 @@
void do_addmeo (void)
{
+ uint32_t argL = T0;
+ uint32_t res = T0 + xer_ca + (-1);
+ uint32_t carried = res < argL || ((xer_ca & 1) == 1 && res == argL);
T1 = T0;
- T0 += xer_ca + (-1);
+ T0 = res;
xer_ov = ((uint32_t)T1 & ((uint32_t)T1 ^ (uint32_t)T0)) >> 31;
xer_so |= xer_ov;
- if (likely(T1 != 0))
+ if (carried)
xer_ca = 1;
else
xer_ca = 0;
@@ -227,9 +230,9 @@
void do_mullwo (void)
{
- int64_t res = (int64_t)T0 * (int64_t)T1;
+ int64_t res = ((int64_t)(int32_t)T0) * ((int64_t)(int32_t)T1);
- if (likely((int32_t)res == res)) {
+ if (likely( ((int64_t)(int32_t)res) == ((int64_t)res) )) {
xer_ov = 0;
} else {
xer_ov = 1;
@@ -306,11 +309,14 @@
void do_subfmeo (void)
{
+ uint32_t argR = -1;
+ uint32_t res = ~T0 + xer_ca - 1;
+ uint32_t carried = res < argR || ((xer_ca & 1) == 1 && res == argR);
T1 = T0;
- T0 = ~T0 + xer_ca - 1;
+ T0 = res;
xer_ov = ((uint32_t)~T1 & ((uint32_t)~T1 ^ (uint32_t)T0)) >> 31;
xer_so |= xer_ov;
- if (likely((uint32_t)T1 != UINT32_MAX))
+ if (carried)
xer_ca = 1;
else
xer_ca = 0;
Index: target-ppc/op.c
===================================================================
--- target-ppc/op.c (revision 4422)
+++ target-ppc/op.c (working copy)
@@ -883,8 +883,11 @@
/* add to minus one extended */
void OPPROTO op_add_me (void)
{
- T0 += xer_ca + (-1);
- if (likely((uint32_t)T1 != 0))
+ uint32_t argL = T0;
+ uint32_t res = T0 + xer_ca + (-1);
+ uint32_t carried = res < argL || ((xer_ca & 1) == 1 && res == argL);
+ T0 = res;
+ if (carried)
xer_ca = 1;
else
xer_ca = 0;
@@ -1176,8 +1179,11 @@
/* subtract from minus one extended */
void OPPROTO op_subfme (void)
{
- T0 = ~T0 + xer_ca - 1;
- if (likely((uint32_t)T0 != UINT32_MAX))
+ uint32_t argR = -1;
+ uint32_t res = ~T0 + xer_ca - 1;
+ uint32_t carried = res < argR || ((xer_ca & 1) == 1 && res == argR);
+ T0 = res;
+ if (carried)
xer_ca = 1;
else
xer_ca = 0;
next reply other threads:[~2008-05-11 0:10 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-11 0:04 Julian Seward [this message]
2008-06-17 12:27 ` [Qemu-devel] [PATCH] ppc32 guests: fix computation of XER.{CA, OV} in addme, subfme, mullwo Aurelien Jarno
2008-06-17 22:06 ` Julian Seward
2008-06-17 22:53 ` J. Mayer
2008-06-17 23:23 ` Julian Seward
2008-06-18 21:32 ` J. Mayer
2008-06-18 21:39 ` Julian Seward
2008-06-18 22:09 ` J. Mayer
2008-06-18 22:13 ` Tristan Gingold
2008-06-19 7:36 ` Julian Seward
2008-06-19 8:36 ` Tristan Gingold
2008-06-19 9:12 ` J. Mayer
2008-10-01 21:47 ` Aurelien Jarno
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=200805110204.47184.jseward@acm.org \
--to=jseward@acm.org \
--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.