Changeset 832
- Timestamp:
- 01/01/11 07:15:25 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/backend/cod2.c (modified) (1 diff)
- trunk/src/backend/cod2.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/cod2.c
r831 r832 574 574 rretregs &= BYTEREGS; 575 575 576 576 cr = scodelem(e2,&rretregs,retregs,TRUE); /* get rvalue */ 577 577 rreg = (tysize[ty2] > REGSIZE) ? findreglsw(rretregs) : findreg(rretregs); 578 578 c = CNIL; 579 579 if (numwords == 1) /* ADD reg,rreg */ 580 580 { 581 581 /* reverse operands to avoid moving around the segment value */ 582 582 if (tysize[ty2] > REGSIZE) 583 583 { c = cat(c,getregs(rretregs)); 584 584 c = genregs(c,op1,rreg,reg); 585 585 retregs = rretregs; /* reverse operands */ 586 586 } 587 587 else 588 588 { c = genregs(c,op1,reg,rreg); 589 589 if (!I16 && *pretregs & mPSW) 590 590 c->Iflags |= word; 591 591 } 592 592 if (I64 && sz == 8) 593 593 code_orrex(c, REX_W); 594 if (I64 && byte && reg >= 4)594 if (I64 && byte && (reg >= 4 || rreg >= 4)) 595 595 code_orrex(c, REX); 596 596 } 597 597 else /* numwords == 2 */ /* ADD lsreg,lsrreg */ 598 598 { 599 599 reg = findreglsw(retregs); 600 600 rreg = findreglsw(rretregs); 601 601 c = genregs(c,op1,reg,rreg); 602 602 if (e->Eoper == OPadd || e->Eoper == OPmin) 603 603 code_orflag(c,CFpsw); 604 604 reg = findregmsw(retregs); 605 605 rreg = findregmsw(rretregs); 606 606 if (!(e2oper == OPu16_32 && // if second operand is 0 607 607 (op2 == 0x0B || op2 == 0x33)) // and OR or XOR 608 608 ) 609 609 genregs(c,op2,reg,rreg); // ADC msreg,msrreg 610 610 } 611 611 break; 612 612 613 613 case OPrelconst: 614 614 if (sz != REGSIZE) trunk/src/backend/cod2.c
r831 r832 574 574 rretregs &= BYTEREGS; 575 575 576 576 cr = scodelem(e2,&rretregs,retregs,TRUE); /* get rvalue */ 577 577 rreg = (tysize[ty2] > REGSIZE) ? findreglsw(rretregs) : findreg(rretregs); 578 578 c = CNIL; 579 579 if (numwords == 1) /* ADD reg,rreg */ 580 580 { 581 581 /* reverse operands to avoid moving around the segment value */ 582 582 if (tysize[ty2] > REGSIZE) 583 583 { c = cat(c,getregs(rretregs)); 584 584 c = genregs(c,op1,rreg,reg); 585 585 retregs = rretregs; /* reverse operands */ 586 586 } 587 587 else 588 588 { c = genregs(c,op1,reg,rreg); 589 589 if (!I16 && *pretregs & mPSW) 590 590 c->Iflags |= word; 591 591 } 592 592 if (I64 && sz == 8) 593 593 code_orrex(c, REX_W); 594 if (I64 && byte && reg >= 4)594 if (I64 && byte && (reg >= 4 || rreg >= 4)) 595 595 code_orrex(c, REX); 596 596 } 597 597 else /* numwords == 2 */ /* ADD lsreg,lsrreg */ 598 598 { 599 599 reg = findreglsw(retregs); 600 600 rreg = findreglsw(rretregs); 601 601 c = genregs(c,op1,reg,rreg); 602 602 if (e->Eoper == OPadd || e->Eoper == OPmin) 603 603 code_orflag(c,CFpsw); 604 604 reg = findregmsw(retregs); 605 605 rreg = findregmsw(rretregs); 606 606 if (!(e2oper == OPu16_32 && // if second operand is 0 607 607 (op2 == 0x0B || op2 == 0x33)) // and OR or XOR 608 608 ) 609 609 genregs(c,op2,reg,rreg); // ADC msreg,msrreg 610 610 } 611 611 break; 612 612 613 613 case OPrelconst: 614 614 if (sz != REGSIZE)
