@@ -568,8 +568,16 @@ static int fxsave_offset[] =
160 + 15 * 16, /* ... %xmm15 (128 bits each). */
};
-#define FXSAVE_ADDR(tdep, fxsave, regnum) \
- (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)])
+/* Return a pointer of the value of register REGNUM inside the FXSAVE area. */
+
+template <typename T,
+ typename ElemType = typename std::remove_const<T>::type,
+ typename = gdb::Requires<std::is_same<ElemType, gdb_byte>>>
+static T *
+fxsave_addr (const i386_gdbarch_tdep *tdep, T *fxsave, int regnum)
+{
+ return fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)];
+}
/* We made an unfortunate choice in putting %mxcsr after the SSE
registers %xmm0-%xmm7 instead of before, since it makes supporting
@@ -612,7 +620,7 @@ i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
{
gdb_byte val[4];
- memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
+ memcpy (val, fxsave_addr (tdep, regs, i), 2);
val[2] = val[3] = 0;
if (i == I387_FOP_REGNUM (tdep))
val[1] &= ((1 << 3) - 1);
@@ -626,7 +634,7 @@ i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
int fpreg;
int top;
- top = ((FXSAVE_ADDR (tdep, regs,
+ top = ((fxsave_addr (tdep, regs,
I387_FSTAT_REGNUM (tdep)))[1] >> 3);
top &= 0x7;
@@ -638,7 +646,7 @@ i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
{
int thisreg = (fpreg + 8 - top) % 8
+ I387_ST0_REGNUM (tdep);
- tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
+ tag = i387_tag (fxsave_addr (tdep, regs, thisreg));
}
else
tag = 3; /* Empty */
@@ -651,7 +659,7 @@ i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
regcache->raw_supply (i, val);
}
else
- regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
+ regcache->raw_supply (i, fxsave_addr (tdep, regs, i));
}
if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
@@ -697,7 +705,7 @@ i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
/* 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));
+ buf[1] |= ((fxsave_addr (tdep, regs, i))[1] & ~((1 << 3) - 1));
}
else if (i == I387_FTAG_REGNUM (tdep))
{
@@ -718,10 +726,10 @@ i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
buf[0] |= (1 << fpreg);
}
}
- memcpy (FXSAVE_ADDR (tdep, regs, i), buf, 2);
+ memcpy (fxsave_addr (tdep, regs, i), buf, 2);
}
else
- regcache->raw_collect (i, FXSAVE_ADDR (tdep, regs, i));
+ regcache->raw_collect (i, fxsave_addr (tdep, regs, i));
}
if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
@@ -1173,14 +1181,14 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
if ((clear_bv & X86_XSTATE_SSE))
regcache->raw_supply (regnum, zero);
else
- regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
+ regcache->raw_supply (regnum, fxsave_addr (tdep, regs, regnum));
return;
case x87:
if ((clear_bv & X86_XSTATE_X87))
regcache->raw_supply (regnum, zero);
else
- regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
+ regcache->raw_supply (regnum, fxsave_addr (tdep, regs, regnum));
return;
case all:
@@ -1338,7 +1346,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
{
for (i = I387_XMM0_REGNUM (tdep);
i < I387_MXCSR_REGNUM (tdep); i++)
- regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
+ regcache->raw_supply (i, fxsave_addr (tdep, regs, i));
}
}
@@ -1357,7 +1365,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
for (i = I387_ST0_REGNUM (tdep);
i < I387_FCTRL_REGNUM (tdep);
i++)
- regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
+ regcache->raw_supply (i, fxsave_addr (tdep, regs, i));
}
}
break;
@@ -1394,7 +1402,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
{
gdb_byte val[4];
- memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
+ memcpy (val, fxsave_addr (tdep, regs, i), 2);
val[2] = val[3] = 0;
if (i == I387_FOP_REGNUM (tdep))
val[1] &= ((1 << 3) - 1);
@@ -1408,7 +1416,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
int fpreg;
int top;
- top = ((FXSAVE_ADDR (tdep, regs,
+ top = ((fxsave_addr (tdep, regs,
I387_FSTAT_REGNUM (tdep)))[1] >> 3);
top &= 0x7;
@@ -1420,7 +1428,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
{
int thisreg = (fpreg + 8 - top) % 8
+ I387_ST0_REGNUM (tdep);
- tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
+ tag = i387_tag (fxsave_addr (tdep, regs, thisreg));
}
else
tag = 3; /* Empty */
@@ -1433,7 +1441,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
regcache->raw_supply (i, val);
}
else
- regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
+ regcache->raw_supply (i, fxsave_addr (tdep, regs, i));
}
if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
@@ -1608,7 +1616,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
if ((clear_bv & X86_XSTATE_SSE))
for (i = I387_XMM0_REGNUM (tdep);
i < I387_MXCSR_REGNUM (tdep); i++)
- memset (FXSAVE_ADDR (tdep, regs, i), 0, 16);
+ memset (fxsave_addr (tdep, regs, i), 0, 16);
/* The mxcsr register is written into the xsave buffer if either AVX
or SSE is enabled, so only clear it if both of those features
@@ -1622,16 +1630,16 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
{
for (i = I387_ST0_REGNUM (tdep);
i < I387_FCTRL_REGNUM (tdep); i++)
- memset (FXSAVE_ADDR (tdep, regs, i), 0, 10);
+ memset (fxsave_addr (tdep, regs, i), 0, 10);
for (i = I387_FCTRL_REGNUM (tdep);
i < I387_XMM0_REGNUM (tdep); i++)
{
if (i == I387_FCTRL_REGNUM (tdep))
- store_unsigned_integer (FXSAVE_ADDR (tdep, regs, i), 2,
+ store_unsigned_integer (fxsave_addr (tdep, regs, i), 2,
byte_order, I387_FCTRL_INIT_VAL);
else
- memset (FXSAVE_ADDR (tdep, regs, i), 0,
+ memset (fxsave_addr (tdep, regs, i), 0,
regcache_register_size (regcache, i));
}
}
@@ -1768,7 +1776,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
i < I387_MXCSR_REGNUM (tdep); i++)
{
regcache->raw_collect (i, raw);
- p = FXSAVE_ADDR (tdep, regs, i);
+ p = fxsave_addr (tdep, regs, i);
if (memcmp (raw, p, 16))
{
xstate_bv |= X86_XSTATE_SSE;
@@ -1801,7 +1809,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
i < I387_FCTRL_REGNUM (tdep); i++)
{
regcache->raw_collect (i, raw);
- p = FXSAVE_ADDR (tdep, regs, i);
+ p = fxsave_addr (tdep, regs, i);
if (memcmp (raw, p, 10))
{
xstate_bv |= X86_XSTATE_X87;
@@ -1907,7 +1915,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
case sse:
/* This is an SSE register. */
- p = FXSAVE_ADDR (tdep, regs, regnum);
+ p = fxsave_addr (tdep, regs, regnum);
if (memcmp (raw, p, 16))
{
xstate_bv |= X86_XSTATE_SSE;
@@ -1917,7 +1925,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
case x87:
/* This is an x87 register. */
- p = FXSAVE_ADDR (tdep, regs, regnum);
+ p = fxsave_addr (tdep, regs, regnum);
if (memcmp (raw, p, 10))
{
xstate_bv |= X86_XSTATE_X87;
@@ -1966,7 +1974,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
/* 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));
+ buf[1] |= ((fxsave_addr (tdep, regs, i))[1] & ~((1 << 3) - 1));
}
else if (i == I387_FTAG_REGNUM (tdep))
{
@@ -1987,7 +1995,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
buf[0] |= (1 << fpreg);
}
}
- p = FXSAVE_ADDR (tdep, regs, i);
+ p = fxsave_addr (tdep, regs, i);
if (memcmp (p, buf, 2))
{
xstate_bv |= X86_XSTATE_X87;
@@ -2000,7 +2008,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
regcache->raw_collect (i, raw);
regsize = regcache_register_size (regcache, i);
- p = FXSAVE_ADDR (tdep, regs, i);
+ p = fxsave_addr (tdep, regs, i);
if (memcmp (raw, p, regsize))
{
xstate_bv |= X86_XSTATE_X87;