From 0ac145a0d117a941dc3b08c6b6f471052c515ffd Mon Sep 17 00:00:00 2001 From: David Given Date: Fri, 8 Feb 2019 22:38:07 +0100 Subject: [PATCH] Add tests for simple and, or, and xor; drastically improve the i80 code generation for these. --- mach/i80/ncg/table | 250 +++++++++++++++++++++++++++++---------- mach/proto/ncg/codegen.c | 3 +- tests/plat/core/and_e.e | 85 ++++++++----- tests/plat/core/andv_e.e | 54 +++++++++ tests/plat/core/ior_e.e | 85 ++++++++----- tests/plat/core/iorv_e.e | 54 +++++++++ tests/plat/core/xor_e.e | 85 ++++++++----- tests/plat/core/xorv_e.e | 54 +++++++++ 8 files changed, 524 insertions(+), 146 deletions(-) create mode 100644 tests/plat/core/andv_e.e create mode 100644 tests/plat/core/iorv_e.e create mode 100644 tests/plat/core/xorv_e.e diff --git a/mach/i80/ncg/table b/mach/i80/ncg/table index 0e3864a44..7cff6f948 100644 --- a/mach/i80/ncg/table +++ b/mach/i80/ncg/table @@ -46,6 +46,7 @@ TOKENS const1 = { INT num; } 1 num. const2 = { INT num; } 2 num. +smallconst2 = { INT num; } 2 num. label = { ADDR off; } 2 off. m = { } 2 cost(0,3) "m". @@ -54,7 +55,7 @@ SETS reg1 = reg + lbreg + m. b_d_h_sp = regpair + stackpointer. b_d_h_psw = regpair + psword. -immediate = const2 + label. +immediate = smallconst2 + const2 + label. src1 = reg. src2 = hl_or_de + const2 + label. src1or2 = src1 + src2. @@ -114,7 +115,7 @@ INSTRUCTIONS mvi reg1:wo,const1:ro cost(2, 7). /* nop cost(1, 3). */ ora reg1:ro kills a:cc cost(1, 4). -/* ori const1:ro kills a:cc cost(2, 7). */ + ori const1:ro kills a:cc cost(2, 7). /* out const1:ro cost(2,10). */ pchl cost(1, 5). pop b_d_h_psw:wo cost(1,10). @@ -144,7 +145,7 @@ INSTRUCTIONS sui const1:ro kills a:cc cost(2, 7). xchg kills de hl cost(1, 4). xra reg1:ro kills a:cc cost(1, 4). -/* xri const1:ro kills a:cc cost(2, 7). */ + xri const1:ro kills a:cc cost(2, 7). xthl kills hl cost(1,18). @@ -225,6 +226,9 @@ gen move %1,%a.2 from hl_or_de yields %1.2 +from smallconst2 + yields {const2, %1.num} + from const2 uses hl_or_de gen move %1,%a yields %a.2 @@ -239,7 +243,12 @@ PATTERNS /* Group 1: Load instructions */ /*********************************************/ -pat loc yields {const2,$1} +pat loc sfit($1, 8) + yields {smallconst2, $1} + +pat loc + yields {const2, $1} + pat ldc yields {const2,highw($1)} {const2,loww($1)} @@ -485,16 +494,17 @@ with hlreg gen shld {label,$1} pat sil -with dereg -uses hlreg={const2,$1}, areg -gen dad lb - mov a,{m} - inx hl - mov h,{m} - mov l,a - mov {m},e - inx hl - mov {m},d + with dereg + uses hlreg={const2,$1}, areg + gen + dad lb + mov a, {m} + inx hl + mov h, {m} + mov l, a + mov {m}, e + inx hl + mov {m}, d pat sil lil $1==$2 with dereg @@ -1123,22 +1133,62 @@ leaving loc $1 loc $2 cal ".cfu" asp 4+$1 lfr 4 /*****************************************/ pat and $1==2 -with hl_or_de hl_or_de -uses areg -gen mov a,%1.2 - ana %2.2 - mov %2.2,a - mov a,%1.1 - ana %2.1 - mov %2.1,a yields %2 -with hl_or_de hl_or_de -uses areg -gen mov a,%1.2 - ana %2.2 - mov %1.2,a - mov a,%1.1 - ana %2.1 - mov %1.1,a yields %1 + with hl_or_de smallconst2 + uses areg + gen + mov a, %1.2 + ani {const1, %2.num & 0xff} + mov %1.2, a + mvi %1.1, {const1, 0} + yields %1 + with hl_or_de const2 + uses areg + gen + mov a, %1.2 + ani {const1, %2.num & 0xff} + mov %1.2, a + mov a, %1.1 + ani {const1, %2.num >> 8} + mov %1.1, a + yields %1 + with const2 hl_or_de + uses areg + gen + mov a, %2.2 + ani {const1, %1.num & 0xff} + mov %2.2, a + mov a, %2.1 + ani {const1, %1.num >> 8} + mov %2.1, a + yields %2 + with smallconst2 hl_or_de + uses areg + gen + mov a, %2.2 + ani {const1, %1.num & 0xff} + mov %2.2, a + mvi %2.1, {const1, 0} + yields %2 + with hl_or_de hl_or_de + uses areg + gen + mov a, %1.2 + ana %2.2 + mov %2.2, a + mov a, %1.1 + ana %2.1 + mov %2.1, a + yields %2 + with hl_or_de hl_or_de + uses areg + gen + mov a,%1.2 + ana %2.2 + mov %1.2,a + mov a,%1.1 + ana %2.1 + mov %1.1,a + yields %1 pat and defined($1) kills ALL @@ -1151,22 +1201,60 @@ kills ALL gen Call {label,".and"} pat ior $1==2 -with hl_or_de hl_or_de -uses areg -gen mov a,%1.2 - ora %2.2 - mov %2.2,a - mov a,%1.1 - ora %2.1 - mov %2.1,a yields %2 -with hl_or_de hl_or_de -uses areg -gen mov a,%1.2 - ora %2.2 - mov %1.2,a - mov a,%1.1 - ora %2.1 - mov %1.1,a yields %1 + with hl_or_de smallconst2 + uses areg + gen + mov a, %1.2 + ori {const1, %2.num & 0xff} + mov %1.2, a + yields %1 + with hl_or_de const2 + uses areg + gen + mov a, %1.2 + ori {const1, %2.num & 0xff} + mov %1.2, a + mov a, %1.1 + ori {const1, %2.num >> 8} + mov %1.1, a + yields %1 + with const2 hl_or_de + uses areg + gen + mov a, %2.2 + ori {const1, %1.num & 0xff} + mov %2.2, a + mov a, %2.1 + ori {const1, %1.num >> 8} + mov %2.1, a + yields %2 + with smallconst2 hl_or_de + uses areg + gen + mov a, %2.2 + ori {const1, %1.num & 0xff} + mov %2.2, a + yields %2 + with hl_or_de hl_or_de + uses areg + gen + mov a, %1.2 + ora %2.2 + mov %2.2, a + mov a, %1.1 + ora %2.1 + mov %2.1, a + yields %2 + with hl_or_de hl_or_de + uses areg + gen + mov a,%1.2 + ora %2.2 + mov %1.2,a + mov a,%1.1 + ora %2.1 + mov %1.1,a + yields %1 pat ior defined($1) kills ALL @@ -1179,22 +1267,60 @@ kills ALL gen Call {label,".ior"} pat xor $1==2 -with hl_or_de hl_or_de -uses areg -gen mov a,%1.2 - xra %2.2 - mov %2.2,a - mov a,%1.1 - xra %2.1 - mov %2.1,a yields %2 -with hl_or_de hl_or_de -uses areg -gen mov a,%1.2 - xra %2.2 - mov %1.2,a - mov a,%1.1 - xra %2.1 - mov %1.1,a yields %1 + with hl_or_de smallconst2 + uses areg + gen + mov a, %1.2 + xri {const1, %2.num & 0xff} + mov %1.2, a + yields %1 + with hl_or_de const2 + uses areg + gen + mov a, %1.2 + xri {const1, %2.num & 0xff} + mov %1.2, a + mov a, %1.1 + xri {const1, %2.num >> 8} + mov %1.1, a + yields %1 + with const2 hl_or_de + uses areg + gen + mov a, %2.2 + xri {const1, %1.num & 0xff} + mov %2.2, a + mov a, %2.1 + xri {const1, %1.num >> 8} + mov %2.1, a + yields %2 + with smallconst2 hl_or_de + uses areg + gen + mov a, %2.2 + xri {const1, %1.num & 0xff} + mov %2.2, a + yields %2 + with hl_or_de hl_or_de + uses areg + gen + mov a, %1.2 + xra %2.2 + mov %2.2, a + mov a, %1.1 + xra %2.1 + mov %2.1, a + yields %2 + with hl_or_de hl_or_de + uses areg + gen + mov a,%1.2 + xra %2.2 + mov %1.2,a + mov a,%1.1 + xra %2.1 + mov %1.1,a + yields %1 pat xor defined($1) kills ALL diff --git a/mach/proto/ncg/codegen.c b/mach/proto/ncg/codegen.c index 3a2d60d1a..4ae6363f0 100644 --- a/mach/proto/ncg/codegen.c +++ b/mach/proto/ncg/codegen.c @@ -5,6 +5,7 @@ static char rcsid[] = "$Id$"; #include #include #include +#include #include "param.h" #include "tables.h" #include "types.h" @@ -375,7 +376,7 @@ unsigned codegen(byte* codep, int ply, int toplevel, unsigned costlimit, int for cp = findcoerc(tp, &machsets[tokexp[i]]); #ifndef NDEBUG if (Debug > 1) - fprintf(stderr, "findcoerc returns 0x%x at position %d\n", (unsigned)cp, i); + fprintf(stderr, "findcoerc returns %p at position %d\n", cp, i); #endif if (cp == 0) { diff --git a/tests/plat/core/and_e.e b/tests/plat/core/and_e.e index 1bdf3d5ed..0fc697a9b 100644 --- a/tests/plat/core/and_e.e +++ b/tests/plat/core/and_e.e @@ -4,15 +4,18 @@ exp $_m_a_i_n pro $_m_a_i_n, 0 - /* And word-sized set */ +three + rom 3 +one + rom 1 +big + rom 256 -four - rom EM_WSIZE + /* And var with var */ - loc 32769 - loc 1 - loe four /* to defeat constant folding */ - and + loe three + loe one + and EM_WSIZE loc 1 cmu EM_WSIZE zeq *1 @@ -22,33 +25,61 @@ four asp 4 1 - /* And triple-word-sized set */ + /* And var with const */ -four_by_three - rom EM_WSIZE*3 - - loc 32769 - loc 32770 - loc 32772 + loe three + loc 1 + and EM_WSIZE loc 1 - loc 2 - loc 4 - loe four_by_three - and - loc 4 cmu EM_WSIZE - zne *2 - loc 2 - cmu EM_WSIZE - zne *2 + zeq *2 + + loc __LINE__ + cal $fail + asp 4 +2 + + /* And const with var */ + + loc 3 + loe one + and EM_WSIZE loc 1 cmu EM_WSIZE zeq *3 -2 - loc __LINE__ - cal $fail - asp 4 + + loc __LINE__ + cal $fail + asp 4 3 + /* And var with big const */ + + loe big + loc 257 + and EM_WSIZE + loc 256 + cmu EM_WSIZE + zeq *4 + + loc __LINE__ + cal $fail + asp 4 +4 + + /* And big const with var */ + + loc 257 + loe big + and EM_WSIZE + loc 256 + cmu EM_WSIZE + zeq *5 + + loc __LINE__ + cal $fail + asp 4 +5 + cal $finished end diff --git a/tests/plat/core/andv_e.e b/tests/plat/core/andv_e.e new file mode 100644 index 000000000..1bdf3d5ed --- /dev/null +++ b/tests/plat/core/andv_e.e @@ -0,0 +1,54 @@ +# + mes 2, EM_WSIZE, EM_PSIZE + + exp $_m_a_i_n + pro $_m_a_i_n, 0 + + /* And word-sized set */ + +four + rom EM_WSIZE + + loc 32769 + loc 1 + loe four /* to defeat constant folding */ + and + loc 1 + cmu EM_WSIZE + zeq *1 + + loc __LINE__ + cal $fail + asp 4 +1 + + /* And triple-word-sized set */ + +four_by_three + rom EM_WSIZE*3 + + loc 32769 + loc 32770 + loc 32772 + loc 1 + loc 2 + loc 4 + loe four_by_three + and + loc 4 + cmu EM_WSIZE + zne *2 + loc 2 + cmu EM_WSIZE + zne *2 + loc 1 + cmu EM_WSIZE + zeq *3 +2 + loc __LINE__ + cal $fail + asp 4 +3 + + cal $finished + end diff --git a/tests/plat/core/ior_e.e b/tests/plat/core/ior_e.e index 9f4a0d985..3dc977dab 100644 --- a/tests/plat/core/ior_e.e +++ b/tests/plat/core/ior_e.e @@ -4,15 +4,16 @@ exp $_m_a_i_n pro $_m_a_i_n, 0 - /* Or word-sized set */ +zero + rom 0 +one + rom 1 -four - rom EM_WSIZE + /* Or var with var */ - loc 0 - loc 1 - loe four /* to defeat constant folding */ - ior + loe zero + loe one + ior EM_WSIZE loc 1 cmu EM_WSIZE zeq *1 @@ -22,33 +23,61 @@ four asp 4 1 - /* Or triple-word-sized set */ + /* Or var with const */ -four_by_three - rom EM_WSIZE*3 - - loc 16 - loc 32 - loc 64 + loe zero + loc 1 + ior EM_WSIZE loc 1 - loc 2 - loc 3 - loe four_by_three - ior - loc 67 cmu EM_WSIZE - zne *2 - loc 34 - cmu EM_WSIZE - zne *2 - loc 17 + zeq *2 + + loc __LINE__ + cal $fail + asp 4 +2 + + /* Or const with var */ + + loc 0 + loe one + ior EM_WSIZE + loc 1 cmu EM_WSIZE zeq *3 -2 - loc __LINE__ - cal $fail - asp 4 + + loc __LINE__ + cal $fail + asp 4 3 + /* Or var with big const */ + + loe zero + loc 1000 + ior EM_WSIZE + loc 1000 + cmu EM_WSIZE + zeq *4 + + loc __LINE__ + cal $fail + asp 4 +4 + + /* Or big const with var */ + + loc 1000 + loe one + ior EM_WSIZE + loc 1001 + cmu EM_WSIZE + zeq *5 + + loc __LINE__ + cal $fail + asp 4 +5 + cal $finished end diff --git a/tests/plat/core/iorv_e.e b/tests/plat/core/iorv_e.e new file mode 100644 index 000000000..9f4a0d985 --- /dev/null +++ b/tests/plat/core/iorv_e.e @@ -0,0 +1,54 @@ +# + mes 2, EM_WSIZE, EM_PSIZE + + exp $_m_a_i_n + pro $_m_a_i_n, 0 + + /* Or word-sized set */ + +four + rom EM_WSIZE + + loc 0 + loc 1 + loe four /* to defeat constant folding */ + ior + loc 1 + cmu EM_WSIZE + zeq *1 + + loc __LINE__ + cal $fail + asp 4 +1 + + /* Or triple-word-sized set */ + +four_by_three + rom EM_WSIZE*3 + + loc 16 + loc 32 + loc 64 + loc 1 + loc 2 + loc 3 + loe four_by_three + ior + loc 67 + cmu EM_WSIZE + zne *2 + loc 34 + cmu EM_WSIZE + zne *2 + loc 17 + cmu EM_WSIZE + zeq *3 +2 + loc __LINE__ + cal $fail + asp 4 +3 + + cal $finished + end diff --git a/tests/plat/core/xor_e.e b/tests/plat/core/xor_e.e index 8218ee63c..97b65f586 100644 --- a/tests/plat/core/xor_e.e +++ b/tests/plat/core/xor_e.e @@ -4,16 +4,17 @@ exp $_m_a_i_n pro $_m_a_i_n, 0 - /* Xor word-sized set */ +three + rom 3 +one + rom 1 -four - rom EM_WSIZE + /* Xor var with var */ - loc 32769 - loc 1 - loe four /* to defeat constant folding */ - xor - loc 32768 + loe three + loe one + xor EM_WSIZE + loc 2 cmu EM_WSIZE zeq *1 @@ -22,33 +23,61 @@ four asp 4 1 - /* Xor triple-word-sized set */ + /* Xor var with const */ -four_by_three - rom EM_WSIZE*3 - - loc 32769 - loc 32770 - loc 32772 + loe three loc 1 + xor EM_WSIZE loc 2 - loc 4 - loe four_by_three - xor - loc 32768 cmu EM_WSIZE - zne *2 - loc 32768 - cmu EM_WSIZE - zne *2 - loc 32768 + zeq *2 + + loc __LINE__ + cal $fail + asp 4 +2 + + /* Xor const with var */ + + loc 3 + loe one + xor EM_WSIZE + loc 2 cmu EM_WSIZE zeq *3 -2 - loc __LINE__ - cal $fail - asp 4 + + loc __LINE__ + cal $fail + asp 4 3 + /* Xor var with big const */ + + loe three + loc 1001 + xor EM_WSIZE + loc 1002 + cmu EM_WSIZE + zeq *4 + + loc __LINE__ + cal $fail + asp 4 +4 + + /* Xor big const with var */ + + loc 1001 + loe three + xor EM_WSIZE + loc 1002 + cmu EM_WSIZE + zeq *5 + + loc __LINE__ + cal $fail + asp 4 +5 + cal $finished end diff --git a/tests/plat/core/xorv_e.e b/tests/plat/core/xorv_e.e new file mode 100644 index 000000000..8218ee63c --- /dev/null +++ b/tests/plat/core/xorv_e.e @@ -0,0 +1,54 @@ +# + mes 2, EM_WSIZE, EM_PSIZE + + exp $_m_a_i_n + pro $_m_a_i_n, 0 + + /* Xor word-sized set */ + +four + rom EM_WSIZE + + loc 32769 + loc 1 + loe four /* to defeat constant folding */ + xor + loc 32768 + cmu EM_WSIZE + zeq *1 + + loc __LINE__ + cal $fail + asp 4 +1 + + /* Xor triple-word-sized set */ + +four_by_three + rom EM_WSIZE*3 + + loc 32769 + loc 32770 + loc 32772 + loc 1 + loc 2 + loc 4 + loe four_by_three + xor + loc 32768 + cmu EM_WSIZE + zne *2 + loc 32768 + cmu EM_WSIZE + zne *2 + loc 32768 + cmu EM_WSIZE + zeq *3 +2 + loc __LINE__ + cal $fail + asp 4 +3 + + cal $finished + end