Some improvements
This commit is contained in:
		
							parent
							
								
									889cf28571
								
							
						
					
					
						commit
						16e657858a
					
				
					 5 changed files with 484 additions and 264 deletions
				
			
		|  | @ -85,6 +85,7 @@ TOKENS | ||||||
| 	 */ | 	 */ | ||||||
| 
 | 
 | ||||||
| 	/* Part (i) */ | 	/* Part (i) */ | ||||||
|  | small_const	= {INT num;} 4 cost(0,4) "#" num . | ||||||
| const		= {INT num;} 4 cost(4,4) "#" num . | const		= {INT num;} 4 cost(4,4) "#" num . | ||||||
| indirect4	= {A_REG reg;} 4 cost(0,4) "(" reg ")" . | indirect4	= {A_REG reg;} 4 cost(0,4) "(" reg ")" . | ||||||
| post_inc4	= {A_REG reg;} 4 cost(0,4) "(" reg ")+" . | post_inc4	= {A_REG reg;} 4 cost(0,4) "(" reg ")+" . | ||||||
|  | @ -222,27 +223,27 @@ SETS | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
| 	/* A m68k4 part */ | 	/* A m68k4 part */ | ||||||
| data4		= D_REG + LOCAL + const + post_inc4 + pre_dec4 + | data4		= D_REG + LOCAL + const + small_const + post_inc4 + pre_dec4 + | ||||||
| 		  indirect4 + offsetted4 + index_off4 + absolute4 + | 		  indirect4 + offsetted4 + index_off4 + absolute4 + | ||||||
| 		  ext_addr . | 		  ext_addr . | ||||||
| memory4		= data4 - D_REG . | memory4		= data4 - D_REG . | ||||||
| control4	= indirect4 + offsetted4 + index_off4 + absolute4 + | control4	= indirect4 + offsetted4 + index_off4 + absolute4 + | ||||||
| 		  LOCAL . | 		  LOCAL . | ||||||
| alterable4	= data4 + A_REG - const - ext_addr . | alterable4	= data4 + A_REG - small_const - const - ext_addr . | ||||||
| any4		= data4 + A_REG . /* all four above together */ | any4		= data4 + A_REG . /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data2		= dreg2 + post_inc2 + pre_dec2 + indirect2 + | data2		= dreg2 + post_inc2 + pre_dec2 + indirect2 + | ||||||
| 		  offsetted2 + index_off2 + absolute2 + const . | 		  offsetted2 + index_off2 + absolute2 + const + small_const . | ||||||
| memory2		= data2 - dreg2 . | memory2		= data2 - dreg2 . | ||||||
| control2	= indirect2 + offsetted2 + index_off2 + absolute2 . | control2	= indirect2 + offsetted2 + index_off2 + absolute2 . | ||||||
| alterable2	= data2 + A_REG + D_REG - const . | alterable2	= data2 + A_REG + D_REG - const - small_const . | ||||||
| any2		= data2 + A_REG + D_REG. | any2		= data2 + A_REG + D_REG. | ||||||
| 
 | 
 | ||||||
| data1		= dreg1 + post_inc1 + pre_dec1 + indirect1 + | data1		= dreg1 + post_inc1 + pre_dec1 + indirect1 + | ||||||
| 		  offsetted1 + index_off1 + absolute1 + const . | 		  offsetted1 + index_off1 + absolute1 + const + small_const . | ||||||
| memory1		= data1 - dreg1 . | memory1		= data1 - dreg1 . | ||||||
| control1	= indirect1 + offsetted1 + index_off1 + absolute1 . | control1	= indirect1 + offsetted1 + index_off1 + absolute1 . | ||||||
| alterable1	= data1 + D_REG - const . | alterable1	= data1 + D_REG - const -small_const . | ||||||
| any1		= data1 + D_REG. | any1		= data1 + D_REG. | ||||||
| 
 | 
 | ||||||
| #else TBL68020 | #else TBL68020 | ||||||
|  | @ -251,31 +252,31 @@ data4		= D_REG + indirect4 + post_inc4 + pre_dec4 + index_off4 + | ||||||
| 		      offsetted4 + OFF_off4 + OFF_indoff4 + | 		      offsetted4 + OFF_off4 + OFF_indoff4 + | ||||||
| 		  INDOFF_off4 + | 		  INDOFF_off4 + | ||||||
| 		  ABS_off4 + ABS_indoff4 + ABSIND_off4 + | 		  ABS_off4 + ABS_indoff4 + ABSIND_off4 + | ||||||
| 		  absolute4 + abs_index4 + const + ext_addr + | 		  absolute4 + abs_index4 + const + small_const + ext_addr + | ||||||
| 		  LOCAL + ILOCAL . | 		  LOCAL + ILOCAL . | ||||||
| memory4		= data4 - D_REG . | memory4		= data4 - D_REG . | ||||||
| control4	= memory4 - (post_inc4 + pre_dec4 + const + ext_addr) . | control4	= memory4 - (post_inc4 + pre_dec4 + const + small_const + ext_addr) . | ||||||
| alterable4	= data4 + A_REG - const - ext_addr . | alterable4	= data4 + A_REG - const - ext_addr - small_const . | ||||||
| any4		= data4 + A_REG . /* all four above together */ | any4		= data4 + A_REG . /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data2		= dreg2 + indirect2 + post_inc2 + pre_dec2 + index_off2 + | data2		= dreg2 + indirect2 + post_inc2 + pre_dec2 + index_off2 + | ||||||
| 		      offsetted2 + OFF_off2 + OFF_indoff2 + | 		      offsetted2 + OFF_off2 + OFF_indoff2 + | ||||||
| 		  INDOFF_off2 + | 		  INDOFF_off2 + | ||||||
| 		  ABS_off2 + ABS_indoff2 + ABSIND_off2 + | 		  ABS_off2 + ABS_indoff2 + ABSIND_off2 + | ||||||
| 		  absolute2 + abs_index2 + const . | 		  absolute2 + abs_index2 + const + small_const . | ||||||
| memory2		= data2 - dreg2 . | memory2		= data2 - dreg2 . | ||||||
| control2	= memory2 - (post_inc2 + pre_dec2 + const) . | control2	= memory2 - (post_inc2 + pre_dec2 + const + small_const) . | ||||||
| alterable2	= data2 + A_REG + D_REG - const . | alterable2	= data2 + A_REG + D_REG - const - small_const . | ||||||
| any2		= data2 + A_REG + D_REG. /* all four above together */ | any2		= data2 + A_REG + D_REG. /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data1		= dreg1 + indirect1 + post_inc1 + pre_dec1 + index_off1 + | data1		= dreg1 + indirect1 + post_inc1 + pre_dec1 + index_off1 + | ||||||
| 		      offsetted1 + OFF_off1 + OFF_indoff1 + | 		      offsetted1 + OFF_off1 + OFF_indoff1 + | ||||||
| 		  INDOFF_off1 + | 		  INDOFF_off1 + | ||||||
| 		  ABS_off1 + ABS_indoff1 + ABSIND_off1 + | 		  ABS_off1 + ABS_indoff1 + ABSIND_off1 + | ||||||
| 		  absolute1 + abs_index1 + const . | 		  absolute1 + abs_index1 + const + small_const . | ||||||
| memory1		= data1 - dreg1 . | memory1		= data1 - dreg1 . | ||||||
| control1	= memory1 - (post_inc1 + pre_dec1 + const) . | control1	= memory1 - (post_inc1 + pre_dec1 + const + small_const) . | ||||||
| alterable1	= data1 + D_REG - const . | alterable1	= data1 + D_REG - const - small_const . | ||||||
| any1		= data1  + D_REG. /* all four above together */ | any1		= data1  + D_REG. /* all four above together */ | ||||||
| 
 | 
 | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
|  | @ -296,7 +297,7 @@ address		= ext_addr + local_addr + regAcon + regAregXcon . | ||||||
| all_regind	= indirect + offsetted + pre_post + index_off + | all_regind	= indirect + offsetted + pre_post + index_off + | ||||||
| 		      regind_addr . | 		      regind_addr . | ||||||
| all_indir	= all_regind . | all_indir	= all_regind . | ||||||
| allexceptcon	= ALL - ( D_REG + A_REG + const + dreg2 + dreg1 + | allexceptcon	= ALL - ( D_REG + A_REG + const + small_const + dreg2 + dreg1 + | ||||||
| 		    local_addr + ext_addr + regAcon + regAregXcon + | 		    local_addr + ext_addr + regAcon + regAregXcon + | ||||||
| 		    t_regAcon + t_regAregXcon ) . | 		    t_regAcon + t_regAregXcon ) . | ||||||
| use_index	= index_off4 + index_off2 + index_off1 . | use_index	= index_off4 + index_off2 + index_off1 . | ||||||
|  | @ -325,7 +326,7 @@ address		= regind_addr + | ||||||
| all_regind	= indirect + offsetted + index_off + pre_post + | all_regind	= indirect + offsetted + index_off + pre_post + | ||||||
| 		      reg_memind + regind_addr . | 		      reg_memind + regind_addr . | ||||||
| all_indir	= all_regind + memind + ILOCAL . | all_indir	= all_regind + memind + ILOCAL . | ||||||
| allexceptcon	= ALL - ( D_REG + A_REG + const + dreg2 + dreg1 + | allexceptcon	= ALL - ( D_REG + A_REG + const + small_const + dreg2 + dreg1 + | ||||||
| 		    local_addr + ext_addr + regAcon + regAregXcon + ext_regX ) . | 		    local_addr + ext_addr + regAcon + regAregXcon + ext_regX ) . | ||||||
| use_index4	= index_off4 + abs_index4 + | use_index4	= index_off4 + abs_index4 + | ||||||
| 		  OFF_indoff4 + INDOFF_off4 + | 		  OFF_indoff4 + INDOFF_off4 + | ||||||
|  | @ -349,10 +350,10 @@ posextern	= absolute + all_indir . | ||||||
| 
 | 
 | ||||||
| genreg		= D_REG + A_REG. | genreg		= D_REG + A_REG. | ||||||
| label		= llabel + slabel . | label		= llabel + slabel . | ||||||
| immediate4	= const + ext_addr . | immediate4	= const + small_const + ext_addr . | ||||||
| conreg4		= D_REG + immediate4 . | conreg4		= D_REG + immediate4 . | ||||||
| conreg2		= dreg2 + const + D_REG . | conreg2		= dreg2 + const + small_const + D_REG . | ||||||
| conreg1		= dreg1 + const + D_REG . | conreg1		= dreg1 + const + small_const + D_REG . | ||||||
| shconreg	= D_REG + shconst . | shconreg	= D_REG + shconst . | ||||||
| datalt4		= data4 * alterable4 . | datalt4		= data4 * alterable4 . | ||||||
| datalt2		= data2 * alterable2 . | datalt2		= data2 * alterable2 . | ||||||
|  | @ -364,7 +365,7 @@ memalt1		= memory1 * alterable1 . | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
| 	/* A m68k4 part */ | 	/* A m68k4 part */ | ||||||
| imm_cmp4	= alterable4 . | imm_cmp4	= alterable4 - genreg . | ||||||
| imm_cmp2	= alterable2 + D_REG . | imm_cmp2	= alterable2 + D_REG . | ||||||
| imm_cmp1	= datalt1 + D_REG . | imm_cmp1	= datalt1 + D_REG . | ||||||
| 
 | 
 | ||||||
|  | @ -374,13 +375,13 @@ test_set1	= datalt1 . | ||||||
| 
 | 
 | ||||||
| #else TBL68020 | #else TBL68020 | ||||||
| 
 | 
 | ||||||
| imm_cmp4	= any4 - immediate4 . | imm_cmp4	= any4 - immediate4 - genreg . | ||||||
| imm_cmp2	= any2 - const . | imm_cmp2	= any2 - const - small_const . | ||||||
| imm_cmp1	= any1 - const . | imm_cmp1	= any1 - const - small_const . | ||||||
| 
 | 
 | ||||||
| test_set4	= data4 - immediate4 . | test_set4	= data4 - immediate4 . | ||||||
| test_set2	= data2 - const . | test_set2	= data2 - const - small_const . | ||||||
| test_set1	= data1 - const . | test_set1	= data1 - const - small_const . | ||||||
| 
 | 
 | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
| 
 | 
 | ||||||
|  | @ -433,7 +434,7 @@ add_l  "add.l"	any4:ro,	A_REG:rw 		cost(2,3). | ||||||
| add_l  "add.l"	conreg4:ro,	alterable4:rw:cc	cost(2,6). | add_l  "add.l"	conreg4:ro,	alterable4:rw:cc	cost(2,6). | ||||||
| and_l  "and.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | and_l  "and.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | ||||||
| and_l  "and.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | and_l  "and.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | ||||||
| and_l  "and.l"	const:ro,	datalt4:rw:cc		cost(2,6). | and_l  "and.l"	const+small_const:ro,	datalt4:rw:cc	cost(2,6). | ||||||
| asl_l  "asl.l"	shconreg:ro,	D_REG:rw:cc		cost(2,5). | asl_l  "asl.l"	shconreg:ro,	D_REG:rw:cc		cost(2,5). | ||||||
| asl   "asl #1,"	memalt2:rw:cc				cost(2,4). | asl   "asl #1,"	memalt2:rw:cc				cost(2,4). | ||||||
| asr_l  "asr.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | asr_l  "asr.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
|  | @ -466,14 +467,15 @@ cmp_l  "cmp.l"	post_inc4:ro,	post_inc4:ro kills :cc 	cost(2,2). | ||||||
| cmp_l  "cmp.l"	immediate4:ro,	imm_cmp4:ro kills :cc	cost(2,2). | cmp_l  "cmp.l"	immediate4:ro,	imm_cmp4:ro kills :cc	cost(2,2). | ||||||
| cmp_w  "cmp.w"	any2:ro,	dreg2:ro kills :cc	cost(2,3). | cmp_w  "cmp.w"	any2:ro,	dreg2:ro kills :cc	cost(2,3). | ||||||
| cmp_w  "cmp.w"	post_inc2:ro,	post_inc2:ro kills :cc 	cost(2,2). | cmp_w  "cmp.w"	post_inc2:ro,	post_inc2:ro kills :cc 	cost(2,2). | ||||||
| cmp_w  "cmp.w"	const:ro,	imm_cmp2:ro kills :cc	cost(2,2). | cmp_w  "cmp.w"	const+small_const:ro,	imm_cmp2:ro kills :cc	cost(2,2). | ||||||
| cmp_b  "cmp.b"	any1:ro,	dreg1:ro kills :cc	cost(2,3). | cmp_b  "cmp.b"	any1:ro,	dreg1:ro kills :cc	cost(2,3). | ||||||
| cmp_b  "cmp.b"	post_inc1:ro,	post_inc1:ro kills :cc 	cost(2,2). | cmp_b  "cmp.b"	post_inc1:ro,	post_inc1:ro kills :cc 	cost(2,2). | ||||||
| cmp_b  "cmp.b"	const:ro,	imm_cmp1:ro kills :cc	cost(2,2). | cmp_b  "cmp.b"	const+small_const:ro,	imm_cmp1:ro kills :cc	cost(2,2). | ||||||
| dbf		D_REG:rw,	label			cost(2,5). | dbf		D_REG:rw,	label			cost(2,5). | ||||||
| eor_l  "eor.l"	conreg4:ro,	datalt4:rw:cc		cost(2,6). | eor_l  "eor.l"	conreg4:ro,	datalt4:rw:cc		cost(2,6). | ||||||
| ext_l  "ext.l"	D_REG:rw:cc				cost(2,2). | /* in the next two instructions: LOCAL only allowed if register var */ | ||||||
| ext_w  "ext.w"	D_REG:rw:cc				cost(2,2). | ext_l  "ext.l"	D_REG+LOCAL:rw:cc			cost(2,2). | ||||||
|  | ext_w  "ext.w"	D_REG+LOCAL:rw:cc			cost(2,2). | ||||||
| jmp		address+control4			cost(2,0). | jmp		address+control4			cost(2,0). | ||||||
| jsr		address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3). | jsr		address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3). | ||||||
| lea		address+control4:ro, A_REG:wo		cost(2,0). | lea		address+control4:ro, A_REG:wo		cost(2,0). | ||||||
|  | @ -490,7 +492,7 @@ not_l  "not.l"	D_REG:rw:cc				cost(2,3). | ||||||
| not_l  "not.l"	memory4:rw:cc				cost(2,6). | not_l  "not.l"	memory4:rw:cc				cost(2,6). | ||||||
| or_l   "or.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | or_l   "or.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | ||||||
| or_l   "or.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | or_l   "or.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | ||||||
| or_l   "or.l"	const:ro,	datalt4:rw:cc		cost(2,6). | or_l   "or.l"	const+small_const:ro,	datalt4:rw:cc		cost(2,6). | ||||||
| rol_l  "rol.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | rol_l  "rol.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
| rol   "rol #1,"	memalt2:rw:cc				cost(2,4). | rol   "rol #1,"	memalt2:rw:cc				cost(2,4). | ||||||
| ror_l  "ror.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ror_l  "ror.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
|  | @ -519,7 +521,8 @@ divs_l "divs.l" data4:ro,	D_REG:rw:cc		cost(2,90). | ||||||
| divsl_l "divsl.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,90). | divsl_l "divsl.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,90). | ||||||
| divu_l "divu.l" data4:ro,	D_REG:rw:cc		cost(2,78). | divu_l "divu.l" data4:ro,	D_REG:rw:cc		cost(2,78). | ||||||
| divul_l "divul.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,78). | divul_l "divul.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,78). | ||||||
| extb_l "extb.l" D_REG:rw:cc				cost(2,4). | /* in the next instruction: LOCAL only allowed if register var */ | ||||||
|  | extb_l "extb.l" D_REG+LOCAL:rw:cc			cost(2,4). | ||||||
| muls_l "muls.l" data4:ro,	D_REG:rw:cc		cost(2,44). | muls_l "muls.l" data4:ro,	D_REG:rw:cc		cost(2,44). | ||||||
| mulu_l "mulu.l" data4:ro,	D_REG:rw:cc		cost(2,44). | mulu_l "mulu.l" data4:ro,	D_REG:rw:cc		cost(2,44). | ||||||
| pea		address+control4+regX			cost(2,4). | pea		address+control4+regX			cost(2,4). | ||||||
|  | @ -538,22 +541,22 @@ killreg "! kill" A_REG:wo				cost(0,0). | ||||||
| 
 | 
 | ||||||
| MOVES | MOVES | ||||||
| 
 | 
 | ||||||
| from const %num==0 to D_REG | from const+small_const %num==0 to D_REG | ||||||
|     gen clr_l %2 |     gen clr_l %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt4 | from const+small_const %num==0 to memalt4 | ||||||
|     gen clr_l %2 |     gen clr_l %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt2 | from const+small_const %num==0 to memalt2 | ||||||
|     gen clr_w %2 |     gen clr_w %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt1 | from const+small_const %num==0 to memalt1 | ||||||
|     gen clr_b %2 |     gen clr_b %2 | ||||||
| 
 | 
 | ||||||
| from const to memalt1 | from const+small_const to memalt1 | ||||||
|     gen move_b {const, lowb(%1.num)}, %2 |     gen move_b {const, lowb(%1.num)}, %2 | ||||||
| 
 | 
 | ||||||
| from const to memalt2 | from const+small_const to memalt2 | ||||||
|     gen move_w {const, loww(%1.num)}, %2 |     gen move_w {const, loww(%1.num)}, %2 | ||||||
| 
 | 
 | ||||||
| from regAcon %bd==0 to A_REG | from regAcon %bd==0 to A_REG | ||||||
|  | @ -606,7 +609,7 @@ to test test_set1 | ||||||
| STACKINGRULES | STACKINGRULES | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to STACK | from const+small_const %num==0 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
|  | @ -625,22 +628,37 @@ from t_regAcon to STACK | ||||||
| 	add_l {const, %1.bd}, {indirect4, sp} | 	add_l {const, %1.bd}, {indirect4, sp} | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
| 
 | 
 | ||||||
|  | from A_REG to STACK | ||||||
|  |     gen pea {indirect4, %1} | ||||||
|  | 
 | ||||||
| from address - ext_addr to STACK | from address - ext_addr to STACK | ||||||
|     gen pea %1 |     gen pea %1 | ||||||
| 
 | 
 | ||||||
| from ext_addr to STACK | from ext_addr to STACK | ||||||
|     gen pea {absolute4, %1.bd} |     gen pea {absolute4, %1.bd} | ||||||
| 
 | 
 | ||||||
| from const to STACK | from const+small_const to STACK | ||||||
|     gen pea {absolute4, %1.num} |     gen pea {absolute4, %1.num} | ||||||
| 
 | 
 | ||||||
| from any4 to STACK | from any4 to STACK | ||||||
|     gen move_l %1, {pre_dec4, sp} |     gen move_l %1, {pre_dec4, sp} | ||||||
| 
 | 
 | ||||||
|  | from any2 to STACK | ||||||
|  |   uses DD_REG | ||||||
|  |     gen clr_l %a | ||||||
|  | 	move_w %1, {dreg2, %a} | ||||||
|  | 	move_l %a, {pre_dec4, sp} | ||||||
|  | 
 | ||||||
| from any2 to STACK | from any2 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 	move_w %1, {offsetted2, sp, 2} | 	move_w %1, {offsetted2, sp, 2} | ||||||
| 
 | 
 | ||||||
|  | from data1 to STACK | ||||||
|  |   uses DD_REG | ||||||
|  |     gen clr_l %a | ||||||
|  | 	move_b %1, {dreg1, %a} | ||||||
|  | 	move_l %a, {pre_dec4, sp} | ||||||
|  | 
 | ||||||
| from data1 to STACK | from data1 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 	move_b %1, {offsetted1, sp, 3} | 	move_b %1, {offsetted1, sp, 3} | ||||||
|  | @ -737,11 +755,11 @@ pat lil inreg($1)==reg_any | ||||||
| 			yields  {indirect4, %a} | 			yields  {indirect4, %a} | ||||||
| 
 | 
 | ||||||
| pat stl inreg($1)==reg_any | pat stl inreg($1)==reg_any | ||||||
| with exact memory1-const | with exact memory1-const-small_const | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen	clr_l {LOCAL, $1} |     gen	clr_l {LOCAL, $1} | ||||||
| 	move_b %1, {dreg1, regvar($1,reg_any)} | 	move_b %1, {dreg1, regvar($1,reg_any)} | ||||||
| with exact memory2-const | with exact memory2-const-small_const | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen	clr_l {LOCAL, $1} |     gen	clr_l {LOCAL, $1} | ||||||
| 	move_w %1, {dreg2, regvar($1,reg_any)} | 	move_w %1, {dreg2, regvar($1,reg_any)} | ||||||
|  | @ -922,6 +940,20 @@ pat lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==reg_pointer | ||||||
|     kills allexceptcon |     kills allexceptcon | ||||||
|     gen add_l {const, $3}, {offsetted4, regvar($1, reg_pointer), $2} |     gen add_l {const, $3}, {offsetted4, regvar($1, reg_pointer), $2} | ||||||
| 
 | 
 | ||||||
|  | #ifdef TBL68020 | ||||||
|  | pat loe lof inc loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen add_l {const, 1}, {ABS_off4, $1, $2} | ||||||
|  | 
 | ||||||
|  | pat loe lof dec loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen sub_l {const, 1}, {ABS_off4, $1, $2} | ||||||
|  | 
 | ||||||
|  | pat loe lof adp loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen add_l {const, $3}, {ABS_off4, $1, $2} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| pat inl inreg($1)==reg_any | pat inl inreg($1)==reg_any | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen add_l {const, 1}, {LOCAL, $1} |     gen add_l {const, 1}, {LOCAL, $1} | ||||||
|  | @ -1098,6 +1130,15 @@ pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer | ||||||
|     killreg %a |     killreg %a | ||||||
| 			yields	%a | 			yields	%a | ||||||
| 
 | 
 | ||||||
|  | #ifdef TBL68020 | ||||||
|  | pat loe lof dup adp loe stf $1==$5 && $2==$6 | ||||||
|  |     kills allexceptcon | ||||||
|  |     uses AA_REG = {ABS_off4, $1, $2} | ||||||
|  |     gen add_l {const, $4}, {ABS_off4, $1, $2} | ||||||
|  |     killreg %a | ||||||
|  | 			yields	%a | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| pat lol lol adp stl loi $1==$2 && $1==$4 && $3==1 && $5==1 && | pat lol lol adp stl loi $1==$2 && $1==$4 && $3==1 && $5==1 && | ||||||
| 						inreg($1)==reg_pointer | 						inreg($1)==reg_pointer | ||||||
|     kills regvar($1, reg_pointer) |     kills regvar($1, reg_pointer) | ||||||
|  | @ -1202,6 +1243,8 @@ with any4 | ||||||
|  * Group 1: load instructions			* |  * Group 1: load instructions			* | ||||||
|  ************************************************/ |  ************************************************/ | ||||||
| 
 | 
 | ||||||
|  | pat loc in_1($1)	yields	{small_const, $1} | ||||||
|  | 
 | ||||||
| pat loc			yields	{const, $1} | pat loc			yields	{const, $1} | ||||||
| 
 | 
 | ||||||
| pat ldc				leaving loc 18 trp | pat ldc				leaving loc 18 trp | ||||||
|  | @ -2206,9 +2249,9 @@ pat zre | ||||||
|     kills posextern |     kills posextern | ||||||
|     gen clr_l {absolute4, $1} |     gen clr_l {absolute4, $1} | ||||||
| 
 | 
 | ||||||
| pat zer $1==4		yields	{const, 0} | pat zer $1==4		yields	{small_const, 0} | ||||||
| pat zer $1==8		yields	{const, 0} {const, 0} | pat zer $1==8		yields	{small_const, 0} {small_const, 0} | ||||||
| pat zer $1==12		yields	{const, 0} {const, 0} {const, 0} | pat zer $1==12		yields	{small_const, 0} {small_const, 0} {small_const, 0} | ||||||
| 
 | 
 | ||||||
| pat zer | pat zer | ||||||
| with STACK | with STACK | ||||||
|  | @ -2264,9 +2307,9 @@ pat loc loc cff	$1==4 && $2==8 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| proc log4 | proc log4 | ||||||
| with datalt4+const DD_REG | with datalt4+const+small_const DD_REG | ||||||
|     gen xxx* %1, %2	yields	%2 |     gen xxx* %1, %2	yields	%2 | ||||||
| with DD_REG datalt4+const | with DD_REG datalt4+const+small_const | ||||||
|     gen xxx* %2, %1	yields	%1 |     gen xxx* %2, %1	yields	%1 | ||||||
| 
 | 
 | ||||||
| proc logdef example and | proc logdef example and | ||||||
|  | @ -2598,10 +2641,10 @@ with STACK | ||||||
|     gen bra {llabel, $1} |     gen bra {llabel, $1} | ||||||
| 
 | 
 | ||||||
| proc brxx example beq | proc brxx example beq | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| with genreg any4 STACK | with genreg any4-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -2615,15 +2658,15 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| 
 | 
 | ||||||
| proc brnqxx example beq | proc brnqxx example beq | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| with genreg any4 STACK | with genreg any4-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -2637,7 +2680,7 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| 
 | 
 | ||||||
|  | @ -3287,12 +3330,12 @@ pat tge ior $2==4			call txxior("blt", "bcs") | ||||||
| pat tgt ior $2==4			call txxior("ble", "bls") | pat tgt ior $2==4			call txxior("ble", "bls") | ||||||
| 
 | 
 | ||||||
| proc cmxtxxand | proc cmxtxxand | ||||||
| with any4 genreg DD_REG | with any4-small_const genreg DD_REG | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	clr_l %3 | 	clr_l %3 | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| with genreg any4-genreg DD_REG | with genreg any4-genreg-small_const DD_REG | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	clr_l %3 | 	clr_l %3 | ||||||
|  | @ -3309,12 +3352,12 @@ with exact imm_cmp4 immediate4 DD_REG | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| 
 | 
 | ||||||
| proc cmxtxxior | proc cmxtxxior | ||||||
| with any4 genreg DD_REG | with any4-small_const genreg DD_REG | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	move {const, 1},  %3 | 	move {const, 1},  %3 | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| with genreg any4-genreg DD_REG | with genreg any4-genreg-small_const DD_REG | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	move {const, 1},  %3 | 	move {const, 1},  %3 | ||||||
|  | @ -3331,13 +3374,13 @@ with exact imm_cmp4 immediate4 DD_REG | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| 
 | 
 | ||||||
| proc cmxtxx | proc cmxtxx | ||||||
| with any4 genreg | with any4-small_const genreg | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	clr_l %a | 	clr_l %a | ||||||
| 	1:		yields	%a | 	1:		yields	%a | ||||||
| with genreg any4-genreg | with genreg any4-genreg-small_const | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
|  | @ -3361,7 +3404,7 @@ with genreg STACK | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	clr_l %a | 	clr_l %a | ||||||
| 	1:		yields	%a | 	1:		yields	%a | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
|  | @ -3411,10 +3454,10 @@ pat cmu tge $1==4			call cmxtxx("bcc","bls") | ||||||
| pat cmu tgt $1==4			call cmxtxx("bhi","bcs") | pat cmu tgt $1==4			call cmxtxx("bhi","bcs") | ||||||
| 
 | 
 | ||||||
| proc cmuzxx example cmu zlt | proc cmuzxx example cmu zlt | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $2} | 	bxx[1] {llabel, $2} | ||||||
| with genreg any4-genreg STACK | with genreg any4-genreg-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $2} | 	bxx[2] {llabel, $2} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -3428,13 +3471,13 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $2} | 	bxx[2] {llabel, $2} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $2} | 	bxx[1] {llabel, $2} | ||||||
| with data2 dreg2 STACK | with data2-small_const dreg2 STACK | ||||||
|     gen cmp_w %1, %2 |     gen cmp_w %1, %2 | ||||||
|         bxx[1] {llabel, $2} |         bxx[1] {llabel, $2} | ||||||
| with dreg2 data2-conreg2 STACK | with dreg2 data2-conreg2-small_const STACK | ||||||
|     gen cmp_w %2, %1 |     gen cmp_w %2, %1 | ||||||
|         bxx[2] {llabel, $2} |         bxx[2] {llabel, $2} | ||||||
| with data1 dreg1 STACK | with data1 dreg1 STACK | ||||||
|  | @ -3506,6 +3549,17 @@ pat loc loc cii loc bne $1==2 && $2==4 && in_2($4)	call bxx2_in("bne") | ||||||
| pat loc loc cii loc bge $1==2 && $2==4 && in_2($4)	call bxx2_in("bge") | pat loc loc cii loc bge $1==2 && $2==4 && in_2($4)	call bxx2_in("bge") | ||||||
| pat loc loc cii loc bgt $1==2 && $2==4 && in_2($4)	call bxx2_in("bgt") | pat loc loc cii loc bgt $1==2 && $2==4 && in_2($4)	call bxx2_in("bgt") | ||||||
| 
 | 
 | ||||||
|  | pat loc loc cii stl $1==1 && $2==4 && inreg($4)==reg_any | ||||||
|  | with memory1+DD_REG | ||||||
|  |     kills regvar($4, reg_any), use_index %xreg==regvar($4, reg_any) | ||||||
|  |     gen	move_b %1, {dreg1, regvar($4,reg_any)} | ||||||
|  | #ifdef TBL68020 | ||||||
|  | 	extb_l	{LOCAL,$4} | ||||||
|  | #else TBL68020 | ||||||
|  | 	ext_w	{LOCAL,$4} | ||||||
|  | 	ext_l	{LOCAL,$4} | ||||||
|  | #endif TBL68020 | ||||||
|  | 
 | ||||||
| pat loc loc cii $1==2 && $2==4 | pat loc loc cii $1==2 && $2==4 | ||||||
| with DD_REG | with DD_REG | ||||||
|     gen ext_l %1	yields	%1 |     gen ext_l %1	yields	%1 | ||||||
|  |  | ||||||
|  | @ -85,6 +85,7 @@ TOKENS | ||||||
| 	 */ | 	 */ | ||||||
| 
 | 
 | ||||||
| 	/* Part (i) */ | 	/* Part (i) */ | ||||||
|  | small_const	= {INT num;} 4 cost(0,4) "#" num . | ||||||
| const		= {INT num;} 4 cost(4,4) "#" num . | const		= {INT num;} 4 cost(4,4) "#" num . | ||||||
| indirect4	= {A_REG reg;} 4 cost(0,4) "(" reg ")" . | indirect4	= {A_REG reg;} 4 cost(0,4) "(" reg ")" . | ||||||
| post_inc4	= {A_REG reg;} 4 cost(0,4) "(" reg ")+" . | post_inc4	= {A_REG reg;} 4 cost(0,4) "(" reg ")+" . | ||||||
|  | @ -222,27 +223,27 @@ SETS | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
| 	/* A m68k4 part */ | 	/* A m68k4 part */ | ||||||
| data4		= D_REG + LOCAL + const + post_inc4 + pre_dec4 + | data4		= D_REG + LOCAL + const + small_const + post_inc4 + pre_dec4 + | ||||||
| 		  indirect4 + offsetted4 + index_off4 + absolute4 + | 		  indirect4 + offsetted4 + index_off4 + absolute4 + | ||||||
| 		  ext_addr . | 		  ext_addr . | ||||||
| memory4		= data4 - D_REG . | memory4		= data4 - D_REG . | ||||||
| control4	= indirect4 + offsetted4 + index_off4 + absolute4 + | control4	= indirect4 + offsetted4 + index_off4 + absolute4 + | ||||||
| 		  LOCAL . | 		  LOCAL . | ||||||
| alterable4	= data4 + A_REG - const - ext_addr . | alterable4	= data4 + A_REG - small_const - const - ext_addr . | ||||||
| any4		= data4 + A_REG . /* all four above together */ | any4		= data4 + A_REG . /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data2		= dreg2 + post_inc2 + pre_dec2 + indirect2 + | data2		= dreg2 + post_inc2 + pre_dec2 + indirect2 + | ||||||
| 		  offsetted2 + index_off2 + absolute2 + const . | 		  offsetted2 + index_off2 + absolute2 + const + small_const . | ||||||
| memory2		= data2 - dreg2 . | memory2		= data2 - dreg2 . | ||||||
| control2	= indirect2 + offsetted2 + index_off2 + absolute2 . | control2	= indirect2 + offsetted2 + index_off2 + absolute2 . | ||||||
| alterable2	= data2 + A_REG + D_REG - const . | alterable2	= data2 + A_REG + D_REG - const - small_const . | ||||||
| any2		= data2 + A_REG + D_REG. | any2		= data2 + A_REG + D_REG. | ||||||
| 
 | 
 | ||||||
| data1		= dreg1 + post_inc1 + pre_dec1 + indirect1 + | data1		= dreg1 + post_inc1 + pre_dec1 + indirect1 + | ||||||
| 		  offsetted1 + index_off1 + absolute1 + const . | 		  offsetted1 + index_off1 + absolute1 + const + small_const . | ||||||
| memory1		= data1 - dreg1 . | memory1		= data1 - dreg1 . | ||||||
| control1	= indirect1 + offsetted1 + index_off1 + absolute1 . | control1	= indirect1 + offsetted1 + index_off1 + absolute1 . | ||||||
| alterable1	= data1 + D_REG - const . | alterable1	= data1 + D_REG - const -small_const . | ||||||
| any1		= data1 + D_REG. | any1		= data1 + D_REG. | ||||||
| 
 | 
 | ||||||
| #else TBL68020 | #else TBL68020 | ||||||
|  | @ -251,31 +252,31 @@ data4		= D_REG + indirect4 + post_inc4 + pre_dec4 + index_off4 + | ||||||
| 		      offsetted4 + OFF_off4 + OFF_indoff4 + | 		      offsetted4 + OFF_off4 + OFF_indoff4 + | ||||||
| 		  INDOFF_off4 + | 		  INDOFF_off4 + | ||||||
| 		  ABS_off4 + ABS_indoff4 + ABSIND_off4 + | 		  ABS_off4 + ABS_indoff4 + ABSIND_off4 + | ||||||
| 		  absolute4 + abs_index4 + const + ext_addr + | 		  absolute4 + abs_index4 + const + small_const + ext_addr + | ||||||
| 		  LOCAL + ILOCAL . | 		  LOCAL + ILOCAL . | ||||||
| memory4		= data4 - D_REG . | memory4		= data4 - D_REG . | ||||||
| control4	= memory4 - (post_inc4 + pre_dec4 + const + ext_addr) . | control4	= memory4 - (post_inc4 + pre_dec4 + const + small_const + ext_addr) . | ||||||
| alterable4	= data4 + A_REG - const - ext_addr . | alterable4	= data4 + A_REG - const - ext_addr - small_const . | ||||||
| any4		= data4 + A_REG . /* all four above together */ | any4		= data4 + A_REG . /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data2		= dreg2 + indirect2 + post_inc2 + pre_dec2 + index_off2 + | data2		= dreg2 + indirect2 + post_inc2 + pre_dec2 + index_off2 + | ||||||
| 		      offsetted2 + OFF_off2 + OFF_indoff2 + | 		      offsetted2 + OFF_off2 + OFF_indoff2 + | ||||||
| 		  INDOFF_off2 + | 		  INDOFF_off2 + | ||||||
| 		  ABS_off2 + ABS_indoff2 + ABSIND_off2 + | 		  ABS_off2 + ABS_indoff2 + ABSIND_off2 + | ||||||
| 		  absolute2 + abs_index2 + const . | 		  absolute2 + abs_index2 + const + small_const . | ||||||
| memory2		= data2 - dreg2 . | memory2		= data2 - dreg2 . | ||||||
| control2	= memory2 - (post_inc2 + pre_dec2 + const) . | control2	= memory2 - (post_inc2 + pre_dec2 + const + small_const) . | ||||||
| alterable2	= data2 + A_REG + D_REG - const . | alterable2	= data2 + A_REG + D_REG - const - small_const . | ||||||
| any2		= data2 + A_REG + D_REG. /* all four above together */ | any2		= data2 + A_REG + D_REG. /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data1		= dreg1 + indirect1 + post_inc1 + pre_dec1 + index_off1 + | data1		= dreg1 + indirect1 + post_inc1 + pre_dec1 + index_off1 + | ||||||
| 		      offsetted1 + OFF_off1 + OFF_indoff1 + | 		      offsetted1 + OFF_off1 + OFF_indoff1 + | ||||||
| 		  INDOFF_off1 + | 		  INDOFF_off1 + | ||||||
| 		  ABS_off1 + ABS_indoff1 + ABSIND_off1 + | 		  ABS_off1 + ABS_indoff1 + ABSIND_off1 + | ||||||
| 		  absolute1 + abs_index1 + const . | 		  absolute1 + abs_index1 + const + small_const . | ||||||
| memory1		= data1 - dreg1 . | memory1		= data1 - dreg1 . | ||||||
| control1	= memory1 - (post_inc1 + pre_dec1 + const) . | control1	= memory1 - (post_inc1 + pre_dec1 + const + small_const) . | ||||||
| alterable1	= data1 + D_REG - const . | alterable1	= data1 + D_REG - const - small_const . | ||||||
| any1		= data1  + D_REG. /* all four above together */ | any1		= data1  + D_REG. /* all four above together */ | ||||||
| 
 | 
 | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
|  | @ -296,7 +297,7 @@ address		= ext_addr + local_addr + regAcon + regAregXcon . | ||||||
| all_regind	= indirect + offsetted + pre_post + index_off + | all_regind	= indirect + offsetted + pre_post + index_off + | ||||||
| 		      regind_addr . | 		      regind_addr . | ||||||
| all_indir	= all_regind . | all_indir	= all_regind . | ||||||
| allexceptcon	= ALL - ( D_REG + A_REG + const + dreg2 + dreg1 + | allexceptcon	= ALL - ( D_REG + A_REG + const + small_const + dreg2 + dreg1 + | ||||||
| 		    local_addr + ext_addr + regAcon + regAregXcon + | 		    local_addr + ext_addr + regAcon + regAregXcon + | ||||||
| 		    t_regAcon + t_regAregXcon ) . | 		    t_regAcon + t_regAregXcon ) . | ||||||
| use_index	= index_off4 + index_off2 + index_off1 . | use_index	= index_off4 + index_off2 + index_off1 . | ||||||
|  | @ -325,7 +326,7 @@ address		= regind_addr + | ||||||
| all_regind	= indirect + offsetted + index_off + pre_post + | all_regind	= indirect + offsetted + index_off + pre_post + | ||||||
| 		      reg_memind + regind_addr . | 		      reg_memind + regind_addr . | ||||||
| all_indir	= all_regind + memind + ILOCAL . | all_indir	= all_regind + memind + ILOCAL . | ||||||
| allexceptcon	= ALL - ( D_REG + A_REG + const + dreg2 + dreg1 + | allexceptcon	= ALL - ( D_REG + A_REG + const + small_const + dreg2 + dreg1 + | ||||||
| 		    local_addr + ext_addr + regAcon + regAregXcon + ext_regX ) . | 		    local_addr + ext_addr + regAcon + regAregXcon + ext_regX ) . | ||||||
| use_index4	= index_off4 + abs_index4 + | use_index4	= index_off4 + abs_index4 + | ||||||
| 		  OFF_indoff4 + INDOFF_off4 + | 		  OFF_indoff4 + INDOFF_off4 + | ||||||
|  | @ -349,10 +350,10 @@ posextern	= absolute + all_indir . | ||||||
| 
 | 
 | ||||||
| genreg		= D_REG + A_REG. | genreg		= D_REG + A_REG. | ||||||
| label		= llabel + slabel . | label		= llabel + slabel . | ||||||
| immediate4	= const + ext_addr . | immediate4	= const + small_const + ext_addr . | ||||||
| conreg4		= D_REG + immediate4 . | conreg4		= D_REG + immediate4 . | ||||||
| conreg2		= dreg2 + const + D_REG . | conreg2		= dreg2 + const + small_const + D_REG . | ||||||
| conreg1		= dreg1 + const + D_REG . | conreg1		= dreg1 + const + small_const + D_REG . | ||||||
| shconreg	= D_REG + shconst . | shconreg	= D_REG + shconst . | ||||||
| datalt4		= data4 * alterable4 . | datalt4		= data4 * alterable4 . | ||||||
| datalt2		= data2 * alterable2 . | datalt2		= data2 * alterable2 . | ||||||
|  | @ -364,7 +365,7 @@ memalt1		= memory1 * alterable1 . | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
| 	/* A m68k4 part */ | 	/* A m68k4 part */ | ||||||
| imm_cmp4	= alterable4 . | imm_cmp4	= alterable4 - genreg . | ||||||
| imm_cmp2	= alterable2 + D_REG . | imm_cmp2	= alterable2 + D_REG . | ||||||
| imm_cmp1	= datalt1 + D_REG . | imm_cmp1	= datalt1 + D_REG . | ||||||
| 
 | 
 | ||||||
|  | @ -374,13 +375,13 @@ test_set1	= datalt1 . | ||||||
| 
 | 
 | ||||||
| #else TBL68020 | #else TBL68020 | ||||||
| 
 | 
 | ||||||
| imm_cmp4	= any4 - immediate4 . | imm_cmp4	= any4 - immediate4 - genreg . | ||||||
| imm_cmp2	= any2 - const . | imm_cmp2	= any2 - const - small_const . | ||||||
| imm_cmp1	= any1 - const . | imm_cmp1	= any1 - const - small_const . | ||||||
| 
 | 
 | ||||||
| test_set4	= data4 - immediate4 . | test_set4	= data4 - immediate4 . | ||||||
| test_set2	= data2 - const . | test_set2	= data2 - const - small_const . | ||||||
| test_set1	= data1 - const . | test_set1	= data1 - const - small_const . | ||||||
| 
 | 
 | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
| 
 | 
 | ||||||
|  | @ -433,7 +434,7 @@ add_l  "add.l"	any4:ro,	A_REG:rw 		cost(2,3). | ||||||
| add_l  "add.l"	conreg4:ro,	alterable4:rw:cc	cost(2,6). | add_l  "add.l"	conreg4:ro,	alterable4:rw:cc	cost(2,6). | ||||||
| and_l  "and.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | and_l  "and.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | ||||||
| and_l  "and.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | and_l  "and.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | ||||||
| and_l  "and.l"	const:ro,	datalt4:rw:cc		cost(2,6). | and_l  "and.l"	const+small_const:ro,	datalt4:rw:cc	cost(2,6). | ||||||
| asl_l  "asl.l"	shconreg:ro,	D_REG:rw:cc		cost(2,5). | asl_l  "asl.l"	shconreg:ro,	D_REG:rw:cc		cost(2,5). | ||||||
| asl   "asl #1,"	memalt2:rw:cc				cost(2,4). | asl   "asl #1,"	memalt2:rw:cc				cost(2,4). | ||||||
| asr_l  "asr.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | asr_l  "asr.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
|  | @ -466,14 +467,15 @@ cmp_l  "cmp.l"	post_inc4:ro,	post_inc4:ro kills :cc 	cost(2,2). | ||||||
| cmp_l  "cmp.l"	immediate4:ro,	imm_cmp4:ro kills :cc	cost(2,2). | cmp_l  "cmp.l"	immediate4:ro,	imm_cmp4:ro kills :cc	cost(2,2). | ||||||
| cmp_w  "cmp.w"	any2:ro,	dreg2:ro kills :cc	cost(2,3). | cmp_w  "cmp.w"	any2:ro,	dreg2:ro kills :cc	cost(2,3). | ||||||
| cmp_w  "cmp.w"	post_inc2:ro,	post_inc2:ro kills :cc 	cost(2,2). | cmp_w  "cmp.w"	post_inc2:ro,	post_inc2:ro kills :cc 	cost(2,2). | ||||||
| cmp_w  "cmp.w"	const:ro,	imm_cmp2:ro kills :cc	cost(2,2). | cmp_w  "cmp.w"	const+small_const:ro,	imm_cmp2:ro kills :cc	cost(2,2). | ||||||
| cmp_b  "cmp.b"	any1:ro,	dreg1:ro kills :cc	cost(2,3). | cmp_b  "cmp.b"	any1:ro,	dreg1:ro kills :cc	cost(2,3). | ||||||
| cmp_b  "cmp.b"	post_inc1:ro,	post_inc1:ro kills :cc 	cost(2,2). | cmp_b  "cmp.b"	post_inc1:ro,	post_inc1:ro kills :cc 	cost(2,2). | ||||||
| cmp_b  "cmp.b"	const:ro,	imm_cmp1:ro kills :cc	cost(2,2). | cmp_b  "cmp.b"	const+small_const:ro,	imm_cmp1:ro kills :cc	cost(2,2). | ||||||
| dbf		D_REG:rw,	label			cost(2,5). | dbf		D_REG:rw,	label			cost(2,5). | ||||||
| eor_l  "eor.l"	conreg4:ro,	datalt4:rw:cc		cost(2,6). | eor_l  "eor.l"	conreg4:ro,	datalt4:rw:cc		cost(2,6). | ||||||
| ext_l  "ext.l"	D_REG:rw:cc				cost(2,2). | /* in the next two instructions: LOCAL only allowed if register var */ | ||||||
| ext_w  "ext.w"	D_REG:rw:cc				cost(2,2). | ext_l  "ext.l"	D_REG+LOCAL:rw:cc			cost(2,2). | ||||||
|  | ext_w  "ext.w"	D_REG+LOCAL:rw:cc			cost(2,2). | ||||||
| jmp		address+control4			cost(2,0). | jmp		address+control4			cost(2,0). | ||||||
| jsr		address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3). | jsr		address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3). | ||||||
| lea		address+control4:ro, A_REG:wo		cost(2,0). | lea		address+control4:ro, A_REG:wo		cost(2,0). | ||||||
|  | @ -490,7 +492,7 @@ not_l  "not.l"	D_REG:rw:cc				cost(2,3). | ||||||
| not_l  "not.l"	memory4:rw:cc				cost(2,6). | not_l  "not.l"	memory4:rw:cc				cost(2,6). | ||||||
| or_l   "or.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | or_l   "or.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | ||||||
| or_l   "or.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | or_l   "or.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | ||||||
| or_l   "or.l"	const:ro,	datalt4:rw:cc		cost(2,6). | or_l   "or.l"	const+small_const:ro,	datalt4:rw:cc		cost(2,6). | ||||||
| rol_l  "rol.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | rol_l  "rol.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
| rol   "rol #1,"	memalt2:rw:cc				cost(2,4). | rol   "rol #1,"	memalt2:rw:cc				cost(2,4). | ||||||
| ror_l  "ror.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ror_l  "ror.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
|  | @ -519,7 +521,8 @@ divs_l "divs.l" data4:ro,	D_REG:rw:cc		cost(2,90). | ||||||
| divsl_l "divsl.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,90). | divsl_l "divsl.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,90). | ||||||
| divu_l "divu.l" data4:ro,	D_REG:rw:cc		cost(2,78). | divu_l "divu.l" data4:ro,	D_REG:rw:cc		cost(2,78). | ||||||
| divul_l "divul.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,78). | divul_l "divul.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,78). | ||||||
| extb_l "extb.l" D_REG:rw:cc				cost(2,4). | /* in the next instruction: LOCAL only allowed if register var */ | ||||||
|  | extb_l "extb.l" D_REG+LOCAL:rw:cc			cost(2,4). | ||||||
| muls_l "muls.l" data4:ro,	D_REG:rw:cc		cost(2,44). | muls_l "muls.l" data4:ro,	D_REG:rw:cc		cost(2,44). | ||||||
| mulu_l "mulu.l" data4:ro,	D_REG:rw:cc		cost(2,44). | mulu_l "mulu.l" data4:ro,	D_REG:rw:cc		cost(2,44). | ||||||
| pea		address+control4+regX			cost(2,4). | pea		address+control4+regX			cost(2,4). | ||||||
|  | @ -538,22 +541,22 @@ killreg "! kill" A_REG:wo				cost(0,0). | ||||||
| 
 | 
 | ||||||
| MOVES | MOVES | ||||||
| 
 | 
 | ||||||
| from const %num==0 to D_REG | from const+small_const %num==0 to D_REG | ||||||
|     gen clr_l %2 |     gen clr_l %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt4 | from const+small_const %num==0 to memalt4 | ||||||
|     gen clr_l %2 |     gen clr_l %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt2 | from const+small_const %num==0 to memalt2 | ||||||
|     gen clr_w %2 |     gen clr_w %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt1 | from const+small_const %num==0 to memalt1 | ||||||
|     gen clr_b %2 |     gen clr_b %2 | ||||||
| 
 | 
 | ||||||
| from const to memalt1 | from const+small_const to memalt1 | ||||||
|     gen move_b {const, lowb(%1.num)}, %2 |     gen move_b {const, lowb(%1.num)}, %2 | ||||||
| 
 | 
 | ||||||
| from const to memalt2 | from const+small_const to memalt2 | ||||||
|     gen move_w {const, loww(%1.num)}, %2 |     gen move_w {const, loww(%1.num)}, %2 | ||||||
| 
 | 
 | ||||||
| from regAcon %bd==0 to A_REG | from regAcon %bd==0 to A_REG | ||||||
|  | @ -606,7 +609,7 @@ to test test_set1 | ||||||
| STACKINGRULES | STACKINGRULES | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to STACK | from const+small_const %num==0 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
|  | @ -625,22 +628,37 @@ from t_regAcon to STACK | ||||||
| 	add_l {const, %1.bd}, {indirect4, sp} | 	add_l {const, %1.bd}, {indirect4, sp} | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
| 
 | 
 | ||||||
|  | from A_REG to STACK | ||||||
|  |     gen pea {indirect4, %1} | ||||||
|  | 
 | ||||||
| from address - ext_addr to STACK | from address - ext_addr to STACK | ||||||
|     gen pea %1 |     gen pea %1 | ||||||
| 
 | 
 | ||||||
| from ext_addr to STACK | from ext_addr to STACK | ||||||
|     gen pea {absolute4, %1.bd} |     gen pea {absolute4, %1.bd} | ||||||
| 
 | 
 | ||||||
| from const to STACK | from const+small_const to STACK | ||||||
|     gen pea {absolute4, %1.num} |     gen pea {absolute4, %1.num} | ||||||
| 
 | 
 | ||||||
| from any4 to STACK | from any4 to STACK | ||||||
|     gen move_l %1, {pre_dec4, sp} |     gen move_l %1, {pre_dec4, sp} | ||||||
| 
 | 
 | ||||||
|  | from any2 to STACK | ||||||
|  |   uses DD_REG | ||||||
|  |     gen clr_l %a | ||||||
|  | 	move_w %1, {dreg2, %a} | ||||||
|  | 	move_l %a, {pre_dec4, sp} | ||||||
|  | 
 | ||||||
| from any2 to STACK | from any2 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 	move_w %1, {offsetted2, sp, 2} | 	move_w %1, {offsetted2, sp, 2} | ||||||
| 
 | 
 | ||||||
|  | from data1 to STACK | ||||||
|  |   uses DD_REG | ||||||
|  |     gen clr_l %a | ||||||
|  | 	move_b %1, {dreg1, %a} | ||||||
|  | 	move_l %a, {pre_dec4, sp} | ||||||
|  | 
 | ||||||
| from data1 to STACK | from data1 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 	move_b %1, {offsetted1, sp, 3} | 	move_b %1, {offsetted1, sp, 3} | ||||||
|  | @ -737,11 +755,11 @@ pat lil inreg($1)==reg_any | ||||||
| 			yields  {indirect4, %a} | 			yields  {indirect4, %a} | ||||||
| 
 | 
 | ||||||
| pat stl inreg($1)==reg_any | pat stl inreg($1)==reg_any | ||||||
| with exact memory1-const | with exact memory1-const-small_const | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen	clr_l {LOCAL, $1} |     gen	clr_l {LOCAL, $1} | ||||||
| 	move_b %1, {dreg1, regvar($1,reg_any)} | 	move_b %1, {dreg1, regvar($1,reg_any)} | ||||||
| with exact memory2-const | with exact memory2-const-small_const | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen	clr_l {LOCAL, $1} |     gen	clr_l {LOCAL, $1} | ||||||
| 	move_w %1, {dreg2, regvar($1,reg_any)} | 	move_w %1, {dreg2, regvar($1,reg_any)} | ||||||
|  | @ -922,6 +940,20 @@ pat lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==reg_pointer | ||||||
|     kills allexceptcon |     kills allexceptcon | ||||||
|     gen add_l {const, $3}, {offsetted4, regvar($1, reg_pointer), $2} |     gen add_l {const, $3}, {offsetted4, regvar($1, reg_pointer), $2} | ||||||
| 
 | 
 | ||||||
|  | #ifdef TBL68020 | ||||||
|  | pat loe lof inc loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen add_l {const, 1}, {ABS_off4, $1, $2} | ||||||
|  | 
 | ||||||
|  | pat loe lof dec loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen sub_l {const, 1}, {ABS_off4, $1, $2} | ||||||
|  | 
 | ||||||
|  | pat loe lof adp loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen add_l {const, $3}, {ABS_off4, $1, $2} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| pat inl inreg($1)==reg_any | pat inl inreg($1)==reg_any | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen add_l {const, 1}, {LOCAL, $1} |     gen add_l {const, 1}, {LOCAL, $1} | ||||||
|  | @ -1098,6 +1130,15 @@ pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer | ||||||
|     killreg %a |     killreg %a | ||||||
| 			yields	%a | 			yields	%a | ||||||
| 
 | 
 | ||||||
|  | #ifdef TBL68020 | ||||||
|  | pat loe lof dup adp loe stf $1==$5 && $2==$6 | ||||||
|  |     kills allexceptcon | ||||||
|  |     uses AA_REG = {ABS_off4, $1, $2} | ||||||
|  |     gen add_l {const, $4}, {ABS_off4, $1, $2} | ||||||
|  |     killreg %a | ||||||
|  | 			yields	%a | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| pat lol lol adp stl loi $1==$2 && $1==$4 && $3==1 && $5==1 && | pat lol lol adp stl loi $1==$2 && $1==$4 && $3==1 && $5==1 && | ||||||
| 						inreg($1)==reg_pointer | 						inreg($1)==reg_pointer | ||||||
|     kills regvar($1, reg_pointer) |     kills regvar($1, reg_pointer) | ||||||
|  | @ -1202,6 +1243,8 @@ with any4 | ||||||
|  * Group 1: load instructions			* |  * Group 1: load instructions			* | ||||||
|  ************************************************/ |  ************************************************/ | ||||||
| 
 | 
 | ||||||
|  | pat loc in_1($1)	yields	{small_const, $1} | ||||||
|  | 
 | ||||||
| pat loc			yields	{const, $1} | pat loc			yields	{const, $1} | ||||||
| 
 | 
 | ||||||
| pat ldc				leaving loc 18 trp | pat ldc				leaving loc 18 trp | ||||||
|  | @ -2206,9 +2249,9 @@ pat zre | ||||||
|     kills posextern |     kills posextern | ||||||
|     gen clr_l {absolute4, $1} |     gen clr_l {absolute4, $1} | ||||||
| 
 | 
 | ||||||
| pat zer $1==4		yields	{const, 0} | pat zer $1==4		yields	{small_const, 0} | ||||||
| pat zer $1==8		yields	{const, 0} {const, 0} | pat zer $1==8		yields	{small_const, 0} {small_const, 0} | ||||||
| pat zer $1==12		yields	{const, 0} {const, 0} {const, 0} | pat zer $1==12		yields	{small_const, 0} {small_const, 0} {small_const, 0} | ||||||
| 
 | 
 | ||||||
| pat zer | pat zer | ||||||
| with STACK | with STACK | ||||||
|  | @ -2264,9 +2307,9 @@ pat loc loc cff	$1==4 && $2==8 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| proc log4 | proc log4 | ||||||
| with datalt4+const DD_REG | with datalt4+const+small_const DD_REG | ||||||
|     gen xxx* %1, %2	yields	%2 |     gen xxx* %1, %2	yields	%2 | ||||||
| with DD_REG datalt4+const | with DD_REG datalt4+const+small_const | ||||||
|     gen xxx* %2, %1	yields	%1 |     gen xxx* %2, %1	yields	%1 | ||||||
| 
 | 
 | ||||||
| proc logdef example and | proc logdef example and | ||||||
|  | @ -2598,10 +2641,10 @@ with STACK | ||||||
|     gen bra {llabel, $1} |     gen bra {llabel, $1} | ||||||
| 
 | 
 | ||||||
| proc brxx example beq | proc brxx example beq | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| with genreg any4 STACK | with genreg any4-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -2615,15 +2658,15 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| 
 | 
 | ||||||
| proc brnqxx example beq | proc brnqxx example beq | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| with genreg any4 STACK | with genreg any4-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -2637,7 +2680,7 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| 
 | 
 | ||||||
|  | @ -3287,12 +3330,12 @@ pat tge ior $2==4			call txxior("blt", "bcs") | ||||||
| pat tgt ior $2==4			call txxior("ble", "bls") | pat tgt ior $2==4			call txxior("ble", "bls") | ||||||
| 
 | 
 | ||||||
| proc cmxtxxand | proc cmxtxxand | ||||||
| with any4 genreg DD_REG | with any4-small_const genreg DD_REG | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	clr_l %3 | 	clr_l %3 | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| with genreg any4-genreg DD_REG | with genreg any4-genreg-small_const DD_REG | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	clr_l %3 | 	clr_l %3 | ||||||
|  | @ -3309,12 +3352,12 @@ with exact imm_cmp4 immediate4 DD_REG | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| 
 | 
 | ||||||
| proc cmxtxxior | proc cmxtxxior | ||||||
| with any4 genreg DD_REG | with any4-small_const genreg DD_REG | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	move {const, 1},  %3 | 	move {const, 1},  %3 | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| with genreg any4-genreg DD_REG | with genreg any4-genreg-small_const DD_REG | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	move {const, 1},  %3 | 	move {const, 1},  %3 | ||||||
|  | @ -3331,13 +3374,13 @@ with exact imm_cmp4 immediate4 DD_REG | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| 
 | 
 | ||||||
| proc cmxtxx | proc cmxtxx | ||||||
| with any4 genreg | with any4-small_const genreg | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	clr_l %a | 	clr_l %a | ||||||
| 	1:		yields	%a | 	1:		yields	%a | ||||||
| with genreg any4-genreg | with genreg any4-genreg-small_const | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
|  | @ -3361,7 +3404,7 @@ with genreg STACK | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	clr_l %a | 	clr_l %a | ||||||
| 	1:		yields	%a | 	1:		yields	%a | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
|  | @ -3411,10 +3454,10 @@ pat cmu tge $1==4			call cmxtxx("bcc","bls") | ||||||
| pat cmu tgt $1==4			call cmxtxx("bhi","bcs") | pat cmu tgt $1==4			call cmxtxx("bhi","bcs") | ||||||
| 
 | 
 | ||||||
| proc cmuzxx example cmu zlt | proc cmuzxx example cmu zlt | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $2} | 	bxx[1] {llabel, $2} | ||||||
| with genreg any4-genreg STACK | with genreg any4-genreg-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $2} | 	bxx[2] {llabel, $2} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -3428,13 +3471,13 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $2} | 	bxx[2] {llabel, $2} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $2} | 	bxx[1] {llabel, $2} | ||||||
| with data2 dreg2 STACK | with data2-small_const dreg2 STACK | ||||||
|     gen cmp_w %1, %2 |     gen cmp_w %1, %2 | ||||||
|         bxx[1] {llabel, $2} |         bxx[1] {llabel, $2} | ||||||
| with dreg2 data2-conreg2 STACK | with dreg2 data2-conreg2-small_const STACK | ||||||
|     gen cmp_w %2, %1 |     gen cmp_w %2, %1 | ||||||
|         bxx[2] {llabel, $2} |         bxx[2] {llabel, $2} | ||||||
| with data1 dreg1 STACK | with data1 dreg1 STACK | ||||||
|  | @ -3506,6 +3549,17 @@ pat loc loc cii loc bne $1==2 && $2==4 && in_2($4)	call bxx2_in("bne") | ||||||
| pat loc loc cii loc bge $1==2 && $2==4 && in_2($4)	call bxx2_in("bge") | pat loc loc cii loc bge $1==2 && $2==4 && in_2($4)	call bxx2_in("bge") | ||||||
| pat loc loc cii loc bgt $1==2 && $2==4 && in_2($4)	call bxx2_in("bgt") | pat loc loc cii loc bgt $1==2 && $2==4 && in_2($4)	call bxx2_in("bgt") | ||||||
| 
 | 
 | ||||||
|  | pat loc loc cii stl $1==1 && $2==4 && inreg($4)==reg_any | ||||||
|  | with memory1+DD_REG | ||||||
|  |     kills regvar($4, reg_any), use_index %xreg==regvar($4, reg_any) | ||||||
|  |     gen	move_b %1, {dreg1, regvar($4,reg_any)} | ||||||
|  | #ifdef TBL68020 | ||||||
|  | 	extb_l	{LOCAL,$4} | ||||||
|  | #else TBL68020 | ||||||
|  | 	ext_w	{LOCAL,$4} | ||||||
|  | 	ext_l	{LOCAL,$4} | ||||||
|  | #endif TBL68020 | ||||||
|  | 
 | ||||||
| pat loc loc cii $1==2 && $2==4 | pat loc loc cii $1==2 && $2==4 | ||||||
| with DD_REG | with DD_REG | ||||||
|     gen ext_l %1	yields	%1 |     gen ext_l %1	yields	%1 | ||||||
|  |  | ||||||
|  | @ -85,6 +85,7 @@ TOKENS | ||||||
| 	 */ | 	 */ | ||||||
| 
 | 
 | ||||||
| 	/* Part (i) */ | 	/* Part (i) */ | ||||||
|  | small_const	= {INT num;} 4 cost(0,4) "#" num . | ||||||
| const		= {INT num;} 4 cost(4,4) "#" num . | const		= {INT num;} 4 cost(4,4) "#" num . | ||||||
| indirect4	= {A_REG reg;} 4 cost(0,4) "(" reg ")" . | indirect4	= {A_REG reg;} 4 cost(0,4) "(" reg ")" . | ||||||
| post_inc4	= {A_REG reg;} 4 cost(0,4) "(" reg ")+" . | post_inc4	= {A_REG reg;} 4 cost(0,4) "(" reg ")+" . | ||||||
|  | @ -222,27 +223,27 @@ SETS | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
| 	/* A m68k4 part */ | 	/* A m68k4 part */ | ||||||
| data4		= D_REG + LOCAL + const + post_inc4 + pre_dec4 + | data4		= D_REG + LOCAL + const + small_const + post_inc4 + pre_dec4 + | ||||||
| 		  indirect4 + offsetted4 + index_off4 + absolute4 + | 		  indirect4 + offsetted4 + index_off4 + absolute4 + | ||||||
| 		  ext_addr . | 		  ext_addr . | ||||||
| memory4		= data4 - D_REG . | memory4		= data4 - D_REG . | ||||||
| control4	= indirect4 + offsetted4 + index_off4 + absolute4 + | control4	= indirect4 + offsetted4 + index_off4 + absolute4 + | ||||||
| 		  LOCAL . | 		  LOCAL . | ||||||
| alterable4	= data4 + A_REG - const - ext_addr . | alterable4	= data4 + A_REG - small_const - const - ext_addr . | ||||||
| any4		= data4 + A_REG . /* all four above together */ | any4		= data4 + A_REG . /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data2		= dreg2 + post_inc2 + pre_dec2 + indirect2 + | data2		= dreg2 + post_inc2 + pre_dec2 + indirect2 + | ||||||
| 		  offsetted2 + index_off2 + absolute2 + const . | 		  offsetted2 + index_off2 + absolute2 + const + small_const . | ||||||
| memory2		= data2 - dreg2 . | memory2		= data2 - dreg2 . | ||||||
| control2	= indirect2 + offsetted2 + index_off2 + absolute2 . | control2	= indirect2 + offsetted2 + index_off2 + absolute2 . | ||||||
| alterable2	= data2 + A_REG + D_REG - const . | alterable2	= data2 + A_REG + D_REG - const - small_const . | ||||||
| any2		= data2 + A_REG + D_REG. | any2		= data2 + A_REG + D_REG. | ||||||
| 
 | 
 | ||||||
| data1		= dreg1 + post_inc1 + pre_dec1 + indirect1 + | data1		= dreg1 + post_inc1 + pre_dec1 + indirect1 + | ||||||
| 		  offsetted1 + index_off1 + absolute1 + const . | 		  offsetted1 + index_off1 + absolute1 + const + small_const . | ||||||
| memory1		= data1 - dreg1 . | memory1		= data1 - dreg1 . | ||||||
| control1	= indirect1 + offsetted1 + index_off1 + absolute1 . | control1	= indirect1 + offsetted1 + index_off1 + absolute1 . | ||||||
| alterable1	= data1 + D_REG - const . | alterable1	= data1 + D_REG - const -small_const . | ||||||
| any1		= data1 + D_REG. | any1		= data1 + D_REG. | ||||||
| 
 | 
 | ||||||
| #else TBL68020 | #else TBL68020 | ||||||
|  | @ -251,31 +252,31 @@ data4		= D_REG + indirect4 + post_inc4 + pre_dec4 + index_off4 + | ||||||
| 		      offsetted4 + OFF_off4 + OFF_indoff4 + | 		      offsetted4 + OFF_off4 + OFF_indoff4 + | ||||||
| 		  INDOFF_off4 + | 		  INDOFF_off4 + | ||||||
| 		  ABS_off4 + ABS_indoff4 + ABSIND_off4 + | 		  ABS_off4 + ABS_indoff4 + ABSIND_off4 + | ||||||
| 		  absolute4 + abs_index4 + const + ext_addr + | 		  absolute4 + abs_index4 + const + small_const + ext_addr + | ||||||
| 		  LOCAL + ILOCAL . | 		  LOCAL + ILOCAL . | ||||||
| memory4		= data4 - D_REG . | memory4		= data4 - D_REG . | ||||||
| control4	= memory4 - (post_inc4 + pre_dec4 + const + ext_addr) . | control4	= memory4 - (post_inc4 + pre_dec4 + const + small_const + ext_addr) . | ||||||
| alterable4	= data4 + A_REG - const - ext_addr . | alterable4	= data4 + A_REG - const - ext_addr - small_const . | ||||||
| any4		= data4 + A_REG . /* all four above together */ | any4		= data4 + A_REG . /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data2		= dreg2 + indirect2 + post_inc2 + pre_dec2 + index_off2 + | data2		= dreg2 + indirect2 + post_inc2 + pre_dec2 + index_off2 + | ||||||
| 		      offsetted2 + OFF_off2 + OFF_indoff2 + | 		      offsetted2 + OFF_off2 + OFF_indoff2 + | ||||||
| 		  INDOFF_off2 + | 		  INDOFF_off2 + | ||||||
| 		  ABS_off2 + ABS_indoff2 + ABSIND_off2 + | 		  ABS_off2 + ABS_indoff2 + ABSIND_off2 + | ||||||
| 		  absolute2 + abs_index2 + const . | 		  absolute2 + abs_index2 + const + small_const . | ||||||
| memory2		= data2 - dreg2 . | memory2		= data2 - dreg2 . | ||||||
| control2	= memory2 - (post_inc2 + pre_dec2 + const) . | control2	= memory2 - (post_inc2 + pre_dec2 + const + small_const) . | ||||||
| alterable2	= data2 + A_REG + D_REG - const . | alterable2	= data2 + A_REG + D_REG - const - small_const . | ||||||
| any2		= data2 + A_REG + D_REG. /* all four above together */ | any2		= data2 + A_REG + D_REG. /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data1		= dreg1 + indirect1 + post_inc1 + pre_dec1 + index_off1 + | data1		= dreg1 + indirect1 + post_inc1 + pre_dec1 + index_off1 + | ||||||
| 		      offsetted1 + OFF_off1 + OFF_indoff1 + | 		      offsetted1 + OFF_off1 + OFF_indoff1 + | ||||||
| 		  INDOFF_off1 + | 		  INDOFF_off1 + | ||||||
| 		  ABS_off1 + ABS_indoff1 + ABSIND_off1 + | 		  ABS_off1 + ABS_indoff1 + ABSIND_off1 + | ||||||
| 		  absolute1 + abs_index1 + const . | 		  absolute1 + abs_index1 + const + small_const . | ||||||
| memory1		= data1 - dreg1 . | memory1		= data1 - dreg1 . | ||||||
| control1	= memory1 - (post_inc1 + pre_dec1 + const) . | control1	= memory1 - (post_inc1 + pre_dec1 + const + small_const) . | ||||||
| alterable1	= data1 + D_REG - const . | alterable1	= data1 + D_REG - const - small_const . | ||||||
| any1		= data1  + D_REG. /* all four above together */ | any1		= data1  + D_REG. /* all four above together */ | ||||||
| 
 | 
 | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
|  | @ -296,7 +297,7 @@ address		= ext_addr + local_addr + regAcon + regAregXcon . | ||||||
| all_regind	= indirect + offsetted + pre_post + index_off + | all_regind	= indirect + offsetted + pre_post + index_off + | ||||||
| 		      regind_addr . | 		      regind_addr . | ||||||
| all_indir	= all_regind . | all_indir	= all_regind . | ||||||
| allexceptcon	= ALL - ( D_REG + A_REG + const + dreg2 + dreg1 + | allexceptcon	= ALL - ( D_REG + A_REG + const + small_const + dreg2 + dreg1 + | ||||||
| 		    local_addr + ext_addr + regAcon + regAregXcon + | 		    local_addr + ext_addr + regAcon + regAregXcon + | ||||||
| 		    t_regAcon + t_regAregXcon ) . | 		    t_regAcon + t_regAregXcon ) . | ||||||
| use_index	= index_off4 + index_off2 + index_off1 . | use_index	= index_off4 + index_off2 + index_off1 . | ||||||
|  | @ -325,7 +326,7 @@ address		= regind_addr + | ||||||
| all_regind	= indirect + offsetted + index_off + pre_post + | all_regind	= indirect + offsetted + index_off + pre_post + | ||||||
| 		      reg_memind + regind_addr . | 		      reg_memind + regind_addr . | ||||||
| all_indir	= all_regind + memind + ILOCAL . | all_indir	= all_regind + memind + ILOCAL . | ||||||
| allexceptcon	= ALL - ( D_REG + A_REG + const + dreg2 + dreg1 + | allexceptcon	= ALL - ( D_REG + A_REG + const + small_const + dreg2 + dreg1 + | ||||||
| 		    local_addr + ext_addr + regAcon + regAregXcon + ext_regX ) . | 		    local_addr + ext_addr + regAcon + regAregXcon + ext_regX ) . | ||||||
| use_index4	= index_off4 + abs_index4 + | use_index4	= index_off4 + abs_index4 + | ||||||
| 		  OFF_indoff4 + INDOFF_off4 + | 		  OFF_indoff4 + INDOFF_off4 + | ||||||
|  | @ -349,10 +350,10 @@ posextern	= absolute + all_indir . | ||||||
| 
 | 
 | ||||||
| genreg		= D_REG + A_REG. | genreg		= D_REG + A_REG. | ||||||
| label		= llabel + slabel . | label		= llabel + slabel . | ||||||
| immediate4	= const + ext_addr . | immediate4	= const + small_const + ext_addr . | ||||||
| conreg4		= D_REG + immediate4 . | conreg4		= D_REG + immediate4 . | ||||||
| conreg2		= dreg2 + const + D_REG . | conreg2		= dreg2 + const + small_const + D_REG . | ||||||
| conreg1		= dreg1 + const + D_REG . | conreg1		= dreg1 + const + small_const + D_REG . | ||||||
| shconreg	= D_REG + shconst . | shconreg	= D_REG + shconst . | ||||||
| datalt4		= data4 * alterable4 . | datalt4		= data4 * alterable4 . | ||||||
| datalt2		= data2 * alterable2 . | datalt2		= data2 * alterable2 . | ||||||
|  | @ -364,7 +365,7 @@ memalt1		= memory1 * alterable1 . | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
| 	/* A m68k4 part */ | 	/* A m68k4 part */ | ||||||
| imm_cmp4	= alterable4 . | imm_cmp4	= alterable4 - genreg . | ||||||
| imm_cmp2	= alterable2 + D_REG . | imm_cmp2	= alterable2 + D_REG . | ||||||
| imm_cmp1	= datalt1 + D_REG . | imm_cmp1	= datalt1 + D_REG . | ||||||
| 
 | 
 | ||||||
|  | @ -374,13 +375,13 @@ test_set1	= datalt1 . | ||||||
| 
 | 
 | ||||||
| #else TBL68020 | #else TBL68020 | ||||||
| 
 | 
 | ||||||
| imm_cmp4	= any4 - immediate4 . | imm_cmp4	= any4 - immediate4 - genreg . | ||||||
| imm_cmp2	= any2 - const . | imm_cmp2	= any2 - const - small_const . | ||||||
| imm_cmp1	= any1 - const . | imm_cmp1	= any1 - const - small_const . | ||||||
| 
 | 
 | ||||||
| test_set4	= data4 - immediate4 . | test_set4	= data4 - immediate4 . | ||||||
| test_set2	= data2 - const . | test_set2	= data2 - const - small_const . | ||||||
| test_set1	= data1 - const . | test_set1	= data1 - const - small_const . | ||||||
| 
 | 
 | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
| 
 | 
 | ||||||
|  | @ -433,7 +434,7 @@ add_l  "add.l"	any4:ro,	A_REG:rw 		cost(2,3). | ||||||
| add_l  "add.l"	conreg4:ro,	alterable4:rw:cc	cost(2,6). | add_l  "add.l"	conreg4:ro,	alterable4:rw:cc	cost(2,6). | ||||||
| and_l  "and.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | and_l  "and.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | ||||||
| and_l  "and.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | and_l  "and.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | ||||||
| and_l  "and.l"	const:ro,	datalt4:rw:cc		cost(2,6). | and_l  "and.l"	const+small_const:ro,	datalt4:rw:cc	cost(2,6). | ||||||
| asl_l  "asl.l"	shconreg:ro,	D_REG:rw:cc		cost(2,5). | asl_l  "asl.l"	shconreg:ro,	D_REG:rw:cc		cost(2,5). | ||||||
| asl   "asl #1,"	memalt2:rw:cc				cost(2,4). | asl   "asl #1,"	memalt2:rw:cc				cost(2,4). | ||||||
| asr_l  "asr.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | asr_l  "asr.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
|  | @ -466,14 +467,15 @@ cmp_l  "cmp.l"	post_inc4:ro,	post_inc4:ro kills :cc 	cost(2,2). | ||||||
| cmp_l  "cmp.l"	immediate4:ro,	imm_cmp4:ro kills :cc	cost(2,2). | cmp_l  "cmp.l"	immediate4:ro,	imm_cmp4:ro kills :cc	cost(2,2). | ||||||
| cmp_w  "cmp.w"	any2:ro,	dreg2:ro kills :cc	cost(2,3). | cmp_w  "cmp.w"	any2:ro,	dreg2:ro kills :cc	cost(2,3). | ||||||
| cmp_w  "cmp.w"	post_inc2:ro,	post_inc2:ro kills :cc 	cost(2,2). | cmp_w  "cmp.w"	post_inc2:ro,	post_inc2:ro kills :cc 	cost(2,2). | ||||||
| cmp_w  "cmp.w"	const:ro,	imm_cmp2:ro kills :cc	cost(2,2). | cmp_w  "cmp.w"	const+small_const:ro,	imm_cmp2:ro kills :cc	cost(2,2). | ||||||
| cmp_b  "cmp.b"	any1:ro,	dreg1:ro kills :cc	cost(2,3). | cmp_b  "cmp.b"	any1:ro,	dreg1:ro kills :cc	cost(2,3). | ||||||
| cmp_b  "cmp.b"	post_inc1:ro,	post_inc1:ro kills :cc 	cost(2,2). | cmp_b  "cmp.b"	post_inc1:ro,	post_inc1:ro kills :cc 	cost(2,2). | ||||||
| cmp_b  "cmp.b"	const:ro,	imm_cmp1:ro kills :cc	cost(2,2). | cmp_b  "cmp.b"	const+small_const:ro,	imm_cmp1:ro kills :cc	cost(2,2). | ||||||
| dbf		D_REG:rw,	label			cost(2,5). | dbf		D_REG:rw,	label			cost(2,5). | ||||||
| eor_l  "eor.l"	conreg4:ro,	datalt4:rw:cc		cost(2,6). | eor_l  "eor.l"	conreg4:ro,	datalt4:rw:cc		cost(2,6). | ||||||
| ext_l  "ext.l"	D_REG:rw:cc				cost(2,2). | /* in the next two instructions: LOCAL only allowed if register var */ | ||||||
| ext_w  "ext.w"	D_REG:rw:cc				cost(2,2). | ext_l  "ext.l"	D_REG+LOCAL:rw:cc			cost(2,2). | ||||||
|  | ext_w  "ext.w"	D_REG+LOCAL:rw:cc			cost(2,2). | ||||||
| jmp		address+control4			cost(2,0). | jmp		address+control4			cost(2,0). | ||||||
| jsr		address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3). | jsr		address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3). | ||||||
| lea		address+control4:ro, A_REG:wo		cost(2,0). | lea		address+control4:ro, A_REG:wo		cost(2,0). | ||||||
|  | @ -490,7 +492,7 @@ not_l  "not.l"	D_REG:rw:cc				cost(2,3). | ||||||
| not_l  "not.l"	memory4:rw:cc				cost(2,6). | not_l  "not.l"	memory4:rw:cc				cost(2,6). | ||||||
| or_l   "or.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | or_l   "or.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | ||||||
| or_l   "or.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | or_l   "or.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | ||||||
| or_l   "or.l"	const:ro,	datalt4:rw:cc		cost(2,6). | or_l   "or.l"	const+small_const:ro,	datalt4:rw:cc		cost(2,6). | ||||||
| rol_l  "rol.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | rol_l  "rol.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
| rol   "rol #1,"	memalt2:rw:cc				cost(2,4). | rol   "rol #1,"	memalt2:rw:cc				cost(2,4). | ||||||
| ror_l  "ror.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ror_l  "ror.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
|  | @ -519,7 +521,8 @@ divs_l "divs.l" data4:ro,	D_REG:rw:cc		cost(2,90). | ||||||
| divsl_l "divsl.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,90). | divsl_l "divsl.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,90). | ||||||
| divu_l "divu.l" data4:ro,	D_REG:rw:cc		cost(2,78). | divu_l "divu.l" data4:ro,	D_REG:rw:cc		cost(2,78). | ||||||
| divul_l "divul.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,78). | divul_l "divul.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,78). | ||||||
| extb_l "extb.l" D_REG:rw:cc				cost(2,4). | /* in the next instruction: LOCAL only allowed if register var */ | ||||||
|  | extb_l "extb.l" D_REG+LOCAL:rw:cc			cost(2,4). | ||||||
| muls_l "muls.l" data4:ro,	D_REG:rw:cc		cost(2,44). | muls_l "muls.l" data4:ro,	D_REG:rw:cc		cost(2,44). | ||||||
| mulu_l "mulu.l" data4:ro,	D_REG:rw:cc		cost(2,44). | mulu_l "mulu.l" data4:ro,	D_REG:rw:cc		cost(2,44). | ||||||
| pea		address+control4+regX			cost(2,4). | pea		address+control4+regX			cost(2,4). | ||||||
|  | @ -538,22 +541,22 @@ killreg "! kill" A_REG:wo				cost(0,0). | ||||||
| 
 | 
 | ||||||
| MOVES | MOVES | ||||||
| 
 | 
 | ||||||
| from const %num==0 to D_REG | from const+small_const %num==0 to D_REG | ||||||
|     gen clr_l %2 |     gen clr_l %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt4 | from const+small_const %num==0 to memalt4 | ||||||
|     gen clr_l %2 |     gen clr_l %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt2 | from const+small_const %num==0 to memalt2 | ||||||
|     gen clr_w %2 |     gen clr_w %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt1 | from const+small_const %num==0 to memalt1 | ||||||
|     gen clr_b %2 |     gen clr_b %2 | ||||||
| 
 | 
 | ||||||
| from const to memalt1 | from const+small_const to memalt1 | ||||||
|     gen move_b {const, lowb(%1.num)}, %2 |     gen move_b {const, lowb(%1.num)}, %2 | ||||||
| 
 | 
 | ||||||
| from const to memalt2 | from const+small_const to memalt2 | ||||||
|     gen move_w {const, loww(%1.num)}, %2 |     gen move_w {const, loww(%1.num)}, %2 | ||||||
| 
 | 
 | ||||||
| from regAcon %bd==0 to A_REG | from regAcon %bd==0 to A_REG | ||||||
|  | @ -606,7 +609,7 @@ to test test_set1 | ||||||
| STACKINGRULES | STACKINGRULES | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to STACK | from const+small_const %num==0 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
|  | @ -625,22 +628,37 @@ from t_regAcon to STACK | ||||||
| 	add_l {const, %1.bd}, {indirect4, sp} | 	add_l {const, %1.bd}, {indirect4, sp} | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
| 
 | 
 | ||||||
|  | from A_REG to STACK | ||||||
|  |     gen pea {indirect4, %1} | ||||||
|  | 
 | ||||||
| from address - ext_addr to STACK | from address - ext_addr to STACK | ||||||
|     gen pea %1 |     gen pea %1 | ||||||
| 
 | 
 | ||||||
| from ext_addr to STACK | from ext_addr to STACK | ||||||
|     gen pea {absolute4, %1.bd} |     gen pea {absolute4, %1.bd} | ||||||
| 
 | 
 | ||||||
| from const to STACK | from const+small_const to STACK | ||||||
|     gen pea {absolute4, %1.num} |     gen pea {absolute4, %1.num} | ||||||
| 
 | 
 | ||||||
| from any4 to STACK | from any4 to STACK | ||||||
|     gen move_l %1, {pre_dec4, sp} |     gen move_l %1, {pre_dec4, sp} | ||||||
| 
 | 
 | ||||||
|  | from any2 to STACK | ||||||
|  |   uses DD_REG | ||||||
|  |     gen clr_l %a | ||||||
|  | 	move_w %1, {dreg2, %a} | ||||||
|  | 	move_l %a, {pre_dec4, sp} | ||||||
|  | 
 | ||||||
| from any2 to STACK | from any2 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 	move_w %1, {offsetted2, sp, 2} | 	move_w %1, {offsetted2, sp, 2} | ||||||
| 
 | 
 | ||||||
|  | from data1 to STACK | ||||||
|  |   uses DD_REG | ||||||
|  |     gen clr_l %a | ||||||
|  | 	move_b %1, {dreg1, %a} | ||||||
|  | 	move_l %a, {pre_dec4, sp} | ||||||
|  | 
 | ||||||
| from data1 to STACK | from data1 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 	move_b %1, {offsetted1, sp, 3} | 	move_b %1, {offsetted1, sp, 3} | ||||||
|  | @ -737,11 +755,11 @@ pat lil inreg($1)==reg_any | ||||||
| 			yields  {indirect4, %a} | 			yields  {indirect4, %a} | ||||||
| 
 | 
 | ||||||
| pat stl inreg($1)==reg_any | pat stl inreg($1)==reg_any | ||||||
| with exact memory1-const | with exact memory1-const-small_const | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen	clr_l {LOCAL, $1} |     gen	clr_l {LOCAL, $1} | ||||||
| 	move_b %1, {dreg1, regvar($1,reg_any)} | 	move_b %1, {dreg1, regvar($1,reg_any)} | ||||||
| with exact memory2-const | with exact memory2-const-small_const | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen	clr_l {LOCAL, $1} |     gen	clr_l {LOCAL, $1} | ||||||
| 	move_w %1, {dreg2, regvar($1,reg_any)} | 	move_w %1, {dreg2, regvar($1,reg_any)} | ||||||
|  | @ -922,6 +940,20 @@ pat lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==reg_pointer | ||||||
|     kills allexceptcon |     kills allexceptcon | ||||||
|     gen add_l {const, $3}, {offsetted4, regvar($1, reg_pointer), $2} |     gen add_l {const, $3}, {offsetted4, regvar($1, reg_pointer), $2} | ||||||
| 
 | 
 | ||||||
|  | #ifdef TBL68020 | ||||||
|  | pat loe lof inc loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen add_l {const, 1}, {ABS_off4, $1, $2} | ||||||
|  | 
 | ||||||
|  | pat loe lof dec loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen sub_l {const, 1}, {ABS_off4, $1, $2} | ||||||
|  | 
 | ||||||
|  | pat loe lof adp loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen add_l {const, $3}, {ABS_off4, $1, $2} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| pat inl inreg($1)==reg_any | pat inl inreg($1)==reg_any | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen add_l {const, 1}, {LOCAL, $1} |     gen add_l {const, 1}, {LOCAL, $1} | ||||||
|  | @ -1098,6 +1130,15 @@ pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer | ||||||
|     killreg %a |     killreg %a | ||||||
| 			yields	%a | 			yields	%a | ||||||
| 
 | 
 | ||||||
|  | #ifdef TBL68020 | ||||||
|  | pat loe lof dup adp loe stf $1==$5 && $2==$6 | ||||||
|  |     kills allexceptcon | ||||||
|  |     uses AA_REG = {ABS_off4, $1, $2} | ||||||
|  |     gen add_l {const, $4}, {ABS_off4, $1, $2} | ||||||
|  |     killreg %a | ||||||
|  | 			yields	%a | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| pat lol lol adp stl loi $1==$2 && $1==$4 && $3==1 && $5==1 && | pat lol lol adp stl loi $1==$2 && $1==$4 && $3==1 && $5==1 && | ||||||
| 						inreg($1)==reg_pointer | 						inreg($1)==reg_pointer | ||||||
|     kills regvar($1, reg_pointer) |     kills regvar($1, reg_pointer) | ||||||
|  | @ -1202,6 +1243,8 @@ with any4 | ||||||
|  * Group 1: load instructions			* |  * Group 1: load instructions			* | ||||||
|  ************************************************/ |  ************************************************/ | ||||||
| 
 | 
 | ||||||
|  | pat loc in_1($1)	yields	{small_const, $1} | ||||||
|  | 
 | ||||||
| pat loc			yields	{const, $1} | pat loc			yields	{const, $1} | ||||||
| 
 | 
 | ||||||
| pat ldc				leaving loc 18 trp | pat ldc				leaving loc 18 trp | ||||||
|  | @ -2206,9 +2249,9 @@ pat zre | ||||||
|     kills posextern |     kills posextern | ||||||
|     gen clr_l {absolute4, $1} |     gen clr_l {absolute4, $1} | ||||||
| 
 | 
 | ||||||
| pat zer $1==4		yields	{const, 0} | pat zer $1==4		yields	{small_const, 0} | ||||||
| pat zer $1==8		yields	{const, 0} {const, 0} | pat zer $1==8		yields	{small_const, 0} {small_const, 0} | ||||||
| pat zer $1==12		yields	{const, 0} {const, 0} {const, 0} | pat zer $1==12		yields	{small_const, 0} {small_const, 0} {small_const, 0} | ||||||
| 
 | 
 | ||||||
| pat zer | pat zer | ||||||
| with STACK | with STACK | ||||||
|  | @ -2264,9 +2307,9 @@ pat loc loc cff	$1==4 && $2==8 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| proc log4 | proc log4 | ||||||
| with datalt4+const DD_REG | with datalt4+const+small_const DD_REG | ||||||
|     gen xxx* %1, %2	yields	%2 |     gen xxx* %1, %2	yields	%2 | ||||||
| with DD_REG datalt4+const | with DD_REG datalt4+const+small_const | ||||||
|     gen xxx* %2, %1	yields	%1 |     gen xxx* %2, %1	yields	%1 | ||||||
| 
 | 
 | ||||||
| proc logdef example and | proc logdef example and | ||||||
|  | @ -2598,10 +2641,10 @@ with STACK | ||||||
|     gen bra {llabel, $1} |     gen bra {llabel, $1} | ||||||
| 
 | 
 | ||||||
| proc brxx example beq | proc brxx example beq | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| with genreg any4 STACK | with genreg any4-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -2615,15 +2658,15 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| 
 | 
 | ||||||
| proc brnqxx example beq | proc brnqxx example beq | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| with genreg any4 STACK | with genreg any4-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -2637,7 +2680,7 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| 
 | 
 | ||||||
|  | @ -3287,12 +3330,12 @@ pat tge ior $2==4			call txxior("blt", "bcs") | ||||||
| pat tgt ior $2==4			call txxior("ble", "bls") | pat tgt ior $2==4			call txxior("ble", "bls") | ||||||
| 
 | 
 | ||||||
| proc cmxtxxand | proc cmxtxxand | ||||||
| with any4 genreg DD_REG | with any4-small_const genreg DD_REG | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	clr_l %3 | 	clr_l %3 | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| with genreg any4-genreg DD_REG | with genreg any4-genreg-small_const DD_REG | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	clr_l %3 | 	clr_l %3 | ||||||
|  | @ -3309,12 +3352,12 @@ with exact imm_cmp4 immediate4 DD_REG | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| 
 | 
 | ||||||
| proc cmxtxxior | proc cmxtxxior | ||||||
| with any4 genreg DD_REG | with any4-small_const genreg DD_REG | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	move {const, 1},  %3 | 	move {const, 1},  %3 | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| with genreg any4-genreg DD_REG | with genreg any4-genreg-small_const DD_REG | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	move {const, 1},  %3 | 	move {const, 1},  %3 | ||||||
|  | @ -3331,13 +3374,13 @@ with exact imm_cmp4 immediate4 DD_REG | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| 
 | 
 | ||||||
| proc cmxtxx | proc cmxtxx | ||||||
| with any4 genreg | with any4-small_const genreg | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	clr_l %a | 	clr_l %a | ||||||
| 	1:		yields	%a | 	1:		yields	%a | ||||||
| with genreg any4-genreg | with genreg any4-genreg-small_const | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
|  | @ -3361,7 +3404,7 @@ with genreg STACK | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	clr_l %a | 	clr_l %a | ||||||
| 	1:		yields	%a | 	1:		yields	%a | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
|  | @ -3411,10 +3454,10 @@ pat cmu tge $1==4			call cmxtxx("bcc","bls") | ||||||
| pat cmu tgt $1==4			call cmxtxx("bhi","bcs") | pat cmu tgt $1==4			call cmxtxx("bhi","bcs") | ||||||
| 
 | 
 | ||||||
| proc cmuzxx example cmu zlt | proc cmuzxx example cmu zlt | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $2} | 	bxx[1] {llabel, $2} | ||||||
| with genreg any4-genreg STACK | with genreg any4-genreg-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $2} | 	bxx[2] {llabel, $2} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -3428,13 +3471,13 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $2} | 	bxx[2] {llabel, $2} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $2} | 	bxx[1] {llabel, $2} | ||||||
| with data2 dreg2 STACK | with data2-small_const dreg2 STACK | ||||||
|     gen cmp_w %1, %2 |     gen cmp_w %1, %2 | ||||||
|         bxx[1] {llabel, $2} |         bxx[1] {llabel, $2} | ||||||
| with dreg2 data2-conreg2 STACK | with dreg2 data2-conreg2-small_const STACK | ||||||
|     gen cmp_w %2, %1 |     gen cmp_w %2, %1 | ||||||
|         bxx[2] {llabel, $2} |         bxx[2] {llabel, $2} | ||||||
| with data1 dreg1 STACK | with data1 dreg1 STACK | ||||||
|  | @ -3506,6 +3549,17 @@ pat loc loc cii loc bne $1==2 && $2==4 && in_2($4)	call bxx2_in("bne") | ||||||
| pat loc loc cii loc bge $1==2 && $2==4 && in_2($4)	call bxx2_in("bge") | pat loc loc cii loc bge $1==2 && $2==4 && in_2($4)	call bxx2_in("bge") | ||||||
| pat loc loc cii loc bgt $1==2 && $2==4 && in_2($4)	call bxx2_in("bgt") | pat loc loc cii loc bgt $1==2 && $2==4 && in_2($4)	call bxx2_in("bgt") | ||||||
| 
 | 
 | ||||||
|  | pat loc loc cii stl $1==1 && $2==4 && inreg($4)==reg_any | ||||||
|  | with memory1+DD_REG | ||||||
|  |     kills regvar($4, reg_any), use_index %xreg==regvar($4, reg_any) | ||||||
|  |     gen	move_b %1, {dreg1, regvar($4,reg_any)} | ||||||
|  | #ifdef TBL68020 | ||||||
|  | 	extb_l	{LOCAL,$4} | ||||||
|  | #else TBL68020 | ||||||
|  | 	ext_w	{LOCAL,$4} | ||||||
|  | 	ext_l	{LOCAL,$4} | ||||||
|  | #endif TBL68020 | ||||||
|  | 
 | ||||||
| pat loc loc cii $1==2 && $2==4 | pat loc loc cii $1==2 && $2==4 | ||||||
| with DD_REG | with DD_REG | ||||||
|     gen ext_l %1	yields	%1 |     gen ext_l %1	yields	%1 | ||||||
|  |  | ||||||
|  | @ -85,6 +85,7 @@ TOKENS | ||||||
| 	 */ | 	 */ | ||||||
| 
 | 
 | ||||||
| 	/* Part (i) */ | 	/* Part (i) */ | ||||||
|  | small_const	= {INT num;} 4 cost(0,4) "#" num . | ||||||
| const		= {INT num;} 4 cost(4,4) "#" num . | const		= {INT num;} 4 cost(4,4) "#" num . | ||||||
| indirect4	= {A_REG reg;} 4 cost(0,4) "(" reg ")" . | indirect4	= {A_REG reg;} 4 cost(0,4) "(" reg ")" . | ||||||
| post_inc4	= {A_REG reg;} 4 cost(0,4) "(" reg ")+" . | post_inc4	= {A_REG reg;} 4 cost(0,4) "(" reg ")+" . | ||||||
|  | @ -222,27 +223,27 @@ SETS | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
| 	/* A m68k4 part */ | 	/* A m68k4 part */ | ||||||
| data4		= D_REG + LOCAL + const + post_inc4 + pre_dec4 + | data4		= D_REG + LOCAL + const + small_const + post_inc4 + pre_dec4 + | ||||||
| 		  indirect4 + offsetted4 + index_off4 + absolute4 + | 		  indirect4 + offsetted4 + index_off4 + absolute4 + | ||||||
| 		  ext_addr . | 		  ext_addr . | ||||||
| memory4		= data4 - D_REG . | memory4		= data4 - D_REG . | ||||||
| control4	= indirect4 + offsetted4 + index_off4 + absolute4 + | control4	= indirect4 + offsetted4 + index_off4 + absolute4 + | ||||||
| 		  LOCAL . | 		  LOCAL . | ||||||
| alterable4	= data4 + A_REG - const - ext_addr . | alterable4	= data4 + A_REG - small_const - const - ext_addr . | ||||||
| any4		= data4 + A_REG . /* all four above together */ | any4		= data4 + A_REG . /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data2		= dreg2 + post_inc2 + pre_dec2 + indirect2 + | data2		= dreg2 + post_inc2 + pre_dec2 + indirect2 + | ||||||
| 		  offsetted2 + index_off2 + absolute2 + const . | 		  offsetted2 + index_off2 + absolute2 + const + small_const . | ||||||
| memory2		= data2 - dreg2 . | memory2		= data2 - dreg2 . | ||||||
| control2	= indirect2 + offsetted2 + index_off2 + absolute2 . | control2	= indirect2 + offsetted2 + index_off2 + absolute2 . | ||||||
| alterable2	= data2 + A_REG + D_REG - const . | alterable2	= data2 + A_REG + D_REG - const - small_const . | ||||||
| any2		= data2 + A_REG + D_REG. | any2		= data2 + A_REG + D_REG. | ||||||
| 
 | 
 | ||||||
| data1		= dreg1 + post_inc1 + pre_dec1 + indirect1 + | data1		= dreg1 + post_inc1 + pre_dec1 + indirect1 + | ||||||
| 		  offsetted1 + index_off1 + absolute1 + const . | 		  offsetted1 + index_off1 + absolute1 + const + small_const . | ||||||
| memory1		= data1 - dreg1 . | memory1		= data1 - dreg1 . | ||||||
| control1	= indirect1 + offsetted1 + index_off1 + absolute1 . | control1	= indirect1 + offsetted1 + index_off1 + absolute1 . | ||||||
| alterable1	= data1 + D_REG - const . | alterable1	= data1 + D_REG - const -small_const . | ||||||
| any1		= data1 + D_REG. | any1		= data1 + D_REG. | ||||||
| 
 | 
 | ||||||
| #else TBL68020 | #else TBL68020 | ||||||
|  | @ -251,31 +252,31 @@ data4		= D_REG + indirect4 + post_inc4 + pre_dec4 + index_off4 + | ||||||
| 		      offsetted4 + OFF_off4 + OFF_indoff4 + | 		      offsetted4 + OFF_off4 + OFF_indoff4 + | ||||||
| 		  INDOFF_off4 + | 		  INDOFF_off4 + | ||||||
| 		  ABS_off4 + ABS_indoff4 + ABSIND_off4 + | 		  ABS_off4 + ABS_indoff4 + ABSIND_off4 + | ||||||
| 		  absolute4 + abs_index4 + const + ext_addr + | 		  absolute4 + abs_index4 + const + small_const + ext_addr + | ||||||
| 		  LOCAL + ILOCAL . | 		  LOCAL + ILOCAL . | ||||||
| memory4		= data4 - D_REG . | memory4		= data4 - D_REG . | ||||||
| control4	= memory4 - (post_inc4 + pre_dec4 + const + ext_addr) . | control4	= memory4 - (post_inc4 + pre_dec4 + const + small_const + ext_addr) . | ||||||
| alterable4	= data4 + A_REG - const - ext_addr . | alterable4	= data4 + A_REG - const - ext_addr - small_const . | ||||||
| any4		= data4 + A_REG . /* all four above together */ | any4		= data4 + A_REG . /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data2		= dreg2 + indirect2 + post_inc2 + pre_dec2 + index_off2 + | data2		= dreg2 + indirect2 + post_inc2 + pre_dec2 + index_off2 + | ||||||
| 		      offsetted2 + OFF_off2 + OFF_indoff2 + | 		      offsetted2 + OFF_off2 + OFF_indoff2 + | ||||||
| 		  INDOFF_off2 + | 		  INDOFF_off2 + | ||||||
| 		  ABS_off2 + ABS_indoff2 + ABSIND_off2 + | 		  ABS_off2 + ABS_indoff2 + ABSIND_off2 + | ||||||
| 		  absolute2 + abs_index2 + const . | 		  absolute2 + abs_index2 + const + small_const . | ||||||
| memory2		= data2 - dreg2 . | memory2		= data2 - dreg2 . | ||||||
| control2	= memory2 - (post_inc2 + pre_dec2 + const) . | control2	= memory2 - (post_inc2 + pre_dec2 + const + small_const) . | ||||||
| alterable2	= data2 + A_REG + D_REG - const . | alterable2	= data2 + A_REG + D_REG - const - small_const . | ||||||
| any2		= data2 + A_REG + D_REG. /* all four above together */ | any2		= data2 + A_REG + D_REG. /* all four above together */ | ||||||
| 
 | 
 | ||||||
| data1		= dreg1 + indirect1 + post_inc1 + pre_dec1 + index_off1 + | data1		= dreg1 + indirect1 + post_inc1 + pre_dec1 + index_off1 + | ||||||
| 		      offsetted1 + OFF_off1 + OFF_indoff1 + | 		      offsetted1 + OFF_off1 + OFF_indoff1 + | ||||||
| 		  INDOFF_off1 + | 		  INDOFF_off1 + | ||||||
| 		  ABS_off1 + ABS_indoff1 + ABSIND_off1 + | 		  ABS_off1 + ABS_indoff1 + ABSIND_off1 + | ||||||
| 		  absolute1 + abs_index1 + const . | 		  absolute1 + abs_index1 + const + small_const . | ||||||
| memory1		= data1 - dreg1 . | memory1		= data1 - dreg1 . | ||||||
| control1	= memory1 - (post_inc1 + pre_dec1 + const) . | control1	= memory1 - (post_inc1 + pre_dec1 + const + small_const) . | ||||||
| alterable1	= data1 + D_REG - const . | alterable1	= data1 + D_REG - const - small_const . | ||||||
| any1		= data1  + D_REG. /* all four above together */ | any1		= data1  + D_REG. /* all four above together */ | ||||||
| 
 | 
 | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
|  | @ -296,7 +297,7 @@ address		= ext_addr + local_addr + regAcon + regAregXcon . | ||||||
| all_regind	= indirect + offsetted + pre_post + index_off + | all_regind	= indirect + offsetted + pre_post + index_off + | ||||||
| 		      regind_addr . | 		      regind_addr . | ||||||
| all_indir	= all_regind . | all_indir	= all_regind . | ||||||
| allexceptcon	= ALL - ( D_REG + A_REG + const + dreg2 + dreg1 + | allexceptcon	= ALL - ( D_REG + A_REG + const + small_const + dreg2 + dreg1 + | ||||||
| 		    local_addr + ext_addr + regAcon + regAregXcon + | 		    local_addr + ext_addr + regAcon + regAregXcon + | ||||||
| 		    t_regAcon + t_regAregXcon ) . | 		    t_regAcon + t_regAregXcon ) . | ||||||
| use_index	= index_off4 + index_off2 + index_off1 . | use_index	= index_off4 + index_off2 + index_off1 . | ||||||
|  | @ -325,7 +326,7 @@ address		= regind_addr + | ||||||
| all_regind	= indirect + offsetted + index_off + pre_post + | all_regind	= indirect + offsetted + index_off + pre_post + | ||||||
| 		      reg_memind + regind_addr . | 		      reg_memind + regind_addr . | ||||||
| all_indir	= all_regind + memind + ILOCAL . | all_indir	= all_regind + memind + ILOCAL . | ||||||
| allexceptcon	= ALL - ( D_REG + A_REG + const + dreg2 + dreg1 + | allexceptcon	= ALL - ( D_REG + A_REG + const + small_const + dreg2 + dreg1 + | ||||||
| 		    local_addr + ext_addr + regAcon + regAregXcon + ext_regX ) . | 		    local_addr + ext_addr + regAcon + regAregXcon + ext_regX ) . | ||||||
| use_index4	= index_off4 + abs_index4 + | use_index4	= index_off4 + abs_index4 + | ||||||
| 		  OFF_indoff4 + INDOFF_off4 + | 		  OFF_indoff4 + INDOFF_off4 + | ||||||
|  | @ -349,10 +350,10 @@ posextern	= absolute + all_indir . | ||||||
| 
 | 
 | ||||||
| genreg		= D_REG + A_REG. | genreg		= D_REG + A_REG. | ||||||
| label		= llabel + slabel . | label		= llabel + slabel . | ||||||
| immediate4	= const + ext_addr . | immediate4	= const + small_const + ext_addr . | ||||||
| conreg4		= D_REG + immediate4 . | conreg4		= D_REG + immediate4 . | ||||||
| conreg2		= dreg2 + const + D_REG . | conreg2		= dreg2 + const + small_const + D_REG . | ||||||
| conreg1		= dreg1 + const + D_REG . | conreg1		= dreg1 + const + small_const + D_REG . | ||||||
| shconreg	= D_REG + shconst . | shconreg	= D_REG + shconst . | ||||||
| datalt4		= data4 * alterable4 . | datalt4		= data4 * alterable4 . | ||||||
| datalt2		= data2 * alterable2 . | datalt2		= data2 * alterable2 . | ||||||
|  | @ -364,7 +365,7 @@ memalt1		= memory1 * alterable1 . | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
| 	/* A m68k4 part */ | 	/* A m68k4 part */ | ||||||
| imm_cmp4	= alterable4 . | imm_cmp4	= alterable4 - genreg . | ||||||
| imm_cmp2	= alterable2 + D_REG . | imm_cmp2	= alterable2 + D_REG . | ||||||
| imm_cmp1	= datalt1 + D_REG . | imm_cmp1	= datalt1 + D_REG . | ||||||
| 
 | 
 | ||||||
|  | @ -374,13 +375,13 @@ test_set1	= datalt1 . | ||||||
| 
 | 
 | ||||||
| #else TBL68020 | #else TBL68020 | ||||||
| 
 | 
 | ||||||
| imm_cmp4	= any4 - immediate4 . | imm_cmp4	= any4 - immediate4 - genreg . | ||||||
| imm_cmp2	= any2 - const . | imm_cmp2	= any2 - const - small_const . | ||||||
| imm_cmp1	= any1 - const . | imm_cmp1	= any1 - const - small_const . | ||||||
| 
 | 
 | ||||||
| test_set4	= data4 - immediate4 . | test_set4	= data4 - immediate4 . | ||||||
| test_set2	= data2 - const . | test_set2	= data2 - const - small_const . | ||||||
| test_set1	= data1 - const . | test_set1	= data1 - const - small_const . | ||||||
| 
 | 
 | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
| 
 | 
 | ||||||
|  | @ -433,7 +434,7 @@ add_l  "add.l"	any4:ro,	A_REG:rw 		cost(2,3). | ||||||
| add_l  "add.l"	conreg4:ro,	alterable4:rw:cc	cost(2,6). | add_l  "add.l"	conreg4:ro,	alterable4:rw:cc	cost(2,6). | ||||||
| and_l  "and.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | and_l  "and.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | ||||||
| and_l  "and.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | and_l  "and.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | ||||||
| and_l  "and.l"	const:ro,	datalt4:rw:cc		cost(2,6). | and_l  "and.l"	const+small_const:ro,	datalt4:rw:cc	cost(2,6). | ||||||
| asl_l  "asl.l"	shconreg:ro,	D_REG:rw:cc		cost(2,5). | asl_l  "asl.l"	shconreg:ro,	D_REG:rw:cc		cost(2,5). | ||||||
| asl   "asl #1,"	memalt2:rw:cc				cost(2,4). | asl   "asl #1,"	memalt2:rw:cc				cost(2,4). | ||||||
| asr_l  "asr.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | asr_l  "asr.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
|  | @ -466,14 +467,15 @@ cmp_l  "cmp.l"	post_inc4:ro,	post_inc4:ro kills :cc 	cost(2,2). | ||||||
| cmp_l  "cmp.l"	immediate4:ro,	imm_cmp4:ro kills :cc	cost(2,2). | cmp_l  "cmp.l"	immediate4:ro,	imm_cmp4:ro kills :cc	cost(2,2). | ||||||
| cmp_w  "cmp.w"	any2:ro,	dreg2:ro kills :cc	cost(2,3). | cmp_w  "cmp.w"	any2:ro,	dreg2:ro kills :cc	cost(2,3). | ||||||
| cmp_w  "cmp.w"	post_inc2:ro,	post_inc2:ro kills :cc 	cost(2,2). | cmp_w  "cmp.w"	post_inc2:ro,	post_inc2:ro kills :cc 	cost(2,2). | ||||||
| cmp_w  "cmp.w"	const:ro,	imm_cmp2:ro kills :cc	cost(2,2). | cmp_w  "cmp.w"	const+small_const:ro,	imm_cmp2:ro kills :cc	cost(2,2). | ||||||
| cmp_b  "cmp.b"	any1:ro,	dreg1:ro kills :cc	cost(2,3). | cmp_b  "cmp.b"	any1:ro,	dreg1:ro kills :cc	cost(2,3). | ||||||
| cmp_b  "cmp.b"	post_inc1:ro,	post_inc1:ro kills :cc 	cost(2,2). | cmp_b  "cmp.b"	post_inc1:ro,	post_inc1:ro kills :cc 	cost(2,2). | ||||||
| cmp_b  "cmp.b"	const:ro,	imm_cmp1:ro kills :cc	cost(2,2). | cmp_b  "cmp.b"	const+small_const:ro,	imm_cmp1:ro kills :cc	cost(2,2). | ||||||
| dbf		D_REG:rw,	label			cost(2,5). | dbf		D_REG:rw,	label			cost(2,5). | ||||||
| eor_l  "eor.l"	conreg4:ro,	datalt4:rw:cc		cost(2,6). | eor_l  "eor.l"	conreg4:ro,	datalt4:rw:cc		cost(2,6). | ||||||
| ext_l  "ext.l"	D_REG:rw:cc				cost(2,2). | /* in the next two instructions: LOCAL only allowed if register var */ | ||||||
| ext_w  "ext.w"	D_REG:rw:cc				cost(2,2). | ext_l  "ext.l"	D_REG+LOCAL:rw:cc			cost(2,2). | ||||||
|  | ext_w  "ext.w"	D_REG+LOCAL:rw:cc			cost(2,2). | ||||||
| jmp		address+control4			cost(2,0). | jmp		address+control4			cost(2,0). | ||||||
| jsr		address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3). | jsr		address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3). | ||||||
| lea		address+control4:ro, A_REG:wo		cost(2,0). | lea		address+control4:ro, A_REG:wo		cost(2,0). | ||||||
|  | @ -490,7 +492,7 @@ not_l  "not.l"	D_REG:rw:cc				cost(2,3). | ||||||
| not_l  "not.l"	memory4:rw:cc				cost(2,6). | not_l  "not.l"	memory4:rw:cc				cost(2,6). | ||||||
| or_l   "or.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | or_l   "or.l"	data4:ro,	D_REG:rw:cc		cost(2,3). | ||||||
| or_l   "or.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | or_l   "or.l"	D_REG:ro,	memalt4:rw:cc		cost(2,6). | ||||||
| or_l   "or.l"	const:ro,	datalt4:rw:cc		cost(2,6). | or_l   "or.l"	const+small_const:ro,	datalt4:rw:cc		cost(2,6). | ||||||
| rol_l  "rol.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | rol_l  "rol.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
| rol   "rol #1,"	memalt2:rw:cc				cost(2,4). | rol   "rol #1,"	memalt2:rw:cc				cost(2,4). | ||||||
| ror_l  "ror.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ror_l  "ror.l"	shconreg:ro,	D_REG:rw:cc		cost(2,4). | ||||||
|  | @ -519,7 +521,8 @@ divs_l "divs.l" data4:ro,	D_REG:rw:cc		cost(2,90). | ||||||
| divsl_l "divsl.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,90). | divsl_l "divsl.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,90). | ||||||
| divu_l "divu.l" data4:ro,	D_REG:rw:cc		cost(2,78). | divu_l "divu.l" data4:ro,	D_REG:rw:cc		cost(2,78). | ||||||
| divul_l "divul.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,78). | divul_l "divul.l" data4:ro,	DREG_pair:rw kills :cc	cost(2,78). | ||||||
| extb_l "extb.l" D_REG:rw:cc				cost(2,4). | /* in the next instruction: LOCAL only allowed if register var */ | ||||||
|  | extb_l "extb.l" D_REG+LOCAL:rw:cc			cost(2,4). | ||||||
| muls_l "muls.l" data4:ro,	D_REG:rw:cc		cost(2,44). | muls_l "muls.l" data4:ro,	D_REG:rw:cc		cost(2,44). | ||||||
| mulu_l "mulu.l" data4:ro,	D_REG:rw:cc		cost(2,44). | mulu_l "mulu.l" data4:ro,	D_REG:rw:cc		cost(2,44). | ||||||
| pea		address+control4+regX			cost(2,4). | pea		address+control4+regX			cost(2,4). | ||||||
|  | @ -538,22 +541,22 @@ killreg "! kill" A_REG:wo				cost(0,0). | ||||||
| 
 | 
 | ||||||
| MOVES | MOVES | ||||||
| 
 | 
 | ||||||
| from const %num==0 to D_REG | from const+small_const %num==0 to D_REG | ||||||
|     gen clr_l %2 |     gen clr_l %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt4 | from const+small_const %num==0 to memalt4 | ||||||
|     gen clr_l %2 |     gen clr_l %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt2 | from const+small_const %num==0 to memalt2 | ||||||
|     gen clr_w %2 |     gen clr_w %2 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to memalt1 | from const+small_const %num==0 to memalt1 | ||||||
|     gen clr_b %2 |     gen clr_b %2 | ||||||
| 
 | 
 | ||||||
| from const to memalt1 | from const+small_const to memalt1 | ||||||
|     gen move_b {const, lowb(%1.num)}, %2 |     gen move_b {const, lowb(%1.num)}, %2 | ||||||
| 
 | 
 | ||||||
| from const to memalt2 | from const+small_const to memalt2 | ||||||
|     gen move_w {const, loww(%1.num)}, %2 |     gen move_w {const, loww(%1.num)}, %2 | ||||||
| 
 | 
 | ||||||
| from regAcon %bd==0 to A_REG | from regAcon %bd==0 to A_REG | ||||||
|  | @ -606,7 +609,7 @@ to test test_set1 | ||||||
| STACKINGRULES | STACKINGRULES | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| from const %num==0 to STACK | from const+small_const %num==0 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 
 | 
 | ||||||
| #ifndef TBL68020 | #ifndef TBL68020 | ||||||
|  | @ -625,22 +628,37 @@ from t_regAcon to STACK | ||||||
| 	add_l {const, %1.bd}, {indirect4, sp} | 	add_l {const, %1.bd}, {indirect4, sp} | ||||||
| #endif TBL68020 | #endif TBL68020 | ||||||
| 
 | 
 | ||||||
|  | from A_REG to STACK | ||||||
|  |     gen pea {indirect4, %1} | ||||||
|  | 
 | ||||||
| from address - ext_addr to STACK | from address - ext_addr to STACK | ||||||
|     gen pea %1 |     gen pea %1 | ||||||
| 
 | 
 | ||||||
| from ext_addr to STACK | from ext_addr to STACK | ||||||
|     gen pea {absolute4, %1.bd} |     gen pea {absolute4, %1.bd} | ||||||
| 
 | 
 | ||||||
| from const to STACK | from const+small_const to STACK | ||||||
|     gen pea {absolute4, %1.num} |     gen pea {absolute4, %1.num} | ||||||
| 
 | 
 | ||||||
| from any4 to STACK | from any4 to STACK | ||||||
|     gen move_l %1, {pre_dec4, sp} |     gen move_l %1, {pre_dec4, sp} | ||||||
| 
 | 
 | ||||||
|  | from any2 to STACK | ||||||
|  |   uses DD_REG | ||||||
|  |     gen clr_l %a | ||||||
|  | 	move_w %1, {dreg2, %a} | ||||||
|  | 	move_l %a, {pre_dec4, sp} | ||||||
|  | 
 | ||||||
| from any2 to STACK | from any2 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 	move_w %1, {offsetted2, sp, 2} | 	move_w %1, {offsetted2, sp, 2} | ||||||
| 
 | 
 | ||||||
|  | from data1 to STACK | ||||||
|  |   uses DD_REG | ||||||
|  |     gen clr_l %a | ||||||
|  | 	move_b %1, {dreg1, %a} | ||||||
|  | 	move_l %a, {pre_dec4, sp} | ||||||
|  | 
 | ||||||
| from data1 to STACK | from data1 to STACK | ||||||
|     gen clr_l {pre_dec4, sp} |     gen clr_l {pre_dec4, sp} | ||||||
| 	move_b %1, {offsetted1, sp, 3} | 	move_b %1, {offsetted1, sp, 3} | ||||||
|  | @ -737,11 +755,11 @@ pat lil inreg($1)==reg_any | ||||||
| 			yields  {indirect4, %a} | 			yields  {indirect4, %a} | ||||||
| 
 | 
 | ||||||
| pat stl inreg($1)==reg_any | pat stl inreg($1)==reg_any | ||||||
| with exact memory1-const | with exact memory1-const-small_const | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen	clr_l {LOCAL, $1} |     gen	clr_l {LOCAL, $1} | ||||||
| 	move_b %1, {dreg1, regvar($1,reg_any)} | 	move_b %1, {dreg1, regvar($1,reg_any)} | ||||||
| with exact memory2-const | with exact memory2-const-small_const | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen	clr_l {LOCAL, $1} |     gen	clr_l {LOCAL, $1} | ||||||
| 	move_w %1, {dreg2, regvar($1,reg_any)} | 	move_w %1, {dreg2, regvar($1,reg_any)} | ||||||
|  | @ -922,6 +940,20 @@ pat lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==reg_pointer | ||||||
|     kills allexceptcon |     kills allexceptcon | ||||||
|     gen add_l {const, $3}, {offsetted4, regvar($1, reg_pointer), $2} |     gen add_l {const, $3}, {offsetted4, regvar($1, reg_pointer), $2} | ||||||
| 
 | 
 | ||||||
|  | #ifdef TBL68020 | ||||||
|  | pat loe lof inc loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen add_l {const, 1}, {ABS_off4, $1, $2} | ||||||
|  | 
 | ||||||
|  | pat loe lof dec loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen sub_l {const, 1}, {ABS_off4, $1, $2} | ||||||
|  | 
 | ||||||
|  | pat loe lof adp loe stf $1==$4 && $2==$5 | ||||||
|  |     kills allexceptcon | ||||||
|  |     gen add_l {const, $3}, {ABS_off4, $1, $2} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| pat inl inreg($1)==reg_any | pat inl inreg($1)==reg_any | ||||||
|     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) |     kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any) | ||||||
|     gen add_l {const, 1}, {LOCAL, $1} |     gen add_l {const, 1}, {LOCAL, $1} | ||||||
|  | @ -1098,6 +1130,15 @@ pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer | ||||||
|     killreg %a |     killreg %a | ||||||
| 			yields	%a | 			yields	%a | ||||||
| 
 | 
 | ||||||
|  | #ifdef TBL68020 | ||||||
|  | pat loe lof dup adp loe stf $1==$5 && $2==$6 | ||||||
|  |     kills allexceptcon | ||||||
|  |     uses AA_REG = {ABS_off4, $1, $2} | ||||||
|  |     gen add_l {const, $4}, {ABS_off4, $1, $2} | ||||||
|  |     killreg %a | ||||||
|  | 			yields	%a | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| pat lol lol adp stl loi $1==$2 && $1==$4 && $3==1 && $5==1 && | pat lol lol adp stl loi $1==$2 && $1==$4 && $3==1 && $5==1 && | ||||||
| 						inreg($1)==reg_pointer | 						inreg($1)==reg_pointer | ||||||
|     kills regvar($1, reg_pointer) |     kills regvar($1, reg_pointer) | ||||||
|  | @ -1202,6 +1243,8 @@ with any4 | ||||||
|  * Group 1: load instructions			* |  * Group 1: load instructions			* | ||||||
|  ************************************************/ |  ************************************************/ | ||||||
| 
 | 
 | ||||||
|  | pat loc in_1($1)	yields	{small_const, $1} | ||||||
|  | 
 | ||||||
| pat loc			yields	{const, $1} | pat loc			yields	{const, $1} | ||||||
| 
 | 
 | ||||||
| pat ldc				leaving loc 18 trp | pat ldc				leaving loc 18 trp | ||||||
|  | @ -2206,9 +2249,9 @@ pat zre | ||||||
|     kills posextern |     kills posextern | ||||||
|     gen clr_l {absolute4, $1} |     gen clr_l {absolute4, $1} | ||||||
| 
 | 
 | ||||||
| pat zer $1==4		yields	{const, 0} | pat zer $1==4		yields	{small_const, 0} | ||||||
| pat zer $1==8		yields	{const, 0} {const, 0} | pat zer $1==8		yields	{small_const, 0} {small_const, 0} | ||||||
| pat zer $1==12		yields	{const, 0} {const, 0} {const, 0} | pat zer $1==12		yields	{small_const, 0} {small_const, 0} {small_const, 0} | ||||||
| 
 | 
 | ||||||
| pat zer | pat zer | ||||||
| with STACK | with STACK | ||||||
|  | @ -2264,9 +2307,9 @@ pat loc loc cff	$1==4 && $2==8 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| proc log4 | proc log4 | ||||||
| with datalt4+const DD_REG | with datalt4+const+small_const DD_REG | ||||||
|     gen xxx* %1, %2	yields	%2 |     gen xxx* %1, %2	yields	%2 | ||||||
| with DD_REG datalt4+const | with DD_REG datalt4+const+small_const | ||||||
|     gen xxx* %2, %1	yields	%1 |     gen xxx* %2, %1	yields	%1 | ||||||
| 
 | 
 | ||||||
| proc logdef example and | proc logdef example and | ||||||
|  | @ -2598,10 +2641,10 @@ with STACK | ||||||
|     gen bra {llabel, $1} |     gen bra {llabel, $1} | ||||||
| 
 | 
 | ||||||
| proc brxx example beq | proc brxx example beq | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| with genreg any4 STACK | with genreg any4-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -2615,15 +2658,15 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| 
 | 
 | ||||||
| proc brnqxx example beq | proc brnqxx example beq | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| with genreg any4 STACK | with genreg any4-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -2637,7 +2680,7 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $1} | 	bxx[2] {llabel, $1} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $1} | 	bxx[1] {llabel, $1} | ||||||
| 
 | 
 | ||||||
|  | @ -3287,12 +3330,12 @@ pat tge ior $2==4			call txxior("blt", "bcs") | ||||||
| pat tgt ior $2==4			call txxior("ble", "bls") | pat tgt ior $2==4			call txxior("ble", "bls") | ||||||
| 
 | 
 | ||||||
| proc cmxtxxand | proc cmxtxxand | ||||||
| with any4 genreg DD_REG | with any4-small_const genreg DD_REG | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	clr_l %3 | 	clr_l %3 | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| with genreg any4-genreg DD_REG | with genreg any4-genreg-small_const DD_REG | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	clr_l %3 | 	clr_l %3 | ||||||
|  | @ -3309,12 +3352,12 @@ with exact imm_cmp4 immediate4 DD_REG | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| 
 | 
 | ||||||
| proc cmxtxxior | proc cmxtxxior | ||||||
| with any4 genreg DD_REG | with any4-small_const genreg DD_REG | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	move {const, 1},  %3 | 	move {const, 1},  %3 | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| with genreg any4-genreg DD_REG | with genreg any4-genreg-small_const DD_REG | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	move {const, 1},  %3 | 	move {const, 1},  %3 | ||||||
|  | @ -3331,13 +3374,13 @@ with exact imm_cmp4 immediate4 DD_REG | ||||||
| 	1:		yields	%3 | 	1:		yields	%3 | ||||||
| 
 | 
 | ||||||
| proc cmxtxx | proc cmxtxx | ||||||
| with any4 genreg | with any4-small_const genreg | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
| 	clr_l %a | 	clr_l %a | ||||||
| 	1:		yields	%a | 	1:		yields	%a | ||||||
| with genreg any4-genreg | with genreg any4-genreg-small_const | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
|  | @ -3361,7 +3404,7 @@ with genreg STACK | ||||||
| 	bxx[2] {slabel, 1f} | 	bxx[2] {slabel, 1f} | ||||||
| 	clr_l %a | 	clr_l %a | ||||||
| 	1:		yields	%a | 	1:		yields	%a | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     uses DD_REG = {const, 1} |     uses DD_REG = {const, 1} | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {slabel, 1f} | 	bxx[1] {slabel, 1f} | ||||||
|  | @ -3411,10 +3454,10 @@ pat cmu tge $1==4			call cmxtxx("bcc","bls") | ||||||
| pat cmu tgt $1==4			call cmxtxx("bhi","bcs") | pat cmu tgt $1==4			call cmxtxx("bhi","bcs") | ||||||
| 
 | 
 | ||||||
| proc cmuzxx example cmu zlt | proc cmuzxx example cmu zlt | ||||||
| with any4 genreg STACK | with any4-small_const genreg STACK | ||||||
|     gen cmp_l %1, %2 |     gen cmp_l %1, %2 | ||||||
| 	bxx[1] {llabel, $2} | 	bxx[1] {llabel, $2} | ||||||
| with genreg any4-genreg STACK | with genreg any4-genreg-small_const STACK | ||||||
|     gen cmp_l %2, %1 |     gen cmp_l %2, %1 | ||||||
| 	bxx[2] {llabel, $2} | 	bxx[2] {llabel, $2} | ||||||
| with exact immediate4 imm_cmp4 | with exact immediate4 imm_cmp4 | ||||||
|  | @ -3428,13 +3471,13 @@ with exact imm_cmp4 immediate4 | ||||||
| with genreg STACK | with genreg STACK | ||||||
|     gen cmp_l {post_inc4, sp}, %1 |     gen cmp_l {post_inc4, sp}, %1 | ||||||
| 	bxx[2] {llabel, $2} | 	bxx[2] {llabel, $2} | ||||||
| with exact immediate4 STACK | with exact immediate4-small_const STACK | ||||||
|     gen cmp_l %1, {post_inc4, sp} |     gen cmp_l %1, {post_inc4, sp} | ||||||
| 	bxx[1] {llabel, $2} | 	bxx[1] {llabel, $2} | ||||||
| with data2 dreg2 STACK | with data2-small_const dreg2 STACK | ||||||
|     gen cmp_w %1, %2 |     gen cmp_w %1, %2 | ||||||
|         bxx[1] {llabel, $2} |         bxx[1] {llabel, $2} | ||||||
| with dreg2 data2-conreg2 STACK | with dreg2 data2-conreg2-small_const STACK | ||||||
|     gen cmp_w %2, %1 |     gen cmp_w %2, %1 | ||||||
|         bxx[2] {llabel, $2} |         bxx[2] {llabel, $2} | ||||||
| with data1 dreg1 STACK | with data1 dreg1 STACK | ||||||
|  | @ -3506,6 +3549,17 @@ pat loc loc cii loc bne $1==2 && $2==4 && in_2($4)	call bxx2_in("bne") | ||||||
| pat loc loc cii loc bge $1==2 && $2==4 && in_2($4)	call bxx2_in("bge") | pat loc loc cii loc bge $1==2 && $2==4 && in_2($4)	call bxx2_in("bge") | ||||||
| pat loc loc cii loc bgt $1==2 && $2==4 && in_2($4)	call bxx2_in("bgt") | pat loc loc cii loc bgt $1==2 && $2==4 && in_2($4)	call bxx2_in("bgt") | ||||||
| 
 | 
 | ||||||
|  | pat loc loc cii stl $1==1 && $2==4 && inreg($4)==reg_any | ||||||
|  | with memory1+DD_REG | ||||||
|  |     kills regvar($4, reg_any), use_index %xreg==regvar($4, reg_any) | ||||||
|  |     gen	move_b %1, {dreg1, regvar($4,reg_any)} | ||||||
|  | #ifdef TBL68020 | ||||||
|  | 	extb_l	{LOCAL,$4} | ||||||
|  | #else TBL68020 | ||||||
|  | 	ext_w	{LOCAL,$4} | ||||||
|  | 	ext_l	{LOCAL,$4} | ||||||
|  | #endif TBL68020 | ||||||
|  | 
 | ||||||
| pat loc loc cii $1==2 && $2==4 | pat loc loc cii $1==2 && $2==4 | ||||||
| with DD_REG | with DD_REG | ||||||
|     gen ext_l %1	yields	%1 |     gen ext_l %1	yields	%1 | ||||||
|  |  | ||||||
|  | @ -396,6 +396,10 @@ loi loc loc cii loc and $1==1 && $2==1 && $3==w && $5==255 && $6==w:	loi 1 | ||||||
| loi loc loc cii loc cmi zeq $1==1 && $2==1 && $3==w && $5>=0 && $5<128 && $6==w:	loi 1 loc $5 cmi w zeq $7 | loi loc loc cii loc cmi zeq $1==1 && $2==1 && $3==w && $5>=0 && $5<128 && $6==w:	loi 1 loc $5 cmi w zeq $7 | ||||||
| loi loc loc cii loc cmi zne $1==1 && $2==1 && $3==w && $5>=0 && $5<128 && $6==w:	loi 1 loc $5 cmi w zne $7 | loi loc loc cii loc cmi zne $1==1 && $2==1 && $3==w && $5>=0 && $5<128 && $6==w:	loi 1 loc $5 cmi w zne $7 | ||||||
| loi loc loc cii loc loc ciu loc and $1==1 && $2==1 && $3==w && $5==w && $6==w && $8==255 && $9==w:	loi 1 | loi loc loc cii loc loc ciu loc and $1==1 && $2==1 && $3==w && $5==w && $6==w && $8==255 && $9==w:	loi 1 | ||||||
|  | loc and LEP sti $1==255 && $2==w && $4==1:	LEP $3 sti $4 | ||||||
|  | loc and lae sti $1==255 && $2==w && $4==1:	lae $3 sti $4 | ||||||
|  | loc and LLP sti $1==255 && $2==w && $4==1:	LLP $3 sti $4 | ||||||
|  | loc and lal sti $1==255 && $2==w && $4==1:	lal $3 sti $4 | ||||||
| cmp teq :       cms p   teq | cmp teq :       cms p   teq | ||||||
| cmp tne :       cms p   tne | cmp tne :       cms p   tne | ||||||
| cmp zeq :	cms p	zeq $2 | cmp zeq :	cms p	zeq $2 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue