1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Improve XMM integer displays

This commit is contained in:
Brian Fiete 2022-01-07 10:31:26 -05:00
parent 88183dbae7
commit 6854c404d8
5 changed files with 80 additions and 33 deletions

View file

@ -58,9 +58,9 @@ namespace IDE.Debugger
{ {
Default, Default,
UInt8, UInt8,
Short, Int16,
Int, Int32,
Long, Int64,
Float, Float,
Double, Double,
COUNT COUNT

View file

@ -99,10 +99,10 @@ enum DwFloatDisplayType : int8
enum DwMmDisplayType : int8 enum DwMmDisplayType : int8
{ {
DwMmDisplayType_Default, DwMmDisplayType_Default,
DwMmDisplayType_Byte, DwMmDisplayType_UInt8,
DwMmDisplayType_Short, DwMmDisplayType_Int16,
DwMmDisplayType_Int, DwMmDisplayType_Int32,
DwMmDisplayType_Long, DwMmDisplayType_Int64,
DwMmDisplayType_Float, DwMmDisplayType_Float,
DwMmDisplayType_Double DwMmDisplayType_Double
}; };

View file

@ -6842,10 +6842,9 @@ String WinDebugger::DbgTypedValueToString(const DbgTypedValue& origTypedValue, c
if ((regForm == RegForm_Double) || (regForm == RegForm_Double2)) if ((regForm == RegForm_Double) || (regForm == RegForm_Double2))
mmDwMmDisplayType = DwMmDisplayType_Double; mmDwMmDisplayType = DwMmDisplayType_Double;
else if (regForm == RegForm_Int4) else if (regForm == RegForm_Int4)
mmDwMmDisplayType = DwMmDisplayType_Int; mmDwMmDisplayType = DwMmDisplayType_Int32;
} }
//TODO: Add support for int types
if (mmDwMmDisplayType == DwMmDisplayType_Double) if (mmDwMmDisplayType == DwMmDisplayType_Double)
{ {
xmmType = "__m128d"; xmmType = "__m128d";
@ -6861,35 +6860,43 @@ String WinDebugger::DbgTypedValueToString(const DbgTypedValue& origTypedValue, c
} }
headerStr = StrFormat("(%f, %f)", xmmRegVals[0], xmmRegVals[1]); headerStr = StrFormat("(%f, %f)", xmmRegVals[0], xmmRegVals[1]);
} }
else if (mmDwMmDisplayType == DwMmDisplayType_Byte) else if (mmDwMmDisplayType == DwMmDisplayType_UInt8)
{ {
int xmmRegVals[4]; int xmmRegVals[4];
xmmCount = 4; xmmCount = 16;
CPURegisters* regs = optEvaluator->GetRegisters(); CPURegisters* regs = optEvaluator->GetRegisters();
for (int xmmMinor = 0; xmmMinor < xmmCount; ++xmmMinor) for (int xmmMinor = 0; xmmMinor < BF_ARRAY_COUNT(xmmRegVals); ++xmmMinor)
{ {
DbgTypedValue xmmReg = GetRegister(StrFormat("xmm%d_%d", xmmMajor, xmmMinor), language, regs, &wdStackFrame->mRegForms); DbgTypedValue xmmReg = GetRegister(StrFormat("xmm%d_%d", xmmMajor, xmmMinor), language, regs, &wdStackFrame->mRegForms);
BF_ASSERT(xmmReg.mType->mTypeCode == DbgType_i32); BF_ASSERT(xmmReg.mType->mTypeCode == DbgType_i32);
BF_ASSERT(xmmReg.mRegNum == CPUReg_XMMREG_FIRST + (xmmMajor * 4) + xmmMinor); BF_ASSERT(xmmReg.mRegNum == CPUReg_XMMREG_FIRST + (xmmMajor * 4) + xmmMinor);
xmmRegVals[xmmMinor] = xmmReg.mInt8; xmmRegVals[xmmMinor] = xmmReg.mInt32;
} }
headerStr = StrFormat("(%d, %d, %d, %d)", xmmRegVals[0], xmmRegVals[1], xmmRegVals[2], xmmRegVals[3]); headerStr = StrFormat("(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)",
xmmRegVals[0] & 0xFF, (xmmRegVals[0] >> 8) & 0xFF, (xmmRegVals[0] >> 16) & 0xFF, (xmmRegVals[0] >> 24) & 0xFF,
xmmRegVals[1] & 0xFF, (xmmRegVals[1] >> 8) & 0xFF, (xmmRegVals[1] >> 16) & 0xFF, (xmmRegVals[1] >> 24) & 0xFF,
xmmRegVals[2] & 0xFF, (xmmRegVals[2] >> 8) & 0xFF, (xmmRegVals[2] >> 16) & 0xFF, (xmmRegVals[2] >> 24) & 0xFF,
xmmRegVals[3] & 0xFF, (xmmRegVals[3] >> 8) & 0xFF, (xmmRegVals[3] >> 16) & 0xFF, (xmmRegVals[3] >> 24) & 0xFF);
} }
else if (mmDwMmDisplayType == DwMmDisplayType_Short) else if (mmDwMmDisplayType == DwMmDisplayType_Int16)
{ {
int xmmRegVals[4]; int xmmRegVals[4];
xmmCount = 4; xmmCount = 8;
CPURegisters* regs = optEvaluator->GetRegisters(); CPURegisters* regs = optEvaluator->GetRegisters();
for (int xmmMinor = 0; xmmMinor < xmmCount; ++xmmMinor) for (int xmmMinor = 0; xmmMinor < BF_ARRAY_COUNT(xmmRegVals); ++xmmMinor)
{ {
DbgTypedValue xmmReg = GetRegister(StrFormat("xmm%d_%d", xmmMajor, xmmMinor), language, regs, &wdStackFrame->mRegForms); DbgTypedValue xmmReg = GetRegister(StrFormat("xmm%d_%d", xmmMajor, xmmMinor), language, regs, &wdStackFrame->mRegForms);
BF_ASSERT(xmmReg.mType->mTypeCode == DbgType_i32); BF_ASSERT(xmmReg.mType->mTypeCode == DbgType_i32);
BF_ASSERT(xmmReg.mRegNum == CPUReg_XMMREG_FIRST + (xmmMajor * 4) + xmmMinor); BF_ASSERT(xmmReg.mRegNum == CPUReg_XMMREG_FIRST + (xmmMajor * 4) + xmmMinor);
xmmRegVals[xmmMinor] = xmmReg.mInt16; xmmRegVals[xmmMinor] = xmmReg.mInt32;
} }
headerStr = StrFormat("(%d, %d, %d, %d)", xmmRegVals[0], xmmRegVals[1], xmmRegVals[2], xmmRegVals[3]); headerStr = StrFormat("(%d, %d, %d, %d, %d, %d, %d, %d)",
xmmRegVals[0] & 0xFFFF, (xmmRegVals[0] >> 16) & 0xFFFF,
xmmRegVals[1] & 0xFFFF, (xmmRegVals[1] >> 16) & 0xFFFF,
xmmRegVals[2] & 0xFFFF, (xmmRegVals[2] >> 16) & 0xFFFF,
xmmRegVals[3] & 0xFFFF, (xmmRegVals[3] >> 16) & 0xFFFF);
} }
else if (mmDwMmDisplayType == DwMmDisplayType_Int) else if (mmDwMmDisplayType == DwMmDisplayType_Int32)
{ {
int xmmRegVals[4]; int xmmRegVals[4];
xmmCount = 4; xmmCount = 4;
@ -6903,7 +6910,21 @@ String WinDebugger::DbgTypedValueToString(const DbgTypedValue& origTypedValue, c
} }
headerStr = StrFormat("(%d, %d, %d, %d)", xmmRegVals[0], xmmRegVals[1], xmmRegVals[2], xmmRegVals[3]); headerStr = StrFormat("(%d, %d, %d, %d)", xmmRegVals[0], xmmRegVals[1], xmmRegVals[2], xmmRegVals[3]);
} }
else // Float else if (mmDwMmDisplayType == DwMmDisplayType_Int64)
{
int64 xmmRegVals[2];
xmmCount = 2;
CPURegisters* regs = optEvaluator->GetRegisters();
for (int xmmMinor = 0; xmmMinor < xmmCount; ++xmmMinor)
{
DbgTypedValue xmmReg = GetRegister(StrFormat("xmm%d_%d", xmmMajor, xmmMinor), language, regs, &wdStackFrame->mRegForms);
BF_ASSERT(xmmReg.mType->mTypeCode == DbgType_i64);
BF_ASSERT(xmmReg.mRegNum == CPUReg_XMMREG_FIRST + (xmmMajor * 4) + xmmMinor);
xmmRegVals[xmmMinor] = xmmReg.mInt64;
}
headerStr = StrFormat("(%lld, %lld)", xmmRegVals[0], xmmRegVals[1]);
}
else // float
{ {
float xmmRegVals[4]; float xmmRegVals[4];
xmmCount = 4; xmmCount = 4;
@ -6925,7 +6946,14 @@ String WinDebugger::DbgTypedValueToString(const DbgTypedValue& origTypedValue, c
result = headerStr + "\n" + xmmType; result = headerStr + "\n" + xmmType;
for (int i = 0; i < xmmCount; i++) for (int i = 0; i < xmmCount; i++)
result += WrapWithModifiers(StrFormat("\n[%d]\t$xmm%d_%d", i, xmmMajor, i, language), origValueType, language); {
if (xmmCount == 16)
result += WrapWithModifiers(StrFormat("\n[%d]\t(uint8)($xmm%d_%d >> %d)", i, xmmMajor, i / 4, (i % 4)*8), origValueType, language);
else if (xmmCount == 8)
result += WrapWithModifiers(StrFormat("\n[%d]\t(int16)($xmm%d_%d >> %d)", i, xmmMajor, i / 2, (i % 2)*8), origValueType, language);
else
result += WrapWithModifiers(StrFormat("\n[%d]\t$xmm%d_%d", i, xmmMajor, i), origValueType, language);
}
return result; return result;
} }
@ -8936,7 +8964,7 @@ DbgTypedValue WinDebugger::GetRegister(const StringImpl& regName, DbgLanguage la
if ((regForm == RegForm_Double) || (regForm == RegForm_Double2)) if ((regForm == RegForm_Double) || (regForm == RegForm_Double2))
mmDisplayType = DwMmDisplayType_Double; mmDisplayType = DwMmDisplayType_Double;
else if (regForm == RegForm_Int4) else if (regForm == RegForm_Int4)
mmDisplayType = DwMmDisplayType_Int; mmDisplayType = DwMmDisplayType_Int32;
} }
//TODO: Add int types //TODO: Add int types
@ -8948,12 +8976,19 @@ DbgTypedValue WinDebugger::GetRegister(const StringImpl& regName, DbgLanguage la
typedVal.mRegNum = regNum; typedVal.mRegNum = regNum;
return typedVal; return typedVal;
} }
else if ((mmDisplayType == DwMmDisplayType_UInt8) || (mmDisplayType == DwMmDisplayType_Int16) || (mmDisplayType == DwMmDisplayType_Int32))
if ((mmDisplayType == DwMmDisplayType_Byte) || (mmDisplayType == DwMmDisplayType_Short) || (mmDisplayType == DwMmDisplayType_Int))
{ {
DbgTypedValue typedVal; DbgTypedValue typedVal;
typedVal.mType = dbgModule->GetPrimitiveType(DbgType_i32, language); typedVal.mType = dbgModule->GetPrimitiveType(DbgType_i32, language);
typedVal.mInt32 = registers->mXmmIRegsARray[xmmMajor].i[xmmMinor]; typedVal.mInt32 = registers->mXmmI32RegsARray[xmmMajor].i[xmmMinor];
typedVal.mRegNum = regNum;
return typedVal;
}
else if (mmDisplayType == DwMmDisplayType_Int64)
{
DbgTypedValue typedVal;
typedVal.mType = dbgModule->GetPrimitiveType(DbgType_i64, language);
typedVal.mInt64 = registers->mXmmI64RegsARray[xmmMajor].i[xmmMinor];
typedVal.mRegNum = regNum; typedVal.mRegNum = regNum;
return typedVal; return typedVal;
} }

