Add "kills MEMORY" to powerpc sti rules.
Adjust some of the loi rules (and associated moves) so we can identify
the tokens that must be in MEMORY.
With this commit, I can navigate the Enterprise even if I comment out
my work-around from e22c888.
			
			
This commit is contained in:
		
							parent
							
								
									19f0eb86a4
								
							
						
					
					
						commit
						e2ccc8f942
					
				
					 1 changed files with 86 additions and 53 deletions
				
			
		|  | @ -214,8 +214,11 @@ TOKENS | |||
| 	SEX_H              = { GPR reg; }             4. | ||||
| 	 | ||||
| 	IND_RC_B           = { GPR reg; INT off; }    4. | ||||
| 	IND_RR_B           = { GPR reg1; GPR reg2; }  4. | ||||
| 	IND_RC_H           = { GPR reg; INT off; }    4. | ||||
| 	IND_RR_H           = { GPR reg1; GPR reg2; }  4. | ||||
| 	IND_RC_H_S         = { GPR reg; INT off; }    4. | ||||
| 	IND_RR_H_S         = { GPR reg1; GPR reg2; }  4. | ||||
| 	IND_RC_W           = { GPR reg; INT off; }    4. | ||||
| 	IND_RR_W           = { GPR reg1; GPR reg2; }  4. | ||||
| 	IND_RC_D           = { GPR reg; INT off; }    8. | ||||
|  | @ -254,9 +257,16 @@ SETS | |||
| 	LOGICAL_ALL        = NOT_R + AND_RR + OR_RR + OR_RC + XOR_RR + | ||||
| 	                     XOR_RC. | ||||
| 
 | ||||
| 	/* indirect 4-byte value */ | ||||
| 	IND_ALL_W          = IND_RC_W + IND_RR_W. | ||||
| 
 | ||||
| 	/* indirect 8-byte value */ | ||||
| 	IND_ALL_D          = IND_RC_D + IND_RR_D. | ||||
| 	/* any indirect value that fits in a GPR */ | ||||
| 	IND_ALL_BHW        = IND_RC_B + IND_RR_B + IND_RC_H + IND_RR_H + | ||||
| 	                     IND_RC_H_S + IND_RR_H_S + IND_ALL_W. | ||||
| 
 | ||||
| 	/* anything killed by sti (store indirect) */ | ||||
| 	MEMORY             = IND_ALL_BHW + IND_ALL_D. | ||||
| 
 | ||||
| 	OP_ALL_W           = SUM_ALL + TRISTATE_ALL + SEX_ALL + LOGICAL_ALL + | ||||
| 	                     IND_ALL_W. | ||||
|  | @ -301,18 +311,18 @@ INSTRUCTIONS | |||
|   fsubs           FSREG:wo, FSREG:ro, FSREG:ro. | ||||
|   fmr             FPR:wo, FPR:ro. | ||||
|   fmr             FSREG:wo, FSREG:ro. | ||||
|   lbzx            GPR:wo, GPR:ro, GPR:ro. | ||||
|   lbz             GPR:wo, GPRINDIRECT:ro. | ||||
|   lbzx            GPR:wo, GPR:ro, GPR:ro. | ||||
|   lfd             FPR:wo, GPRINDIRECT:ro. | ||||
|   lfdu            FPR:wo, GPRINDIRECT:ro. | ||||
|   lfdx            FPR:wo, GPR:ro, GPR:ro. | ||||
|   lfs             FSREG:wo, GPRINDIRECT:ro. | ||||
|   lfsu            FSREG:wo, GPRINDIRECT:rw. | ||||
|   lfsx            FSREG:wo, GPR:ro, GPR:ro. | ||||
|   lhzx            GPR:wo, GPR:ro, GPR:ro. | ||||
|   lhax            GPR:wo, GPR:ro, GPR:ro. | ||||
|   lha             GPR:wo, GPRINDIRECT:ro. | ||||
|   lhax            GPR:wo, GPR:ro, GPR:ro. | ||||
|   lhz             GPR:wo, GPRINDIRECT:ro. | ||||
|   lhzx            GPR:wo, GPR:ro, GPR:ro. | ||||
|   li32            GPR:wo, LABEL:ro. | ||||
|   lwzu            GPR:wo, GPRINDIRECT:ro. | ||||
|   lwzx            GPR:wo, GPR:ro, GPR:ro. | ||||
|  | @ -420,35 +430,64 @@ MOVES | |||
| 			COMMENT("move SUM_RR->GPR") | ||||
| 			add %2, %1.reg1, %1.reg2 | ||||
| 
 | ||||
| /* Read/write byte */ | ||||
| /* Read byte */ | ||||
| 
 | ||||
| 	from IND_RC_B to GPR | ||||
| 		gen | ||||
| 			COMMENT("move IND_RC_B->GPR") | ||||
| 			lbz %2, {GPRINDIRECT, %1.reg, %1.off} | ||||
| 
 | ||||
