@@ -12557,28 +12557,57 @@ unsigned GraphColor::edgeWeightARF(const LiveRange *lr1, const LiveRange *lr2) {
1255712557 unsigned lr1_nreg = lr1->getNumRegNeeded ();
1255812558 unsigned lr2_nreg = lr2->getNumRegNeeded ();
1255912559
12560+ if (lr1_align < lr2_align) {
12561+ G4_SubReg_Align tmp_align = lr1_align;
12562+ unsigned tmp_nreg = lr1_nreg;
12563+ lr1_align = lr2_align;
12564+ lr2_align = tmp_align;
12565+ lr1_nreg = lr2_nreg;
12566+ lr2_nreg = tmp_nreg;
12567+ }
12568+
1256012569 if (lr1_align == Any) {
12570+ // Any vs
1256112571 return lr1_nreg + lr2_nreg - 1 ;
1256212572 } else if (lr1_align == Four_Word && lr2_align == Any) {
12573+ // 4 vs Any
1256312574 return lr1_nreg + lr2_nreg + 3 - (lr1_nreg + lr2_nreg) % 4 ;
1256412575 } else if (lr1_align == Four_Word && lr2_align == Four_Word) {
12576+ // 4 vs 4
1256512577 return lr1_nreg + lr2_nreg - 1 + (4 - lr1_nreg % 4 ) % 4 +
1256612578 (4 - lr2_nreg % 4 ) % 4 ;
12567- } else if (lr1_align == Four_Word && lr2_align == Eight_Word) {
12568- if (((8 - lr2_nreg % 8 ) % 8 ) >= 4 )
12569- return lr2_nreg + lr1_nreg - 1 + (8 - lr2_nreg % 8 ) % 8 - 4 ;
12570- return lr1_nreg + lr2_nreg - 1 + (8 - lr2_nreg % 8 ) % 8 +
12571- (4 - lr1_nreg % 4 ) % 4 ;
1257212579 } else if (lr1_align == Eight_Word && lr2_align == Any) {
12580+ // 8 vs Any
1257312581 return lr1_nreg + lr2_nreg + 7 - (lr1_nreg + lr2_nreg) % 8 ;
1257412582 } else if (lr1_align == Eight_Word && lr2_align == Four_Word) {
12583+ // 8 vs 4
1257512584 if (((8 - lr1_nreg % 8 ) % 8 ) >= 4 )
1257612585 return lr1_nreg + lr2_nreg - 1 + (8 - lr1_nreg % 8 ) % 8 - 4 ;
1257712586 return lr1_nreg + lr2_nreg - 1 + (8 - lr1_nreg % 8 ) % 8 +
1257812587 (4 - lr2_nreg % 4 ) % 4 ;
1257912588 } else if (lr1_align == Eight_Word && lr2_align == Eight_Word) {
12589+ // 8 vs 8
1258012590 return lr1_nreg + lr2_nreg - 1 + (8 - lr1_nreg % 8 ) % 8 +
1258112591 (8 - lr2_nreg % 8 ) % 8 ;
12592+ } else if (lr1_align == Sixteen_Word && lr2_align == Any) {
12593+ // 16 vs Any
12594+ return lr1_nreg + lr2_nreg + 15 - (lr1_nreg + lr2_nreg) % 16 ;
12595+ } else if (lr1_align == Sixteen_Word && lr2_align == Four_Word) {
12596+ // 16 vs 4
12597+ if (((16 - lr1_nreg % 16 ) % 16 ) >= 4 )
12598+ return lr1_nreg + lr2_nreg - 1 + (16 - lr1_nreg % 16 ) % 16 - 4 ;
12599+ return lr1_nreg + lr2_nreg - 1 + (16 - lr1_nreg % 16 ) % 16 +
12600+ (4 - lr2_nreg % 4 ) % 4 ;
12601+ } else if (lr1_align == Sixteen_Word && lr2_align == Eight_Word) {
12602+ // 16 vs 8
12603+ if (((16 - lr1_nreg % 16 ) % 16 ) >= 8 )
12604+ return lr1_nreg + lr2_nreg - 1 + (16 - lr1_nreg % 16 ) % 16 - 8 ;
12605+ return lr1_nreg + lr2_nreg - 1 + (16 - lr1_nreg % 16 ) % 16 +
12606+ (8 - lr2_nreg % 8 ) % 8 ;
12607+ } else if (lr1_align == Sixteen_Word && lr2_align == Sixteen_Word) {
12608+ // 16 vs 16
12609+ return lr1_nreg + lr2_nreg - 1 + (16 - lr1_nreg % 16 ) % 16 +
12610+ (16 - lr2_nreg % 16 ) % 16 ;
1258212611 } else {
1258312612 vISA_ASSERT_UNREACHABLE (
1258412613 " Found unsupported subRegAlignment in address register allocation!" );
0 commit comments