Changeset 601
- Timestamp:
- 08/05/10 21:21:50 (14 years ago)
- Author:
- walter
- Message:
bugzilla 4443 Optimizer produces wrong code for
or && with struct arrays
- 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
r596 r601 342 342 case 40: ss = 2; ss2 = 3; break; 343 343 case 18: ss = 3; break; 344 344 case 36: ss = 3; ss2 = 2; break; 345 345 case 72: ss = 3; ss2 = 3; break; 346 346 default: 347 347 ss2 = 0; 348 348 goto L13; 349 349 } 350 350 } 351 351 freenode(e11->E2); 352 352 freenode(e11); 353 353 e11 = e11->E1; 354 354 goto L13; 355 355 } 356 356 else 357 357 { 358 358 L13: 359 359 regm_t regm; 360 360 if (e11->Eoper == OPvar && isregvar(e11,®m,®1)) 361 361 { 362 retregs = regm; 362 if (tysize[tybasic(e11->Ety)]<= REGSIZE) 363 retregs = mask[reg1]; // only want the LSW 364 else 365 retregs = regm; 363 366 c1 = NULL; 364 367 freenode(e11); 365 368 } 366 369 else 367 370 c1 = codelem(e11,&retregs,FALSE); 368 371 } 369 372 rretregs = ALLREGS & ~retregs; 370 373 c2 = scodelem(ebase,&rretregs,retregs,TRUE); 371 374 { 372 375 regm_t sregs = *pretregs & ~rretregs; 373 376 if (!sregs) 374 377 sregs = ALLREGS & ~rretregs; 375 378 c3 = allocreg(&sregs,®,ty); 376 379 } 380 381 assert((retregs & (retregs - 1)) == 0); // must be only one register 382 assert((rretregs & (rretregs - 1)) == 0); // must be only one register 377 383 378 384 reg1 = findreg(retregs); 379 385 reg2 = findreg(rretregs); 380 386 381 387 if (ss2) 382 388 { 383 389 assert(reg != reg2); 384 390 if (reg1 == BP) 385 391 { static unsigned imm32[4] = {1+1,2+1,4+1,8+1}; 386 392 387 393 // IMUL reg,imm32 388 394 c = genc2(CNIL,0x69,modregxrm(3,reg,BP),imm32[ss]); 389 395 } 390 396 else 391 397 { // LEA reg,[reg1*ss][reg1] 392 398 c = gen2sib(CNIL,0x8D,modregxrm(0,reg,4),modregrm(ss,reg1 & 7,reg1 & 7)); 393 399 if (reg1 & 8) 394 400 code_orrex(c, REX_X | REX_B); 395 401 } 396 402 reg1 = reg; trunk/src/backend/cod2.c
r596 r601 342 342 case 40: ss = 2; ss2 = 3; break; 343 343 case 18: ss = 3; break; 344 344 case 36: ss = 3; ss2 = 2; break; 345 345 case 72: ss = 3; ss2 = 3; break; 346 346 default: 347 347 ss2 = 0; 348 348 goto L13; 349 349 } 350 350 } 351 351 freenode(e11->E2); 352 352 freenode(e11); 353 353 e11 = e11->E1; 354 354 goto L13; 355 355 } 356 356 else 357 357 { 358 358 L13: 359 359 regm_t regm; 360 360 if (e11->Eoper == OPvar && isregvar(e11,®m,®1)) 361 361 { 362 retregs = regm; 362 if (tysize[tybasic(e11->Ety)]<= REGSIZE) 363 retregs = mask[reg1]; // only want the LSW 364 else 365 retregs = regm; 363 366 c1 = NULL; 364 367 freenode(e11); 365 368 } 366 369 else 367 370 c1 = codelem(e11,&retregs,FALSE); 368 371 } 369 372 rretregs = ALLREGS & ~retregs; 370 373 c2 = scodelem(ebase,&rretregs,retregs,TRUE); 371 374 { 372 375 regm_t sregs = *pretregs & ~rretregs; 373 376 if (!sregs) 374 377 sregs = ALLREGS & ~rretregs; 375 378 c3 = allocreg(&sregs,®,ty); 376 379 } 380 381 assert((retregs & (retregs - 1)) == 0); // must be only one register 382 assert((rretregs & (rretregs - 1)) == 0); // must be only one register 377 383 378 384 reg1 = findreg(retregs); 379 385 reg2 = findreg(rretregs); 380 386 381 387 if (ss2) 382 388 { 383 389 assert(reg != reg2); 384 390 if (reg1 == BP) 385 391 { static unsigned imm32[4] = {1+1,2+1,4+1,8+1}; 386 392 387 393 // IMUL reg,imm32 388 394 c = genc2(CNIL,0x69,modregxrm(3,reg,BP),imm32[ss]); 389 395 } 390 396 else 391 397 { // LEA reg,[reg1*ss][reg1] 392 398 c = gen2sib(CNIL,0x8D,modregxrm(0,reg,4),modregrm(ss,reg1 & 7,reg1 & 7)); 393 399 if (reg1 & 8) 394 400 code_orrex(c, REX_X | REX_B); 395 401 } 396 402 reg1 = reg;
Download in other formats:
© Copyright 2004-2024 - The Sankaty Group, Inc. All rights reserved.
