Merge from default.
authorDavid Given <dg@cowlark.com>
Fri, 15 Feb 2019 23:25:33 +0000 (00:25 +0100)
committerDavid Given <dg@cowlark.com>
Fri, 15 Feb 2019 23:25:33 +0000 (00:25 +0100)
1  2 
mach/i80/libem/rst.s
mach/i80/ncg/table

@@@ -5,77 -5,38 +5,38 @@@
  .sect .bss
  .sect .text
  
+ ! Which resets we install are determined by statistical analysis of Star
+ ! Trek. When changing these, make sure to update the i80 table to match.
+ !     97 call .floadn2
+ !     41 call .floadn4
+ !     34 call .fload4
+ !     28 call .fstoren2
+ !
+ ! Also:
+ !     48 call .cmps_mag
  .define .rst_init
  .rst_init:
-     mvi a, 0xc3     ! jmp <a16>
-     sta 0x08
-     sta 0x10
-     sta 0x18
-     lxi h, rst1
-     shld 0x09
-     lxi h, rst2
-     shld 0x11
-     lxi h, rst3
-     shld 0x19
-     ret
-     ! de = [fp+const1]
- rst1:
-     lhld .fp
-     xchg
-     pop h
-     mov a, m
-     inx h
-     push h
-       mov l, a
-       ral
-       sbb a
-       mov h, a
-       dad d
-     mov e, m
-     inx h
-     mov d, m
-     ret
-     ! [fp+const1] = bc
- rst2:
-     lhld .fp
-     xchg
-     
-     pop h
+     lxi h, .floadn2
+     lxi d, 0x0008
+     call copy
+     lxi h, .floadn4
+     call copy
+     lxi h, .fload4
+     call copy
+     lxi h, .fstoren2
+     call copy
+     lxi h, .cmps_mag
+     jmp copy
+ ! Copies eight bytes from HL to DE.
+ copy:
+     mvi c, 8
+ .1:
      mov a, m
+     stax d
      inx h
-     push h
-       mov l, a
-       ral
-       sbb a
-       mov h, a
-       dad d
-     mov m, c
-     inx h
-     mov m, b
+     inr e
+     dcr c
+     jnz .1
 -    ret
 +    ret
-     ! hl = fp+const1
- rst3:
-     lhld .fp
-     xchg
-     pop h
-     mov a, m
-     inx h
-     push h
-     mov l, a
-     ral
-     sbb a
-     mov h, a
-     dad d
-     ret
@@@ -20,11 -24,10 +24,12 @@@ lbreg                      /* the registers used as localb
  reg                   /* the free registers */
  regpair                       /* register pairs bc, de and hl */
  regind                        /* register indirect */
 +bcreg       /* bc-register-pair */
  dereg                 /* de-register-pair */
  hlreg                 /* hl-register-pair */
 +bc_or_de    /* bc- or de-register-pair */
  hl_or_de              /* de- or hl-register-pair */
+ localbase
  stackpointer
  psword
  
@@@ -188,84 -200,104 +197,100 @@@ TEST
  
  STACKINGRULES
  
- from regpair to STACK
-    gen push %1
+    from regpair to STACK
+       gen
+          push %1
  
 -   from immediate + reg to STACK
 -      uses hl_or_de
 -      gen
 -         move %1, %a
 -         push %a
 +from immediate + reg to STACK
 +   uses regpair
 +   gen
 +      move %1,%a
 +      push %a
  
- from immediate + reg to STACK
-    gen
-       push hl
-       move %1,hl
-       xthl.
+    from immediate + reg to STACK
+       gen
+          push hl
+          move %1, hl
+          xthl.
  
  COERCIONS
  
- from STACK
-    uses regpair
-    gen
-       pop %a
-    yields %a
   from STACK
+       uses regpair
+       gen
+          pop %a
+       yields %a
  
 -   from STACK
 -      uses hl_or_de
 -      gen
 -         pop %a
 -      yields %a.2
 +from STACK
 +   uses regpair
 +   gen
 +      pop %a
 +   yields %a.2
  
 -   from STACK
 -      uses areg
 -      gen
 -         dcx sp
 -         pop psw
 -         inx sp
 -      yields %a
 +from STACK
 +uses areg
 +gen dcx sp
 +    pop psw
 +    inx sp                            yields a
  
- from immediate
-    uses regpair
-    gen
-       move %1,%a
-    yields %a
+    from immediate
+       uses regpair=%1
+       yields %a
  
 -   from hl_or_de
 -      uses hl_or_de
 +from hl_or_de
 +   uses hl_or_de
        gen
           xchg.
        yields %a
  
- from regpair
-    uses regpair
-    gen
-       move %1,%a
-    yields %a
+    from regpair
+       uses regpair=%1
+       yields %a
  
- from reg
-    uses reusing %1, regpair
-    gen
-       move %1,%a.2
-       move {const1,0},%a.1
-       yields %a
+    from reg
 -      uses reusing %1, hl_or_de
++      uses reusing %1, regpair
+       gen
+          move %1,%a.2
+          move {const1,0},%a.1
+       yields %a
  
 -   from hl_or_de                              yields %1.2
 +from regpair
 +   yields %1.2
  
 -   from smallpconst2
 -      yields {const2, %1.num}
 -
 -   from smallnconst2
 -      yields {const2, %1.num}
 +from smallconst2
 +   yields {const2, %1.num}
  
- from const2
-    uses regpair
+    from const2
 -      uses hl_or_de=%1
++      uses regpair=%1
+       yields %a
+    from smallpconst2
+       uses reg={const1, %1.num & 0xff}
+       yields %a
+    from smallnconst2
+       uses reg={const1, %1.num & 0xff}
+       yields %a
+    from smallpconst2 %1.num == 1
+       uses reg={const1, 0}
        gen
-          move %1, %a
-       yields %a.2
+          inr %a
+       yields %a
  
- from regpair
-    uses areg
-    gen
-       move %1.2,a
-    yields a
+    from smallnconst2 %1.num == 0-1
+       uses reg={const1, 0}
+       gen
+          dcr %a
+       yields %a
+    from const2
+       uses reg={const1, %1.num & 0xff}
+       yields %a
+    from hl_or_de
+       uses reg=%1.2
+       yields %a
  
  PATTERNS
  
@@@ -316,19 -374,22 +367,22 @@@ pat lo
        adp $1
        loi 2
  
- #ifdef USE_I80_RSTS
-    pat lal sfit($1, 8)
-       uses dereg, hlreg, areg
-       gen
-          rst {const1, 3}
-          data1 {const1, $1}
-       yields hl
- #endif
+ pat lal ($1>0) && ($1<=STACKHELPERS)
+    uses hlreg
+    gen
+       Call {plabel, ".faddr", $1}
+    yields hl
+ pat lal ($1<0) && ($1>=0-STACKHELPERS)
+    uses hlreg
+    gen
+       Call {plabel, ".faddrn", 0-$1}
+    yields hl
  
  pat lal
 -   uses hlreg={const2,$1}
 +   uses hlreg={fp}, regpair={const2,$1}
        gen
 -         dad lb
 +         dad %b
        yields hl
  
  pat lae
