925 lines
		
	
	
	
		
			30 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			925 lines
		
	
	
	
		
			30 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
/* ARM DESCRIPTOR TABLE FOR ACK TARGET OPTIMISER */
 | 
						|
 | 
						|
MAXOP           5;
 | 
						|
MAXLINELEN      50;
 | 
						|
 
 | 
						|
%%;
 | 
						|
 
 | 
						|
ZERO			{strcmp(VAL,"#0") ==0};
 | 
						|
CONST,C1,C2,C3,C4 	{VAL[0] == '#'};
 | 
						|
REG,REG1,REG2		{is_register(VAL)};
 | 
						|
LAB			{VAL[0] == 'I'};
 | 
						|
LL,X,Y,Z,W,LOG1,LOG2	{TRUE};
 | 
						|
XX			{no_side_effects(VAL)};
 | 
						|
YY,ZZ,VV,WW		{TRUE};
 | 
						|
RL11			{is_reglist_11(VAL)};
 | 
						|
RL1,RL2,RL3,RL4		{is_reglist1(VAL)};
 | 
						|
RL13			{is_local(VAL)};
 | 
						|
X1,X2,Y1,Y2,Z1,Z2,V1,V2 {TRUE};
 | 
						|
 | 
						|
%%;
 | 
						|
 
 | 
						|
/* save space */
 | 
						|
ADD REG,REG,ZERO			   -> ;
 | 
						|
MOV REG, REG				   -> ;
 | 
						|
STMFD R12<,X:LDMFD R12<,X		   -> ;
 | 
						|
CMP REG,REG:BNE X1			   -> ;
 | 
						|
MOV REG,ZERO : ADD REG,REG,CONST	   -> MOV REG,CONST;
 | 
						|
STR REG,XX,Y : LDR REG,XX,Y		   -> STR REG,XX,Y;
 | 
						|
LDR REG,XX,Y: STMFD R12<,Z:LDR REG,XX,Y	   -> LDR REG,XX,Y : STMFD R12<,Z;
 | 
						|
LDR REG,XX,Y: STMFD R12<,Z,W:LDR REG,XX,Y  -> LDR REG,XX,Y : STMFD R12<,Z,W;
 | 
						|
STR REG,XX : LDR REG,XX			   -> STR REG,XX;
 | 
						|
LDR REG,XX : STMFD R12<,Z:LDR REG,XX	   -> LDR REG,XX : STMFD R12<,Z;
 | 
						|
LDR REG,XX : STMFD R12<,Z,W:LDR REG,XX     -> LDR REG,XX : STMFD R12<,Z,W;
 | 
						|
MOV REG, #-2147483648:RSB REG,REG,ZERO	   -> MOV REG,#-2147483648;
 | 
						|
ADD R12,X,Y : MOV R12,R13		   -> MOV R12,R13;
 | 
						|
MOV R11,REG:STMFD R12<,R11		   -> STMFD R12<,REG;
 | 
						|
MOV REG,ZERO:MOV REG1,REG,LSR#8:
 | 
						|
SUB REG,REG,REG1,LSL#8			   -> MOV REG,ZERO;
 | 
						|
 | 
						|
/* conditionals */
 | 
						|
SUB.S REG,X,Y : CMP REG,ZERO               -> SUB.S REG,X,Y;
 | 
						|
ADD.S REG,X,Y : CMP REG,ZERO               -> ADD.S REG,X,Y;
 | 
						|
ORR.S REG,X,Y : CMP REG,ZERO               -> ORR.S REG,X,Y;
 | 
						|
AND.S REG,X,Y : CMP REG,ZERO               -> AND.S REG,X,Y;
 | 
						|
EOR.S REG,X,Y : CMP REG,ZERO               -> EOR.S REG,X,Y;
 | 
						|
 
 | 
						|
SUB REG,X,Y : CMP REG,ZERO                 -> SUB.S REG,X,Y;
 | 
						|
ADD REG,X,Y : CMP REG,ZERO                 -> ADD.S REG,X,Y;
 | 
						|
ORR REG,X,Y : CMP REG,ZERO                 -> ORR.S REG,X,Y;
 | 
						|
AND REG,X,Y : CMP REG,ZERO                 -> AND.S REG,X,Y;
 | 
						|
EOR REG,X,Y : CMP REG,ZERO                 -> EOR.S REG,X,Y;
 | 
						|
 
 | 
						|
/* speed increase */
 | 
						|
STR REG,XX,Y : LDR REG1,XX,Y
 | 
						|
	{is_unequal(REG,REG1)}		   -> STR REG,XX,Y : MOV REG1,REG;
 | 
						|
LDR REG,XX,Y : LDR REG1,XX,Y
 | 
						|
	{is_unequal(REG,REG1)}		   -> LDR REG,XX,Y : MOV REG1,REG;
 | 
						|
STR REG,X    : LDR REG1,X
 | 
						|
	{is_unequal(REG,REG1)}		   -> STR REG,X    : MOV REG1,REG;
 | 
						|
LDR REG,X    : LDR REG1,X
 | 
						|
	{is_unequal(REG,REG1)}		   -> LDR REG,X    : MOV REG1,REG;
 | 
						|
 | 
						|
LDR REG,XX,Y : STR REG,Z,W : LDR REG,XX,Y  -> LDR REG,XX,Y : STR REG,Z,W;
 | 
						|
LDR REG,X    : STR REG,Z,W : LDR REG,X	   -> LDR REG,X    : STR REG,Z,W;
 | 
						|
 | 
						|
MOV REG,C1   :STMFD R12<,X,Y : MOV REG,C1  -> MOV REG,C1   : STMFD R12<,X,Y;
 | 
						|
MOV REG,C1   :STR REG,X,Y    : MOV REG,C1  -> MOV REG,C1   : STR REG,X,Y;
 | 
						|
MOV REG,C1   :STR REG,X      : MOV REG,C1  -> MOV REG,C1   : STR REG,X;
 | 
						|
 | 
						|
MOV REG, ZERO: ADD REG1,REG1,REG	   -> MOV REG,ZERO;
 | 
						|
MOV REG, ZERO: ADD REG,REG,CONST	   -> MOV REG,CONST;
 | 
						|
 | 
						|
/* for loops */
 | 
						|
LDR REG,XX,Y:CMP REG,Z:
 | 
						|
BEQ LAB:LDR REG,XX,Y			   -> LDR REG,XX,Y:CMP REG,Z:BEQ LAB;
 | 
						|
 
 | 
						|
/* illegal constant optimisation */
 | 
						|
MOV REG,CONST: RSB REG1,REG,#0 
 | 
						|
	{is_byte(CONST,LOG1)}		   -> MVN REG1,#LOG1;
 | 
						|
 | 
						|
MOV REG,CONST:ADD REG,REG,#65280:
 | 
						|
ADD REG,REG,#16711680:
 | 
						|
ADD REG,REG,#-16777216
 | 
						|
	{is_byte2(CONST,LOG1,LOG2)}	   -> MOV REG,#LOG1:
 | 
						|
					      MOV REG,REG,ASR#LOG2;
 | 
						|
 | 
						|
MOV REG,CONST:ADD REG,REG,#65280:
 | 
						|
ADD REG,REG,#16711680:
 | 
						|
ADD REG,REG,#-16777216:
 | 
						|
ADD REG1,REG1,REG
 | 
						|
	{is_byte2(CONST,LOG1,LOG2) && is_unequal(REG1,REG)}
 | 
						|
					   -> MOV REG,#LOG1:
 | 
						|
					      ADD REG1,REG1,REG,ASR#LOG2;
 | 
						|
 | 
						|
/* combine ldm's and stm's */
 | 
						|
STMFD R12<, RL1: STMFD R12<, RL2
 | 
						|
	{is_greater(RL1,RL2,W)}		   -> STMFD R12<,W;
 | 
						|
LDMFD R12<, RL1: LDMFD R12<, RL2
 | 
						|
	{is_greater(RL2,RL1,W)}		   -> LDMFD R12<,W;
 | 
						|
 | 
						|
/* unsigned comparisons */
 | 
						|
/*MOV.HI REG, #-1:MOV.LS REG, #1:
 | 
						|
MOV.EQ REG, #0:CMP REG, #0:BGT LAB	   -> BLS LAB;
 | 
						|
*/
 | 
						|
MOV.HI REG, #-1:MOV.LS REG, #1:
 | 
						|
MOV.EQ REG, #0:CMP REG, #0:BGE LAB	   -> BLS LAB /*: BEQ LAB */ ;
 | 
						|
MOV.HI REG, #-1:MOV.LS REG, #1:
 | 
						|
MOV.EQ REG, #0:CMP REG, #0:BLE LAB	   -> BHI LAB: BEQ LAB;
 | 
						|
MOV.HI REG, #-1:MOV.LS REG, #1:
 | 
						|
MOV.EQ REG, #0:CMP REG, #0:BLT LAB	   -> BHI LAB;
 | 
						|
 | 
						|
MOV.HI REG, #1:MOV.LS REG, #-1:
 | 
						|
MOV.EQ REG, #0:CMP REG, #0:BGT LAB	   -> BHI LAB;
 | 
						|
MOV.HI REG, #1:MOV.LS REG, #-1:
 | 
						|
MOV.EQ REG, #0:CMP REG, #0:BGE LAB	   -> BHI LAB: BEQ LAB;
 | 
						|
MOV.HI REG, #1:MOV.LS REG, #-1:
 | 
						|
MOV.EQ REG, #0:CMP REG, #0:BLE LAB	   -> BLS LAB /*: BEQ LAB */ ;
 | 
						|
/*
 | 
						|
MOV.HI REG, #1:MOV.LS REG, #-1:
 | 
						|
MOV.EQ REG, #0:CMP REG, #0:BLT LAB	   -> BLS LAB;
 | 
						|
*/
 | 
						|
 | 
						|
MOV REG,REG1:RSB REG,REG,ZERO
 | 
						|
	{is_unequal(REG,REG1)}		   -> RSB REG,REG1,ZERO;
 | 
						|
 | 
						|
MOV REG,REG1:AND REG,REG,REG2
 | 
						|
	{is_unequal3(REG,REG1,REG2)}	   -> AND REG,REG1,REG2;
 | 
						|
MOV REG,REG1:ORR REG,REG,REG2
 | 
						|
	{is_unequal3(REG,REG1,REG2)}	   -> ORR REG,REG1,REG2;
 | 
						|
MOV REG,REG1:EOR REG,REG,REG2
 | 
						|
	{is_unequal3(REG,REG1,REG2)}	   -> EOR REG,REG1,REG2;
 | 
						|
 | 
						|
/* combine successive pushes into one single multiple push */
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
ADD R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1,X2 : ADD R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
ADD R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1    : ADD R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
	{is_lams(ANY) && list_f_10(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
/* three push sequences */
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
/* four push sequences */
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : SUB R10,Y1,Y2 : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : LDR R10,Y1,Y2 : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1    : MOV R10,Y1    : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : SUB R10,Y1,Y2 : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,Y1,Y2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : LDR R10,Y1,Y2 : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,Z1,Z2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
ANY R11,X1,X2 : STMFD R12<,RL11 :
 | 
						|
MOV R11,Y1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,Z1    : STMFD R12<,RL11 :
 | 
						|
MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
 | 
						|
{ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
 | 
						|
ANY R11,X1,X2 : MOV R10,Y1    : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
%%;
 | 
						|
 
 | 
						|
int is_register(s)
 | 
						|
register char *s;
 | 
						|
{ if (*s++ == 'R' && *s >= '0' && *s <= '9') {
 | 
						|
      if (*s++ == '1' && (*s >= '0' && *s <= '5')) s++;
 | 
						|
      return *s == '\0';
 | 
						|
      }
 | 
						|
      return FALSE;
 | 
						|
}
 | 
						|
 
 | 
						|
int is_byte(s,t)
 | 
						|
char *s, *t;
 | 
						|
{
 | 
						|
	long arg;
 | 
						|
 | 
						|
	s++;   /* skip # */
 | 
						|
	arg = atol(s);
 | 
						|
	if (arg<1 || arg>256) return(FALSE);
 | 
						|
	sprintf(t,"%d",arg-1);
 | 
						|
	return(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
int is_byte2(s,t1,t2)
 | 
						|
char *s,*t1,*t2;
 | 
						|
{
 | 
						|
	long arg, shift;
 | 
						|
 | 
						|
	s++;
 | 
						|
	arg = atol(s);
 | 
						|
	if (arg<1 || arg>255) return(FALSE);
 | 
						|
	if (arg & 0x80) {
 | 
						|
		shift = arg << 24;
 | 
						|
		sprintf(t1,"%ld",shift);
 | 
						|
		sprintf(t2,"%d", 24);
 | 
						|
		return(TRUE);
 | 
						|
	}
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
  
 | 
						|
int no_side_effects(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
	for (;;) {
 | 
						|
		switch(*s++) {
 | 
						|
		  case '\0': return(TRUE);
 | 
						|
		  case ']' : return(FALSE);
 | 
						|
		  case '<' : return(FALSE);
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
int is_greater(s1, s2, rl)
 | 
						|
register char *s1, *s2, *rl;
 | 
						|
{
 | 
						|
	long a1, a2;
 | 
						|
 | 
						|
	s1++; s1++;   /* skip '{R' */
 | 
						|
	s2++; s2++;
 | 
						|
	a1 = atol(s1);
 | 
						|
	a2 = atol(s2);
 | 
						|
	if (a1 > a2) {
 | 
						|
		sprintf(rl, "{R%d,R%d}", a2, a1);
 | 
						|
		return(TRUE);
 | 
						|
	}
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int is_local(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
	if (strcmp(s, "[R13") == 0) return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int is_reglist_11(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
	if (strcmp(s, "{R11}") == 0){
 | 
						|
		return(TRUE);
 | 
						|
	}
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int is_reglist(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
	if (*s == '{') return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int is_reglist1(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
	if (*s != '{') return(FALSE);
 | 
						|
	for (;;) {
 | 
						|
		switch(*s++) {
 | 
						|
			case '\0': return(TRUE);
 | 
						|
			case ',' : return(FALSE);
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
int is_lams(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
/*	if (strcmp(s,"LDR") == 0) return(TRUE);
 | 
						|
	if (strcmp(s,"ADD") == 0) return(TRUE);
 | 
						|
	if (strcmp(s,"ADR") == 0) return(TRUE);
 | 
						|
	if (strcmp(s,"MOV") == 0) return(TRUE);
 | 
						|
	if (strcmp(s,"SUB") == 0) return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
*/
 | 
						|
return(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
int is_unequal(s1, s2)
 | 
						|
register char *s1, *s2;
 | 
						|
{
 | 
						|
	long a1, a2;
 | 
						|
 | 
						|
	s1++; s2++;
 | 
						|
	a1 = atol(s1);
 | 
						|
	a2 = atol(s2);
 | 
						|
	if (a1 == a2) return(FALSE);
 | 
						|
	return(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
int is_unequal3(s1, s2, s3)
 | 
						|
register char *s1, *s2, *s3;
 | 
						|
{
 | 
						|
	long a1, a2, a3;
 | 
						|
 | 
						|
	s1++; s2++; s3++;
 | 
						|
	a1 = atol(s1);
 | 
						|
	a2 = atol(s2);
 | 
						|
	a3 = atol(s3);
 | 
						|
	if (a1 == a2) return(FALSE);
 | 
						|
	if (a3 == a2) return(FALSE);
 | 
						|
	if (a1 == a3) return(FALSE);
 | 
						|
	return(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
int list_f_10(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
	sprintf(s,"{R10,R11}");
 | 
						|
	return(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
int list_f_9(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
	sprintf(s,"{R9,R10,R11}");
 | 
						|
	return(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
int list_f_8(s)
 | 
						|
register char *s;
 | 
						|
{
 | 
						|
	sprintf(s,"{R8,R9,R10,R11}");
 | 
						|
	return(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
int ok_regcheck1(r, s1)
 | 
						|
register char *s1;
 | 
						|
int r;
 | 
						|
{
 | 
						|
	int a1;
 | 
						|
 | 
						|
	if (*s1 == '[') s1++;
 | 
						|
	if (*s1 != 'R') return(TRUE);
 | 
						|
	s1++;  /* skip R */
 | 
						|
	a1 = atoi(s1);
 | 
						|
	if (a1 >= r && a1 <= 11) return(FALSE);
 | 
						|
	return(TRUE);
 | 
						|
}
 | 
						|
 | 
						|
int ok_regcheck2(r, s1, s2)
 | 
						|
register char *s1, *s2;
 | 
						|
int r;
 | 
						|
{
 | 
						|
	if (ok_regcheck1(r,s1))
 | 
						|
		if (ok_regcheck1(r,s2))
 | 
						|
			return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int ok_regcheck3(r, s1, s2, s3)
 | 
						|
register char *s1, *s2, *s3;
 | 
						|
int r;
 | 
						|
{
 | 
						|
	if (ok_regcheck1(r,s1))
 | 
						|
		if (ok_regcheck2(r,s2,s3))
 | 
						|
			return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int ok_regcheck4(r, s1, s2, s3, s4)
 | 
						|
register char *s1, *s2, *s3, *s4;
 | 
						|
int r;
 | 
						|
{
 | 
						|
	if (ok_regcheck2(r,s1,s2))
 | 
						|
		if (ok_regcheck2(r,s3,s4))
 | 
						|
			return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int ok_regcheck5(r, s1, s2, s3, s4, s5)
 | 
						|
register char *s1, *s2, *s3, *s4, *s5;
 | 
						|
int r;
 | 
						|
{
 | 
						|
	if (ok_regcheck2(r,s1,s2))
 | 
						|
		if (ok_regcheck3(r,s3,s4,s5))
 | 
						|
			return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int ok_regcheck6(r, s1, s2, s3, s4, s5, s6)
 | 
						|
register char *s1, *s2, *s3, *s4, *s5, *s6;
 | 
						|
int r;
 | 
						|
{
 | 
						|
	if (ok_regcheck2(r,s1,s2))
 | 
						|
		if (ok_regcheck4(r,s3,s4,s5,s6))
 | 
						|
			return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int ok_regcheck7(r, s1, s2, s3, s4, s5, s6, s7)
 | 
						|
register char *s1, *s2, *s3, *s4, *s5, *s6, *s7;
 | 
						|
int r;
 | 
						|
{
 | 
						|
	if (ok_regcheck4(r,s1,s2,s3,s4))
 | 
						|
		if (ok_regcheck3(r,s5,s6,s7))
 | 
						|
			return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
int ok_regcheck8(r, s1, s2, s3, s4, s5, s6, s7, s8)
 | 
						|
register char *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8;
 | 
						|
int r;
 | 
						|
{
 | 
						|
	if (ok_regcheck4(r,s1,s2,s3,s4))
 | 
						|
		if (ok_regcheck4(r,s5,s6,s7,s8))
 | 
						|
			return(TRUE);
 | 
						|
	return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
 |