From: Julian Seward Date: Tue, 20 Jul 2004 12:24:53 +0000 (+0000) Subject: Fix extremely obscure bug in xadd picked up by QEMU's test suite. The X-Git-Tag: svn/VALGRIND_2_2_0~123 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ff1439fd06744b2dc400eb7b81edb0110cb41957;p=thirdparty%2Fvalgrind.git Fix extremely obscure bug in xadd picked up by QEMU's test suite. The (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 --- diff --git a/coregrind/vg_to_ucode.c b/coregrind/vg_to_ucode.c index 4ec2598964..7790cb77c3 100644 --- a/coregrind/vg_to_ucode.c +++ b/coregrind/vg_to_ucode.c @@ -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;