@@@ -364,102 -423,82 +418,102 @@@ pat lxa $1==
     yields hl
  
  pat lxa $1==1
 -uses dereg, hlreg
 -gen move {const2,SL},hl
 -    dad lb
 -    mov e,{m}
 -    inx hl
 -    mov d,{m}
 -    lxi hl,{const2,SL}
 -    dad de                            yields hl
 +   uses dereg={const2, SL}, hlreg={fp}
 +   gen
 +      dad de
 +      mov e,{m}
 +      inx hl
 +      mov d,{m}
 +      lxi hl,{const2,SL}
 +      dad de
 +   yields hl
  
  pat lxa $1>1 && $1<256
 -uses dereg, hlreg, areg={const1,$1}
 -gen move lb,de
 -    1:
 -    lxi hl,{const2,SL}
 -    dad de
 -    mov e,{m}
 -    inx hl
 -    mov d,{m}
 -    dcr a
 -    jnz {label,1b}
 -    lxi hl,{const2,SL}
 -    dad de                            yields hl
 +   uses dereg, hlreg={fp}, areg={const1,$1}
 +   gen
 +      xchg.
 +      1:
 +      lxi hl,{const2,SL}
 +      dad de
 +      mov e,{m}
 +      inx hl
 +      mov d,{m}
 +      dcr a
 +      jnz {label,1b}
 +      lxi hl,{const2,SL}
 +      dad de
 +   yields hl
  
  pat loi $1==1
 -with exact label
 -  uses areg
 -  gen lda %1                          yields a
 -with dereg
 -  uses areg
 -  gen ldax de                         yields a
 -with hlreg
 -  uses reusing %1, reg
 -  gen mov %a,{m}                      yields %a
 +   with exact label
 +      uses areg
 +         gen
 +            lda %1
-                       yields a
++      yields a
 +   with bc_or_de
 +      uses areg
 +         gen
 +            ldax %1
 +                      yields a
 +   with hlreg
 +      uses reusing %1, reg
 +         gen
 +            mov %a,{m}
 +              yields %a
  
  pat loi $1==2
 -with exact label
 -   gen lhld %1                                yields hl
 -with hlreg
 -   uses dereg
 -   gen mov e,{m}
 -       inx %1
 -       mov d,{m}                      yields de
 +   with exact label
 +      gen
 +         lhld %1
 +      yields hl
 +   with hlreg
 +      uses regpair
 +         gen
 +            mov %a.2, {m}
 +            inx %1
 +            mov %a.1, {m}
 +              yields %a
  
  pat loi $1==4
 -with exact label
 -   gen lhld %1
 -       xchg.
 -       lhld {label,%1.off+2}          yields hl de
 -with exact label
 -   gen lhld {label,%1.off+2}
 -       xchg.
 -       lhld %1                                yields de hl
 -with hlreg
 -   uses dereg, areg
 -   gen mov e,{m}
 -       inx %1
 -       mov d,{m}
 -       inx hl
 -       mov a,{m}
 -       inx hl
 -       mov h,{m}
 -       mov l,a                                yields hl de
 +   with exact label
 +      gen
 +         lhld %1
 +         xchg.
 +         lhld {label,%1.off+2}
 +      yields hl de
 +   with exact label
 +      gen
 +         lhld {label,%1.off+2}
 +         xchg.
 +         lhld %1
 +      yields de hl
 +   with hlreg
 +      uses regpair, areg
 +      gen
 +         mov %a.2, {m}
 +         inx %1
 +         mov %a.1,{m}
 +         inx hl
 +         mov a,{m}
 +         inx hl
 +         mov h,{m}
 +         mov l,a
 +      yields hl %a
  
  pat loi $1<=510
 -with hl_or_de STACK
 -uses hl_or_de={const2,$1-1}, areg
 -gen dad de
 -    mvi a,{const1,$1/2}
 -    1:
 -    mov d,{m}
 -    dcx hl
 -    mov e,{m}
 -    dcx hl
 -    push de
 -    dcr a
 -    jnz {label,1b}
 +   with hl_or_de STACK
 +      uses hl_or_de={const2,$1-1}, areg
 +      gen
 +         dad de
 +         mvi a,{const1,$1/2}
 +         1:
 +         mov d,{m}
 +         dcx hl
 +         mov e,{m}
 +         dcx hl
 +         push de
 +         dcr a
 +         jnz {label,1b}
  
  pat loi $1>=512
  kills ALL
@@@ -507,39 -545,43 +561,50 @@@ pat lp
  /******************************************/
  
  pat stl lol $1==$2
 -with dereg                            yields de de leaving stl $1
 +   with regpair
 +   yields %1 %1
 +   leaving
 +      stl $1
  
  #ifdef USE_I80_RSTS
