Optimize mr. X, X after some instructions.
				
					
				
			For example, when ncg emits
    slw r9,r8,r5
    mr. r9,r9
then top simplifies the code to
    slw. r9,r8,r5
			
			
This commit is contained in:
		
							parent
							
								
									c964eeddba
								
							
						
					
					
						commit
						5f2a7b260f
					
				
					 2 changed files with 29 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -348,7 +348,7 @@ INSTRUCTIONS
 | 
			
		|||
  or              GPR:wo, GPR:ro, GPR:ro.
 | 
			
		||||
    mr            GPR:wo, GPR:ro.
 | 
			
		||||
  orX "or."       GPR:wo:cc, GPR:ro, GPR:ro.
 | 
			
		||||
    orX_readonly "or." GPR:ro:cc, GPR:ro, GPR:ro.
 | 
			
		||||
    mrX_readonly "mr." GPR:ro:cc, GPR:ro.
 | 
			
		||||
  orc             GPR:wo, GPR:ro, GPR:ro.
 | 
			
		||||
  ori             GPR:wo, GPR:ro, CONST+LABEL_LO:ro.
 | 
			
		||||
  oris            GPR:wo, GPR:ro, CONST:ro.
 | 
			
		||||
| 
						 | 
				
			
			@ -707,15 +707,12 @@ MOVES
 | 
			
		|||
 | 
			
		||||
TESTS
 | 
			
		||||
 | 
			
		||||
	/* Given orX %1, %1, %1, ncgg says, "Instruction destroys %1,
 | 
			
		||||
	 * not allowed here".  We use orX_readonly to trick ncgg.
 | 
			
		||||
	 *
 | 
			
		||||
	 * Using "or." and not "mr." because mach/powerpc/top/table
 | 
			
		||||
	 * was optimizing "or." and not "mr.".
 | 
			
		||||
	/* Given "mrX %1, %1", ncgg would say, "Instruction destroys
 | 
			
		||||
	 * %1, not allowed here".  We use mrX_readonly to trick ncgg.
 | 
			
		||||
	 */
 | 
			
		||||
	to test GPR
 | 
			
		||||
		gen
 | 
			
		||||
			orX_readonly %1, %1, %1
 | 
			
		||||
			mrX_readonly %1, %1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
STACKINGRULES
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
 | 
			
		||||
/* PowerPC desciptor table for ACK target optimizer */
 | 
			
		||||
/* PowerPC table for ACK target optimizer */
 | 
			
		||||
 | 
			
		||||
MAXOP 3;
 | 
			
		||||
LABEL_STARTER '.';
 | 
			
		||||
| 
						 | 
				
			
			@ -16,10 +16,33 @@ X, Y, Z             { TRUE };
 | 
			
		|||
addi  RNZ, RNZ, 0            -> ;
 | 
			
		||||
addis RNZ, RNZ, 0            -> ;
 | 
			
		||||
 | 
			
		||||
or X, Y, Y                   -> mr X, Y ;
 | 
			
		||||
or. X, Y, Y                  -> mr. X, Y ;
 | 
			
		||||
 | 
			
		||||
mr X, X                      -> ;
 | 
			
		||||
fmr X, X                     -> ;
 | 
			
		||||
 | 
			
		||||
or X, Y, Z : or. X, X, X     -> or. X, Y, Z ;
 | 
			
		||||
add X, Y, Z   : mr. X, X     -> add. X, Y, Z ;
 | 
			
		||||
and X, Y, Z   : mr. X, X     -> and. X, Y, Z ;
 | 
			
		||||
andc X, Y, Z  : mr. X, X     -> andc. X, Y, Z ;
 | 
			
		||||
divw X, Y, Z  : mr. X, X     -> divw. X, Y, Z ;
 | 
			
		||||
divwu X, Y, Z : mr. X, X     -> divwu. X, Y, Z ;
 | 
			
		||||
extsb X, Y, Z : mr. X, X     -> extsb. X, Y, Z ;
 | 
			
		||||
extsh X, Y, Z : mr. X, X     -> extsh. X, Y, Z ;
 | 
			
		||||
eqv X, Y, Z   : mr. X, X     -> eqv. X, Y, Z ;
 | 
			
		||||
mullw X, Y, Z : mr. X, X     -> mullw. X, Y, Z ;
 | 
			
		||||
nand X, Y, Z  : mr. X, X     -> nand. X, Y, Z ;
 | 
			
		||||
nor X, Y, Z   : mr. X, X     -> nor. X, Y, Z ;
 | 
			
		||||
or X, Y, Z    : mr. X, X     -> or. X, Y, Z ;
 | 
			
		||||
orc X, Y, Z   : mr. X, X     -> orc. X, Y, Z ;
 | 
			
		||||
slw X, Y, Z   : mr. X, X     -> slw. X, Y, Z ;
 | 
			
		||||
slwi X, Y, Z  : mr. X, X     -> slwi. X, Y, Z ;
 | 
			
		||||
subf X, Y, Z  : mr. X, X     -> subf. X, Y, Z ;
 | 
			
		||||
sraw X, Y, Z  : mr. X, X     -> sraw. X, Y, Z ;
 | 
			
		||||
srawi X, Y, Z : mr. X, X     -> srawi. X, Y, Z ;
 | 
			
		||||
srw X, Y, Z   : mr. X, X     -> srw. X, Y, Z ;
 | 
			
		||||
srwi X, Y, Z  : mr. X, X     -> srwi. X, Y, Z ;
 | 
			
		||||
xor X, Y, Z   : mr. X, X     -> xor. X, Y, Z ;
 | 
			
		||||
 | 
			
		||||
b X : labdef X               -> labdef X ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue