From 277d5865e738a47206989634625aa10222165665 Mon Sep 17 00:00:00 2001 From: David Given Date: Sat, 16 Feb 2019 00:55:51 +0100 Subject: [PATCH] Not-working version of the code generator which uses bc as a normal register; turns out this is actually *worse* than reserving bc for the stack frame. There are code generation bugs but I'm not going to bother fixing them. --- mach/i80/libem/faddr.h | 9 ++----- mach/i80/libem/faddrn.h | 9 ++----- mach/i80/libem/fload.h | 16 +---------- mach/i80/libem/floadn.h | 30 ++++----------------- mach/i80/libem/fstore.h | 16 +---------- mach/i80/libem/fstoren.h | 30 ++++----------------- mach/i80/ncg/table | 58 ++++++++++++++++++++-------------------- mach/i80/top/table | 2 +- 8 files changed, 46 insertions(+), 124 deletions(-) diff --git a/mach/i80/libem/faddr.h b/mach/i80/libem/faddr.h index e88344080..a54a2e965 100644 --- a/mach/i80/libem/faddr.h +++ b/mach/i80/libem/faddr.h @@ -11,20 +11,15 @@ .define LABEL(.faddr, OFFSET) LABEL(.faddr, OFFSET): + lhld .fp #if OFFSET == 0 - mov l, c - mov h, b #elif OFFSET == 1 - mov l, c - mov h, b inx h #elif OFFSET == 2 - mov l, c - mov h, b inx h inx h #else - lxi h, OFFSET + lxi b, OFFSET dad b #endif ret diff --git a/mach/i80/libem/faddrn.h b/mach/i80/libem/faddrn.h index 5e5545273..9bd1e8135 100644 --- a/mach/i80/libem/faddrn.h +++ b/mach/i80/libem/faddrn.h @@ -11,20 +11,15 @@ .define LABEL(.faddrn, OFFSET) LABEL(.faddrn, OFFSET): + lhld .fp #if OFFSET == 0 - mov l, c - mov h, b #elif OFFSET == 1 - mov l, c - mov h, b dcx h #elif OFFSET == 2 - mov l, c - mov h, b dcx h dcx h #else - lxi h, -OFFSET + lxi b, -OFFSET dad b #endif ret diff --git a/mach/i80/libem/fload.h b/mach/i80/libem/fload.h index 5b0e02e5d..8c7be90fa 100644 --- a/mach/i80/libem/fload.h +++ b/mach/i80/libem/fload.h @@ -11,21 +11,7 @@ .define LABEL(.fload, OFFSET) LABEL(.fload, OFFSET): - #if OFFSET == 0 - #error "0 shouldn't happen" - #elif OFFSET == 1 - mov l, c - mov h, b - inx h - #elif OFFSET == 2 - mov l, c - mov h, b - inx h - inx h - #else - lxi h, OFFSET - dad b - #endif + call LABEL(.faddr, OFFSET) mov e, m inx h mov d, m diff --git a/mach/i80/libem/floadn.h b/mach/i80/libem/floadn.h index 4a04b7137..69599cafe 100644 --- a/mach/i80/libem/floadn.h +++ b/mach/i80/libem/floadn.h @@ -11,28 +11,8 @@ .define LABEL(.floadn, OFFSET) LABEL(.floadn, OFFSET): - #if OFFSET == 0 - #error "0 shouldn't happen" - #elif OFFSET == 1 - mov l, c - mov h, b - mov d, m - dcx h - mov e, m - ret - #elif OFFSET == 2 - mov l, c - mov h, b - dcx h - mov d, m - dcx h - mov e, m - ret - #else - lxi h, -OFFSET - dad b - mov e, m - inx h - mov d, m - ret - #endif + call LABEL(.faddr, OFFSET) + mov e, m + inx h + mov d, m + ret diff --git a/mach/i80/libem/fstore.h b/mach/i80/libem/fstore.h index 2a9bce62c..372241e1d 100644 --- a/mach/i80/libem/fstore.h +++ b/mach/i80/libem/fstore.h @@ -11,21 +11,7 @@ .define LABEL(.fstore, OFFSET) LABEL(.fstore, OFFSET): - #if OFFSET == 0 - #error "0 shouldn't happen" - #elif OFFSET == 1 - mov l, c - mov h, b - inx h - #elif OFFSET == 2 - mov l, c - mov h, b - inx h - inx h - #else - lxi h, OFFSET - dad b - #endif + call LABEL(.faddr, OFFSET) mov m, e inx h mov m, d diff --git a/mach/i80/libem/fstoren.h b/mach/i80/libem/fstoren.h index a739825df..b4e7e40b8 100644 --- a/mach/i80/libem/fstoren.h +++ b/mach/i80/libem/fstoren.h @@ -11,29 +11,9 @@ .define LABEL(.fstoren, OFFSET) LABEL(.fstoren, OFFSET): - #if OFFSET == 0 - #error "0 shouldn't happen" - #elif OFFSET == 1 - mov l, c - mov h, b - mov m, d - dcx h - mov m, e - ret - #elif OFFSET == 2 - mov l, c - mov h, b - dcx h - mov m, d - dcx h - mov m, e - ret - #else - lxi h, -OFFSET - dad b - mov m, e - inx h - mov m, d - ret - #endif + call LABEL(.faddr, OFFSET) + mov m, e + inx h + mov m, d + ret diff --git a/mach/i80/ncg/table b/mach/i80/ncg/table index 2ffd3e862..fe8b06e0c 100644 --- a/mach/i80/ncg/table +++ b/mach/i80/ncg/table @@ -48,8 +48,10 @@ TOKENS const1 = { INT num; } 1 num. const2 = { INT num; } 2 num. -smallconst2 = { INT num; } 2 num. -label = { ADDR off; } 2 off. +smallpconst2 = { INT num; } 2 num. /* Byte-sized positive constant */ +smallnconst2 = { INT num; } 2 num. /* Byte-sized negative constant */ +label = { ADDR off; } 2 off. +plabel = { ADDR off; INT param; } 2 off param. m = { } 2 cost(0,3) "m". fp = { } 2. @@ -58,7 +60,7 @@ SETS reg1 = reg + m. b_d_h_sp = regpair + stackpointer. b_d_h_psw = regpair + psword. -immediate = smallconst2 + const2 + label. +immediate = smallnconst2 + smallpconst2 + const2 + label. src1 = reg. src2 = regpair + const2 + label. src1or2 = src1 + src2. @@ -72,6 +74,7 @@ INSTRUCTIONS 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). + Call "call" plabel:ro cost(3,17). /* 'call' is a reserved word */ /* cc label:ro cost(3,14). */ /* cm label:ro cost(3,14). */ @@ -189,6 +192,10 @@ MOVES mov %2.1, %1.1 mov %2.2, %1.2 + from fp to hlreg + gen + lhld {label, ".fp"} + TESTS to test areg /* dummy test, never used */ @@ -254,11 +261,8 @@ from hl_or_de move {const1,0},%a.1 yields %a -from regpair - yields %1.2 - -from smallconst2 - yields {const2, %1.num} + from regpair + yields %1.2 from const2 uses regpair=%1 @@ -312,44 +316,44 @@ pat ldc #ifdef USE_I80_RSTS pat lol $1==0-2 - uses dereg, hlreg + uses dereg, hlreg, bcreg gen rst {const1, 1} yields de pat lol $1==0-4 - uses dereg, hlreg + uses dereg, hlreg, bcreg gen rst {const1, 2} yields de pat lol $1==4 - uses dereg, hlreg + uses dereg, hlreg, bcreg gen rst {const1, 3} yields de #endif pat lol ($1>0) && ($1<=STACKHELPERS) - uses dereg, hlreg + uses dereg, hlreg, bcreg gen Call {plabel, ".fload", $1} yields de pat lol ($1<0) && ($1>=0-STACKHELPERS) - uses dereg, hlreg + uses dereg, hlreg, bcreg gen Call {plabel, ".floadn", 0-$1} yields de pat lol - uses dereg, hlreg={const2, $1} + uses hlreg={fp}, regpair={const2, $1} gen - dad lb - mov e, {m} + dad %b + mov %b.2, {m} inx hl - mov d, {m} - yields de + mov %b.1, {m} + yields %b pat loe uses hlreg @@ -368,13 +372,13 @@ pat lof loi 2 pat lal ($1>0) && ($1<=STACKHELPERS) - uses hlreg + uses hlreg, bcreg gen Call {plabel, ".faddr", $1} yields hl pat lal ($1<0) && ($1>=0-STACKHELPERS) - uses hlreg + uses hlreg, bcreg gen Call {plabel, ".faddrn", 0-$1} yields hl @@ -569,20 +573,20 @@ pat stl lol $1==$2 #ifdef USE_I80_RSTS pat stl $1==0-2 with dereg - uses hlreg + uses hlreg, bcreg gen rst {const1, 4} #endif pat stl ($1>0) && ($1<=STACKHELPERS) with dereg - uses hlreg + uses hlreg, bcreg gen Call {plabel, ".fstore", $1} pat stl ($1<0) && ($1>=0-STACKHELPERS) with dereg - uses hlreg + uses hlreg, bcreg gen Call {plabel, ".fstoren", 0-$1} @@ -777,10 +781,6 @@ pat sbi $1==2 yields %2 {const2, 0-%1.num} leaving adi 2 - with smallconst2 regpair - yields %2 {smallconst2, 0-%1.num} - leaving - adi 2 with regpair const2 uses areg gen @@ -1368,7 +1368,7 @@ pat and !defined($1) Call {label,".and"} pat ior $1==2 - with regpair smallconst2 + with regpair smallpconst2 uses areg gen mov a, %1.2 @@ -1437,7 +1437,7 @@ kills ALL gen Call {label,".ior"} pat xor $1==2 - with regpair smallconst2 + with regpair smallpconst2 uses areg gen mov a, %1.2 diff --git a/mach/i80/top/table b/mach/i80/top/table index f03c92d9b..18fa63c5f 100644 --- a/mach/i80/top/table +++ b/mach/i80/top/table @@ -19,6 +19,6 @@ call X : ret -> jmp X ; push h : lxi h, X : pop d -> lxi d, X : xchg ; push d : lxi d, X : pop h -> lxi h, X : xchg ; -push h : lhld h, X : pop d -> xchg : lhld X ; +push h : lhld X : pop d -> xchg : lhld X ; %%; -- 2.34.1