Untitled Diff

Erstellt Diff läuft nie ab
75 Entfernungen
100 Zeilen
73 Hinzufügungen
99 Zeilen
RefPosition *__fastcall LinearScan::BuildUse(
RefPosition *__fastcall LinearScan::BuildUse(
LinearScan *this,
LinearScan *this,
GenTree *operand,
GenTree *operand,
unsigned int candidates,
unsigned int candidates,
unsigned int multiRegIdx)
unsigned int multiRegIdx)
{
{
unsigned __int8 gtLIRFlags; // di
unsigned __int8 gtLIRFlags; // r14
GenTree *theTreeNode; // r11
GenTree *theTreeNode; // rdi
genTreeOps gtOper; // dl
genTreeOps gtOper; // dl
char v8; // di
char v8; // r14
Compiler *v10; // rsi
Compiler *v11; // r9
__int64 v11; // rcx
__int64 v12; // rcx
LclVarDsc *lvaTable; // r8
LclVarDsc *lvaTable; // r8
Interval *v13; // rbx
Interval *v14; // rsi
unsigned __int64 v14; // rcx
unsigned __int64 v15; // rcx
unsigned __int64 *v16; // r8
GenTreeFlags gtFlags; // r8d
Compiler *compiler; // r9
__int64 lvVarIndex; // r10
unsigned __int64 *currentLiveVars; // r8
unsigned __int64 *currentLiveVars; // r8
__int64 lvVarIndex; // rdx
GenTreeFlags gtFlags; // r8d
Compiler *compiler; // rsi
RefInfoListNode *m_head; // rdx
RefInfoListNode *m_head; // rdx
RefInfoListNode *v20; // r8
RefInfoListNode *v22; // r8
RefInfoListNode *m_next; // rax
RefInfoListNode *m_next; // rax
Interval **ref; // rax
Interval **ref; // rax
RefPosition *result; // rax
RefPosition *result; // rax


gtLIRFlags = operand->gtLIRFlags;
gtLIRFlags = operand->gtLIRFlags;
theTreeNode = operand;
theTreeNode = operand;
gtOper = operand->gtOper;
gtOper = operand->gtOper;
v8 = gtLIRFlags >> 2;
v8 = gtLIRFlags >> 2;
if ( (unsigned __int8)(gtOper - 2) > 4u
if ( (unsigned __int8)(gtOper - 2) > 4u
|| (v10 = this->compiler,
|| (v11 = this->compiler,
v11 = *(unsigned int *)&theTreeNode[1]._gtRegNum,
v12 = *(unsigned int *)&theTreeNode[1]._gtRegNum,
lvaTable = v10->lvaTable,
lvaTable = v11->lvaTable,
*((char *)&lvaTable[v11] + 4) >= 0) )
*((char *)&lvaTable[v12] + 4) >= 0) )
{
{
if ( ((gtOper - 3) & 0xFD) == 0 && (theTreeNode->gtFlags & 0x2000000) != 0 )
if ( ((gtOper - 3) & 0xFD) != 0 || (theTreeNode->gtFlags & 0x2000000) == 0 )
{
m_head = this->defList.m_head;
v22 = 0i64;
if ( !m_head )
LABEL_26:
noWayAssertBody();
while ( m_head->treeNode != theTreeNode || ((*((unsigned __int8 *)m_head->ref + 37) >> 1) & 3) != multiRegIdx )
{
v22 = m_head;
m_head = m_head->m_next;
if ( !m_head )
goto LABEL_26;
}
m_next = m_head->m_next;
if ( v22 )
v22->m_next = m_next;
else
this->defList.m_head = m_next;
if ( !m_next )
this->defList.m_tail = v22;
ref = (Interval **)m_head->ref;
theTreeNode = 0i64;
m_head->m_next = 0i64;
v14 = *ref;
m_head->m_next = this->listNodePool.m_freeList;
this->listNodePool.m_freeList = m_head;
}
else
{
{
compiler = this->compiler;
compiler = this->compiler;
lvVarIndex = compiler->lvaTable[multiRegIdx
lvVarIndex = compiler->lvaTable[multiRegIdx
+ compiler->lvaTable[*(unsigned int *)&theTreeNode[1]._gtRegNum].lvFieldLclStart].lvVarIndex;
+ compiler->lvaTable[*(unsigned int *)&theTreeNode[1]._gtRegNum].lvFieldLclStart].lvVarIndex;
v13 = this->localVarIntervals[lvVarIndex];
v14 = this->localVarIntervals[lvVarIndex];
gtFlags = theTreeNode->gtFlags;
gtFlags = theTreeNode->gtFlags;
if ( !_bittest((const int *)&gtFlags, (unsigned __int8)(multiRegIdx + 26)) )
if ( _bittest((const int *)&gtFlags, (unsigned __int8)(multiRegIdx + 26)) )
goto LABEL_23;
{
v14 = compiler->lvaTable[multiRegIdx
currentLiveVars = this->currentLiveVars;
+ compiler->lvaTable[*(unsigned int *)&theTreeNode[1]._gtRegNum].lvFieldLclStart].lvVarIndex;
if ( compiler->lvaTrackedCountInSizeTUnits > 1 )
currentLiveVars = this->currentLiveVars;
currentLiveVars[(unsigned __int64)(unsigned int)lvVarIndex >> 6] &= ~(1i64 << (lvVarIndex & 0x3F));
if ( compiler->lvaTrackedCountInSizeTUnits > 1 )
else
goto LABEL_6;
this->currentLiveVars = (unsigned __int64 *)((unsigned __int64)currentLiveVars & ~(1i64 << lvVarIndex));
goto LABEL_11;
}
}
m_head = this->defList.m_head;
v20 = 0i64;
if ( !m_head )
LABEL_24:
noWayAssertBody();
while ( m_head->treeNode != theTreeNode || ((*((unsigned __int8 *)m_head->ref + 37) >> 1) & 3) != multiRegIdx )
{
v20 = m_head;
m_head = m_head->m_next;
if ( !m_head )
goto LABEL_24;
}
}
m_next = m_head->m_next;
if ( v20 )
v20->m_next = m_next;
else
this->defList.m_head = m_next;
if ( !m_next )
this->defList.m_tail = v20;
ref = (Interval **)m_head->ref;
theTreeNode = 0i64;
m_head->m_next = 0i64;
v13 = *ref;
m_head->m_next = this->listNodePool.m_freeList;
this->listNodePool.m_freeList = m_head;
}
}
else
else
{
{
v13 = this->localVarIntervals[lvaTable[v11].lvVarIndex];
v14 = this->localVarIntervals[lvaTable[v12].lvVarIndex];
if ( (theTreeNode->gtFlags & 0x4000000) != 0 )
if ( (theTreeNode->gtFlags & 0x4000000) != 0 )
{
{
v14 = lvaTable[v13->varNum].lvVarIndex;
v15 = lvaTable[v14->varNum].lvVarIndex;
currentLiveVars = this->currentLiveVars;
v16 = this->currentLiveVars;
if ( v10->lvaTrackedCountInSizeTUnits > 1 )
if ( v11->lvaTrackedCountInSizeTUnits > 1 )
{
v16[v15 >> 6] &= ~(1i64 << (v15 & 0x3F));
LOBYTE(lvVarIndex) = v14;
else
LABEL_6:
this->currentLiveVars = (unsigned __int64 *)((unsigned __int64)v16 & ~(1i64 << v15));
currentLiveVars[v14 >> 6] &= ~(1i64 << (lvVarIndex & 0x3F));
LinearScan::UpdatePreferencesOfDyingLocal(this, v14);
goto LABEL_23;
}
LABEL_11:
this->currentLiveVars = (unsigned __int64 *)((unsigned __int64)currentLiveVars & ~(1i64 << v14));
}
}
}
}
LABEL_23:
result = LinearScan::newRefPosition(this, v14, this->currentLoc, RefTypeUse, theTreeNode, candidates, multiRegIdx);
result = LinearScan::newRefPosition(this, v13, this->currentLoc, RefTypeUse, theTreeNode, candidates, multiRegIdx);
*((_BYTE *)result + 37) ^= (*((_BYTE *)result + 37) ^ v8) & 1;
*((_BYTE *)result + 37) ^= (*((_BYTE *)result + 37) ^ v8) & 1;
return result;
return result;
}
}