| 	from IND_RR_B to GPR | ||||
| 		gen | ||||
| 			COMMENT("move IND_RR_B->GPR") | ||||
| 			lbzx %2, %1.reg1, %1.reg2 | ||||
| 
 | ||||
| /* Write byte */ | ||||
| 
 | ||||
| 	from GPR to IND_RC_B | ||||
| 		gen | ||||
| 			COMMENT("move GPR->IND_RC_B") | ||||
| 			stb %1, {GPRINDIRECT, %2.reg, %2.off} | ||||
| 
 | ||||
| /* Read/write halfword (short) */ | ||||
| 	from GPR to IND_RR_B | ||||
| 		gen | ||||
| 			COMMENT("move GPR->IND_RR_B") | ||||
| 			stbx %1, %2.reg1, %2.reg2 | ||||
| 
 | ||||
| /* Read halfword (short) */ | ||||
| 
 | ||||
| 	from IND_RC_H to GPR | ||||
| 		gen | ||||
| 			COMMENT("move IND_RC_H->GPR") | ||||
| 			lhz %2, {GPRINDIRECT, %1.reg, %1.off} | ||||
| 
 | ||||
| 	from IND_RR_H to GPR | ||||
| 		gen | ||||
| 			COMMENT("move IND_RR_H->GPR") | ||||
| 			lhzx %2, %1.reg1, %1.reg2 | ||||
| 
 | ||||
| 	from IND_RC_H_S to GPR | ||||
| 		gen | ||||
| 			COMMENT("move IND_RC_H_S->GPR") | ||||
| 			lha %2, {GPRINDIRECT, %1.reg, %1.off} | ||||
| 
 | ||||
| 	from IND_RR_H_S to GPR | ||||
| 		gen | ||||
| 			COMMENT("move IND_RR_H_S->GPR") | ||||
| 			lhax %2, %1.reg1, %1.reg2 | ||||
| 
 | ||||
| /* Write halfword */ | ||||
| 
 | ||||
| 	from GPR to IND_RC_H | ||||
| 		gen | ||||
| 			COMMENT("move GPR->IND_RC_H") | ||||
| 			sth %1, {GPRINDIRECT, %2.reg, %2.off} | ||||
| 
 | ||||
| 	from GPR to IND_RR_H | ||||
| 		gen | ||||
| 			COMMENT("move GPR->IND_RR_H") | ||||
| 			sthx %1, %2.reg1, %2.reg2 | ||||
| 
 | ||||
| /* Read word */ | ||||
| 
 | ||||
| 	from IND_RC_W to GPR | ||||
|  | @ -670,7 +709,7 @@ STACKINGRULES | |||
| 			move %1, RSCRATCH | ||||
| 			stwu RSCRATCH, {GPRINDIRECT, SP, 0-4} | ||||
| 			 | ||||
| 	from IND_ALL_W to STACK | ||||
| 	from IND_ALL_BHW to STACK | ||||
| 		gen | ||||
| 			move %1, RSCRATCH | ||||
| 			stwu RSCRATCH, {GPRINDIRECT, SP, 0-4} | ||||
|  | @ -771,7 +810,7 @@ COERCIONS | |||
| 			addi SP, SP, {CONST, 4} | ||||
| 		yields %a | ||||
| 		 | ||||
| 	from IND_ALL_W | ||||
| 	from IND_ALL_BHW | ||||
| 		uses REG | ||||
| 		gen | ||||
| 			move %1, %a | ||||
|  | @ -1048,54 +1087,28 @@ PATTERNS | |||
| 
 | ||||
| 	pat loi $1==INT8                   /* Load byte indirect */ | ||||
| 		with GPR | ||||
| 			uses REG | ||||
| 			gen | ||||
| 				lbz %a, {GPRINDIRECT, %1, 0} | ||||
| 			yields %a | ||||
| 			yields {IND_RC_B, %1, 0} | ||||
| 		with SUM_RR | ||||
| 			uses reusing %1, REG | ||||
| 			gen | ||||
| 				lbzx %a, %1.reg1, %1.reg2 | ||||
| 			yields %a | ||||
| 			yields {IND_RR_B, %1.reg1, %1.reg2} | ||||
| 		with SUM_RC | ||||
| 			uses REG | ||||
| 			gen | ||||
| 				move {IND_RC_B, %1.reg, %1.off}, %a | ||||
| 			yields %a | ||||
| 			yields {IND_RC_B, %1.reg, %1.off} | ||||
| 
 | ||||
