From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12079 invoked by alias); 6 Jul 2009 19:01:03 -0000 Received: (qmail 11563 invoked by uid 22791); 6 Jul 2009 19:00:59 -0000 X-SWARE-Spam-Status: No, hits=-1.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_24,J_CHICKENPOX_25,J_CHICKENPOX_41,J_CHICKENPOX_53 X-Spam-Check-By: sourceware.org Received: from web112508.mail.gq1.yahoo.com (HELO web112508.mail.gq1.yahoo.com) (98.137.26.150) by sourceware.org (qpsmtpd/0.43rc1) with SMTP; Mon, 06 Jul 2009 19:00:45 +0000 Received: (qmail 80699 invoked by uid 60001); 6 Jul 2009 19:00:42 -0000 Message-ID: <819978.78752.qm@web112508.mail.gq1.yahoo.com> Received: from [123.238.27.12] by web112508.mail.gq1.yahoo.com via HTTP; Mon, 06 Jul 2009 12:00:42 PDT Date: Mon, 06 Jul 2009 19:01:00 -0000 From: paawan oza Subject: Re: i386.record.floating.point.patch : with more testing and assurity To: Mark Kettenis Cc: gdb-patches@sourceware.org, teawater@gmail.com MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-07/txt/msg00154.txt.bz2 Hi, All the comments by you are taken care. As far as possible I took care of s= pacing issues and commenting issues as suggested. I will try to integrate test example with gdb testsuite. I am sending a patch which includes yours and Hui's review comments. Regards, Oza. --- On Mon, 7/6/09, Mark Kettenis wrote: > From: Mark Kettenis > Subject: Re: i386.record.floating.point.patch : with more testing and ass= urity > To: paawan1982@yahoo.com > Cc: gdb-patches@sourceware.org, teawater@gmail.com > Date: Monday, July 6, 2009, 12:03 AM > > Date: Wed, 1 Jul 2009 09:17:41 > -0700 (PDT) > > From: paawan oza > >=20 > > Hi, > >=20 > > For your review convenience, I am sending the patch in > plain text as a part of email body. > > please also refer to the previous mails, where a point > is raised by Hui. > > I provided justification for the same. > > please help with the point to throw more light. >=20 > Please review the GNU coding standards.=A0 Your new code > has some > formatting problems. >=20 > > TEST_CASE > > **************************************************** > > test_float.c > > **************************************************** > > #include > > #include > > #include > >=20 > > /* the test intends to test following insns.=A0=20 > > flds faddp fstps fstpl fldl fxch fabs fdivrp fmulp > fsubrp fucomp fnstsw fsqrt > > fchs f2xm1 fyl2x fxtract fprem1 fld fdecstp fld1 > fldl2t fldl2e FLDPI FLDLG2 FLDLN2 > > FLDZ fincstp ffree fptan fpatan fincstp fsincos > frndint fscale fsin fcos fcmovb > > fcmovbe fcmove fcmovu fcmovnb fcmovnbe fsave frstor > fstsw=20 > > */ > >=20 > > float no1,no2,no3,no4,no5,no6,no7; > > double x =3D 100.345, y =3D 25.7789; > > long double ldx =3D 88888888888888888888.88, ldy =3D > 9999999999999999999.99; > > float result,resultd,resultld;=20 > > float *float_memory; > >=20 > > /* initialization of floats */ > > void init_floats() > > { > >=A0=A0=A0no1 =3D 10.45; > >=A0=A0=A0no2 =3D 20.77; > >=A0=A0=A0no3 =3D 156.89874646; > >=A0=A0=A0no4 =3D 14.56; > >=A0=A0=A0no5 =3D 11.11; > >=A0=A0=A0no6 =3D 66.77; > >=A0=A0=A0no7 =3D 88.88; > >=A0=A0=A0float_memory =3D malloc(sizeof(float) * > 4); > >=A0=A0=A0*float_memory =3D 256.256; > >=A0=A0=A0*(float_memory + 1) =3D 356.356; > >=A0=A0=A0*(float_memory + 2) =3D 456.456; > >=A0=A0=A0*(float_memory + 3) =3D 556.556; > > } > >=20 > > /* marks FPU stack as empty */ > > void empty_fpu_stack() > > { > >=A0=A0=A0asm ("ffree %st(1) \n\t" > >=A0 =A0 =A0 =A0 "ffree %st(2) \n\t" > >=A0 =A0 =A0 =A0 "ffree %st(3) \n\t" > >=A0 =A0 =A0 =A0 "ffree %st(4) \n\t" > >=A0 =A0 =A0 =A0 "ffree %st(5) \n\t" > >=A0 =A0 =A0 =A0 "ffree %st(6) \n\t" > >=A0 =A0 =A0 =A0 "ffree %st(7)"); > > }=A0=A0=A0 > >=20 > > /* tests floating point arithmatic */ > > void test_arith_floats() > > { > >=A0=A0=A0result =3D no1 + no2 + no3 + no4 + no5 > + no6 + no7; > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D fmodf(no2,no1);=20 > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0resultd =3D fmod(x,y);=20 > >=A0=A0=A0printf("result is %f\n",resultd); > >=20 > >=A0=A0=A0resultld =3D fmodl(ldy,ldy);=20 > >=A0=A0=A0printf("result is %f\n",resultld); > >=20 > >=A0=A0=A0result =3D fabsf(no1);=A0 =A0 > =A0 =A0=20 > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D no3 / no4; > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D no1 * no2 * no3 * no4; > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D no1 - no2 - no3 - no4; > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=20 > >=A0=A0=A0asm ("fld %0" : > :"m"(*float_memory)); > >=A0=A0=A0asm ("fchs"); > >=A0=A0=A0 > >=A0=A0=A0/* test for f2xm1 */=A0=20 > >=A0=A0=A0asm ("fld %0" : :"m"(*float_memory)); >=20 > >=A0=A0=A0asm ("f2xm1"); > >=20 > >=A0=A0=A0asm ("fyl2x"); > >=20 > >=A0=A0=A0asm ("fld %0" : :"m"(*float_memory)); >=20 > >=A0=A0=A0asm ("fxtract"); > >=20 > >=A0=A0=A0asm ("fld %0" : :"m"(*float_memory)); >=20 > >=A0=A0=A0asm ("fprem1"); > >=20 > >=A0=A0=A0/* decrement fpu stack pointer only > status register should get affected */ > >=A0=A0=A0asm ("fld %0" : > :"m"(*float_memory));=A0=A0=A0 > >=A0=A0=A0 > >=A0=A0=A0empty_fpu_stack(); > >=A0=A0=A0 > >=A0=A0=A0asm ("fld1"); > >=A0=A0=A0asm ("fldl2t"); > >=A0=A0=A0asm ("fldl2e"); > >=A0=A0=A0asm ("fldpi"); > >=A0=A0=A0asm ("fldlg2"); > >=A0=A0=A0asm ("fldln2"); > >=A0=A0=A0asm ("fldz"); > >=20 > >=A0=A0=A0empty_fpu_stack(); > >=A0=A0=A0/* finishing emptying the stack */ > >=A0 =A0 =A0=A0=A0 > >=A0=A0=A0result =3D sqrt(no3); > >=A0=A0=A0printf("result is %f\n",result); > > } > >=20 > > void test_log_exp_floats() > > { > >=A0=A0=A0result =3D log10(no3); > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D log(no3); > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D exp10(no3); > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D exp(no3); > >=A0=A0=A0printf("result is %f\n",result); > > } > >=20 > > void test_trigo_floats() > > { > >=A0=A0=A0result =3D sin(30); > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D cos(30); > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D tan(30); > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0result =3D atan(30); > >=A0=A0=A0printf("result is %f\n",result); > >=20 > >=A0=A0=A0asm ("fld %0" : :"m"(*float_memory)); >=20 > >=A0=A0=A0asm ("fptan"); > >=20 > >=A0=A0=A0/* changes st1 and popping register > stack */ > >=A0=A0=A0asm ("fpatan");=A0=20 > >=20 > >=A0=A0=A0asm("fincstp"); > >=A0=A0=A0asm ("fld %0" : :"m"(float_memory)); >=20 > >=A0=A0=A0asm ("fsincos"); > >=20 > >=A0=A0=A0asm ("fld %0" : :"m"(*float_memory)); >=20 > >=A0=A0=A0asm ("frndint"); > >=20 > >=A0=A0=A0asm ("fld %0" : > :"m"(*float_memory)); > >=A0=A0=A0asm ("fld %0" : > :"m"(*(float_memory+1)));=A0=20 > >=A0=A0=A0asm ("fscale"); > >=20 > >=A0=A0=A0empty_fpu_stack(); > >=20 > >=A0=A0=A0asm ("fld %0" : :"m"(*float_memory)); >=20 > >=A0=A0=A0asm ("fsin"); > >=A0=A0=A0asm ("fcos"); > >=20 > >=A0=A0=A0/* currently we assume condition > likely and always record the registers=20 > >=A0=A0=A0code could be optimized only if the > flag is set then record */ > >=A0=A0=A0asm ("fld %0" : > :"m"(*float_memory)); > >=A0=A0=A0asm ("fld %0" : > :"m"(*(float_memory+1)));=A0=20 > >=A0=A0=A0asm ("fcmovb %st(1), %st"); > >=A0=A0=A0asm ("fcmovbe %st(1), %st"); > >=A0=A0=A0asm ("fcmove %st(1), %st"); > >=A0=A0=A0asm ("fcmovu %st(1), %st"); > >=A0=A0=A0asm ("fcmovnb %st(1), %st"); > >=A0=A0=A0asm ("fcmovnbe %st(1), %st"); > >=20 > >=A0=A0=A0empty_fpu_stack(); > >=A0=A0=A0/* finished emtyping the stack */ > > } > >=20 > > void test_compare_floats() > > { > >=A0 =A0=A0=A0ldy =3D > 88888888888888888888.88; > >=A0 =A0=A0=A0if (ldx =3D=3D ldy) > >=A0 =A0 =A0=A0=A0ldy =3D > 7777777777777777777777777777.777; > >=A0 =A0=A0=A0else > >=A0 =A0 =A0=A0=A0ldy =3D > 666666666666666666666666666.666; > > } > >=20 > > /* test loading and saving of FPU environment */ > > void test_fpu_env() > > { > >=A0=A0=A0asm ("fsave %0" : "=3Dm"(*float_memory) > : ); > >=A0=A0=A0asm ("frstor %0" : : > "m"(*float_memory)); > >=A0=A0=A0asm ("fstsw %ax");=A0=20 > > } > >=20 > > int main() > > { > >=A0 =A0=A0=A0init_floats(); > >=A0 =A0=A0=A0test_arith_floats(); > >=A0 =A0=A0=A0test_log_exp_floats(); > >=A0 =A0=A0=A0test_trigo_floats(); > >=A0 =A0=A0=A0test_compare_floats(); > >=A0 =A0=A0=A0test_fpu_env(); > > } >=20 > As other already indicated, you should really turn this > into something > that is integrated in the GDB testsuite. >=20 > > diff -urN gdb.orig/i386-tdep.c gdb.new/i386-tdep.c > > --- gdb.orig/i386-tdep.c=A0 =A0 2009-05-29 > 17:08:40.000000000 -0400 > > +++ gdb.new/i386-tdep.c=A0 =A0 2009-06-01 > 20:02:23.000000000 -0400 > > @@ -543,6 +543,9 @@ > > /* The maximum number of saved registers.=A0 This > should include all > >=A0 =A0=A0=A0registers mentioned above, and > %eip.=A0 */ > > #define I386_NUM_SAVED_REGS=A0 =A0 > I386_NUM_GREGS > > +#define I386_SAVE_FPU_REGS=A0 =A0 =A0 =A0 > 0xFFFD > > +#define I386_SAVE_FPU_ENV=A0 =A0 =A0 =A0 > 0xFFFE > > +#define I386_SAVE_FPU_ENV_REG_STACK=A0 =A0 > 0xFFFF >=20 > What are these constants used for?=A0 Do they have > anything to do with > the number of saved registers?=A0 Also, please use > lowercase for > hexadecimal constants. >=20 > > struct i386_frame_cache > > { > > @@ -2985,6 +2988,54 @@ > >=A0 =A0 return 0; > > } > >=20 > > +/* Record the value of floating point registers which > will be changed by the current instruction > > +=A0=A0=A0to "record_arch_list". > > +=A0=A0=A0return -1 if something is wrong. > */=A0=20 >=20 > Everey new sentence should start with a capital; everey > full stop (.) > should be followed by two spaces.=A0 Also please wrap > your comments such > that fit in a 80-column wide screen. >=20 > > + > > +static int i386_record_floats(struct i386_record_s > *ir, uint32_t iregnum) >=20 > static int >=20 > > +{ > > +=A0 int i; > > + > > +=A0 /* Oza : push/pop of fpu stack is going to > happen=20 > > +=A0 =A0=A0=A0currently we store st0-st7 > registers, but we need not store all registers all the > time. > > +=A0 =A0=A0=A0using fstatus, we use 11-13 > bits which gives us stack top and hence we optimize our > storage. */ >=20 > Sorry, but I don't understand what you're saying here. >=20 > > +=A0 if (I386_SAVE_FPU_REGS =3D=3D iregnum) > > +=A0 =A0 { > > +=A0 =A0 =A0 for > (i=3DI386_ST0_REGNUM;i<=3DI386_ST7_REGNUM;i++) >=20 > Spacing problems. >=20 > > +=A0 =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 if > (record_arch_list_add_reg (ir->regcache,i)) > > +=A0 =A0 =A0 =A0 =A0 =A0 return > -1;=A0 =A0=20 > > +=A0 =A0 =A0 =A0 } > > +=A0 =A0 } > > +=A0 else if (I386_SAVE_FPU_ENV =3D=3D iregnum) > > +=A0 =A0 { > > +=A0 =A0 =A0 for > (i=3DI386_FCTRL;i<=3DI386_FOP;i++) > > +=A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 if > (record_arch_list_add_reg (ir->regcache,i)) > > +=A0 =A0 =A0 =A0 =A0 return -1;=A0 > =A0=20 > > +=A0 =A0 =A0 } > > +=A0 =A0 } > > +=A0 else if (I386_SAVE_FPU_ENV_REG_STACK =3D=3D > iregnum) > > +=A0 =A0 { > > +=A0 =A0 =A0 for > (i=3DI386_ST0_REGNUM;i<=3DI386_FOP;i++) > > +=A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 if > (record_arch_list_add_reg (ir->regcache,i)) > > +=A0 =A0 =A0 =A0 =A0 return -1;=A0 > =A0=20 > > +=A0 =A0 =A0 } > > +=A0 =A0 } > > +=A0 else if (iregnum >=3D I386_ST0_REGNUM > && iregnum <=3D I386_FOP) > > +=A0 =A0 { > > +=A0 =A0 =A0 if (record_arch_list_add_reg > (ir->regcache,iregnum)) > > +=A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 } > > +=A0 else > > +=A0 =A0 { > > +=A0 =A0 =A0 /* param Error */ >=20 > Capitalization; missing full stop. >=20 > > +=A0 =A0 =A0 return -1; > > +=A0 =A0 }=20 > > +=A0 return 0; > > +} > > + > > /* Parse the current instruction and record the values > of the registers and > >=A0 =A0=A0=A0memory that will be changed in > current instruction to "record_arch_list". > >=A0 =A0=A0=A0Return -1 if something wrong. > */ > > @@ -4035,7 +4086,6 @@ > >=A0 =A0 =A0 =A0 break; > >=20 > >=A0 =A0 =A0 =A0 /* floats */ > > -=A0 =A0 =A0 /* It just record the memory > change of instrcution. */ > >=A0 =A0 =A0 case 0xd8: > >=A0 =A0 =A0 case 0xd9: > >=A0 =A0 =A0 case 0xda: > > @@ -4056,39 +4106,49 @@ > >=A0 =A0 =A0 =A0=A0=A0return -1; > >=A0 =A0 =A0=A0=A0switch (ir.reg) > >=A0 =A0 =A0 =A0=A0=A0{ > > -=A0 =A0 =A0 =A0 case 0x00: > > -=A0 =A0 =A0 =A0 case 0x01: > >=A0 =A0 =A0 =A0=A0=A0case 0x02: > > -=A0 =A0 =A0 =A0 case 0x03: > > +=A0 =A0 =A0 =A0 case 0x12: > > +=A0 =A0 =A0 =A0 case 0x22: > > +=A0 =A0 =A0 =A0 case 0x32: > > +=A0 =A0 =A0 =A0 =A0 /* for FCOM, FICOM > nothing to do */ >=20 > Please use lowercase for assembler mnemonics. >=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 =A0 =A0 case 0x03: > > +=A0 =A0 =A0 =A0 case 0x13: > > +=A0 =A0 =A0 =A0 case 0x23: > > +=A0 =A0 =A0 =A0 case 0x33: > > +=A0 =A0 =A0 =A0 =A0 =A0 /* FCOMP, > FICOMP pop FPU stack, store all */ > > +=A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 case 0x00: > > +=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0case 0x01: > >=A0 =A0 =A0 =A0=A0=A0case 0x04: > >=A0 =A0 =A0 =A0=A0=A0case 0x05: > >=A0 =A0 =A0 =A0=A0=A0case 0x06: > >=A0 =A0 =A0 =A0=A0=A0case 0x07: > >=A0 =A0 =A0 =A0=A0=A0case 0x10: > > -=A0 =A0 =A0 =A0 case 0x11: > > -=A0 =A0 =A0 =A0 case 0x12: > > -=A0 =A0 =A0 =A0 case 0x13: > > +=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0case 0x11: > >=A0 =A0 =A0 =A0=A0=A0case 0x14: > >=A0 =A0 =A0 =A0=A0=A0case 0x15: > >=A0 =A0 =A0 =A0=A0=A0case 0x16: > >=A0 =A0 =A0 =A0=A0=A0case 0x17: > >=A0 =A0 =A0 =A0=A0=A0case 0x20: > >=A0 =A0 =A0 =A0=A0=A0case 0x21: > > -=A0 =A0 =A0 =A0 case 0x22: > > -=A0 =A0 =A0 =A0 case 0x23: > >=A0 =A0 =A0 =A0=A0=A0case 0x24: > >=A0 =A0 =A0 =A0=A0=A0case 0x25: > >=A0 =A0 =A0 =A0=A0=A0case 0x26: > >=A0 =A0 =A0 =A0=A0=A0case 0x27: > >=A0 =A0 =A0 =A0=A0=A0case 0x30: > >=A0 =A0 =A0 =A0=A0=A0case 0x31: > > -=A0 =A0 =A0 =A0 case 0x32: > > -=A0 =A0 =A0 =A0 case 0x33: > >=A0 =A0 =A0 =A0=A0=A0case 0x34: > >=A0 =A0 =A0 =A0=A0=A0case 0x35: > >=A0 =A0 =A0 =A0=A0=A0case 0x36: > >=A0 =A0 =A0 =A0=A0=A0case 0x37: > > -=A0 =A0 =A0 =A0 =A0 break; > > +=A0 =A0 =A0 =A0 =A0 /* FADD, FMUL, > FSUB, FSUBR, FDIV, FDIVR, FIADD, FIMUL, FISUB, FISUBR, > FIDIV, FIDIVR=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > ModR/M.reg is an extension of code, always affects st(0) > register */ > > +=A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_ST0_REGNUM)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break;=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0=A0=A0 > >=A0 =A0 =A0 =A0=A0=A0case 0x08: > >=A0 =A0 =A0 =A0=A0=A0case 0x0a: > >=A0 =A0 =A0 =A0=A0=A0case 0x0b: > > @@ -4096,6 +4156,7 @@ > >=A0 =A0 =A0 =A0=A0=A0case 0x19: > >=A0 =A0 =A0 =A0=A0=A0case 0x1a: > >=A0 =A0 =A0 =A0=A0=A0case 0x1b: > > +=A0 =A0 =A0 =A0 case 0x1d:=20 > >=A0 =A0 =A0 =A0=A0=A0case 0x28: > >=A0 =A0 =A0 =A0=A0=A0case 0x29: > >=A0 =A0 =A0 =A0=A0=A0case 0x2a: > > @@ -4103,11 +4164,16 @@ > >=A0 =A0 =A0 =A0=A0=A0case 0x38: > >=A0 =A0 =A0 =A0=A0=A0case 0x39: > >=A0 =A0 =A0 =A0=A0=A0case 0x3a: > > -=A0 =A0 =A0 =A0 case 0x3b: > > +=A0 =A0 =A0 =A0 case 0x3b:=A0 =A0 > =A0=A0=A0 > > +=A0 =A0 =A0 =A0 case 0x3c:=20 > > +=A0 =A0 =A0 =A0 case 0x3d:=20 > >=A0 =A0 =A0 =A0 =A0=A0=A0switch > (ir.reg & 7) > >=A0 =A0 =A0 =A0=A0=A0{ > >=A0 =A0 =A0 =A0=A0=A0case 0: > > -=A0 =A0 =A0 =A0 =A0 break; > > +=A0 =A0 =A0 =A0 =A0 /* FLD, FILD */ > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1;=A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 break; > >=A0 =A0 =A0 =A0=A0=A0case 1: > >=A0 =A0 =A0 =A0 =A0=A0=A0switch > (ir.reg >> 4) > >=A0 =A0 =A0 =A0 =A0 =A0=A0=A0{ > > @@ -4120,6 +4186,7 @@ > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0return -1; > >=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0break; > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0case 3: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0default: > >=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0if (record_arch_list_add_mem (addr, 2)) > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0return -1; > > @@ -4130,15 +4197,42 @@ > >=A0 =A0 =A0 =A0 =A0=A0=A0switch > (ir.reg >> 4) > >=A0 =A0 =A0 =A0 =A0 =A0=A0=A0{ > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0case 0: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 4)) > > +=A0 =A0 =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (3 =3D=3D (ir.reg & 7)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 /* FSTP m32fp */ > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(&ir, I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 }=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 break; > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0case 1: > >=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0if (record_arch_list_add_mem (addr, 4)) > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > ((3 =3D=3D (ir.reg & 7)) || (5 =3D=3D (ir.reg & 7)) || (7 =3D=3D > (ir.reg & 7))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 /* FSTP */ > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(&ir, I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 }=20 > >=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0break; > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0case 2: > >=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0if (record_arch_list_add_mem (addr, 8)) > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (3 =3D=3D (ir.reg & 7)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 /* FSTP m64fp */ > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(&ir, I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 }=20 > >=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0break; > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0case 3: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > ((3 <=3D (ir.reg & 7)) && (6 <=3D (ir.reg > & 7))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 /* FISTP, FBLD, FILD, > FBSTP */ > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(&ir, I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 }=A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=20 > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0default: > >=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0if (record_arch_list_add_mem (addr, 2)) > >=A0 =A0 =A0 =A0 =A0 > =A0=A0=A0return -1; > > @@ -4147,54 +4241,71 @@ > >=A0 =A0 =A0 =A0 =A0=A0=A0break; > >=A0 =A0 =A0 =A0=A0=A0} > >=A0 =A0 =A0 =A0 =A0=A0=A0break; > > -=A0 =A0 =A0 =A0 case 0x0c: > > -=A0 =A0 =A0 =A0 case 0x0d: > > -=A0 =A0 =A0 =A0 case 0x1d: > > -=A0 =A0 =A0 =A0 case 0x2c: > > -=A0 =A0 =A0 =A0 case 0x3c: > > -=A0 =A0 =A0 =A0 case 0x3d: > > -=A0 =A0 =A0 =A0 =A0 break; > > -=A0 =A0 =A0 =A0 case 0x0e: > > +=A0 =A0 =A0 =A0 =A0=A0=A0case > 0x0c: > > +=A0 =A0 =A0 =A0 =A0 /* FLDENV */ > > +=A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_SAVE_FPU_ENV_REG_STACK)) > > +=A0 =A0 =A0 =A0 =A0 =A0 return > -1;=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 case 0x0d:=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 /* > FLDCW */ > > +=A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_FCTRL)) > > +=A0 =A0 =A0 =A0 =A0 =A0 return > -1;=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 case 0x2c:=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 /* > FRTSTOR */ > > +=A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_SAVE_FPU_ENV_REG_STACK)) > > +=A0 =A0 =A0 =A0 =A0 =A0 return > -1;=A0=20 > > +=A0 =A0 =A0 =A0 =A0 break;=20 > > +=A0 =A0 =A0 =A0 case 0x0e:=20 > >=A0 =A0 =A0 =A0 =A0=A0=A0if > (ir.dflag) > >=A0 =A0 =A0 =A0=A0=A0{ > > -=A0 =A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 28)) > > -=A0 =A0 =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 28)) > > +=A0 =A0 =A0 =A0 =A0 return -1; > >=A0 =A0 =A0 =A0=A0=A0} > >=A0 =A0 =A0 =A0 =A0=A0=A0else > >=A0 =A0 =A0 =A0=A0=A0{ > > -=A0 =A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 14)) > > -=A0 =A0 =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 14)) > > +=A0 =A0 =A0 =A0 =A0 return -1; > >=A0 =A0 =A0 =A0=A0=A0} > >=A0 =A0 =A0 =A0 =A0=A0=A0break; > > -=A0 =A0 =A0 =A0 case 0x0f: > > -=A0 =A0 =A0 =A0 case 0x2f: > > +=A0 =A0 =A0 =A0 case 0x0f:=A0=20 > > +=A0 =A0 =A0 =A0 case 0x2f:=A0=20 > >=A0 =A0 =A0 =A0 =A0=A0=A0if > (record_arch_list_add_mem (addr, 2)) > >=A0 =A0 =A0 =A0=A0=A0return -1; > >=A0 =A0 =A0 =A0 =A0=A0=A0break; > > -=A0 =A0 =A0 =A0 case 0x1f: > > -=A0 =A0 =A0 =A0 case 0x3e: > > +=A0 =A0 =A0 =A0 case 0x1f:=A0=20 > > +=A0 =A0 =A0 =A0 case 0x3e:=A0=20 > >=A0 =A0 =A0 =A0 =A0=A0=A0if > (record_arch_list_add_mem (addr, 10)) > >=A0 =A0 =A0 =A0=A0=A0return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 /* > FSTP, FBSTP */ > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 return > -1;=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=20 > >=A0 =A0 =A0 =A0 =A0=A0=A0break; > > -=A0 =A0 =A0 =A0 case 0x2e: > > +=A0 =A0 =A0 =A0 case 0x2e:=20 > >=A0 =A0 =A0 =A0 =A0=A0=A0if > (ir.dflag) > >=A0 =A0 =A0 =A0=A0=A0{ > > -=A0 =A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 28)) > > -=A0 =A0 =A0 =A0 =A0 =A0 return -1; > > -=A0 =A0 =A0 =A0 =A0 addr +=3D 28; > > +=A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 28)) > > +=A0 =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 addr +=3D 28; > >=A0 =A0 =A0 =A0=A0=A0} > >=A0 =A0 =A0 =A0 =A0=A0=A0else > >=A0 =A0 =A0 =A0=A0=A0{ > > -=A0 =A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 14)) > > -=A0 =A0 =A0 =A0 =A0 =A0 return -1; > > -=A0 =A0 =A0 =A0 =A0 addr +=3D 14; > > +=A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 14)) > > +=A0 =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 addr +=3D 14; > >=A0 =A0 =A0 =A0=A0=A0} > >=A0 =A0 =A0 =A0 =A0=A0=A0if > (record_arch_list_add_mem (addr, 80)) > >=A0 =A0 =A0 =A0=A0=A0return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 /* > FSAVE */ > > +=A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_SAVE_FPU_ENV_REG_STACK)) > > +=A0 =A0 =A0 =A0 =A0 =A0 return > -1;=A0=A0=A0 > >=A0 =A0 =A0 =A0 =A0=A0=A0break; > > -=A0 =A0 =A0 =A0 case 0x3f: > > +=A0 =A0 =A0 =A0 case 0x3f:=20 > >=A0 =A0 =A0 =A0 =A0=A0=A0if > (record_arch_list_add_mem (addr, 8)) > >=A0 =A0 =A0 =A0=A0=A0return -1; > > +=A0 =A0 =A0 =A0 /* FISTP */ > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 return > -1;=A0=A0=A0 > >=A0 =A0 =A0 =A0 =A0=A0=A0break; > >=A0 =A0 =A0 =A0=A0=A0default: > >=A0 =A0 =A0 =A0 =A0=A0=A0ir.addr > -=3D 2; > > @@ -4202,9 +4313,180 @@ > >=A0 =A0 =A0 =A0 =A0=A0=A0goto > no_support; > >=A0 =A0 =A0 =A0 =A0=A0=A0break; > >=A0 =A0 =A0 =A0=A0=A0} > > -=A0 =A0 } > > +=A0 =A0 }=A0=A0=A0 > > +=A0 =A0 =A0 =A0 /* opcode is an extension > of modR/M byte */=A0 =A0=A0=A0 > > +=A0 =A0 else > > +=A0 =A0 {=20 > > +=A0 =A0 =A0 =A0 =A0 switch (opcode) > > +=A0 =A0 =A0 =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xd8: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_ST0_REGNUM)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 return -1;=A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 =A0 =A0 case > 0xd9:=A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (0x0c =3D=3D (ir.modrm >> 4)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if ((ir.modrm & 0x0f) <=3D 7) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if (i386_record_floats(&ir, > I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 return -1;=A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 else > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if (i386_record_floats(&ir, > I386_ST0_REGNUM)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 return -1;=A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 /* if only st(0) is changing, then we > have already recorded */ > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if ((ir.modrm & 0x0f) - 0x08) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 if (i386_record_floats(&ir, > I386_ST0_REGNUM + ((ir.modrm & 0x0f) - 0x08))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 return -1;=A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 }=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 }=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > else > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 switch(ir.modrm) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xe0: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xe1: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf0: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf5: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf8: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xfa: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xfc: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xfe: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xff: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if (i386_record_floats(&ir, > I386_ST0_REGNUM)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 break;=A0 =A0 =A0 =A0 > =A0=A0=A0 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf1:=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf2:=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf3:=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf4: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf6:=A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf7:=A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xe8:=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xe9:=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xea:=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xeb: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xec:=A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xed:=A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xee:=A0=A0=A0 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xf9:=A0 =A0=A0=A0 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xfb: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if (i386_record_floats(&ir, > I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 return -1;=A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 break; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 case 0xfd:=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if (i386_record_floats(&ir, > I386_ST0_REGNUM)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if (i386_record_floats(&ir, > I386_ST1_REGNUM)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 break; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 }=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xda: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (0xe9 =3D=3D ir.modrm) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > > +=A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 else > if ((0x0c =3D=3D ir.modrm >> 4) || (0x0d =3D=3D ir.modrm > >> 4)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(&ir, I386_ST0_REGNUM)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (((ir.modrm & 0x0f) > 0) && > ((ir.modrm & 0x0f) <=3D 7)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(&ir, > I386_ST0_REGNUM + (ir.modrm & 0x0f))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1;=A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 else if ((ir.modrm & 0x0f) - 0x08) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_ST0_REGNUM + ((ir.modrm > & 0x0f) - 0x08))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 }=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break;=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xdb: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (0xe3 =3D=3D ir.modrm) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > > +=A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_SAVE_FPU_ENV)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 else > if ((0x0c =3D=3D ir.modrm >> 4) || (0x0d =3D=3D ir.modrm > >> 4)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(&ir, I386_ST0_REGNUM)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (((ir.modrm & 0x0f) > 0) && > ((ir.modrm & 0x0f) <=3D 7)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(&ir, > I386_ST0_REGNUM + (ir.modrm & 0x0f))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1;=A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 else if ((ir.modrm & 0x0f) - 0x08) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_ST0_REGNUM + ((ir.modrm > & 0x0f) - 0x08))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 }=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xdc: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > ((0x0c =3D=3D ir.modrm >> 4) || (0x0d =3D=3D ir.modrm >> > 4) || (0x0f =3D=3D ir.modrm >> 4)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if ((ir.modrm & 0x0f) <=3D 7) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(&ir, > I386_ST0_REGNUM + (ir.modrm & 0x0f))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1;=A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 else > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(&ir, I386_ST0_REGNUM + ((ir.modrm > & 0x0f) - 0x08))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 }=A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0break; > > +=A0 =A0 =A0 =A0 =A0 =A0 case > 0xdd:=A0 =A0 =A0 =A0 =A0 =A0=A0=A0 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (0x0c =3D=3D ir.modrm >> 4) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(&ir,I386_FTAG)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 else > if ((0x0d =3D=3D ir.modrm >> 4) || (0x0e =3D=3D ir.modrm > >> 4)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 {=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if ((ir.modrm & 0x0f) <=3D 7) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 if (i386_record_floats(&ir, > I386_ST0_REGNUM + (ir.modrm & 0x0f))) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 return -1;=A0 > =A0=A0=A0 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 else > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 if (i386_record_floats(&ir, > I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 }=A0 =A0 =A0 =A0 =A0 =A0=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xde: > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > ((0x0c =3D=3D ir.modrm >> 4) || (0x0e =3D=3D ir.modrm >> > 4) || (0x0f =3D=3D ir.modrm >> 4) || (0xd9 =3D=3D ir.modrm)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 {=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0=A0=A0 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(&ir, > I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1;=A0 =A0=A0=A0 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 }=A0=A0=A0 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xdf: > > +=A0 =A0 =A0 =A0 =A0 if (0xe0 =3D=3D > ir.modrm) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (record_arch_list_add_reg (ir.regcache, > I386_EAX_REGNUM)) > > +=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 else > if ((0x0f =3D=3D ir.modrm >> 4) || (0x0e =3D=3D ir.modrm > >> 4)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 {=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(&ir, > I386_SAVE_FPU_REGS)) > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 }=20 > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break; > > +=A0 =A0 =A0 =A0 =A0 =A0 }=A0 > =A0 =A0=A0=A0 > > +=A0 =A0 =A0 =A0 }=A0 =A0 =A0 > =A0=A0=A0 > >=A0 =A0 =A0 =A0 break; > > - > >=A0 =A0 =A0 =A0 /* string ops */ > >=A0 =A0 =A0 =A0 /* movsS */ > >=A0 =A0 =A0 case 0xa4: > > @@ -4623,10 +4905,17 @@ > >=A0 =A0 =A0 =A0 /* fwait */ > >=A0 =A0 =A0 =A0 /* XXX */ > >=A0 =A0 =A0 case 0x9b: > > -=A0 =A0 =A0 printf_unfiltered (_("Process > record doesn't support instruction " > > -=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0"fwait.\n")); > > -=A0 =A0 =A0 ir.addr -=3D 1; > > -=A0 =A0 =A0 goto no_support; > > +=A0 =A0 =A0 if (target_read_memory (ir.addr, > &tmpu8, 1)) > > +=A0 =A0 { > > +=A0 =A0 =A0 if (record_debug) > > +=A0 =A0 =A0 =A0 printf_unfiltered > (_("Process record: error reading memory at " > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0"addr 0x%s len =3D 1.\n"), > > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0=A0=A0paddr_nz (ir.addr)); > > +=A0 =A0 =A0 return -1; > > +=A0 =A0 } > > +=A0 =A0 =A0 opcode =3D (uint32_t) tmpu8; > > +=A0 =A0 =A0 ir.addr++; > > +=A0 =A0 =A0 goto reswitch;=A0 > =A0=A0=A0 > >=A0 =A0 =A0 =A0 break; > >=20 > >=A0 =A0 =A0 =A0 /* int3 */ > > diff -urN gdb.orig/i386-tdep.h gdb.new/i386-tdep.h > > --- gdb.orig/i386-tdep.h=A0 =A0 2009-05-17 > 17:56:44.000000000 -0400 > > +++ gdb.new/i386-tdep.h=A0 =A0 2009-05-31 > 16:33:14.000000000 -0400 > > @@ -145,7 +145,22 @@ > >=A0 =A0 I386_ES_REGNUM,=A0 =A0 =A0 > =A0 /* %es */ > >=A0 =A0 I386_FS_REGNUM,=A0 =A0 =A0 > =A0 /* %fs */ > >=A0 =A0 I386_GS_REGNUM,=A0 =A0 =A0 > =A0 /* %gs */ > > -=A0 I386_ST0_REGNUM=A0 =A0 =A0 =A0 /* > %st(0) */ > > +=A0 I386_ST0_REGNUM,=A0 =A0 =A0 =A0 /* > %st(0) */ > > +=A0 I386_ST1_REGNUM,=A0 =A0 =A0 =A0 /* > %st(1) */ > > +=A0 I386_ST2_REGNUM,=A0 =A0 =A0 =A0 /* > %st(2) */ > > +=A0 I386_ST3_REGNUM,=A0 =A0 =A0 =A0 /* > %st(3) */ > > +=A0 I386_ST4_REGNUM,=A0 =A0 =A0 =A0 /* > %st(4) */ > > +=A0 I386_ST5_REGNUM,=A0 =A0 =A0 =A0 /* > %st(5) */ > > +=A0 I386_ST6_REGNUM,=A0 =A0 =A0 =A0 /* > %st(6) */ > > +=A0 I386_ST7_REGNUM,=A0 =A0 =A0 =A0 /* > %st(7) */ > > +=A0 I386_FCTRL,=A0 =A0 =A0 =A0 =A0 > =A0 /* floating point env regs : FCTRL-FOP */=A0 > =A0=20 > > +=A0 I386_FSTAT,=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0=A0=A0 > > +=A0 I386_FTAG,=A0 =A0 =A0 =A0 =A0 > =A0=20 > > +=A0 I386_FISEG, > > +=A0 I386_FIOFF, > > +=A0 I386_FOSEG, > > +=A0 I386_FOOFF, > > +=A0 I386_FOP > > }; >=20 > If you no longer need this, please remove this from your > diff. >=20