@@ -1103,32 +1103,29 @@ void CompileUnit::addSimdLane(DIEBlock* Block, DbgVariable& DV, VISAVariableLoca
1103
1103
// 11 DW_OP_const1u 16 or 8
1104
1104
// 12 DW_OP_INTEL_piece_stack
1105
1105
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)
1128
1113
{
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++ ;
1131
1116
}
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
+
1132
1129
addUInt (Block, dwarf::DW_FORM_data1, DW_OP_INTEL_push_simd_lane);
1133
1130
addUInt (Block, dwarf::DW_FORM_data1, litForSubReg);
1134
1131
addUInt (Block, dwarf::DW_FORM_data1, dwarf::DW_OP_shr);
0 commit comments