All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] SPARC target : Fix carry flag update in addxcc and subxcc ops
@ 2006-04-08 13:46 Even Rouault
  2006-04-09 20:38 ` Paul Brook
  2006-04-10 17:57 ` [Qemu-devel] [PATCH] SPARC target : Fix carry flag update in addxccand subxc Blue Swirl
  0 siblings, 2 replies; 7+ messages in thread
From: Even Rouault @ 2006-04-08 13:46 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 270 bytes --]

I send a patch that should fix a bug in the update of carry flag for addxcc 
and subxcc instructions when the carry flag is set before the evaluation of 
the instruction.
(the fix is identical to what is done in the similar instruction 
op_adcl_T0_T1_cc for arm target)

[-- Attachment #2: qemu-sparc-carry-xcc-ops.patch --]
[-- Type: text/x-diff, Size: 2130 bytes --]

? patch-qemu-sparc-xcc_ops.txt
Index: op.c
===================================================================
RCS file: /sources/qemu/qemu/target-sparc/op.c,v
retrieving revision 1.18
diff -u -p -r1.18 op.c
--- op.c	30 Oct 2005 17:28:50 -0000	1.18
+++ op.c	7 Apr 2006 22:04:40 -0000
@@ -415,9 +415,9 @@ void OPPROTO op_addx_T1_T0(void)
 void OPPROTO op_addx_T1_T0_cc(void)
 {
     target_ulong src1;
-
+    target_ulong has_carry = FLAG_SET(PSR_CARRY);
     src1 = T0;
-    T0 += T1 + FLAG_SET(PSR_CARRY);
+    T0 += T1 + has_carry;
     env->psr = 0;
 #ifdef TARGET_SPARC64
     if (!(T0 & 0xffffffff))
@@ -435,7 +435,7 @@ void OPPROTO op_addx_T1_T0_cc(void)
 	env->xcc |= PSR_ZERO;
     if ((int64_t) T0 < 0)
 	env->xcc |= PSR_NEG;
-    if (T0 < src1)
+    if (T0 < src1 || (has_carry && T0 <= src1))
 	env->xcc |= PSR_CARRY;
     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
 	env->xcc |= PSR_OVF;
@@ -444,7 +444,7 @@ void OPPROTO op_addx_T1_T0_cc(void)
 	env->psr |= PSR_ZERO;
     if ((int32_t) T0 < 0)
 	env->psr |= PSR_NEG;
-    if (T0 < src1)
+    if (T0 < src1 || (has_carry && T0 <= src1))
 	env->psr |= PSR_CARRY;
     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
 	env->psr |= PSR_OVF;
@@ -505,9 +505,9 @@ void OPPROTO op_subx_T1_T0(void)
 void OPPROTO op_subx_T1_T0_cc(void)
 {
     target_ulong src1;
-
+    target_ulong has_carry = FLAG_SET(PSR_CARRY);
     src1 = T0;
-    T0 -= T1 + FLAG_SET(PSR_CARRY);
+    T0 -= T1 + has_carry;
     env->psr = 0;
 #ifdef TARGET_SPARC64
     if (!(T0 & 0xffffffff))
@@ -525,7 +525,7 @@ void OPPROTO op_subx_T1_T0_cc(void)
 	env->xcc |= PSR_ZERO;
     if ((int64_t) T0 < 0)
 	env->xcc |= PSR_NEG;
-    if (src1 < T1)
+    if (src1 < T1 || (has_carry && src1 <= T1))
 	env->xcc |= PSR_CARRY;
     if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
 	env->xcc |= PSR_OVF;
@@ -534,7 +534,7 @@ void OPPROTO op_subx_T1_T0_cc(void)
 	env->psr |= PSR_ZERO;
     if ((int32_t) T0 < 0)
 	env->psr |= PSR_NEG;
-    if (src1 < T1)
+    if (src1 < T1 || (has_carry && src1 <= T1))
 	env->psr |= PSR_CARRY;
     if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
 	env->psr |= PSR_OVF;

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2006-04-10 20:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-04-08 13:46 [Qemu-devel] [PATCH] SPARC target : Fix carry flag update in addxcc and subxcc ops Even Rouault
2006-04-09 20:38 ` Paul Brook
2006-04-10 18:04   ` [Qemu-devel] [PATCH] SPARC target : Fix carry flag update inaddxcc and subxc Blue Swirl
2006-04-10 18:13     ` Paul Brook
2006-04-10 18:46     ` Laurent Desnogues
2006-04-10 20:18       ` Even Rouault
2006-04-10 17:57 ` [Qemu-devel] [PATCH] SPARC target : Fix carry flag update in addxccand subxc Blue Swirl

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.