diff --git a/IDE/src/Debugger/DebugManager.bf b/IDE/src/Debugger/DebugManager.bf index d10ef3c3..54b7e278 100644 --- a/IDE/src/Debugger/DebugManager.bf +++ b/IDE/src/Debugger/DebugManager.bf @@ -58,9 +58,9 @@ namespace IDE.Debugger { Default, UInt8, - Short, - Int, - Long, + Int16, + Int32, + Int64, Float, Double, COUNT diff --git a/IDEHelper/Debugger.h b/IDEHelper/Debugger.h index ce603352..0f9495ee 100644 --- a/IDEHelper/Debugger.h +++ b/IDEHelper/Debugger.h @@ -99,10 +99,10 @@ enum DwFloatDisplayType : int8 enum DwMmDisplayType : int8 { DwMmDisplayType_Default, - DwMmDisplayType_Byte, - DwMmDisplayType_Short, - DwMmDisplayType_Int, - DwMmDisplayType_Long, + DwMmDisplayType_UInt8, + DwMmDisplayType_Int16, + DwMmDisplayType_Int32, + DwMmDisplayType_Int64, DwMmDisplayType_Float, DwMmDisplayType_Double }; diff --git a/IDEHelper/WinDebugger.cpp b/IDEHelper/WinDebugger.cpp index 247f57e9..3139724a 100644 --- a/IDEHelper/WinDebugger.cpp +++ b/IDEHelper/WinDebugger.cpp @@ -6842,10 +6842,9 @@ String WinDebugger::DbgTypedValueToString(const DbgTypedValue& origTypedValue, c if ((regForm == RegForm_Double) || (regForm == RegForm_Double2)) mmDwMmDisplayType = DwMmDisplayType_Double; else if (regForm == RegForm_Int4) - mmDwMmDisplayType = DwMmDisplayType_Int; + mmDwMmDisplayType = DwMmDisplayType_Int32; } - - //TODO: Add support for int types + if (mmDwMmDisplayType == DwMmDisplayType_Double) { xmmType = "__m128d"; @@ -6861,35 +6860,43 @@ String WinDebugger::DbgTypedValueToString(const DbgTypedValue& origTypedValue, c } headerStr = StrFormat("(%f, %f)", xmmRegVals[0], xmmRegVals[1]); } - else if (mmDwMmDisplayType == DwMmDisplayType_Byte) + else if (mmDwMmDisplayType == DwMmDisplayType_UInt8) { int xmmRegVals[4]; - xmmCount = 4; + xmmCount = 16; 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); BF_ASSERT(xmmReg.mType->mTypeCode == DbgType_i32); 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]; - xmmCount = 4; + xmmCount = 8; 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); BF_ASSERT(xmmReg.mType->mTypeCode == DbgType_i32); 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]; 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]); } - 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]; xmmCount = 4; @@ -6916,7 +6937,7 @@ String WinDebugger::DbgTypedValueToString(const DbgTypedValue& origTypedValue, c xmmRegVals[xmmMinor] = xmmReg.mSingle; } headerStr = StrFormat("(%f, %f, %f, %f)", xmmRegVals[0], xmmRegVals[1], xmmRegVals[2], xmmRegVals[3]); - } + } } else { @@ -6925,7 +6946,14 @@ String WinDebugger::DbgTypedValueToString(const DbgTypedValue& origTypedValue, c result = headerStr + "\n" + xmmType; 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; } @@ -8936,7 +8964,7 @@ DbgTypedValue WinDebugger::GetRegister(const StringImpl& regName, DbgLanguage la if ((regForm == RegForm_Double) || (regForm == RegForm_Double2)) mmDisplayType = DwMmDisplayType_Double; else if (regForm == RegForm_Int4) - mmDisplayType = DwMmDisplayType_Int; + mmDisplayType = DwMmDisplayType_Int32; } //TODO: Add int types @@ -8948,12 +8976,19 @@ DbgTypedValue WinDebugger::GetRegister(const StringImpl& regName, DbgLanguage la typedVal.mRegNum = regNum; return typedVal; } - - if ((mmDisplayType == DwMmDisplayType_Byte) || (mmDisplayType == DwMmDisplayType_Short) || (mmDisplayType == DwMmDisplayType_Int)) + else if ((mmDisplayType == DwMmDisplayType_UInt8) || (mmDisplayType == DwMmDisplayType_Int16) || (mmDisplayType == DwMmDisplayType_Int32)) { DbgTypedValue typedVal; 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; return typedVal; } diff --git a/IDEHelper/X64.h b/IDEHelper/X64.h index 8b249b36..a230b8fe 100644 --- a/IDEHelper/X64.h +++ b/IDEHelper/X64.h @@ -340,11 +340,16 @@ public: double d[2]; }; - struct XmmIReg + struct XmmI32Reg { int32 i[4]; }; + struct XmmI64Reg + { + int64 i[2]; + }; + union { IntRegs mIntRegs; @@ -355,7 +360,8 @@ public: { XmmReg mXmmRegsArray[kNumXmmRegs]; XmmDReg mXmmDRegsArray[kNumXmmRegs]; - XmmIReg mXmmIRegsARray[kNumXmmRegs]; + XmmI32Reg mXmmI32RegsARray[kNumXmmRegs]; + XmmI64Reg mXmmI64RegsARray[kNumXmmRegs]; }; X64CPURegisters() diff --git a/IDEHelper/X86.h b/IDEHelper/X86.h index c68c48db..0f4e5e77 100644 --- a/IDEHelper/X86.h +++ b/IDEHelper/X86.h @@ -193,13 +193,18 @@ public: struct XmmDReg { double d[2]; - }; + }; - struct XmmIReg + struct XmmI32Reg { int32 i[4]; }; + struct XmmI64Reg + { + int64 i[2]; + }; + union { IntRegs mIntRegs; @@ -210,7 +215,8 @@ public: { XmmReg mXmmRegsArray[kNumXmmRegs]; XmmDReg mXmmDRegsArray[kNumXmmRegs]; - XmmIReg mXmmIRegsARray[kNumXmmRegs]; + XmmI32Reg mXmmI32RegsARray[kNumXmmRegs]; + XmmI64Reg mXmmI64RegsARray[kNumXmmRegs]; }; X86CPURegisters()