public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Mark Kettenis <mark.kettenis@xs4all.nl>
To: hjl.tools@gmail.com
Cc: gdb-patches@sourceware.org
Subject: Re: PATCH: 5/6 [2nd try]: Add AVX support (i387 changes)
Date: Sat, 27 Mar 2010 15:08:00 -0000	[thread overview]
Message-ID: <201003271508.o2RF80I7030511@glazunov.sibelius.xs4all.nl> (raw)
In-Reply-To: <20100306222212.GF21133@intel.com> (hongjiu.lu@intel.com)

> Date: Sat, 6 Mar 2010 14:22:12 -0800
> From: "H.J. Lu" <hongjiu.lu@intel.com>
> 
> Hi,
> 
> Here are i387 changes to support AVX.  OK to install?

I can't help thinking that the i387_supply_xsave/i387_collect_xsave
functions can be written in a simpler way, but I guess for now this is
acceptable.  Hope you don't mind if a I rewrite that logic at some
point though.

> H.J.
> ---
> 2010-03-06  H.J. Lu  <hongjiu.lu@intel.com>
> 
> 	* i387-tdep.c: Include "i386-xstate.h".
> 	(XSAVE_XSTATE_BV_ADDR): New.
> 	(xsave_avxh_offset): Likewise.
> 	(XSAVE_AVXH_ADDR): Likewise.
> 	(i387_supply_xsave): Likewise.
> 	(i387_collect_xsave): Likewise.
> 
> 	* i387-tdep.h (I387_NUM_YMM_REGS): New.
> 	(I387_YMM0H_REGNUM): Likewise.
> 	(I387_YMMENDH_REGNUM): Likewise.
> 	(i387_supply_xsave): Likewise.
> 	(i387_collect_xsave): Likewise.
> 
> diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
> index 3fb5b56..197af7f 100644
> --- a/gdb/i387-tdep.c
> +++ b/gdb/i387-tdep.c
> @@ -34,6 +34,7 @@
>  
>  #include "i386-tdep.h"
>  #include "i387-tdep.h"
> +#include "i386-xstate.h"
>  
>  /* Print the floating point number specified by RAW.  */
>  
> @@ -677,6 +678,518 @@ i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
>  			  FXSAVE_MXCSR_ADDR (regs));
>  }
>  
> +/* `xstate_bv' is at byte offset 512.  */
> +#define XSAVE_XSTATE_BV_ADDR(xsave) (xsave + 512)
> +
> +/* At xsave_avxh_offset[REGNUM] you'll find the offset to the location in
> +   the upper 128bit of AVX register data structure used by the "xsave"
> +   instruction where GDB register REGNUM is stored.  */
> +
> +static int xsave_avxh_offset[] =
> +{
> +  576 + 0 * 16,		/* Upper 128bit of %ymm0 through ...  */
> +  576 + 1 * 16,
> +  576 + 2 * 16,
> +  576 + 3 * 16,
> +  576 + 4 * 16,
> +  576 + 5 * 16,
> +  576 + 6 * 16,
> +  576 + 7 * 16,
> +  576 + 8 * 16,
> +  576 + 9 * 16,
> +  576 + 10 * 16,
> +  576 + 11 * 16,
> +  576 + 12 * 16,
> +  576 + 13 * 16,
> +  576 + 14 * 16,
> +  576 + 15 * 16		/* Upper 128bit of ... %ymm15 (128 bits each).  */
> +};
> +
> +#define XSAVE_AVXH_ADDR(tdep, xsave, regnum) \
> +  (xsave + xsave_avxh_offset[regnum - I387_YMM0H_REGNUM (tdep)])
> +
> +/* Similar to i387_supply_fxsave, but use XSAVE extended state.  */
> +
> +void
> +i387_supply_xsave (struct regcache *regcache, int regnum,
> +		   const void *xsave)
> +{
> +  struct gdbarch_tdep *tdep = gdbarch_tdep (get_regcache_arch (regcache));
> +  const gdb_byte *regs = xsave;
> +  int i;
> +  unsigned int clear_bv;
> +  const gdb_byte *p;
> +  enum
> +    {
> +      none = 0x0,
> +      x87 = 0x1,
> +      sse = 0x2,
> +      avxh = 0x4,
> +      all = x87 | sse | avxh
> +    } regclass;
> +
> +  gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
> +  gdb_assert (tdep->num_xmm_regs > 0);
> +
> +  if (regnum == -1)
> +    regclass = all;
> +  else if (regnum >= I387_YMM0H_REGNUM (tdep)
> +	   && regnum < I387_YMMENDH_REGNUM (tdep))
> +    regclass = avxh;
> +  else if (regnum >= I387_XMM0_REGNUM(tdep)
> +	   && regnum < I387_MXCSR_REGNUM (tdep))
> +    regclass = sse;
> +  else if (regnum >= I387_ST0_REGNUM (tdep)
> +	   && regnum < I387_FCTRL_REGNUM (tdep))
> +    regclass = x87;
> +  else
> +    regclass = none;
> +
> +  if (regs != NULL && regclass != none)
> +    {
> +      /* Get `xstat_bv'.  */
> +      const gdb_byte *xstate_bv_p = XSAVE_XSTATE_BV_ADDR (regs);
> +
> +      /* The supported bits in `xstat_bv' are 1 byte.  Clear part in
> +	 vector registers if its bit in xstat_bv is zero.  */
> +      clear_bv = (~(*xstate_bv_p)) & tdep->xcr0;
> +    }
> +  else
> +    clear_bv = I386_XSTATE_MAX_MASK;
> +
> +  switch (regclass)
> +    {
> +    case none:
> +      break;
> +
> +    case avxh:
> +      if ((clear_bv & bit_I386_XSTATE_AVX))
> +	p = NULL;
> +      else
> +	p = XSAVE_AVXH_ADDR (tdep, regs, regnum);
> +      regcache_raw_supply (regcache, regnum, p);
> +      return;
> +
> +    case sse:
> +      if ((clear_bv & bit_I386_XSTATE_SSE))
> +	p = NULL;
> +      else
> +	p = FXSAVE_ADDR (tdep, regs, regnum);
> +      regcache_raw_supply (regcache, regnum, p);
> +      return;
> +
> +    case x87:
> +      if ((clear_bv & bit_I386_XSTATE_X87))
> +	p = NULL;
> +      else
> +	p = FXSAVE_ADDR (tdep, regs, regnum);
> +      regcache_raw_supply (regcache, regnum, p);
> +      return;
> +
> +    case all:
> +      /* Hanle the upper YMM registers.  */
> +      if ((tdep->xcr0 & bit_I386_XSTATE_AVX))
> +	{
> +	  if ((clear_bv & bit_I386_XSTATE_AVX))
> +	    p = NULL;
> +	  else
> +	    p = regs;
> +
> +	  for (i = I387_YMM0H_REGNUM (tdep);
> +	       i < I387_YMMENDH_REGNUM (tdep); i++)
> +	    {
> +	      if (p != NULL)
> +		p = XSAVE_AVXH_ADDR (tdep, regs, i);
> +	      regcache_raw_supply (regcache, i, p);
> +	    }
> +	}
> +
> +      /* Handle the XMM registers.  */
> +      if ((tdep->xcr0 & bit_I386_XSTATE_SSE))
> +	{
> +	  if ((clear_bv & bit_I386_XSTATE_SSE))
> +	    p = NULL;
> +	  else
> +	    p = regs;
> +
> +	  for (i = I387_XMM0_REGNUM (tdep);
> +	       i < I387_MXCSR_REGNUM (tdep); i++)
> +	    {
> +	      if (p != NULL)
> +		p = FXSAVE_ADDR (tdep, regs, i);
> +	      regcache_raw_supply (regcache, i, p);
> +	    }
> +	}
> +
> +      /* Handle the x87 registers.  */
> +      if ((tdep->xcr0 & bit_I386_XSTATE_X87))
> +	{
> +	  if ((clear_bv & bit_I386_XSTATE_X87))
> +	    p = NULL;
> +	  else
> +	    p = regs;
> +
> +	  for (i = I387_ST0_REGNUM (tdep);
> +	       i < I387_FCTRL_REGNUM (tdep); i++)
> +	    {
> +	      if (p != NULL)
> +		p = FXSAVE_ADDR (tdep, regs, i);
> +	      regcache_raw_supply (regcache, i, p);
> +	    }
> +	}
> +      break;
> +    }
> +
> +  /* Only handle x87 control registers.  */
> +  for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
> +    if (regnum == -1 || regnum == i)
> +      {
> +	if (regs == NULL)
> +	  {
> +	    regcache_raw_supply (regcache, i, NULL);
> +	    continue;
> +	  }
> +
> +	/* Most of the FPU control registers occupy only 16 bits in
> +	   the xsave extended state.  Give those a special treatment.  */
> +	if (i != I387_FIOFF_REGNUM (tdep)
> +	    && i != I387_FOOFF_REGNUM (tdep))
> +	  {
> +	    gdb_byte val[4];
> +
> +	    memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
> +	    val[2] = val[3] = 0;
> +	    if (i == I387_FOP_REGNUM (tdep))
> +	      val[1] &= ((1 << 3) - 1);
> +	    else if (i== I387_FTAG_REGNUM (tdep))
> +	      {
> +		/* The fxsave area contains a simplified version of
> +		   the tag word.  We have to look at the actual 80-bit
> +		   FP data to recreate the traditional i387 tag word.  */
> +
> +		unsigned long ftag = 0;
> +		int fpreg;
> +		int top;
> +
> +		top = ((FXSAVE_ADDR (tdep, regs,
> +				     I387_FSTAT_REGNUM (tdep)))[1] >> 3);
> +		top &= 0x7;
> +
> +		for (fpreg = 7; fpreg >= 0; fpreg--)
> +		  {
> +		    int tag;
> +
> +		    if (val[0] & (1 << fpreg))
> +		      {
> +			int regnum = (fpreg + 8 - top) % 8 
> +				       + I387_ST0_REGNUM (tdep);
> +			tag = i387_tag (FXSAVE_ADDR (tdep, regs, regnum));
> +		      }
> +		    else
> +		      tag = 3;		/* Empty */
> +
> +		    ftag |= tag << (2 * fpreg);
> +		  }
> +		val[0] = ftag & 0xff;
> +		val[1] = (ftag >> 8) & 0xff;
> +	      }
> +	    regcache_raw_supply (regcache, i, val);
> +	  }
> +	else 
> +	  regcache_raw_supply (regcache, i, FXSAVE_ADDR (tdep, regs, i));
> +      }
> +
> +  if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
> +    {
> +      p = regs == NULL ? NULL : FXSAVE_MXCSR_ADDR (regs);
> +      regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), p);
> +    }
> +}
> +
> +/* Similar to i387_collect_fxsave, but use XSAVE extended state.  */
> +
> +void
> +i387_collect_xsave (const struct regcache *regcache, int regnum,
> +		    void *xsave, int gcore)
> +{
> +  struct gdbarch_tdep *tdep = gdbarch_tdep (get_regcache_arch (regcache));
> +  gdb_byte *regs = xsave;
> +  int i;
> +  enum
> +    {
> +      none = 0x0,
> +      check = 0x1,
> +      x87 = 0x2 | check,
> +      sse = 0x4 | check,
> +      avxh = 0x8 | check,
> +      all = x87 | sse | avxh
> +    } regclass;
> +
> +  gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
> +  gdb_assert (tdep->num_xmm_regs > 0);
> +
> +  if (regnum == -1)
> +    regclass = all;
> +  else if (regnum >= I387_YMM0H_REGNUM (tdep)
> +	   && regnum < I387_YMMENDH_REGNUM (tdep))
> +    regclass = avxh;
> +  else if (regnum >= I387_XMM0_REGNUM(tdep)
> +	   && regnum < I387_MXCSR_REGNUM (tdep))
> +    regclass = sse;
> +  else if (regnum >= I387_ST0_REGNUM (tdep)
> +	   && regnum < I387_FCTRL_REGNUM (tdep))
> +    regclass = x87;
> +  else
> +    regclass = none;
> +
> +  if (gcore)
> +    {
> +      /* Update XCR0 and `xstate_bv' with XCR0 for gcore.  */
> +      if (tdep->xsave_xcr0_offset != -1)
> +	memcpy (regs + tdep->xsave_xcr0_offset, &tdep->xcr0, 8);
> +      memcpy (XSAVE_XSTATE_BV_ADDR (regs), &tdep->xcr0, 8);
> +
> +      switch (regclass)
> +	{
> +	default:
> +	  abort ();
> +
> +	case all:
> +	  /* Handle the upper YMM registers.  */
> +	  if ((tdep->xcr0 & bit_I386_XSTATE_AVX))
> +	    for (i = I387_YMM0H_REGNUM (tdep);
> +		 i < I387_YMMENDH_REGNUM (tdep); i++)
> +	      regcache_raw_collect (regcache, i,
> +				    XSAVE_AVXH_ADDR (tdep, regs, i));
> +
> +	  /* Handle the XMM registers.  */
> +	  if ((tdep->xcr0 & bit_I386_XSTATE_SSE))
> +	    for (i = I387_XMM0_REGNUM (tdep);
> +		 i < I387_MXCSR_REGNUM (tdep); i++)
> +	      regcache_raw_collect (regcache, i,
> +				    FXSAVE_ADDR (tdep, regs, i));
> +
> +	  /* Handle the x87 registers.  */
> +	  if ((tdep->xcr0 & bit_I386_XSTATE_X87))
> +	    for (i = I387_ST0_REGNUM (tdep);
> +		 i < I387_FCTRL_REGNUM (tdep); i++)
> +	      regcache_raw_collect (regcache, i,
> +				    FXSAVE_ADDR (tdep, regs, i));
> +	  break;
> +
> +	case x87:
> +	  regcache_raw_collect (regcache, regnum,
> +				FXSAVE_ADDR (tdep, regs, regnum));
> +	  return;
> +
> +	case sse:
> +	  regcache_raw_collect (regcache, regnum,
> +				FXSAVE_ADDR (tdep, regs, regnum));
> +	  return;
> +
> +	case avxh:
> +	  regcache_raw_collect (regcache, regnum,
> +				XSAVE_AVXH_ADDR (tdep, regs, regnum));
> +	  return;
> +	}
> +    }
> +  else
> +    {
> +      if ((regclass & check))
> +	{
> +	  gdb_byte raw[I386_MAX_REGISTER_SIZE];
> +	  gdb_byte *xstate_bv_p = XSAVE_XSTATE_BV_ADDR (regs);
> +	  unsigned int xstate_bv = 0;
> +	  /* The supported bits in `xstat_bv' are 1 byte. */
> +	  unsigned int clear_bv = (~(*xstate_bv_p)) & tdep->xcr0;
> +	  gdb_byte *p;
> +
> +	  /* Clear register set if its bit in xstat_bv is zero.  */
> +	  if (clear_bv)
> +	    {
> +	      if ((clear_bv & bit_I386_XSTATE_AVX))
> +		for (i = I387_YMM0H_REGNUM (tdep);
> +		     i < I387_YMMENDH_REGNUM (tdep); i++)
> +		  memset (XSAVE_AVXH_ADDR (tdep, regs, i), 0, 16);
> +
> +	      if ((clear_bv & bit_I386_XSTATE_SSE))
> +		for (i = I387_XMM0_REGNUM (tdep);
> +		     i < I387_MXCSR_REGNUM (tdep); i++)
> +		  memset (FXSAVE_ADDR (tdep, regs, i), 0, 16);
> +
> +	      if ((clear_bv & bit_I386_XSTATE_X87))
> +		for (i = I387_ST0_REGNUM (tdep);
> +		     i < I387_FCTRL_REGNUM (tdep); i++)
> +		  memset (FXSAVE_ADDR (tdep, regs, i), 0, 10);
> +	    }
> +
> +	  if (regclass == all)
> +	    {
> +	      /* Check if any upper YMM registers are changed.  */
> +	      if ((tdep->xcr0 & bit_I386_XSTATE_AVX))
> +		for (i = I387_YMM0H_REGNUM (tdep);
> +		     i < I387_YMMENDH_REGNUM (tdep); i++)
> +		  {
> +		    regcache_raw_collect (regcache, i, raw);
> +		    p = XSAVE_AVXH_ADDR (tdep, regs, i);
> +		    if (memcmp (raw, p, 16))
> +		      {
> +			xstate_bv |= bit_I386_XSTATE_AVX;
> +			memcpy (p, raw, 16);
> +		      }
> +		  }
> +
> +	      /* Check if any SSE registers are changed.  */
> +	      if ((tdep->xcr0 & bit_I386_XSTATE_SSE))
> +		for (i = I387_XMM0_REGNUM (tdep);
> +		     i < I387_MXCSR_REGNUM (tdep); i++)
> +		  {
> +		    regcache_raw_collect (regcache, i, raw);
> +		    p = FXSAVE_ADDR (tdep, regs, i);
> +		    if (memcmp (raw, p, 16))
> +		      {
> +			xstate_bv |= bit_I386_XSTATE_SSE;
> +			memcpy (p, raw, 16);
> +		      }
> +		  }
> +
> +	      /* Check if any X87 registers are changed.  */
> +	      if ((tdep->xcr0 & bit_I386_XSTATE_X87))
> +		for (i = I387_ST0_REGNUM (tdep);
> +		     i < I387_FCTRL_REGNUM (tdep); i++)
> +		  {
> +		    regcache_raw_collect (regcache, i, raw);
> +		    p = FXSAVE_ADDR (tdep, regs, i);
> +		    if (memcmp (raw, p, 10))
> +		      {
> +			xstate_bv |= bit_I386_XSTATE_X87;
> +			memcpy (p, raw, 10);
> +		      }
> +		  }
> +	    }
> +	  else
> +	    {
> +	      /* Check if REGNUM is changed.  */
> +	      regcache_raw_collect (regcache, regnum, raw);
> +
> +	      switch (regclass)
> +		{
> +		default:
> +		  abort ();
> +
> +		case avxh:
> +		  /* This is an upper YMM register.  */
> +		  p = XSAVE_AVXH_ADDR (tdep, regs, regnum);
> +		  if (memcmp (raw, p, 16))
> +		    {
> +		      xstate_bv |= bit_I386_XSTATE_AVX;
> +		      memcpy (p, raw, 16);
> +		    }
> +		  break;
> +
> +		case sse:
> +		  /* This is an SSE register.  */
> +		  p = FXSAVE_ADDR (tdep, regs, regnum);
> +		  if (memcmp (raw, p, 16))
> +		    {
> +		      xstate_bv |= bit_I386_XSTATE_SSE;
> +		      memcpy (p, raw, 16);
> +		    }
> +		  break;
> +
> +		case x87:
> +		  /* This is an x87 register.  */
> +		  p = FXSAVE_ADDR (tdep, regs, regnum);
> +		  if (memcmp (raw, p, 10))
> +		    {
> +		      xstate_bv |= bit_I386_XSTATE_X87;
> +		      memcpy (p, raw, 10);
> +		    }
> +		  break;
> +		}
> +	    }
> +
> +	  /* Update the corresponding bits in `xstate_bv' if any SSE/AVX
> +	     registers are changed.  */
> +	  if (xstate_bv)
> +	    {
> +	      /* The supported bits in `xstat_bv' are 1 byte.  */
> +	      *xstate_bv_p |= (gdb_byte) xstate_bv;
> +
> +	      switch (regclass)
> +		{
> +		default:
> +		  abort ();
> +
> +		case all:
> +		  break;
> +
> +		case x87:
> +		case sse:
> +		case avxh:
> +		  /* Register REGNUM has been updated.  Return.  */
> +		  return;
> +		}
> +	    }
> +	  else
> +	    {
> +	      /* Return if REGNUM isn't changed.  */
> +	      if (regclass != all)
> +		return;
> +	    }
> +	}
> +    }
> +
> +  /* Only handle x87 control registers.  */
> +  for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
> +    if (regnum == -1 || regnum == i)
> +      {
> +	/* Most of the FPU control registers occupy only 16 bits in
> +	   the xsave extended state.  Give those a special treatment.  */
> +	if (i != I387_FIOFF_REGNUM (tdep)
> +	    && i != I387_FOOFF_REGNUM (tdep))
> +	  {
> +	    gdb_byte buf[4];
> +
> +	    regcache_raw_collect (regcache, i, buf);
> +
> +	    if (i == I387_FOP_REGNUM (tdep))
> +	      {
> +		/* The opcode occupies only 11 bits.  Make sure we
> +                   don't touch the other bits.  */
> +		buf[1] &= ((1 << 3) - 1);
> +		buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
> +	      }
> +	    else if (i == I387_FTAG_REGNUM (tdep))
> +	      {
> +		/* Converting back is much easier.  */
> +
> +		unsigned short ftag;
> +		int fpreg;
> +
> +		ftag = (buf[1] << 8) | buf[0];
> +		buf[0] = 0;
> +		buf[1] = 0;
> +
> +		for (fpreg = 7; fpreg >= 0; fpreg--)
> +		  {
> +		    int tag = (ftag >> (fpreg * 2)) & 3;
> +
> +		    if (tag != 3)
> +		      buf[0] |= (1 << fpreg);
> +		  }
> +	      }
> +	    memcpy (FXSAVE_ADDR (tdep, regs, i), buf, 2);
> +	  }
> +	else
> +	  regcache_raw_collect (regcache, i, FXSAVE_ADDR (tdep, regs, i));
> +      }
> +
> +  if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
> +    regcache_raw_collect (regcache, I387_MXCSR_REGNUM (tdep),
> +			  FXSAVE_MXCSR_ADDR (regs));
> +}
> +
>  /* Recreate the FTW (tag word) valid bits from the 80-bit FP data in
>     *RAW.  */
>  
> diff --git a/gdb/i387-tdep.h b/gdb/i387-tdep.h
> index 645eb91..976fa11 100644
> --- a/gdb/i387-tdep.h
> +++ b/gdb/i387-tdep.h
> @@ -33,6 +33,8 @@ struct ui_file;
>  #define I387_ST0_REGNUM(tdep) ((tdep)->st0_regnum)
>  #define I387_NUM_XMM_REGS(tdep) ((tdep)->num_xmm_regs)
>  #define I387_MM0_REGNUM(tdep) ((tdep)->mm0_regnum)
> +#define I387_NUM_YMM_REGS(tdep) ((tdep)->num_ymm_regs)
> +#define I387_YMM0H_REGNUM(tdep) ((tdep)->ymm0h_regnum)
>  
>  #define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 8)
>  #define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 1)
> @@ -45,6 +47,8 @@ struct ui_file;
>  #define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
>  #define I387_MXCSR_REGNUM(tdep) \
>    (I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep))
> +#define I387_YMMENDH_REGNUM(tdep) \
> +  (I387_YMM0H_REGNUM (tdep) + I387_NUM_YMM_REGS (tdep))
>  
>  /* Print out the i387 floating point state.  */
>  
> @@ -99,6 +103,11 @@ extern void i387_collect_fsave (const struct regcache *regcache, int regnum,
>  extern void i387_supply_fxsave (struct regcache *regcache, int regnum,
>  				const void *fxsave);
>  
> +/* Similar to i387_supply_fxsave, but use XSAVE extended state.  */
> +
> +extern void i387_supply_xsave (struct regcache *regcache, int regnum,
> +			       const void *xsave);
> +
>  /* Fill register REGNUM (if it is a floating-point or SSE register) in
>     *FXSAVE with the value from REGCACHE.  If REGNUM is -1, do this for
>     all registers.  This function doesn't touch any of the reserved
> @@ -107,6 +116,11 @@ extern void i387_supply_fxsave (struct regcache *regcache, int regnum,
>  extern void i387_collect_fxsave (const struct regcache *regcache, int regnum,
>  				 void *fxsave);
>  
> +/* Similar to i387_collect_fxsave, but use XSAVE extended state.  */
> +
> +extern void i387_collect_xsave (const struct regcache *regcache,
> +				int regnum, void *xsave, int gcore);
> +
>  /* Prepare the FPU stack in REGCACHE for a function return.  */
>  
>  extern void i387_return_value (struct gdbarch *gdbarch,
> 

  parent reply	other threads:[~2010-03-27 15:08 UTC|newest]

Thread overview: 115+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-04 18:02 PATCH: 1/6: Add AVX support H.J. Lu
2010-03-04 18:05 ` PATCH: 2/6: Add AVX support (Update document) H.J. Lu
2010-03-04 18:06   ` PATCH: 3/6: Add AVX support (i386 changes) H.J. Lu
2010-03-06 22:21     ` PATCH: 3/6 [2nd try]: " H.J. Lu
2010-03-07 21:32       ` H.J. Lu
2010-03-11 22:37         ` Mark Kettenis
2010-03-12  0:00           ` H.J. Lu
2010-03-27 14:55             ` Mark Kettenis
2010-03-27 15:30               ` Daniel Jacobowitz
2010-03-27 16:05                 ` Mark Kettenis
2010-03-27 15:33               ` H.J. Lu
2010-03-27 16:09                 ` Mark Kettenis
2010-03-28  1:39                   ` H.J. Lu
2010-03-12 16:49       ` H.J. Lu
2010-03-13  1:38         ` H.J. Lu
2010-03-29  1:11         ` PATCH: 3/6 [3rd " H.J. Lu
2010-04-02 14:31           ` H.J. Lu
2010-04-02 14:42             ` Mark Kettenis
2010-04-02 15:28               ` H.J. Lu
2010-04-07 10:13                 ` Mark Kettenis
2010-04-07 14:56                   ` H.J. Lu
2010-04-07 15:04                     ` H.J. Lu
2010-04-07 15:19                       ` Mark Kettenis
2010-04-07 16:55             ` H.J. Lu
2010-04-07 18:34               ` Mark Kettenis
2010-04-07 18:50                 ` H.J. Lu
2010-03-27 15:48       ` PATCH: 3/6 [2nd " Mark Kettenis
2010-03-28  1:37         ` H.J. Lu
2010-03-28 11:55           ` Mark Kettenis
2010-03-28 14:25             ` H.J. Lu
2010-03-29 20:32               ` Mark Kettenis
2010-03-29 21:41                 ` H.J. Lu
2010-03-04 18:08   ` PATCH: 4/6: Add AVX support (amd64 changes) H.J. Lu
2010-03-04 18:09     ` PATCH: 5/6: Add AVX support (i387 changes) H.J. Lu
2010-03-04 18:10       ` PATCH: 6/6: Add AVX support (gdbserver changes) H.J. Lu
2010-03-06 22:23         ` PATCH: 6/6 [2nd try]: " H.J. Lu
2010-03-12 17:25           ` H.J. Lu
2010-03-27 16:07             ` Daniel Jacobowitz
2010-03-28  1:11               ` H.J. Lu
2010-03-28  7:55                 ` Pedro Alves
2010-03-28 14:56                   ` H.J. Lu
2010-03-28 16:17                     ` Pedro Alves
2010-03-28 16:37                       ` H.J. Lu
2010-03-28 16:40                   ` Daniel Jacobowitz
2010-03-28 16:47                     ` Pedro Alves
2010-03-28 20:53                       ` H.J. Lu
2010-03-28 21:27                         ` Pedro Alves
2010-03-28 16:39                 ` Daniel Jacobowitz
2010-03-28 19:31                   ` H.J. Lu
2010-03-29  1:09             ` PATCH: 6/6 [3rd " H.J. Lu
2010-03-29 14:08               ` Eli Zaretskii
2010-03-29 14:42                 ` H.J. Lu
2010-03-29 15:11                   ` Eli Zaretskii
2010-03-29 15:42                     ` H.J. Lu
2010-03-29 15:51                       ` Eli Zaretskii
2010-03-30 16:48               ` H.J. Lu
2010-04-02 17:39                 ` Daniel Jacobowitz
2010-04-07  4:37                   ` H.J. Lu
2010-04-03 21:57                 ` Jan Kratochvil
2010-04-07  4:12                   ` H.J. Lu
2010-04-07 16:59                 ` H.J. Lu
2010-03-05  3:20       ` PATCH: 5/6: Add AVX support (i387 changes) Hui Zhu
2010-03-05  3:54         ` H.J. Lu
2010-03-06 22:22       ` PATCH: 5/6 [2nd try]: " H.J. Lu
2010-03-12 17:24         ` H.J. Lu
2010-04-07 16:57           ` PATCH: 5/6 [3rd " H.J. Lu
2010-03-27 15:08         ` Mark Kettenis [this message]
2010-03-27 15:15           ` PATCH: 5/6 [2nd " H.J. Lu
2010-03-06 22:21     ` PATCH: 4/6 [2nd try]: Add AVX support (amd64 changes) H.J. Lu
2010-03-07 21:33       ` H.J. Lu
2010-03-12 17:01         ` H.J. Lu
2010-03-13  1:38           ` H.J. Lu
2010-03-29  1:07           ` PATCH: 4/6 [3rd " H.J. Lu
2010-04-02 14:32             ` H.J. Lu
2010-04-07 16:54               ` H.J. Lu
2010-03-05 10:33   ` PATCH: 2/6: Add AVX support (Update document) Eli Zaretskii
2010-03-05 14:08     ` H.J. Lu
2010-03-06 22:19   ` PATCH: 2/6 [2nd try]: " H.J. Lu
2010-03-12 11:11     ` Eli Zaretskii
2010-03-12 14:17       ` H.J. Lu
2010-03-12 15:28         ` Eli Zaretskii
2010-03-12 15:27     ` Eli Zaretskii
2010-03-12 16:46     ` H.J. Lu
2010-03-12 18:15       ` Eli Zaretskii
2010-03-29  0:18     ` PATCH: 2/6 [3rd " H.J. Lu
2010-03-30 16:41       ` H.J. Lu
2010-03-30 18:27         ` Eli Zaretskii
2010-03-30 18:37           ` H.J. Lu
2010-03-04 19:09 ` PATCH: 1/6: Add AVX support Daniel Jacobowitz
2010-03-04 19:29   ` H.J. Lu
2010-03-04 19:47     ` Daniel Jacobowitz
2010-03-04 21:27       ` H.J. Lu
2010-03-04 21:34         ` Nathan Froyd
2010-03-04 21:41           ` H.J. Lu
2010-03-04 21:59             ` Nathan Froyd
2010-03-04 21:47         ` Daniel Jacobowitz
2010-03-05  2:06           ` H.J. Lu
2010-03-05  7:29             ` Mark Kettenis
2010-03-06 22:16 ` PATCH: 0/6 [2nd try]: " H.J. Lu
2010-03-06 22:18   ` PATCH: 1/6 [2nd try]: Add AVX support (AVX XML files) H.J. Lu
2010-03-07 14:16   ` PATCH: 0/6 [2nd try]: Add AVX support Mark Kettenis
2010-03-07 14:37     ` H.J. Lu
2010-03-07 16:31       ` H.J. Lu
2010-03-07 16:40         ` H.J. Lu
2010-03-07 17:04           ` H.J. Lu
2010-03-07 17:39             ` H.J. Lu
2010-03-07 20:00               ` Mark Kettenis
2010-03-07 19:10           ` Nathan Froyd
2010-03-07 19:49             ` Mark Kettenis
2010-03-07 21:07               ` Nathan Froyd
2010-03-07 21:17                 ` H.J. Lu
2010-03-07 20:29           ` Mark Kettenis
2010-03-07 21:04             ` H.J. Lu
2010-03-27 16:16   ` Daniel Jacobowitz
2010-03-29  0:16   ` PATCH: 0/6 [3nd " H.J. Lu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201003271508.o2RF80I7030511@glazunov.sibelius.xs4all.nl \
    --to=mark.kettenis@xs4all.nl \
    --cc=gdb-patches@sourceware.org \
    --cc=hjl.tools@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).