-    pat stl sfit($1, 8)
-          with bcreg
-       uses hlreg, dereg, areg
-       gen
-          rst {const1, 2}
-          data1 {const1, $1}
+    pat stl $1==0-2
+       with dereg
+          uses hlreg
+          gen
+             rst {const1, 4}
  #endif
  
+ pat stl ($1>0) && ($1<=STACKHELPERS)
+    with dereg
+       uses hlreg
+       gen
+          Call {plabel, ".fstore", $1}
+ pat stl ($1<0) && ($1>=0-STACKHELPERS)
+    with dereg
+       uses hlreg
+       gen
+          Call {plabel, ".fstoren", 0-$1}
  pat stl
 -      with dereg
 -      uses hlreg={const2, $1}
 -      gen
 -         dad lb
 -         mov {m}, e
 -         inx hl
 -         mov {m}, d
 +      with regpair
 +      uses hlreg={fp}, regpair={const2, $1}
 +      gen
 +              dad %b
 +              mov {m}, %1.2
 +              inx hl
 +              mov {m}, %1.1
  
  pat ste loe $1==$2
 -with hlreg                            yields hl hl leaving ste $1
 +   with regpair
 +   yields %1 %1
 +   leaving
 +      ste $1
  
  pat ste
 -with hlreg
 -gen shld {label,$1}
 +   with hlreg
 +      gen
 +         shld {label,$1}
  
  pat sil
     leaving