| 	pat loi loc loc cii $1==INT16 && $2==INT16 && $3==INT32 /* Load half-word indirect and sign extend */ | ||||
| 	pat loi loc loc cii $1==INT16 && $2==INT16 && $3==INT32 | ||||
| 	/* Load half-word indirect and sign extend */ | ||||
| 		with GPR | ||||
| 			uses REG | ||||
| 			gen | ||||
| 				lha %a, {GPRINDIRECT, %1, 0} | ||||
| 			yields %a | ||||
| 			yields {IND_RC_H_S, %1, 0} | ||||
| 		with SUM_RR | ||||
| 			uses reusing %1, REG | ||||
| 			gen | ||||
| 				lhax %a, %1.reg1, %1.reg2 | ||||
| 			yields %a | ||||
| 			yields {IND_RR_H_S, %1.reg1, %1.reg2} | ||||
| 		with SUM_RC | ||||
| 			uses REG | ||||
| 			gen | ||||
| 				move {IND_RC_H_S, %1.reg, %1.off}, %a | ||||
| 			yields %a | ||||
| 			yields {IND_RC_H_S, %1.reg, %1.off} | ||||
| 
 | ||||
| 	pat loi $1==INT16                  /* Load half-word indirect */ | ||||
| 		with GPR | ||||
| 			uses REG | ||||
| 			gen | ||||
| 				lhz %a, {GPRINDIRECT, %1, 0} | ||||
| 			yields %a | ||||
| 			yields {IND_RC_H, %1, 0} | ||||
| 		with SUM_RR | ||||
| 			uses reusing %1, REG | ||||
| 			gen | ||||
| 				lhzx %a, %1.reg1, %1.reg2 | ||||
| 			yields %a | ||||
| 			yields {IND_RR_H, %1.reg1, %1.reg2} | ||||
| 		with SUM_RC | ||||
| 			uses REG | ||||
| 			gen | ||||
| 				move {IND_RC_H, %1.reg, %1.off}, %a | ||||
| 			yields %a | ||||
| 			yields {IND_RC_H, %1.reg, %1.off} | ||||
| 
 | ||||
| 	pat loi $1==INT32                  /* Load word indirect */ | ||||
| 		with GPR | ||||
|  | @ -1126,70 +1139,90 @@ PATTERNS | |||
| 
 | ||||
| 	pat sti $1==INT8                   /* Store byte indirect */ | ||||
| 		with GPR GPR | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				stb %2, {GPRINDIRECT, %1, 0} | ||||
| 		with SUM_RR GPR | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				stbx %2, %1.reg1, %1.reg2 | ||||
| 		with SUM_RC GPR | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2, {IND_RC_B, %1.reg, %1.off} | ||||
| 		with GPR SEX_B | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				stb %2.reg, {GPRINDIRECT, %1, 0} | ||||
| 		with SUM_RR SEX_B | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				stbx %2.reg, %1.reg1, %1.reg2 | ||||
| 		with SUM_RC SEX_B | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2.reg, {IND_RC_B, %1.reg, %1.off} | ||||
| 
 | ||||
| 	pat sti $1==INT16                  /* Store half-word indirect */ | ||||
| 		with GPR GPR | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				sth %2, {GPRINDIRECT, %1, 0} | ||||
| 		with SUM_RR GPR | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				sthx %2, %1.reg1, %1.reg2 | ||||
| 		with SUM_RC GPR | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2, {IND_RC_H, %1.reg, %1.off} | ||||
| 		with GPR SEX_H | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				sth %2.reg, {GPRINDIRECT, %1, 0} | ||||
| 		with SUM_RR SEX_H | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				sthx %2.reg, %1.reg1, %1.reg2 | ||||
| 		with SUM_RC SEX_H | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2.reg, {IND_RC_H, %1.reg, %1.off} | ||||
| 
 | ||||
| 	pat sti $1==INT32                  /* Store word indirect */ | ||||
| 		with GPR GPR+FSREG | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2, {IND_RC_W, %1, 0} | ||||
| 		with SUM_RR GPR+FSREG | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2, {IND_RR_W, %1.reg1, %1.reg2} | ||||
| 		with SUM_RC GPR+FSREG | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2, {IND_RC_W, %1.reg, %1.off} | ||||
| 
 | ||||
| 	pat sti $1==INT64                  /* Store double-word indirect */ | ||||
| 		with GPR FREG | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2, {IND_RC_D, %1, 0} | ||||
| 		with SUM_RR FREG | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2, {IND_RR_D, %1.reg1, %1.reg2} | ||||
| 		with SUM_RC FREG | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2, {IND_RC_D, %1.reg, %1.off} | ||||
| 		with GPR GPR GPR | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				stw %2, {GPRINDIRECT, %1, 0} | ||||
| 				stw %3, {GPRINDIRECT, %1, 4} | ||||
| 		with SUM_RC GPR GPR | ||||
| 			kills MEMORY | ||||
| 			gen | ||||
| 				move %2, {IND_RC_W, %1.reg, %1.off} | ||||
| 				move %3, {IND_RC_W, %1.reg, %1.off+4} | ||||
|  | @ -1199,7 +1232,7 @@ PATTERNS | |||
| 			loc $1 | ||||
| 			sts INT32 | ||||
| 
 | ||||
| 	pat sts                            /* Load arbitrary size */ | ||||
| 	pat sts                            /* Store arbitrary size */ | ||||
| 		with GPR3 GPR4 STACK | ||||
| 			kills ALL | ||||
| 			gen | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue