Merge pull request #177 from davidgiven/dtrg-8080
i80: Better peephole optimiser rules
This commit is contained in:
commit
43ea6e2bec
|
@ -10,7 +10,7 @@
|
|||
At present such a class number is supposed to fit in 4 bits.
|
||||
*/
|
||||
|
||||
#define class(ch) ((tkclass)[(unsigned int)ch])
|
||||
#define class(ch) ((tkclass)[(unsigned char)ch])
|
||||
|
||||
/* Being the start of a token is, fortunately, a mutual exclusive
|
||||
property, so, as there are less than 16 classes they can be
|
||||
|
@ -37,11 +37,11 @@
|
|||
class. This is implemented as a collection of tables to speed up
|
||||
the decision whether a character has a special meaning.
|
||||
*/
|
||||
#define in_idf(ch) (inidf[(unsigned int)ch])
|
||||
#define is_oct(ch) (isoct[(unsigned int)ch])
|
||||
#define is_dig(ch) (isdig[(unsigned int)ch])
|
||||
#define is_hex(ch) (ishex[(unsigned int)ch])
|
||||
#define is_wsp(ch) (iswsp[(unsigned int)ch])
|
||||
#define in_idf(ch) (inidf[(unsigned char)ch])
|
||||
#define is_oct(ch) (isoct[(unsigned char)ch])
|
||||
#define is_dig(ch) (isdig[(unsigned char)ch])
|
||||
#define is_hex(ch) (ishex[(unsigned char)ch])
|
||||
#define is_wsp(ch) (iswsp[(unsigned char)ch])
|
||||
|
||||
extern char tkclass[];
|
||||
extern char inidf[], isoct[], isdig[], ishex[], iswsp[];
|
||||
|
|
|
@ -21,3 +21,5 @@
|
|||
%token <y_word> STLDAX
|
||||
|
||||
%type <y_word> r16 r8
|
||||
|
||||
%token <y_word> KILL
|
||||
|
|
|
@ -4,6 +4,12 @@
|
|||
*/
|
||||
#define RCSID3 "$Id$"
|
||||
|
||||
/*
|
||||
* Specials
|
||||
*/
|
||||
|
||||
0, KILL, 0, "kill",
|
||||
|
||||
/*
|
||||
* Intel 8080 keywords
|
||||
*/
|
||||
|
|
|
@ -10,7 +10,8 @@
|
|||
* Intel 8080 parsing rules
|
||||
*/
|
||||
operation
|
||||
: NOOPOP
|
||||
: KILL REG {}
|
||||
| NOOPOP
|
||||
{ emit1($1);}
|
||||
|
|
||||
D8OP expr
|
||||
|
|
|
@ -48,6 +48,7 @@ TOKENS
|
|||
|
||||
const1 = { INT num; } 1 num.
|
||||
const2 = { INT num; } 2 num.
|
||||
largeconst2 = { INT num; } 2 num. /* Word-sized constant with low byte zero */
|
||||
smallpconst2 = { INT num; } 2 num. /* Byte-sized positive constant */
|
||||
smallnconst2 = { INT num; } 2 num. /* Byte-sized negative constant */
|
||||
label = { ADDR off; } 2 off.
|
||||
|
@ -60,17 +61,18 @@ SETS
|
|||
reg1 = reg + lbreg + m.
|
||||
b_d_h_sp = regpair + stackpointer.
|
||||
b_d_h_psw = regpair + psword.
|
||||
immediate = smallpconst2 + smallnconst2 + const2 + label.
|
||||
immediate = largeconst2 + smallpconst2 + smallnconst2 + const2 + label.
|
||||
src1 = reg.
|
||||
src2 = hl_or_de + const2 + label.
|
||||
src1or2 = src1 + src2.
|
||||
anyreg = reg + regpair.
|
||||
|
||||
INSTRUCTIONS
|
||||
|
||||
/* aci const1:ro kills a:cc cost(2, 7). */
|
||||
adc reg1:ro kills a:cc cost(1, 4).
|
||||
add reg1:ro kills a:cc cost(1, 4).
|
||||
/* adi const1:ro kills a:cc cost(2, 7). */
|
||||
adi const1:ro kills a:cc cost(2, 7).
|
||||
ana reg1:ro kills a:cc cost(1, 4).
|
||||
ani const1:ro kills a:cc cost(2, 7).
|
||||
Call "call" label:ro cost(3,17).
|
||||
|
@ -154,6 +156,7 @@ INSTRUCTIONS
|
|||
xri const1:ro kills a:cc cost(2, 7).
|
||||
xthl kills hl cost(1,18).
|
||||
|
||||
kill anyreg:rw kills :cc cost(0, 0).
|
||||
|
||||
MOVES
|
||||
|
||||
|
@ -261,6 +264,9 @@ COERCIONS
|
|||
|
||||
from hl_or_de yields %1.2
|
||||
|
||||
from largeconst2
|
||||
yields {const2, %1.num}
|
||||
|
||||
from smallpconst2
|
||||
yields {const2, %1.num}
|
||||
|
||||
|
@ -271,6 +277,10 @@ COERCIONS
|
|||
uses hl_or_de=%1
|
||||
yields %a
|
||||
|
||||
from largeconst2
|
||||
uses hl_or_de=%1
|
||||
yields %a
|
||||
|
||||
from smallpconst2
|
||||
uses reg={const1, %1.num & 0xff}
|
||||
yields %a
|
||||
|
@ -305,6 +315,9 @@ PATTERNS
|
|||
/* Group 1: Load instructions */
|
||||
/*********************************************/
|
||||
|
||||
pat loc ($1 != 0) && (($1 & 0xff) == 0)
|
||||
yields {largeconst2, $1}
|
||||
|
||||
pat loc ufit($1, 8)
|
||||
yields {smallpconst2, $1}
|
||||
|
||||
|
@ -727,6 +740,18 @@ pat sde
|
|||
/****************************************/
|
||||
|
||||
pat adi $1==2
|
||||
with hl_or_de largeconst2
|
||||
uses areg
|
||||
gen
|
||||
mov a, %1.1
|
||||
adi {const1, %2.num >> 8}
|
||||
mov %1.1, a
|
||||
kill a
|
||||
yields %1
|
||||
with largeconst2 hl_or_de
|
||||
yields %1 %2
|
||||
leaving
|
||||
adi 2
|
||||
with hlreg dereg
|
||||
gen
|
||||
dad de
|
||||
|
@ -755,6 +780,14 @@ pat sbi $1==2
|
|||
yields %2 {const2, 0-%1.num}
|
||||
leaving
|
||||
adi 2
|
||||
with largeconst2 hl_or_de
|
||||
yields %2 {largeconst2, 0-%1.num}
|
||||
leaving
|
||||
adi 2
|
||||
with smallpconst2 hl_or_de
|
||||
yields %2 {smallnconst2, 0-%1.num}
|
||||
leaving
|
||||
adi 2
|
||||
with smallnconst2 hl_or_de
|
||||
yields %2 {smallpconst2, 0-%1.num}
|
||||
leaving
|
||||
|
@ -768,6 +801,7 @@ pat sbi $1==2
|
|||
mvi a, {const1, %2.num >> 8}
|
||||
sbb %1.1
|
||||
mov %1.1, a
|
||||
kill a
|
||||
yields %1
|
||||
with hl_or_de hl_or_de
|
||||
uses areg
|
||||
|
@ -778,6 +812,7 @@ pat sbi $1==2
|
|||
mov a,%2.1
|
||||
sbb %1.1
|
||||
mov %1.1,a
|
||||
kill a
|
||||
yields %1
|
||||
with hl_or_de hl_or_de
|
||||
uses areg
|
||||
|
@ -788,6 +823,7 @@ pat sbi $1==2
|
|||
mov a,%2.1
|
||||
sbb %1.1
|
||||
mov %2.1,a
|
||||
kill a
|
||||
yields %2
|
||||
|
||||
pat sbi $1==4
|
||||
|
@ -1282,6 +1318,7 @@ pat and $1==2
|
|||
mov a, %1.2
|
||||
ani {const1, %2.num & 0xff}
|
||||
mov %1.2, a
|
||||
kill a
|
||||
yields %1
|
||||
with smallnconst2 hl_or_de
|
||||
yields %1 %2
|
||||
|
@ -1293,9 +1330,11 @@ pat and $1==2
|
|||
mov a, %1.2
|
||||
ani {const1, %2.num & 0xff}
|
||||
mov %1.2, a
|
||||
kill a
|
||||
mov a, %1.1
|
||||
ani {const1, %2.num >> 8}
|
||||
mov %1.1, a
|
||||
kill a
|
||||
yields %1
|
||||
with const2 hl_or_de
|
||||
yields %1 %2
|
||||
|
@ -1307,9 +1346,11 @@ pat and $1==2
|
|||
mov a, %1.2
|
||||
ana %2.2
|
||||
mov %2.2, a
|
||||
kill a
|
||||
mov a, %1.1
|
||||
ana %2.1
|
||||
mov %2.1, a
|
||||
kill a
|
||||
yields %2
|
||||
with hl_or_de hl_or_de
|
||||
uses areg
|
||||
|
@ -1317,9 +1358,11 @@ pat and $1==2
|
|||
mov a,%1.2
|
||||
ana %2.2
|
||||
mov %1.2,a
|
||||
kill a
|
||||
mov a,%1.1
|
||||
ana %2.1
|
||||
mov %1.1,a
|
||||
kill a
|
||||
yields %1
|
||||
|
||||
pat and defined($1)
|
||||
|
@ -1343,6 +1386,7 @@ pat ior $1==2
|
|||
mov a, %1.2
|
||||
ori {const1, %2.num & 0xff}
|
||||
mov %1.2, a
|
||||
kill a
|
||||
yields %1
|
||||
with smallpconst2 hl_or_de
|
||||
yields %1 %2
|
||||
|
@ -1354,6 +1398,7 @@ pat ior $1==2
|
|||
mov a, %1.2
|
||||
ori {const1, %2.num & 0xff}
|
||||
mov %1.2, a
|
||||
kill a
|
||||
move {const1, 0xff}, %1.1
|
||||
yields %1
|
||||
with smallnconst2 hl_or_de
|
||||
|
@ -1366,9 +1411,11 @@ pat ior $1==2
|
|||
mov a, %1.2
|
||||
ori {const1, %2.num & 0xff}
|
||||
mov %1.2, a
|
||||
kill a
|
||||
mov a, %1.1
|
||||
ori {const1, %2.num >> 8}
|
||||
mov %1.1, a
|
||||
kill a
|
||||
yields %1
|
||||
with const2 hl_or_de
|
||||
yields %1 %2
|
||||
|
@ -1380,9 +1427,11 @@ pat ior $1==2
|
|||
mov a, %1.2
|
||||
ora %2.2
|
||||
mov %2.2, a
|
||||
kill a
|
||||
mov a, %1.1
|
||||
ora %2.1
|
||||
mov %2.1, a
|
||||
kill a
|
||||
yields %2
|
||||
with hl_or_de hl_or_de
|
||||
uses areg
|
||||
|
@ -1390,9 +1439,11 @@ pat ior $1==2
|
|||
mov a,%1.2
|
||||
ora %2.2
|
||||
mov %1.2,a
|
||||
kill a
|
||||
mov a,%1.1
|
||||
ora %2.1
|
||||
mov %1.1,a
|
||||
kill a
|
||||
yields %1
|
||||
|
||||
pat ior defined($1)
|
||||
|
@ -1414,6 +1465,7 @@ pat xor $1==2
|
|||
mov a, %1.2
|
||||
xri {const1, %2.num & 0xff}
|
||||
mov %1.2, a
|
||||
kill a
|
||||
yields %1
|
||||
with smallpconst2 hl_or_de
|
||||
yields %1 %2
|
||||
|
@ -1425,9 +1477,11 @@ pat xor $1==2
|
|||
mov a, %1.2
|
||||
xri {const1, %2.num & 0xff}
|
||||
mov %1.2, a
|
||||
kill a
|
||||
mov a, %1.1
|
||||
xri {const1, %2.num >> 8}
|
||||
mov %1.1, a
|
||||
kill a
|
||||
yields %1
|
||||
with const2 hl_or_de
|
||||
yields %1 %2
|
||||
|
@ -1439,9 +1493,11 @@ pat xor $1==2
|
|||
mov a, %1.2
|
||||
xra %2.2
|
||||
mov %2.2, a
|
||||
kill a
|
||||
mov a, %1.1
|
||||
xra %2.1
|
||||
mov %2.1, a
|
||||
kill a
|
||||
yields %2
|
||||
with hl_or_de hl_or_de
|
||||
uses areg
|
||||
|
@ -1449,9 +1505,11 @@ pat xor $1==2
|
|||
mov a,%1.2
|
||||
xra %2.2
|
||||
mov %1.2,a
|
||||
kill a
|
||||
mov a,%1.1
|
||||
xra %2.1
|
||||
mov %1.1,a
|
||||
kill a
|
||||
yields %1
|
||||
|
||||
pat xor defined($1)
|
||||
|
@ -1470,6 +1528,7 @@ uses areg
|
|||
gen mov a,%1.2
|
||||
cma.
|
||||
mov %1.2,a
|
||||
kill a
|
||||
mov a,%1.1
|
||||
cma.
|
||||
mov %1.1,a yields %1
|
||||
|
|
|
@ -26,4 +26,37 @@ push d : lxi d, X : pop h -> lxi h, X : xchg ;
|
|||
|
||||
push h : lhld X : pop d -> xchg : lhld X ;
|
||||
|
||||
X -1 -> X 255 ;
|
||||
X -2 -> X 254 ;
|
||||
X -3 -> X 253 ;
|
||||
X -4 -> X 252 ;
|
||||
|
||||
mov a, X : adi -4 : mov X, a : kill a -> dcr X : dcr X : dcr X : dcr X;
|
||||
mov a, X : adi -3 : mov X, a : kill a -> dcr X : dcr X : dcr X ;
|
||||
mov a, X : adi -2 : mov X, a : kill a -> dcr X : dcr X ;
|
||||
mov a, X : adi -1 : mov X, a : kill a -> dcr X ;
|
||||
mov a, X : adi 0 : mov X, a : kill a -> ;
|
||||
mov a, X : adi 1 : mov X, a : kill a -> inr X ;
|
||||
mov a, X : adi 2 : mov X, a : kill a -> inr X : inr X ;
|
||||
mov a, X : adi 3 : mov X, a : kill a -> inr X : inr X : inr X ;
|
||||
mov a, X : adi 4 : mov X, a : kill a -> inr X : inr X : inr X : inr X;
|
||||
|
||||
mov a, X : sbi -4 : mov X, a : kill a -> inr X : inr X : inr X : inr X;
|
||||
mov a, X : sbi -3 : mov X, a : kill a -> inr X : inr X : inr X ;
|
||||
mov a, X : sbi -2 : mov X, a : kill a -> inr X : inr X ;
|
||||
mov a, X : sbi -1 : mov X, a : kill a -> inr X ;
|
||||
mov a, X : sbi 0 : mov X, a : kill a -> ;
|
||||
mov a, X : sbi 1 : mov X, a : kill a -> dcr X ;
|
||||
mov a, X : sbi 2 : mov X, a : kill a -> dcr X : dcr X ;
|
||||
mov a, X : sbi 3 : mov X, a : kill a -> dcr X : dcr X : dcr X ;
|
||||
mov a, X : sbi 4 : mov X, a : kill a -> dcr X : dcr X : dcr X : dcr X ;
|
||||
|
||||
mov a, X : ani 0 : mov X, a : kill a -> mvi X, 0 ;
|
||||
mov a, X : ani 255 : mov X, a : kill a -> ;
|
||||
|
||||
mov a, X : ori 0 : mov X, a : kill a -> ;
|
||||
mov a, X : ori 255 : mov X, a : kill a -> mvi X, 255 ;
|
||||
|
||||
mov a, X : xri 0 : mov X, a : kill a -> ;
|
||||
|
||||
%%;
|
||||
|
|
|
@ -111,5 +111,19 @@ big
|
|||
asp 4
|
||||
7
|
||||
|
||||
/* And var with big low-byte-zero const */
|
||||
|
||||
loe big
|
||||
loc 256
|
||||
and EM_WSIZE
|
||||
loc 256
|
||||
cmu EM_WSIZE
|
||||
zeq *8
|
||||
|
||||
loc __LINE__
|
||||
cal $fail
|
||||
asp 4
|
||||
8
|
||||
|
||||
cal $finished
|
||||
end
|
||||
|
|
|
@ -27,5 +27,7 @@ void _m_a_i_n(void)
|
|||
ASSERT(((unsigned int)1 + (unsigned int)two) == 3);
|
||||
ASSERT(((unsigned int)-1 + (unsigned int)two) == 1);
|
||||
|
||||
ASSERT(((unsigned int)two + (unsigned int)256) == 258);
|
||||
|
||||
finished();
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ int two = 2;
|
|||
int one = 1;
|
||||
int zero = 0;
|
||||
int minusone = -1;
|
||||
int biggish = 258;
|
||||
|
||||
/* Bypasses the CRT, so there's no stdio. */
|
||||
void _m_a_i_n(void)
|
||||
|
@ -28,5 +29,7 @@ void _m_a_i_n(void)
|
|||
ASSERT(((unsigned int)2 - (unsigned int)one) == 1);
|
||||
ASSERT(((unsigned int)1 - (unsigned int)two) == UINT_MAX);
|
||||
|
||||
ASSERT(((unsigned int)biggish - (unsigned int)256) == 2);
|
||||
|
||||
finished();
|
||||
}
|
||||
|
|
|
@ -111,5 +111,19 @@ big
|
|||
asp 4
|
||||
7
|
||||
|
||||
/* Or var with big low-byte-zero const */
|
||||
|
||||
loe big
|
||||
loc 256
|
||||
ior EM_WSIZE
|
||||
loc 258
|
||||
cmu EM_WSIZE
|
||||
zeq *8
|
||||
|
||||
loc __LINE__
|
||||
cal $fail
|
||||
asp 4
|
||||
8
|
||||
|
||||
cal $finished
|
||||
end
|
||||
|
|
|
@ -111,6 +111,20 @@ big
|
|||
asp 4
|
||||
7
|
||||
|
||||
/* Xor var with big low-byte-zero const */
|
||||
|
||||
loe big
|
||||
loc 256
|
||||
xor EM_WSIZE
|
||||
loc 745
|
||||
cmu EM_WSIZE
|
||||
zeq *8
|
||||
|
||||
loc __LINE__
|
||||
cal $fail
|
||||
asp 4
|
||||
8
|
||||
|
||||
|
||||
cal $finished
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue