From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3414 invoked by alias); 5 Aug 2009 01:29:54 -0000 Received: (qmail 3399 invoked by uid 22791); 5 Aug 2009 01:29:51 -0000 X-SWARE-Spam-Status: No, hits=-1.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_41,J_CHICKENPOX_53,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-gx0-f222.google.com (HELO mail-gx0-f222.google.com) (209.85.217.222) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 05 Aug 2009 01:29:39 +0000 Received: by gxk22 with SMTP id 22so8697067gxk.0 for ; Tue, 04 Aug 2009 18:29:37 -0700 (PDT) MIME-Version: 1.0 Received: by 10.231.16.136 with SMTP id o8mr2603038iba.24.1249435777124; Tue, 04 Aug 2009 18:29:37 -0700 (PDT) In-Reply-To: <509767.4697.qm@web112517.mail.gq1.yahoo.com> References: <509767.4697.qm@web112517.mail.gq1.yahoo.com> From: Hui Zhu Date: Wed, 05 Aug 2009 01:29:00 -0000 Message-ID: Subject: Re: final i386.floating.record.patch To: paawan oza Cc: Michael Snyder , "gdb-patches@sourceware.org" Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes 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-08/txt/msg00065.txt.bz2 I think replay all register is better. Thanks, Hui On Wed, Aug 5, 2009 at 01:59, paawan oza wrote: > > Hi Hui, > > please find my analysis as follows. > > following are the registers which you may find it different. > > fstat > ftag > fiseg > fioff > foseg > fooff > fop > > In my opinion, we do not need to record all these registers. because thes= e registers are purly depends on instruction's execution status in FPU unit. > > > for e.g. > fop register stores te last opcode executed by x87 FPU unit. > fstat register may contain c0, c1, c2, c3 flag status... > > why we dont need to record, because even if we reply the recod... > Anyway these register are going to be change by FPU HW unit based on any = fp insn's nature and its execution. (next insn which FPU is going to execut= e) > > so it doesnt make much sense to store it, because even if we restore it, = FPU unit doesnt use them directly, but FPU HW sets them after executing cur= rent fp insn. so anyway they are going to reset as soon as FPU executes nex= t insn. > > but still if you feel that we must record those registers because user mi= ght want to observe those registers, then I can do that. > > please let me know you opinion about it. > > Regards, > Oza. > > --- On Tue, 8/4/09, Hui Zhu wrote: > >> From: Hui Zhu >> Subject: Re: final i386.floating.record.patch >> To: "paawan oza" >> Cc: "Michael Snyder" , "gdb-patches@sourceware.org" = >> Date: Tuesday, August 4, 2009, 8:13 PM >> ./gdb ./a.out >> GNU gdb (GDB) 6.8.50.20090804-cvs >> Copyright (C) 2009 Free Software Foundation, Inc. >> License GPLv3+: GNU GPL version 3 or later >> This is free software: you are free to change and >> redistribute it. >> There is NO WARRANTY, to the extent permitted by law. >> Type "show copying" >> and "show warranty" for details. >> This GDB was configured as "i686-pc-linux-gnu". >> For bug reporting instructions, please see: >> ... >> Setting up the environment for debugging gdb. >> Function "internal_error" not defined. >> Make breakpoint pending on future shared library load? (y >> or [n]) >> [answered N; input not from terminal] >> Function "info_command" not defined. >> Make breakpoint pending on future shared library load? (y >> or [n]) >> [answered N; input not from terminal] >> /home/teawater/gdb/rec/bgdbno/gdb/.gdbinit:8: Error in >> sourced command file: >> No breakpoint number 0. >> (gdb) start >> During symbol reading, DW_AT_name missing from >> DW_TAG_base_type. >> Temporary breakpoint 1 at 0x8048c74: file 1.c, line 197. >> Starting program: /home/teawater/gdb/rec/bgdbno/gdb/a.out >> >> Temporary breakpoint 1, main () at 1.c:197 >> 197=A0=A0=A0 =A0=A0=A0init_floats(); >> (gdb) record >> (gdb) info all-registers >> eax >> 0x1=A0=A0=A0 1 >> ecx >> 0xbffff780=A0=A0=A0 -1073744000 >> edx >> 0xbffff7a0=A0=A0=A0 -1073743968 >> ebx >> 0xb7f9eff4=A0=A0=A0 -1208356876 >> esp >> 0xbffff760=A0=A0=A0 0xbffff760 >> ebp >> 0xbffff768=A0=A0=A0 0xbffff768 >> esi >> 0xb7ffece0=A0=A0=A0 -1207964448 >> edi >> 0x0=A0=A0=A0 0 >> eip >> 0x8048c74=A0=A0=A0 0x8048c74 >> eflags >> =A0=A0=A00x200286=A0=A0=A0 [ PF SF IF ID >> ] >> cs >> =A0=A0=A00x73=A0=A0=A0 115 >> ss >> =A0=A0=A00x7b=A0=A0=A0 123 >> ds >> =A0=A0=A00x7b=A0=A0=A0 123 >> es >> =A0=A0=A00x7b=A0=A0=A0 123 >> fs >> =A0=A0=A00x0=A0=A0=A0 0 >> gs >> =A0=A0=A00x33=A0=A0=A0 51 >> st0 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st1 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st2 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st3 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st4 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st5 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st6 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st7 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> fctrl >> 0x37f=A0=A0=A0 895 >> fstat >> 0x0=A0=A0=A0 0 >> ftag >> =A0=A0=A00xffff=A0=A0=A0 65535 >> fiseg >> 0x0=A0=A0=A0 0 >> fioff >> 0x0=A0=A0=A0 0 >> foseg >> 0x0=A0=A0=A0 0 >> fooff >> 0x0=A0=A0=A0 0 >> fop >> 0x0=A0=A0=A0 0 >> xmm0=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm1=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> ---Type to continue, or q to >> quit--- >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm2=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm3=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm4=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm5=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm6=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm7=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> mxcsr >> 0x1f80=A0=A0=A0 [ IM DM ZM OM UM PM ] >> mm0=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm1=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm2=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm3=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm4=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm5=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm6=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm7=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> (gdb) >> (gdb) c >> Continuing. >> result is 369.438751 >> result is 10.320001 >> result is 23.008301 >> result is 0.000000 >> result is 10.450000 >> result is 10.776012 >> result is 495830.968750 >> result is -181.778748 >> result is 12.525923 >> result is 2.195619 >> result is 5.055601 >> result is inf >> result is inf >> result is -0.988032 >> result is 0.154251 >> result is -6.405331 >> result is 1.537475 >> The next instruction is syscall exit_group.=A0 It will >> make the program >> exit.=A0 Do you want to stop the program?([y] or n) >> Process record: inferior program stopped. >> >> Program received signal SIGTRAP, Trace/breakpoint trap. >> 0xb7fe3405 in __kernel_vsyscall () >> (gdb) rc >> Continuing. >> >> No more reverse-execution history. >> main () at 1.c:197 >> 197=A0=A0=A0 =A0=A0=A0init_floats(); >> (gdb) info all-registers >> eax >> 0x1=A0=A0=A0 1 >> ecx >> 0xbffff780=A0=A0=A0 -1073744000 >> edx >> 0xbffff7a0=A0=A0=A0 -1073743968 >> ebx >> 0xb7f9eff4=A0=A0=A0 -1208356876 >> esp >> 0xbffff760=A0=A0=A0 0xbffff760 >> ebp >> 0xbffff768=A0=A0=A0 0xbffff768 >> esi >> 0xb7ffece0=A0=A0=A0 -1207964448 >> edi >> 0x0=A0=A0=A0 0 >> eip >> 0x8048c74=A0=A0=A0 0x8048c74 >> eflags >> =A0=A0=A00x200286=A0=A0=A0 [ PF SF IF ID >> ] >> cs >> =A0=A0=A00x73=A0=A0=A0 115 >> ss >> =A0=A0=A00x7b=A0=A0=A0 123 >> ds >> =A0=A0=A00x7b=A0=A0=A0 123 >> es >> =A0=A0=A00x7b=A0=A0=A0 123 >> fs >> =A0=A0=A00x0=A0=A0=A0 0 >> gs >> =A0=A0=A00x33=A0=A0=A0 51 >> st0 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st1 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st2 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st3 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st4 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st5 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st6 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> st7 >> 0=A0=A0=A0 (raw 0x00000000000000000000) >> fctrl >> 0x37f=A0=A0=A0 895 >> fstat >> 0x6069=A0=A0=A0 24681 >> ftag >> =A0=A0=A00x13f=A0=A0=A0 319 >> fiseg >> 0x73=A0=A0=A0 115 >> fioff >> 0x8048bfd=A0=A0=A0 134515709 >> foseg >> 0x7b=A0=A0=A0 123 >> fooff >> 0x0=A0=A0=A0 0 >> fop >> 0x2e9=A0=A0=A0 745 >> xmm0=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm1=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> ---Type to continue, or q to >> quit--- >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm2=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm3=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm4=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm5=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm6=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> xmm7=A0 =A0 =A0 =A0 =A0=A0=A0{v4_float >> =3D {0x0, 0x0, 0x0, 0x0}, v2_double =3D {0x0, >> 0x0}, v16_int8 =3D {0x0 }, v8_int16 =3D >> {0x0, 0x0, 0x0, >> =A0 =A0 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 =3D {0x0, >> 0x0, 0x0, 0x0}, >> v2_int64 =3D {0x0, 0x0}, uint128 =3D >> 0x00000000000000000000000000000000} >> mxcsr >> 0x1f80=A0=A0=A0 [ IM DM ZM OM UM PM ] >> mm0=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm1=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm2=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm3=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm4=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm5=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm6=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> mm7=A0 =A0 =A0 =A0 =A0 =A0 {uint64 =3D 0x0, >> v2_int32 =3D {0x0, 0x0}, v4_int16 =3D {0x0, >> 0x0, 0x0, 0x0}, v8_int8 =3D {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, >> 0x0, 0x0}} >> (gdb) >> >> >> On Tue, Aug 4, 2009 at 22:25, paawan oza >> wrote: >> > >> > Hi Hui, >> > >> > tested following line. >> > line 54: >> > result =3D fmodf(no2,no1); >> > >> > please see the log below. all registers are same. >> > >> > >> ****************************************************************** >> > (gdb) n >> > 52 =A0 =A0 =A0 =A0printf("result is %f\n",result); >> > (gdb) n >> > result is 369.438751 >> > 54 =A0 =A0 =A0 =A0result =3D fmodf(no2,no1); >> > (gdb) info all-registers >> > st0 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st1 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st2 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st3 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st4 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st5 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st6 =A0 =A0 =A0 =A0 =A0 =A088.87999725341796875 =A0 =A0 (raw >> 0x4005b1c28f0000000000) >> > st7 =A0 =A0 =A0 =A0 =A0 =A0369.438751220703125 =A0 =A0 =A0(raw >> 0x4007b8b8290000000000) >> > fctrl =A0 =A0 =A0 =A0 =A00x37f =A0 =A0895 >> > fstat =A0 =A0 =A0 =A0 =A00x20 =A0 =A0 32 >> > ftag =A0 =A0 =A0 =A0 =A0 0xffff =A0 65535 >> > fiseg =A0 =A0 =A0 =A0 =A00x73 =A0 =A0 115 >> > fioff =A0 =A0 =A0 =A0 =A00xb7eccd27 =A0 =A0 =A0 -1209217753 >> > foseg =A0 =A0 =A0 =A0 =A00x7b =A0 =A0 123 >> > fooff =A0 =A0 =A0 =A0 =A00xbfffc0d4 =A0 =A0 =A0 -1073757996 >> > fop =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 >> > (gdb) n >> > 55 =A0 =A0 =A0 =A0printf("result is %f\n",result); >> > (gdb) >> > result is 10.320001 >> > 57 =A0 =A0 =A0 =A0resultd =3D fmod(x,y); >> > (gdb) reverse-next >> > 55 =A0 =A0 =A0 =A0printf("result is %f\n",result); >> > (gdb) >> > 54 =A0 =A0 =A0 =A0result =3D fmodf(no2,no1); >> > (gdb) >> > 52 =A0 =A0 =A0 =A0printf("result is %f\n",result); >> > (gdb) info all-registers >> > st0 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st1 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st2 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st3 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st4 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st5 =A0 =A0 =A0 =A0 =A0 =A00 =A0 =A0 =A0 =A0(raw >> 0x00000000000000000000) >> > st6 =A0 =A0 =A0 =A0 =A0 =A088.87999725341796875 =A0 =A0 (raw >> 0x4005b1c28f0000000000) >> > st7 =A0 =A0 =A0 =A0 =A0 =A0369.43873691558837890625 (raw >> 0x4007b8b8288800000000) >> > fctrl =A0 =A0 =A0 =A0 =A00x37f =A0 =A0895 >> > fstat =A0 =A0 =A0 =A0 =A00x20 =A0 =A0 32 >> > ftag =A0 =A0 =A0 =A0 =A0 0xffff =A0 65535 >> > fiseg =A0 =A0 =A0 =A0 =A00x73 =A0 =A0 115 >> > fioff =A0 =A0 =A0 =A0 =A00xb7eccd27 =A0 =A0 =A0 -1209217753 >> > foseg =A0 =A0 =A0 =A0 =A00x7b =A0 =A0 123 >> > fooff =A0 =A0 =A0 =A0 =A00xbfffc0d4 =A0 =A0 =A0 -1073757996 >> > fop =A0 =A0 =A0 =A0 =A0 =A00x0 =A0 =A0 =A00 >> > (gdb) >> > >> ****************************************************************** >> > >> > --- On Tue, 8/4/09, Hui Zhu >> wrote: >> > >> >> From: Hui Zhu >> >> Subject: Re: final i386.floating.record.patch >> >> To: "paawan oza" >> >> Cc: "Michael Snyder" , >> "gdb-patches@sourceware.org" >> >> >> Date: Tuesday, August 4, 2009, 7:28 PM >> >> I think you can do it with youself. >> >> >> >> Hui >> >> >> >> On Tue, Aug 4, 2009 at 21:05, paawan oza >> >> wrote: >> >> > >> >> > Hi, >> >> > >> >> > As I understand you have tried to run the >> example test >> >> code which I had sent earlier. >> >> > >> >> > please let me know at which c statement (or >> insn) it >> >> is causing this ? >> >> > So I can dig into it more. >> >> > >> >> > Thanks & Regards, >> >> > Oza. >> >> > >> >> > >> >> > --- On Tue, 8/4/09, paawan oza >> >> wrote: >> >> > >> >> >> From: paawan oza >> >> >> Subject: Re: final >> i386.floating.record.patch >> >> >> To: "Hui Zhu" >> >> >> Cc: "Michael Snyder" , >> >> "gdb-patches@sourceware.org" >> >> >> >> >> Date: Tuesday, August 4, 2009, 6:32 PM >> >> >> Hi Hui, >> >> >> I am not sure which test case (insn) >> caused >> >> this. >> >> >> would you please send me the example (.c >> file) >> >> which you >> >> >> have tried to run ? >> >> >> please also try to let me know at which >> insn (at >> >> which >> >> >> point it fails). >> >> >> Regards, >> >> >> Oza. >> >> >> >> >> >> --- On Tue, 8/4/09, Hui Zhu >> >> >> wrote: >> >> >> >> >> >> > From: Hui Zhu >> >> >> > Subject: Re: final >> >> i386.floating.record.patch >> >> >> > To: "paawan oza" >> >> >> > Cc: "Michael Snyder" , >> >> >> "gdb-patches@sourceware.org" >> >> >> >> >> >> > Date: Tuesday, August 4, 2009, 8:49 >> AM >> >> >> > Hi Paawan, >> >> >> > >> >> >> > Thanks for your work. >> >> >> > >> >> >> > I do a some test works with the test >> code >> >> that you >> >> >> sent in >> >> >> > before. >> >> >> > I get the values of fp reg with >> command >> >> "info >> >> >> > all-registers". >> >> >> > >> >> >> > It looks like some fp reg's values >> not right >> >> in >> >> >> replay >> >> >> > mode. >> >> >> > >> >> >> > In record mode they are: >> >> >> > fctrl >> >> >> > 0x37f=A0=A0=A0 895 >> >> >> > fstat >> >> >> > 0x0=A0=A0=A0 0 >> >> >> > ftag >> >> >> > =A0=A0=A00xffff=A0=A0=A0 65535 >> >> >> > fiseg >> >> >> > 0x0=A0=A0=A0 0 >> >> >> > fioff >> >> >> > 0x0=A0=A0=A0 0 >> >> >> > ---Type to continue, >> or q >> >> >> to >> >> >> > quit--- >> >> >> > foseg >> >> >> > 0x0=A0=A0=A0 0 >> >> >> > fooff >> >> >> > 0x0=A0=A0=A0 0 >> >> >> > fop >> >> >> > 0x0=A0=A0=A0 0 >> >> >> > >> >> >> > In replay mode they are: >> >> >> > fctrl >> >> >> > 0x37f=A0=A0=A0 895 >> >> >> > fstat >> >> >> > 0x6069=A0=A0=A0 24681 >> >> >> > ftag >> >> >> > =A0=A0=A00x557f=A0=A0=A0 21887 >> >> >> > fiseg >> >> >> > 0x73=A0=A0=A0 115 >> >> >> > fioff >> >> >> > 0x8048bfd=A0=A0=A0 134515709 >> >> >> > ---Type to continue, >> or q >> >> >> to >> >> >> > quit--- >> >> >> > foseg >> >> >> > 0x7b=A0=A0=A0 123 >> >> >> > fooff >> >> >> > 0x0=A0=A0=A0 0 >> >> >> > fop >> >> >> > 0x2e9=A0=A0=A0 745 >> >> >> > >> >> >> > >> >> >> > >> >> >> > Thanks, >> >> >> > Hui >> >> >> > >> >> >> > >> >> >> > #include >> >> >> > #include >> >> >> > #include >> >> >> > >> >> >> > /* the test intends to test >> following insns. >> >> >> > 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 >> >> >> > */ >> >> >> > >> >> >> > 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; >> >> >> > float *float_memory; >> >> >> > >> >> >> > /* initialization of floats */ >> >> >> > void init_floats() >> >> >> > { >> >> >> >=A0 no1 =3D 10.45; >> >> >> >=A0 no2 =3D 20.77; >> >> >> >=A0 no3 =3D 156.89874646; >> >> >> >=A0 no4 =3D 14.56; >> >> >> >=A0 no5 =3D 11.11; >> >> >> >=A0 no6 =3D 66.77; >> >> >> >=A0 no7 =3D 88.88; >> >> >> >=A0 float_memory =3D >> malloc(sizeof(float) * 4); >> >> >> >=A0 *float_memory =3D 256.256; >> >> >> >=A0 *(float_memory + 1) =3D 356.356; >> >> >> >=A0 *(float_memory + 2) =3D 456.456; >> >> >> >=A0 *(float_memory + 3) =3D 556.556; >> >> >> > } >> >> >> > >> >> >> > /* marks FPU stack as empty */ >> >> >> > void empty_fpu_stack() >> >> >> > { >> >> >> >=A0 asm ("ffree %st(1) \n\t" >> >> >> > =A0 =A0 =A0 "ffree %st(2) \n\t" >> >> >> > =A0 =A0 =A0 "ffree %st(3) \n\t" >> >> >> > =A0 =A0 =A0 "ffree %st(4) \n\t" >> >> >> > =A0 =A0 =A0 "ffree %st(5) \n\t" >> >> >> > =A0 =A0 =A0 "ffree %st(6) \n\t" >> >> >> > =A0 =A0 =A0 "ffree %st(7)"); >> >> >> > } >> >> >> > >> >> >> > /* tests floating point arithmatic >> */ >> >> >> > void test_arith_floats() >> >> >> > { >> >> >> >=A0 result =3D no1 + no2 + no3 + no4 + >> no5 + no6 >> >> + >> >> >> no7; >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D fmodf(no2,no1); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 resultd =3D fmod(x,y); >> >> >> >=A0 printf("result is %f\n",resultd); >> >> >> > >> >> >> >=A0 resultld =3D fmodl(ldy,ldy); >> >> >> >=A0 printf("result is >> %f\n",resultld); >> >> >> > >> >> >> >=A0 result =3D fabsf(no1); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D no3 / no4; >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D no1 * no2 * no3 * no4; >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D no1 - no2 - no3 - no4; >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> > >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> >=A0 asm ("fchs"); >> >> >> > >> >> >> >=A0 /* test for f2xm1 */ >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> >=A0 asm ("f2xm1"); >> >> >> > >> >> >> >=A0 asm ("fyl2x"); >> >> >> > >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> >=A0 asm ("fxtract"); >> >> >> > >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> >=A0 asm ("fprem1"); >> >> >> > >> >> >> >=A0 /* decrement fpu stack pointer >> only status >> >> >> register should >> >> >> > get affected */ >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> > >> >> >> >=A0 empty_fpu_stack(); >> >> >> > >> >> >> >=A0 asm ("fld1"); >> >> >> >=A0 asm ("fldl2t"); >> >> >> >=A0 asm ("fldl2e"); >> >> >> >=A0 asm ("fldpi"); >> >> >> >=A0 asm ("fldlg2"); >> >> >> >=A0 asm ("fldln2"); >> >> >> >=A0 asm ("fldz"); >> >> >> > >> >> >> >=A0 empty_fpu_stack(); >> >> >> >=A0 /* finishing emptying the stack >> */ >> >> >> > >> >> >> >=A0 result =3D sqrt(no3); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > } >> >> >> > >> >> >> > void test_log_exp_floats() >> >> >> > { >> >> >> >=A0 result =3D log10(no3); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D log(no3); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D exp10(no3); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D exp(no3); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > } >> >> >> > >> >> >> > void test_trigo_floats() >> >> >> > { >> >> >> >=A0 result =3D sin(30); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D cos(30); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D tan(30); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 result =3D atan(30); >> >> >> >=A0 printf("result is %f\n",result); >> >> >> > >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> >=A0 asm ("fptan"); >> >> >> > >> >> >> >=A0 /* changes st1 and popping >> register stack >> >> */ >> >> >> >=A0 asm ("fpatan"); >> >> >> > >> >> >> >=A0 asm("fincstp"); >> >> >> >=A0 asm ("fld %0" : >> :"m"(float_memory)); >> >> >> >=A0 asm ("fsincos"); >> >> >> > >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> >=A0 asm ("frndint"); >> >> >> > >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> >=A0 asm ("fld %0" : >> :"m"(*(float_memory+1))); >> >> >> >=A0 asm ("fscale"); >> >> >> > >> >> >> >=A0 empty_fpu_stack(); >> >> >> > >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> >=A0 asm ("fsin"); >> >> >> >=A0 asm ("fcos"); >> >> >> > >> >> >> >=A0 /* currently we assume condition >> likely >> >> and >> >> >> always record >> >> >> > the registers >> >> >> >=A0 code could be optimized only if >> the flag is >> >> set >> >> >> then >> >> >> > record */ >> >> >> >=A0 asm ("fld %0" : >> :"m"(*float_memory)); >> >> >> >=A0 asm ("fld %0" : >> :"m"(*(float_memory+1))); >> >> >> >=A0 asm ("fcmovb %st(1), %st"); >> >> >> >=A0 asm ("fcmovbe %st(1), %st"); >> >> >> >=A0 asm ("fcmove %st(1), %st"); >> >> >> >=A0 asm ("fcmovu %st(1), %st"); >> >> >> >=A0 asm ("fcmovnb %st(1), %st"); >> >> >> >=A0 asm ("fcmovnbe %st(1), %st"); >> >> >> > >> >> >> >=A0 empty_fpu_stack(); >> >> >> >=A0 /* finished emtyping the stack */ >> >> >> > } >> >> >> > >> >> >> > void test_compare_floats() >> >> >> > { >> >> >> > =A0=A0=A0ldy =3D >> 88888888888888888888.88; >> >> >> > =A0=A0=A0if (ldx =3D=3D ldy) >> >> >> > =A0 =A0=A0=A0ldy =3D >> >> >> > 7777777777777777777777777777.777; >> >> >> > =A0=A0=A0else >> >> >> > =A0 =A0=A0=A0ldy =3D >> >> >> > 666666666666666666666666666.666; >> >> >> > } >> >> >> > >> >> >> > /* test loading and saving of FPU >> environment >> >> */ >> >> >> > void test_fpu_env() >> >> >> > { >> >> >> >=A0 asm ("fsave %0" : >> "=3Dm"(*float_memory) : ); >> >> >> >=A0 asm ("frstor %0" : : >> "m"(*float_memory)); >> >> >> >=A0 asm ("fstsw %ax"); >> >> >> > } >> >> >> > >> >> >> > int main() >> >> >> > { >> >> >> > =A0=A0=A0init_floats(); >> >> >> > =A0=A0=A0test_arith_floats(); >> >> >> > =A0=A0=A0test_log_exp_floats(); >> >> >> > =A0=A0=A0test_trigo_floats(); >> >> >> > =A0=A0=A0test_compare_floats(); >> >> >> > =A0=A0=A0test_fpu_env(); >> >> >> > } >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > On Mon, Aug 3, 2009 at 22:56, >> paawan >> >> oza >> >> >> > wrote: >> >> >> > > Hi, >> >> >> > > >> >> >> > > please find the patch attached. >> I have >> >> attached >> >> >> as per >> >> >> > your suggestion. >> >> >> > > I am attaching it from opera >> browser. >> >> >> > > >> >> >> > > Regards, >> >> >> > > Oza. >> >> >> > > >> >> >> > > --- On Thu, 7/30/09, Michael >> Snyder >> >> >> >> >> > wrote: >> >> >> > > >> >> >> > >> From: Michael Snyder >> >> >> > >> Subject: Re: final >> >> >> i386.floating.record.patch >> >> >> > >> To: "paawan oza" >> >> >> > >> Cc: "gdb-patches@sourceware.org" >> >> >> > >> >> >> > >> Date: Thursday, July 30, >> 2009, 11:31 >> >> PM >> >> >> > >> paawan oza wrote: >> >> >> > >> > Hi, >> >> >> > >> > >> >> >> > >> > please find my answers >> below. >> >> >> > >> > >> >> >> > >> >=A0 1) Are you using a >> Windows >> >> machine to >> >> >> send >> >> >> > your >> >> >> > >> >=A0 emails?=A0 If so, >> >> >> > >> >=A0 is it possible that >> there is >> >> a >> >> >> Unix/Linux >> >> >> > >> machine you could >> >> >> > >> >=A0 try >> >> >> > >> >=A0 sending from? >> Your >> >> attachments look >> >> >> OK >> >> >> > for >> >> >> > >> me, but >> >> >> > >> >=A0 some people >> >> >> > >> >=A0 seem to have had >> problems >> >> with them. >> >> >> > >> > >> >> >> > >> > Oza : I used to send >> all from >> >> windows >> >> >> till >> >> >> > now. >> >> >> > >> > but this patch I sent >> it from >> >> >> Linux...from >> >> >> > opera. >> >> >> > >> >=A0=A0=A02) And are you >> using >> >> cut-and-paste >> >> >> to >> >> >> > >> insert the patches >> >> >> > >> >=A0 into the >> >> >> > >> >=A0 body of your >> email?=A0 That >> >> would >> >> >> certainly >> >> >> > >> cause >> >> >> > >> >=A0 problems, because >> >> >> > >> >=A0 tabs might be >> changed into >> >> spaces >> >> >> (which >> >> >> > is >> >> >> > >> exactly what >> >> >> > >> >=A0 was >> >> >> > >> >=A0 causing patch to >> fail for me >> >> today). >> >> >> > >> >=A0 Oza: yes I am using >> >> copy-paste....I >> >> >> dont >> >> >> > know >> >> >> > >> any-other way. >> >> >> > >> > because attachmenet >> are not >> >> welcome, so >> >> >> I am >> >> >> > not sure >> >> >> > >> how I could proceed with >> this. >> >> >> > >> >> >> >> > >> It's not that attachments >> are not >> >> welcome. >> >> >> > >> There are various binary >> encodings >> >> for >> >> >> > attachments, and >> >> >> > >> some of those binary >> encodings are >> >> not >> >> >> welcome. >> >> >> > I >> >> >> > >> think >> >> >> > >> because there's no >> open-source way >> >> of >> >> >> decoding >> >> >> > them. >> >> >> > >> >> >> >> > >> If you look at the list, >> you'll see >> >> that >> >> >> > attachments are >> >> >> > >> used a lot. >> >> >> > >> >> >> >> > >> Copy-and-paste, though, in >> general >> >> will not >> >> >> work, >> >> >> > because >> >> >> > >> it >> >> >> > >> usually changes tabs into >> spaces, >> >> which ruins >> >> >> a >> >> >> > patch. >> >> >> > >> >> >> >> > >> >> >> >> > >> > I will send you >> updated >> >> patch.....may be >> >> >> I >> >> >> > might have >> >> >> > >> mistaken of old gdb file. >> sorry for >> >> >> incovenience. >> >> >> > >> >> >> >> > >> I think it was just the >> >> tabs-to-spaces >> >> >> issue. >> >> >> > >> Why don't you try sending >> an >> >> attachment from >> >> >> > Opera? >> >> >> > >> >> >> >> > >> >> >> >> > > >> >> >> > > >> >> >> > > >> >> >> > >> >> >> >> >> >> >> >> >> >> >> >> >> >> > >> >> > >> >> > >> >> > >> >> >> > >> > >> > >> > >> > > > >