Not-working version of the code generator which uses bc as a normal register;
authorDavid Given <dg@cowlark.com>
Fri, 15 Feb 2019 23:55:51 +0000 (00:55 +0100)
committerDavid Given <dg@cowlark.com>
Fri, 15 Feb 2019 23:55:51 +0000 (00:55 +0100)
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
mach/i80/libem/faddrn.h
mach/i80/libem/fload.h
mach/i80/libem/floadn.h
mach/i80/libem/fstore.h
mach/i80/libem/fstoren.h
mach/i80/ncg/table
mach/i80/top/table

index e883440..a54a2e9 100644 (file)
 
 .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
index 5e55452..9bd1e81 100644 (file)
 
 .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
index 5b0e02e..8c7be90 100644 (file)
 
 .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
index 4a04b71..69599ca 100644 (file)
 
 .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
index 2a9bce6..372241e 100644 (file)
 
 .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
index a739825..b4e7e40 100644 (file)
 
 .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
 
index 2ffd3e8..fe8b06e 100644 (file)
@@ -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
index f03c92d..18fa63c 100644 (file)
@@ -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 ;
 
 %%;