View file

@ -340,11 +340,16 @@ public:
double d[2]; double d[2];
}; };
struct XmmIReg struct XmmI32Reg
{ {
int32 i[4]; int32 i[4];
}; };
struct XmmI64Reg
{
int64 i[2];
};
union union
{ {
IntRegs mIntRegs; IntRegs mIntRegs;
@ -355,7 +360,8 @@ public:
{ {
XmmReg mXmmRegsArray[kNumXmmRegs]; XmmReg mXmmRegsArray[kNumXmmRegs];
XmmDReg mXmmDRegsArray[kNumXmmRegs]; XmmDReg mXmmDRegsArray[kNumXmmRegs];
XmmIReg mXmmIRegsARray[kNumXmmRegs]; XmmI32Reg mXmmI32RegsARray[kNumXmmRegs];
XmmI64Reg mXmmI64RegsARray[kNumXmmRegs];
}; };
X64CPURegisters() X64CPURegisters()

View file

@ -195,11 +195,16 @@ public:
double d[2]; double d[2];
}; };
struct XmmIReg struct XmmI32Reg
{ {
int32 i[4]; int32 i[4];
}; };
struct XmmI64Reg
{
int64 i[2];
};
union union
{ {
IntRegs mIntRegs; IntRegs mIntRegs;
@ -210,7 +215,8 @@ public:
{ {
XmmReg mXmmRegsArray[kNumXmmRegs]; XmmReg mXmmRegsArray[kNumXmmRegs];
XmmDReg mXmmDRegsArray[kNumXmmRegs]; XmmDReg mXmmDRegsArray[kNumXmmRegs];
XmmIReg mXmmIRegsARray[kNumXmmRegs]; XmmI32Reg mXmmI32RegsARray[kNumXmmRegs];
XmmI64Reg mXmmI64RegsARray[kNumXmmRegs];
}; };
X86CPURegisters() X86CPURegisters()