@@@ -982,12 -1029,11 +1057,11 @@@ pat inl ($1<0) && ($1>=0-STACKHELPERS
           inx hl
           inr {m}
           1:
- #endif
  
  pat inl
 -   uses hlreg={const2,$1}
 +   uses hlreg={fp}, regpair={const2, $1}
        gen
 -         dad lb
 +         dad %b
           inr {m}
           jnz {label,1f}
           inx hl
@@@ -1003,37 -1049,20 +1077,22 @@@ gen inr {m
      1:
  
  pat dec
 -with hl_or_de
 -gen dcx %1                            yields %1
 +   with regpair
 +      gen
 +         dcx %1
 +      yields %1
  
- #ifdef USE_I80_RSTS
-    pat del sfit($1, 8)
-       uses hlreg, areg, dereg
+ pat del
 -   uses hlreg={const2,$1}
++   uses hlreg={fp}, regpair={const2,$1}
        gen
-          rst {const1, 3}
-          data1 {const1, $1}
 -         dad lb
--         mov e, {m}
++         dad %b
++         mov %b.2, {m}
           inx hl
--         mov d, {m}
++         mov %b.1, {m}
           dcx de
--         mov {m}, d
++         mov {m}, %b.1
           dcx hl
           mov {m}, e
- #endif
- pat del
-    uses hlreg={fp}, regpair={const2,$1}
-    gen
-       dad %b
-       mov %b.2, {m}
-       inx hl
-       mov %b.1, {m}
-       dcx %b
-       mov {m}, %b.1
-       dcx hl
-       mov {m}, %b.2
  
  pat dee
  uses hlreg
@@@ -1041,22 -1070,10 +1100,10 @@@ gen lhld {label,$1
      dcx hl
      shld {label,$1}
  
- #ifdef USE_I80_RSTS
-    pat zrl sfit($1, 8)
-       uses hlreg, dereg, areg
-       gen
-          rst {const1, 3}
-          data1 {const1, $1}
-          xra a
-          mov {m}, a
-          inx hl
-          mov {m}, a
- #endif
  pat zrl
 -   uses hlreg={const2,$1}, areg
 +   uses hlreg={fp}, regpair={const2,$1}, areg
        gen
 -         dad lb
 +         dad %b
           xra a
           mov {m},a
           inx hl
@@@ -1252,15 -1261,28 +1299,28 @@@ leaving loc $1 loc $2 cal ".cfu" asp 4+
  /*****************************************/
  
  pat and $1==2
-    with regpair smallconst2
 -   with hl_or_de smallpconst2
++   with regpair smallpconst2
+       uses areg
+       gen
+          mov a, %1.2
+          ani {const1, %2.num & 0xff}
+       yields a
 -   with smallpconst2 hl_or_de
++   with smallpconst2 regpair
+       yields %1 %2
+       leaving
+          and 2
 -   with hl_or_de smallnconst2
++   with regpair smallnconst2
        uses areg
        gen
           mov a, %1.2
           ani {const1, %2.num & 0xff}
           mov %1.2, a
-          mvi %1.1, {const1, 0}
        yields %1
 -   with smallnconst2 hl_or_de
++   with smallnconst2 regpair
+       yields %1 %2
+       leaving
+          and 2
 -   with hl_or_de const2
 +   with regpair const2
        uses areg
        gen
           mov a, %1.2
           ani {const1, %2.num >> 8}
           mov %1.1, a
        yields %1
 -   with const2 hl_or_de
 +   with const2 regpair
-       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 regpair
-       uses areg
-       gen
-          mov a, %2.2
-          ani {const1, %1.num & 0xff}
-          mov %2.2, a
-          mvi %2.1, {const1, 0}
-       yields %2
+       yields %1 %2
+       leaving
+          and 2
 -   with hl_or_de hl_or_de
 +   with regpair regpair
        uses areg
        gen
           mov a, %1.2
@@@ -1329,7 -1337,23 +1375,23 @@@ pat ior $1==
           ori {const1, %2.num & 0xff}
           mov %1.2, a
        yields %1
 -   with smallpconst2 hl_or_de
++   with smallpconst2 regpair
+       yields %1 %2
+       leaving
+          ior 2
 -   with hl_or_de smallnconst2
++   with regpair smallnconst2
+       uses areg
+       gen
+          mov a, %1.2
+          ori {const1, %2.num & 0xff}
+          mov %1.2, a
+          move {const1, 0xff}, %1.1
+       yields %1
 -   with smallnconst2 hl_or_de
++   with smallnconst2 regpair
+       yields %1 %2
+       leaving
+          ior 2
 -   with hl_or_de const2
 +   with regpair const2
        uses areg
        gen
           mov a, %1.2
           ori {const1, %2.num >> 8}
           mov %1.1, a
        yields %1
 -   with const2 hl_or_de
 +   with const2 regpair
-       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 regpair
-       uses areg
-       gen
-          mov a, %2.2
-          ori {const1, %1.num & 0xff}
-          mov %2.2, a
-       yields %2
+       yields %1 %2
+       leaving
+          ior 2
 -   with hl_or_de hl_or_de
 +   with regpair regpair
        uses areg
        gen
           mov a, %1.2
@@@ -1395,7 -1406,11 +1444,11 @@@ pat xor $1==
           xri {const1, %2.num & 0xff}
           mov %1.2, a
        yields %1
 -   with smallpconst2 hl_or_de
++   with smallpconst2 regpair
+       yields %1 %2
+       leaving
+          xor 2
 -   with hl_or_de const2
 +   with regpair const2
        uses areg
        gen
           mov a, %1.2
           xri {const1, %2.num >> 8}
           mov %1.1, a
        yields %1
 -   with const2 hl_or_de
 +   with const2 regpair
-       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 regpair
-       uses areg
-       gen
-          mov a, %2.2
-          xri {const1, %1.num & 0xff}
-          mov %2.2, a
-       yields %2
+       yields %1 %2
+       leaving
+          xor 2
 -   with hl_or_de hl_or_de
 +   with regpair regpair
        uses areg
        gen
           mov a, %1.2
@@@ -1687,28 -1674,90 +1727,90 @@@ leaving cal ".cmf4" asp 8 lfr 
  pat cmf $1==8
  leaving cal ".cmf8" asp 16 lfr 2
  
- pat cmu $1==2
-    with regpair regpair
+ pat cmu zlt $1==2
 -   with hl_or_de hl_or_de STACK
++   with regpair regpair STACK
        uses areg
        gen
-          mov a,%2.1
-          cmp %1.1
-          jz {label,2f}
-          jc {label,1f}
-          0:
-          lxi %2,{const2,1}
-          jmp {label,3f}
-          1:
-          lxi %2,{const2,0-1}
-          jmp {label,3f}
-          2:
-          mov a,%2.2
-          cmp %1.2
-          jc {label,1b}
-          jnz {label,0b}
-          lxi %2,{const2,0}
-          3:
-       yields %2
+          mov a, %2.2
+          sub %1.2
+          mov a, %2.1
+          sbb %1.1
+          jc {label, $2}
 -   with const2 hl_or_de STACK
++   with const2 regpair STACK
+       uses areg
+       gen
+          mov a, %2.2
+          sbi {const1, %1.num & 0xff}
+          mov a, %2.1
+          sbi {const1, %1.num >> 8}
+          jc {label, $2}
 -   with hl_or_de const2 STACK
++   with regpair const2 STACK
+       uses areg
+       gen
+          mvi a, {const1, %2.num & 0xff}
+          sub %1.2
+          mvi a, {const1, %2.num >> 8}
+          sbb %1.1
+          jc {label, $2}
+ pat cmu zgt $1==2
+    leaving
+       exg 2
+       cmu 2
+       zlt $2
+ pat cmu zge $1==2
 -   with hl_or_de hl_or_de STACK
++   with regpair regpair STACK
+       uses areg
+       gen
+          mov a, %2.2
+          sub %1.2
+          mov a, %2.1
+          sbb %1.1
+          jnc {label, $2}
 -   with const2 hl_or_de STACK
++   with const2 regpair STACK
+       uses areg
+       gen
+          mov a, %2.2
+          sbi {const1, %1.num & 0xff}
+          mov a, %2.1
+          sbi {const1, %1.num >> 8}
+          jnc {label, $2}
 -   with hl_or_de const2 STACK
++   with regpair const2 STACK
+       uses areg
+       gen
+          mvi a, {const1, %2.num & 0xff}
+          sub %1.2
+          mvi a, {const1, %2.num >> 8}
+          sbb %1.1
+          jnc {label, $2}
+ pat cmu zle $1==2
+    leaving
+       exg 2
+       cmu 2
+       zge $2
+ pat cmu $1==2
 -with hl_or_de hl_or_de
++with regpair regpair
+ uses areg
+ gen mov a,%2.1
+     cmp %1.1
+     jz {label,2f}
+     jc {label,1f}
+     0:
+     lxi %2,{const2,1}
+     jmp {label,3f}
+     1:
+     lxi %2,{const2,0-1}
+     jmp {label,3f}
+     2:
+     mov a,%2.2
+     cmp %1.2
+     jc {label,1b}
+     jnz {label,0b}
+     lxi %2,{const2,0}
+     3:                                        yields %2
  
  pat cmu $1==4
  kills ALL
@@@ -2102,75 -2077,68 +2150,68 @@@ pat bn
           jnz {label,$1}
  
  pat zlt
- with STACK
- gen pop psw
-     ora a
-     jm {label,$1}
- with regpair STACK
- gen mov a,%1.1
-     ora a
-     jm {label,$1}
+    with STACK
+       gen
+          pop psw
+          ora a
+          jm {label,$1}
 -   with hl_or_de STACK
++   with regpair STACK
+       gen
+          mov a,%1.1
+          ora a
+          jm {label,$1}
  
  pat zle
- with regpair STACK
- uses areg
- gen xra a
-     add %1.1
-     jm {label,$1}
-     jnz {label,1f}
-     xra a
-     add %1.2
-     jz {label,$1}
-     1:
 -   with hl_or_de STACK
++   with regpair STACK
+       uses areg
+       gen
+          mov a, %1.1
+          ora a
+          jm {label, $1}
+          jnz {label, 1f}
+          ora %1.2
+          jz {label, $1}
+          1:
  
  pat zeq
- with regpair STACK
- uses areg
- gen mov a,%1.1
-     ora %1.2
-     jz {label,$1}
 -   with hl_or_de STACK
++   with regpair STACK
+       uses areg
+       gen
+          mov a,%1.1
+          ora %1.2
+          jz {label,$1}
  
  pat zne
- with regpair STACK
- uses areg
- gen mov a,%1.1
-     ora %1.2
-     jnz {label,$1}
 -   with hl_or_de STACK
++   with regpair STACK
+       uses areg
+       gen
+          mov a,%1.1
+          ora %1.2
+          jnz {label,$1}
  
  pat zge
- with STACK
- gen pop psw
-     ral.
-     jnc {label,$1}
- with regpair STACK
- gen mov a,%1.1
-     ora a
-     jp {label,$1}
+    with STACK
+       gen
+          pop psw
+          ral.
+          jnc {label,$1}
 -   with hl_or_de STACK
++   with regpair STACK
+       gen
+          mov a,%1.1
+          ora a
+          jp {label,$1}
  
  pat zgt
- with regpair STACK
- uses areg
- gen xra a
-     add %1.1
-     jm {label,1f}
-     jnz {label,$1}
-     xra a
-     add %1.2
-     jnz {label,$1}
-     1:
- #ifdef USE_I80_RSTS
-    pat lol zeq sfit($1, 8)
-       with STACK
-          uses hlreg, dereg, areg
-          gen
-             rst {const1, 3}
-             data1 {const1, $1}
-             mov a, {m}
-             inx hl
-             ora {m}
-             jz {label, $2}
- #endif
 -   with hl_or_de STACK
++   with regpair STACK
+       uses areg
+       gen
+          mov a, %1.1
+          ora a
+          jm {label, 1f}
+          jnz {label, $1}
+          ora %1.2
+          jnz {label, $1}
+          1:
  
  pat lol zeq
     with STACK
           ora {m}
           jz {label,$2}
  
- #ifdef USE_I80_RSTS
-    pat lol zne sfit($1, 8)
-       with STACK
-          uses hlreg, dereg, areg
-          gen
-             rst {const1, 3}
-             data1 {const1, $1}
-             mov a, {m}
-             inx hl
-             ora {m}
-             jnz {label, $2}
- #endif
  pat lol zne
     with STACK
 -      uses hlreg={const2,$1}, areg
 -      gen
 -         dad lb
 -         mov a,{m}
 -         inx hl
 -         ora {m}
 -         jnz {label,$2}
 +   uses hlreg={fp}, regpair={const2,$1}, areg
 +   gen
 +      dad %b
 +      mov a,{m}
 +      inx hl
 +      ora {m}
 +      jnz {label,$2}
  
  pat ior zeq $1==2
 -   with hl_or_de hl_or_de STACK
 +   with regpair regpair STACK
        uses areg
        gen
           mov a,%1.1
@@@ -2284,12 -2236,22 +2312,22 @@@ pat ret $1<=
  /* Group 15: Miscellaneous              */
  /******************************************/
  
- pat asp ($1<=0-12) || ($1>=12)
+ pat asp $1==0 /* do nothing */
+ pat asp ($1==2)
 -   with hl_or_de
++   with regpair
     with STACK
-       uses hlreg={const2,$1}
 -      uses hlreg
++      uses regpair
        gen
-          dad sp
-          sphl.
 -         pop hl
++         pop %a
+ pat asp ($1==4)
 -   with hl_or_de hl_or_de
++   with regpair regpair
+    with STACK
 -      uses hlreg
++      uses regpair
+       gen
 -         pop hl
 -         pop hl
++         pop %a
++         pop %a
  
  pat asp ($1<0) && ($1>0-12)
     with STACK
        leaving
           asp $1+2
  
- pat asp $1==0 /* do nothing */
- pat asp ($1>0) && ($1<12)
+ pat asp ($1>4) && ($1<12)
     with STACK
 -      uses hlreg
 +      uses regpair
        gen
 -         pop hl
 +         pop %a
        leaving
           asp $1-2