Skip to content

Commit d9c4fb6

Browse files
mtargowssys_zuul
authored andcommitted
DWARF SIMD location expressions support cont.
Change-Id: I2066e1c530f404300a7ee4699a322dbd05dd6711
1 parent 12ea5e3 commit d9c4fb6

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

IGC/Compiler/DebugInfo/DwarfCompileUnit.cpp

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,32 +1103,29 @@ void CompileUnit::addSimdLane(DIEBlock* Block, DbgVariable& DV, VISAVariableLoca
11031103
// 11 DW_OP_const1u 16 or 8
11041104
// 12 DW_OP_INTEL_piece_stack
11051105

1106-
dwarf::LocationAtom litForSubReg = dwarf::DW_OP_lit2; // If 64-bit ptr or variable
1107-
dwarf::LocationAtom litForSIMDlane = dwarf::DW_OP_lit3; // If 64-bit ptr or variable
1108-
uint64_t bitsUsedByVar = varSizeInBits; // If unpacked then small variable uses 32 bits
1109-
if ((varSizeInBits == 32) || ((varSizeInBits < 32) && !isPacked))
1110-
{
1111-
litForSubReg = dwarf::DW_OP_lit3;
1112-
litForSIMDlane = dwarf::DW_OP_lit7;
1113-
bitsUsedByVar = 32;
1114-
}
1115-
else if (varSizeInBits == 16)
1116-
{
1117-
IGC_ASSERT_MESSAGE(isPacked, "16-bit packed variable expected");
1118-
litForSubReg = dwarf::DW_OP_lit4;
1119-
litForSIMDlane = dwarf::DW_OP_lit15;
1120-
}
1121-
else if (varSizeInBits == 8)
1122-
{
1123-
IGC_ASSERT_MESSAGE(isPacked, "8-bit packed variable expected");
1124-
litForSubReg = dwarf::DW_OP_lit5;
1125-
litForSIMDlane = dwarf::DW_OP_lit31;
1126-
}
1127-
else
1106+
// If unpacked then small variable takes up 32 bits else when packed fits its exact size
1107+
uint32_t bitsUsedByVar = (isPacked || varSizeInBits > 32) ? (uint32_t)varSizeInBits : 32;
1108+
uint32_t variablesInSingleGRF = (VISAMod->m_pShader->getGRFSize() * 8) / bitsUsedByVar;
1109+
1110+
uint32_t iterNo = 0;
1111+
uint32_t variablesCounter = 1;
1112+
while (variablesInSingleGRF > variablesCounter)
11281113
{
1129-
// Nothing to do else for 64-bit variable or ptr
1130-
IGC_ASSERT_MESSAGE(varSizeInBits == 64, "Missing support for this variable size");
1114+
variablesCounter = 2 * variablesCounter;
1115+
iterNo++;
11311116
}
1117+
1118+
// 1 var fits the whole GRF then set litForSubReg=dwarf::DW_OP_lit0 and litForSIMDlane=dwarf::DW_OP_lit0,
1119+
// 2 vars - dwarf::DW_OP_lit1 and dwarf::DW_OP_lit1,
1120+
// 4 vars - dwarf::DW_OP_lit2 and dwarf::DW_OP_lit3,
1121+
// 8 vars - dwarf::DW_OP_lit3 and dwarf::DW_OP_lit7,
1122+
// 16 vars - dwarf::DW_OP_lit4 and dwarf::DW_OP_lit15,
1123+
// 32 vars - dwarf::DW_OP_lit5 and dwarf::DW_OP_lit31,
1124+
// 64 vars - dwarf::DW_OP_lit6 and dwarf::DW_OP_lit63,
1125+
// 128 vars - dwarf::DW_OP_lit7 and dwarf::DW_OP_lit127, etc.
1126+
dwarf::LocationAtom litForSubReg = (dwarf::LocationAtom)(dwarf::DW_OP_lit0 + iterNo);
1127+
dwarf::LocationAtom litForSIMDlane = (dwarf::LocationAtom)(dwarf::DW_OP_lit0 + variablesInSingleGRF - 1);
1128+
11321129
addUInt(Block, dwarf::DW_FORM_data1, DW_OP_INTEL_push_simd_lane);
11331130
addUInt(Block, dwarf::DW_FORM_data1, litForSubReg);
11341131
addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_shr);

0 commit comments

Comments
 (0)