]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix extremely obscure bug in xadd picked up by QEMU's test suite. The
authorJulian Seward <jseward@acm.org>
Tue, 20 Jul 2004 12:24:53 +0000 (12:24 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 20 Jul 2004 12:24:53 +0000 (12:24 +0000)
(almost useless) instruction "xadd %reg,%reg" gave the wrong answer
due to a subtlety of the order in which the destination registers are
PUTted to.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2513

coregrind/vg_to_ucode.c

index 4ec2598964139cd2944e12e547242e5639db4a2b..7790cb77c3d728f4f0148da1a70880c7d32b1a37 100644 (file)
@@ -3137,8 +3137,8 @@ Addr dis_xadd_G_E ( UCodeBlock* cb,
       uInstr2(cb, GET, sz, ArchReg, gregOfRM(rm), TempReg, tmpt);
       uInstr2(cb, ADD, sz, TempReg, tmpd, TempReg, tmpt);
       setFlagsFromUOpcode(cb, ADD);
-      uInstr2(cb, PUT, sz, TempReg, tmpt, ArchReg, eregOfRM(rm));
       uInstr2(cb, PUT, sz, TempReg, tmpd, ArchReg, gregOfRM(rm));
+      uInstr2(cb, PUT, sz, TempReg, tmpt, ArchReg, eregOfRM(rm));
       DIP("xadd%c %s, %s\n", 
           nameISize(sz), nameIReg(sz,gregOfRM(rm)), nameIReg(sz,eregOfRM(rm)));
       return 1+eip0;