From 66fdfb08a9a603cd99ad1b2146d43b30b73f693e Mon Sep 17 00:00:00 2001
From: jespergravgaard <jesper@balmangravgaard.dk>
Date: Sat, 30 Dec 2017 14:18:57 +0100
Subject: [PATCH] Improved ZP detection

---
 .../camelot64/kickc/fragment/AsmFragment.java |  11 +-
 .../kickc/test/ref/bitmap-bresenham.log       |  92 ++++----
 .../kickc/test/ref/bitmap-plotter.log         |  20 +-
 .../dk/camelot64/kickc/test/ref/bresenham.log |  10 +-
 .../camelot64/kickc/test/ref/bresenhamarr.log |   8 +-
 .../kickc/test/ref/callconstparam.log         |  10 +-
 .../dk/camelot64/kickc/test/ref/casting.log   |   8 +-
 .../dk/camelot64/kickc/test/ref/chargen.log   |  10 +-
 .../dk/camelot64/kickc/test/ref/constants.log |  24 +--
 .../camelot64/kickc/test/ref/flipper-rex2.log |  18 +-
 .../dk/camelot64/kickc/test/ref/halfscii.log  |  64 +++---
 .../dk/camelot64/kickc/test/ref/immzero.log   |   6 +-
 .../kickc/test/ref/incrementinarray.log       |  12 +-
 .../kickc/test/ref/inline-string.log          |   8 +-
 .../camelot64/kickc/test/ref/inline-word.log  |   8 +-
 .../camelot64/kickc/test/ref/inmemstring.log  |   6 +-
 .../kickc/test/ref/liverange-call-problem.log |  10 +-
 .../dk/camelot64/kickc/test/ref/loopmin.log   |   6 +-
 .../dk/camelot64/kickc/test/ref/printmsg.log  |  10 +-
 .../camelot64/kickc/test/ref/ptr-complex.log  |   6 +-
 .../dk/camelot64/kickc/test/ref/ptrtest.log   |  14 +-
 .../kickc/test/ref/scroll-clobber.log         |   6 +-
 .../dk/camelot64/kickc/test/ref/scroll.log    |   8 +-
 .../dk/camelot64/kickc/test/ref/scrollbig.log |  18 +-
 .../camelot64/kickc/test/ref/signed-words.log |  10 +-
 .../camelot64/kickc/test/ref/sinus-basic.log  |  34 +--
 .../kickc/test/ref/sinus-sprites.log          |  82 ++++----
 .../dk/camelot64/kickc/test/ref/summin.log    |  12 +-
 .../kickc/test/ref/test-multiply.asm          |  25 +--
 .../kickc/test/ref/test-multiply.log          | 196 +++++++++---------
 .../kickc/test/ref/test-multiply.sym          |  19 +-
 .../dk/camelot64/kickc/test/ref/voronoi.log   |  32 +--
 .../dk/camelot64/kickc/test/ref/wordexpr.log  |   6 +-
 .../camelot64/kickc/test/ref/zpparammin.log   |  12 +-
 .../dk/camelot64/kickc/test/ref/zpptr.log     |  10 +-
 35 files changed, 413 insertions(+), 418 deletions(-)

diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragment.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragment.java
index 13c66f38a..85d974870 100644
--- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragment.java
+++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragment.java
@@ -411,15 +411,20 @@ public class AsmFragment {
       @Override
       public AsmParameter visitAsmExprUnary(KickCParser.AsmExprUnaryContext ctx) {
          AsmParameter sub = (AsmParameter) this.visit(ctx.asmExpr());
-         String param = ctx.getChild(0).getText() + sub.getParam();
-         return new AsmParameter(param, sub.isZp());
+         String operator = ctx.getChild(0).getText();
+         String param = operator + sub.getParam();
+         boolean isZp = sub.isZp();
+         if(operator.equals("<") || operator.equals(">")) {
+            isZp = true;
+         }
+         return new AsmParameter(param, isZp);
       }
 
       @Override
       public AsmParameter visitAsmExprInt(KickCParser.AsmExprIntContext ctx) {
          Number number = NumberParser.parseLiteral(ctx.NUMBER().getText());
          ConstantInteger intVal = new ConstantInteger(number.intValue());
-         boolean isZp = SymbolType.BYTE.equals(intVal.getType());
+         boolean isZp = SymbolType.isByte(intVal.getType()) || SymbolType.isSByte(intVal.getType()) ;
          String param = getAsmNumber(number);
          return new AsmParameter(param, isZp);
       }
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log
index caf4123ff..37400a590 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log
@@ -5552,89 +5552,89 @@ Uplift Scope [line] 6.25: zp ZP_BYTE:41 [ line::y1#0 ] 5.95: zp ZP_BYTE:40 [ lin
 Uplift Scope [main] 
 Uplift Scope [] 
 
-Uplifting [lines] best 15270 combination zp ZP_BYTE:2 [ lines::l#2 lines::l#1 ] 
+Uplifting [lines] best 15163 combination zp ZP_BYTE:2 [ lines::l#2 lines::l#1 ] 
 Uplift attempts [init_plot_tables] 10000/138240 (limiting to 10000)
-Uplifting [init_plot_tables] best 14640 combination zp ZP_WORD:32 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 ] reg byte y [ init_plot_tables::bits#3 init_plot_tables::bits#4 init_plot_tables::bits#1 ] reg byte x [ init_plot_tables::x#2 init_plot_tables::x#1 ] reg byte x [ init_plot_tables::y#2 init_plot_tables::y#1 ] reg byte a [ init_plot_tables::$0 ] reg byte a [ init_plot_tables::$7 ] reg byte a [ init_plot_tables::$8 ] reg byte a [ init_plot_tables::$9 ] zp ZP_BYTE:66 [ init_plot_tables::$10 ] zp ZP_BYTE:62 [ init_plot_tables::$6 ] 
+Uplifting [init_plot_tables] best 14533 combination zp ZP_WORD:32 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 ] reg byte y [ init_plot_tables::bits#3 init_plot_tables::bits#4 init_plot_tables::bits#1 ] reg byte x [ init_plot_tables::x#2 init_plot_tables::x#1 ] reg byte x [ init_plot_tables::y#2 init_plot_tables::y#1 ] reg byte a [ init_plot_tables::$0 ] reg byte a [ init_plot_tables::$7 ] reg byte a [ init_plot_tables::$8 ] reg byte a [ init_plot_tables::$9 ] zp ZP_BYTE:66 [ init_plot_tables::$10 ] zp ZP_BYTE:62 [ init_plot_tables::$6 ] 
 Limited combination testing to 10000 combinations of 138240 possible.
-Uplifting [plot] best 14385 combination reg byte y [ plot::y#4 plot::y#1 plot::y#0 plot::y#3 plot::y#2 ] reg byte x [ plot::x#4 plot::x#1 plot::x#0 plot::x#3 plot::x#2 ] zp ZP_WORD:51 [ plot::plotter_y#0 ] zp ZP_WORD:53 [ plot::$0 ] reg byte a [ plot::$1 ] zp ZP_WORD:55 [ plot::plotter#0 ] zp ZP_WORD:49 [ plot::plotter_x#0 ] 
-Uplifting [line_xdyi] best 14289 combination zp ZP_BYTE:16 [ line_xdyi::e#3 line_xdyi::e#0 line_xdyi::e#6 line_xdyi::e#2 line_xdyi::e#1 ] zp ZP_BYTE:15 [ line_xdyi::y#3 line_xdyi::y#5 line_xdyi::y#0 line_xdyi::y#1 line_xdyi::y#6 line_xdyi::y#2 ] zp ZP_BYTE:58 [ line_xdyi::$8 ] reg byte x [ line_xdyi::x#3 line_xdyi::x#6 line_xdyi::x#0 line_xdyi::x#1 line_xdyi::x#2 ] zp ZP_BYTE:11 [ line_xdyi::yd#2 line_xdyi::yd#0 line_xdyi::yd#1 ] zp ZP_BYTE:12 [ line_xdyi::xd#5 line_xdyi::xd#0 line_xdyi::xd#1 ] zp ZP_BYTE:13 [ line_xdyi::x1#6 line_xdyi::x1#0 line_xdyi::x1#1 ] 
-Uplifting [line_xdyd] best 14193 combination zp ZP_BYTE:28 [ line_xdyd::e#3 line_xdyd::e#0 line_xdyd::e#6 line_xdyd::e#2 line_xdyd::e#1 ] zp ZP_BYTE:27 [ line_xdyd::y#3 line_xdyd::y#5 line_xdyd::y#0 line_xdyd::y#1 line_xdyd::y#6 line_xdyd::y#2 ] zp ZP_BYTE:60 [ line_xdyd::$8 ] reg byte x [ line_xdyd::x#3 line_xdyd::x#6 line_xdyd::x#0 line_xdyd::x#1 line_xdyd::x#2 ] zp ZP_BYTE:23 [ line_xdyd::yd#2 line_xdyd::yd#0 line_xdyd::yd#1 ] zp ZP_BYTE:24 [ line_xdyd::xd#5 line_xdyd::xd#0 line_xdyd::xd#1 ] zp ZP_BYTE:25 [ line_xdyd::x1#6 line_xdyd::x1#0 line_xdyd::x1#1 ] 
-Uplifting [line_ydxi] best 14067 combination zp ZP_BYTE:8 [ line_ydxi::e#3 line_ydxi::e#0 line_ydxi::e#6 line_ydxi::e#2 line_ydxi::e#1 ] reg byte x [ line_ydxi::x#3 line_ydxi::x#5 line_ydxi::x#1 line_ydxi::x#0 line_ydxi::x#6 line_ydxi::x#2 ] reg byte a [ line_ydxi::$8 ] zp ZP_BYTE:7 [ line_ydxi::y#3 line_ydxi::y#6 line_ydxi::y#1 line_ydxi::y#0 line_ydxi::y#2 ] zp ZP_BYTE:3 [ line_ydxi::xd#2 line_ydxi::xd#1 line_ydxi::xd#0 ] zp ZP_BYTE:4 [ line_ydxi::yd#5 line_ydxi::yd#1 line_ydxi::yd#0 ] zp ZP_BYTE:5 [ line_ydxi::y1#6 line_ydxi::y1#1 line_ydxi::y1#0 ] 
-Uplifting [line_ydxd] best 13941 combination zp ZP_BYTE:22 [ line_ydxd::e#3 line_ydxd::e#0 line_ydxd::e#6 line_ydxd::e#2 line_ydxd::e#1 ] reg byte x [ line_ydxd::x#3 line_ydxd::x#5 line_ydxd::x#1 line_ydxd::x#0 line_ydxd::x#6 line_ydxd::x#2 ] reg byte a [ line_ydxd::$8 ] zp ZP_BYTE:21 [ line_ydxd::y#3 line_ydxd::y#6 line_ydxd::y#1 line_ydxd::y#0 line_ydxd::y#2 ] zp ZP_BYTE:17 [ line_ydxd::xd#2 line_ydxd::xd#1 line_ydxd::xd#0 ] zp ZP_BYTE:18 [ line_ydxd::yd#5 line_ydxd::yd#1 line_ydxd::yd#0 ] zp ZP_BYTE:19 [ line_ydxd::y1#6 line_ydxd::y1#1 line_ydxd::y1#0 ] 
-Uplifting [init_screen] best 13941 combination zp ZP_WORD:34 [ init_screen::b#2 init_screen::b#1 ] zp ZP_WORD:36 [ init_screen::c#2 init_screen::c#1 ] 
+Uplifting [plot] best 14278 combination reg byte y [ plot::y#4 plot::y#1 plot::y#0 plot::y#3 plot::y#2 ] reg byte x [ plot::x#4 plot::x#1 plot::x#0 plot::x#3 plot::x#2 ] zp ZP_WORD:51 [ plot::plotter_y#0 ] zp ZP_WORD:53 [ plot::$0 ] reg byte a [ plot::$1 ] zp ZP_WORD:55 [ plot::plotter#0 ] zp ZP_WORD:49 [ plot::plotter_x#0 ] 
+Uplifting [line_xdyi] best 14182 combination zp ZP_BYTE:16 [ line_xdyi::e#3 line_xdyi::e#0 line_xdyi::e#6 line_xdyi::e#2 line_xdyi::e#1 ] zp ZP_BYTE:15 [ line_xdyi::y#3 line_xdyi::y#5 line_xdyi::y#0 line_xdyi::y#1 line_xdyi::y#6 line_xdyi::y#2 ] zp ZP_BYTE:58 [ line_xdyi::$8 ] reg byte x [ line_xdyi::x#3 line_xdyi::x#6 line_xdyi::x#0 line_xdyi::x#1 line_xdyi::x#2 ] zp ZP_BYTE:11 [ line_xdyi::yd#2 line_xdyi::yd#0 line_xdyi::yd#1 ] zp ZP_BYTE:12 [ line_xdyi::xd#5 line_xdyi::xd#0 line_xdyi::xd#1 ] zp ZP_BYTE:13 [ line_xdyi::x1#6 line_xdyi::x1#0 line_xdyi::x1#1 ] 
+Uplifting [line_xdyd] best 14086 combination zp ZP_BYTE:28 [ line_xdyd::e#3 line_xdyd::e#0 line_xdyd::e#6 line_xdyd::e#2 line_xdyd::e#1 ] zp ZP_BYTE:27 [ line_xdyd::y#3 line_xdyd::y#5 line_xdyd::y#0 line_xdyd::y#1 line_xdyd::y#6 line_xdyd::y#2 ] zp ZP_BYTE:60 [ line_xdyd::$8 ] reg byte x [ line_xdyd::x#3 line_xdyd::x#6 line_xdyd::x#0 line_xdyd::x#1 line_xdyd::x#2 ] zp ZP_BYTE:23 [ line_xdyd::yd#2 line_xdyd::yd#0 line_xdyd::yd#1 ] zp ZP_BYTE:24 [ line_xdyd::xd#5 line_xdyd::xd#0 line_xdyd::xd#1 ] zp ZP_BYTE:25 [ line_xdyd::x1#6 line_xdyd::x1#0 line_xdyd::x1#1 ] 
+Uplifting [line_ydxi] best 13960 combination zp ZP_BYTE:8 [ line_ydxi::e#3 line_ydxi::e#0 line_ydxi::e#6 line_ydxi::e#2 line_ydxi::e#1 ] reg byte x [ line_ydxi::x#3 line_ydxi::x#5 line_ydxi::x#1 line_ydxi::x#0 line_ydxi::x#6 line_ydxi::x#2 ] reg byte a [ line_ydxi::$8 ] zp ZP_BYTE:7 [ line_ydxi::y#3 line_ydxi::y#6 line_ydxi::y#1 line_ydxi::y#0 line_ydxi::y#2 ] zp ZP_BYTE:3 [ line_ydxi::xd#2 line_ydxi::xd#1 line_ydxi::xd#0 ] zp ZP_BYTE:4 [ line_ydxi::yd#5 line_ydxi::yd#1 line_ydxi::yd#0 ] zp ZP_BYTE:5 [ line_ydxi::y1#6 line_ydxi::y1#1 line_ydxi::y1#0 ] 
+Uplifting [line_ydxd] best 13834 combination zp ZP_BYTE:22 [ line_ydxd::e#3 line_ydxd::e#0 line_ydxd::e#6 line_ydxd::e#2 line_ydxd::e#1 ] reg byte x [ line_ydxd::x#3 line_ydxd::x#5 line_ydxd::x#1 line_ydxd::x#0 line_ydxd::x#6 line_ydxd::x#2 ] reg byte a [ line_ydxd::$8 ] zp ZP_BYTE:21 [ line_ydxd::y#3 line_ydxd::y#6 line_ydxd::y#1 line_ydxd::y#0 line_ydxd::y#2 ] zp ZP_BYTE:17 [ line_ydxd::xd#2 line_ydxd::xd#1 line_ydxd::xd#0 ] zp ZP_BYTE:18 [ line_ydxd::yd#5 line_ydxd::yd#1 line_ydxd::yd#0 ] zp ZP_BYTE:19 [ line_ydxd::y1#6 line_ydxd::y1#1 line_ydxd::y1#0 ] 
+Uplifting [init_screen] best 13834 combination zp ZP_WORD:34 [ init_screen::b#2 init_screen::b#1 ] zp ZP_WORD:36 [ init_screen::c#2 init_screen::c#1 ] 
 Uplift attempts [line] 10000/186624 (limiting to 10000)
-Uplifting [line] best 13825 combination zp ZP_BYTE:41 [ line::y1#0 ] reg byte y [ line::y0#0 ] zp ZP_BYTE:39 [ line::x1#0 ] zp ZP_BYTE:38 [ line::x0#0 ] zp ZP_BYTE:43 [ line::yd#1 ] zp ZP_BYTE:44 [ line::yd#0 ] zp ZP_BYTE:46 [ line::yd#3 ] zp ZP_BYTE:47 [ line::yd#10 ] zp ZP_BYTE:42 [ line::xd#1 ] zp ZP_BYTE:45 [ line::xd#0 ] 
+Uplifting [line] best 13714 combination zp ZP_BYTE:41 [ line::y1#0 ] reg byte y [ line::y0#0 ] zp ZP_BYTE:39 [ line::x1#0 ] zp ZP_BYTE:38 [ line::x0#0 ] zp ZP_BYTE:43 [ line::yd#1 ] zp ZP_BYTE:44 [ line::yd#0 ] zp ZP_BYTE:46 [ line::yd#3 ] zp ZP_BYTE:47 [ line::yd#10 ] zp ZP_BYTE:42 [ line::xd#1 ] zp ZP_BYTE:45 [ line::xd#0 ] 
 Limited combination testing to 10000 combinations of 186624 possible.
-Uplifting [main] best 13825 combination 
-Uplifting [] best 13825 combination 
+Uplifting [main] best 13714 combination 
+Uplifting [] best 13714 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ lines::l#2 lines::l#1 ]
-Uplifting [lines] best 13825 combination zp ZP_BYTE:2 [ lines::l#2 lines::l#1 ] 
+Uplifting [lines] best 13714 combination zp ZP_BYTE:2 [ lines::l#2 lines::l#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:8 [ line_ydxi::e#3 line_ydxi::e#0 line_ydxi::e#6 line_ydxi::e#2 line_ydxi::e#1 ]
-Uplifting [line_ydxi] best 13825 combination zp ZP_BYTE:8 [ line_ydxi::e#3 line_ydxi::e#0 line_ydxi::e#6 line_ydxi::e#2 line_ydxi::e#1 ] 
+Uplifting [line_ydxi] best 13714 combination zp ZP_BYTE:8 [ line_ydxi::e#3 line_ydxi::e#0 line_ydxi::e#6 line_ydxi::e#2 line_ydxi::e#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:16 [ line_xdyi::e#3 line_xdyi::e#0 line_xdyi::e#6 line_xdyi::e#2 line_xdyi::e#1 ]
-Uplifting [line_xdyi] best 13825 combination zp ZP_BYTE:16 [ line_xdyi::e#3 line_xdyi::e#0 line_xdyi::e#6 line_xdyi::e#2 line_xdyi::e#1 ] 
+Uplifting [line_xdyi] best 13714 combination zp ZP_BYTE:16 [ line_xdyi::e#3 line_xdyi::e#0 line_xdyi::e#6 line_xdyi::e#2 line_xdyi::e#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:22 [ line_ydxd::e#3 line_ydxd::e#0 line_ydxd::e#6 line_ydxd::e#2 line_ydxd::e#1 ]
-Uplifting [line_ydxd] best 13825 combination zp ZP_BYTE:22 [ line_ydxd::e#3 line_ydxd::e#0 line_ydxd::e#6 line_ydxd::e#2 line_ydxd::e#1 ] 
+Uplifting [line_ydxd] best 13714 combination zp ZP_BYTE:22 [ line_ydxd::e#3 line_ydxd::e#0 line_ydxd::e#6 line_ydxd::e#2 line_ydxd::e#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:28 [ line_xdyd::e#3 line_xdyd::e#0 line_xdyd::e#6 line_xdyd::e#2 line_xdyd::e#1 ]
-Uplifting [line_xdyd] best 13825 combination zp ZP_BYTE:28 [ line_xdyd::e#3 line_xdyd::e#0 line_xdyd::e#6 line_xdyd::e#2 line_xdyd::e#1 ] 
+Uplifting [line_xdyd] best 13714 combination zp ZP_BYTE:28 [ line_xdyd::e#3 line_xdyd::e#0 line_xdyd::e#6 line_xdyd::e#2 line_xdyd::e#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:15 [ line_xdyi::y#3 line_xdyi::y#5 line_xdyi::y#0 line_xdyi::y#1 line_xdyi::y#6 line_xdyi::y#2 ]
-Uplifting [line_xdyi] best 13825 combination zp ZP_BYTE:15 [ line_xdyi::y#3 line_xdyi::y#5 line_xdyi::y#0 line_xdyi::y#1 line_xdyi::y#6 line_xdyi::y#2 ] 
+Uplifting [line_xdyi] best 13714 combination zp ZP_BYTE:15 [ line_xdyi::y#3 line_xdyi::y#5 line_xdyi::y#0 line_xdyi::y#1 line_xdyi::y#6 line_xdyi::y#2 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:27 [ line_xdyd::y#3 line_xdyd::y#5 line_xdyd::y#0 line_xdyd::y#1 line_xdyd::y#6 line_xdyd::y#2 ]
-Uplifting [line_xdyd] best 13825 combination zp ZP_BYTE:27 [ line_xdyd::y#3 line_xdyd::y#5 line_xdyd::y#0 line_xdyd::y#1 line_xdyd::y#6 line_xdyd::y#2 ] 
+Uplifting [line_xdyd] best 13714 combination zp ZP_BYTE:27 [ line_xdyd::y#3 line_xdyd::y#5 line_xdyd::y#0 line_xdyd::y#1 line_xdyd::y#6 line_xdyd::y#2 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:58 [ line_xdyi::$8 ]
-Uplifting [line_xdyi] best 13825 combination zp ZP_BYTE:58 [ line_xdyi::$8 ] 
+Uplifting [line_xdyi] best 13714 combination zp ZP_BYTE:58 [ line_xdyi::$8 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:60 [ line_xdyd::$8 ]
-Uplifting [line_xdyd] best 13825 combination zp ZP_BYTE:60 [ line_xdyd::$8 ] 
+Uplifting [line_xdyd] best 13714 combination zp ZP_BYTE:60 [ line_xdyd::$8 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:66 [ init_plot_tables::$10 ]
-Uplifting [init_plot_tables] best 13765 combination reg byte a [ init_plot_tables::$10 ] 
+Uplifting [init_plot_tables] best 13654 combination reg byte a [ init_plot_tables::$10 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:7 [ line_ydxi::y#3 line_ydxi::y#6 line_ydxi::y#1 line_ydxi::y#0 line_ydxi::y#2 ]
-Uplifting [line_ydxi] best 13765 combination zp ZP_BYTE:7 [ line_ydxi::y#3 line_ydxi::y#6 line_ydxi::y#1 line_ydxi::y#0 line_ydxi::y#2 ] 
+Uplifting [line_ydxi] best 13654 combination zp ZP_BYTE:7 [ line_ydxi::y#3 line_ydxi::y#6 line_ydxi::y#1 line_ydxi::y#0 line_ydxi::y#2 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:21 [ line_ydxd::y#3 line_ydxd::y#6 line_ydxd::y#1 line_ydxd::y#0 line_ydxd::y#2 ]
-Uplifting [line_ydxd] best 13765 combination zp ZP_BYTE:21 [ line_ydxd::y#3 line_ydxd::y#6 line_ydxd::y#1 line_ydxd::y#0 line_ydxd::y#2 ] 
+Uplifting [line_ydxd] best 13654 combination zp ZP_BYTE:21 [ line_ydxd::y#3 line_ydxd::y#6 line_ydxd::y#1 line_ydxd::y#0 line_ydxd::y#2 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:62 [ init_plot_tables::$6 ]
-Uplifting [init_plot_tables] best 13765 combination zp ZP_BYTE:62 [ init_plot_tables::$6 ] 
+Uplifting [init_plot_tables] best 13654 combination zp ZP_BYTE:62 [ init_plot_tables::$6 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:3 [ line_ydxi::xd#2 line_ydxi::xd#1 line_ydxi::xd#0 ]
-Uplifting [line_ydxi] best 13765 combination zp ZP_BYTE:3 [ line_ydxi::xd#2 line_ydxi::xd#1 line_ydxi::xd#0 ] 
+Uplifting [line_ydxi] best 13654 combination zp ZP_BYTE:3 [ line_ydxi::xd#2 line_ydxi::xd#1 line_ydxi::xd#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:11 [ line_xdyi::yd#2 line_xdyi::yd#0 line_xdyi::yd#1 ]
-Uplifting [line_xdyi] best 13765 combination zp ZP_BYTE:11 [ line_xdyi::yd#2 line_xdyi::yd#0 line_xdyi::yd#1 ] 
+Uplifting [line_xdyi] best 13654 combination zp ZP_BYTE:11 [ line_xdyi::yd#2 line_xdyi::yd#0 line_xdyi::yd#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:17 [ line_ydxd::xd#2 line_ydxd::xd#1 line_ydxd::xd#0 ]
-Uplifting [line_ydxd] best 13765 combination zp ZP_BYTE:17 [ line_ydxd::xd#2 line_ydxd::xd#1 line_ydxd::xd#0 ] 
+Uplifting [line_ydxd] best 13654 combination zp ZP_BYTE:17 [ line_ydxd::xd#2 line_ydxd::xd#1 line_ydxd::xd#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:23 [ line_xdyd::yd#2 line_xdyd::yd#0 line_xdyd::yd#1 ]
-Uplifting [line_xdyd] best 13765 combination zp ZP_BYTE:23 [ line_xdyd::yd#2 line_xdyd::yd#0 line_xdyd::yd#1 ] 
+Uplifting [line_xdyd] best 13654 combination zp ZP_BYTE:23 [ line_xdyd::yd#2 line_xdyd::yd#0 line_xdyd::yd#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:41 [ line::y1#0 ]
-Uplifting [line] best 13765 combination zp ZP_BYTE:41 [ line::y1#0 ] 
+Uplifting [line] best 13654 combination zp ZP_BYTE:41 [ line::y1#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:4 [ line_ydxi::yd#5 line_ydxi::yd#1 line_ydxi::yd#0 ]
-Uplifting [line_ydxi] best 13765 combination zp ZP_BYTE:4 [ line_ydxi::yd#5 line_ydxi::yd#1 line_ydxi::yd#0 ] 
+Uplifting [line_ydxi] best 13654 combination zp ZP_BYTE:4 [ line_ydxi::yd#5 line_ydxi::yd#1 line_ydxi::yd#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:12 [ line_xdyi::xd#5 line_xdyi::xd#0 line_xdyi::xd#1 ]
-Uplifting [line_xdyi] best 13765 combination zp ZP_BYTE:12 [ line_xdyi::xd#5 line_xdyi::xd#0 line_xdyi::xd#1 ] 
+Uplifting [line_xdyi] best 13654 combination zp ZP_BYTE:12 [ line_xdyi::xd#5 line_xdyi::xd#0 line_xdyi::xd#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:18 [ line_ydxd::yd#5 line_ydxd::yd#1 line_ydxd::yd#0 ]
-Uplifting [line_ydxd] best 13765 combination zp ZP_BYTE:18 [ line_ydxd::yd#5 line_ydxd::yd#1 line_ydxd::yd#0 ] 
+Uplifting [line_ydxd] best 13654 combination zp ZP_BYTE:18 [ line_ydxd::yd#5 line_ydxd::yd#1 line_ydxd::yd#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:24 [ line_xdyd::xd#5 line_xdyd::xd#0 line_xdyd::xd#1 ]
-Uplifting [line_xdyd] best 13765 combination zp ZP_BYTE:24 [ line_xdyd::xd#5 line_xdyd::xd#0 line_xdyd::xd#1 ] 
+Uplifting [line_xdyd] best 13654 combination zp ZP_BYTE:24 [ line_xdyd::xd#5 line_xdyd::xd#0 line_xdyd::xd#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:39 [ line::x1#0 ]
-Uplifting [line] best 13765 combination zp ZP_BYTE:39 [ line::x1#0 ] 
+Uplifting [line] best 13654 combination zp ZP_BYTE:39 [ line::x1#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:38 [ line::x0#0 ]
-Uplifting [line] best 13765 combination zp ZP_BYTE:38 [ line::x0#0 ] 
+Uplifting [line] best 13654 combination zp ZP_BYTE:38 [ line::x0#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:5 [ line_ydxi::y1#6 line_ydxi::y1#1 line_ydxi::y1#0 ]
-Uplifting [line_ydxi] best 13765 combination zp ZP_BYTE:5 [ line_ydxi::y1#6 line_ydxi::y1#1 line_ydxi::y1#0 ] 
+Uplifting [line_ydxi] best 13654 combination zp ZP_BYTE:5 [ line_ydxi::y1#6 line_ydxi::y1#1 line_ydxi::y1#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:13 [ line_xdyi::x1#6 line_xdyi::x1#0 line_xdyi::x1#1 ]
-Uplifting [line_xdyi] best 13765 combination zp ZP_BYTE:13 [ line_xdyi::x1#6 line_xdyi::x1#0 line_xdyi::x1#1 ] 
+Uplifting [line_xdyi] best 13654 combination zp ZP_BYTE:13 [ line_xdyi::x1#6 line_xdyi::x1#0 line_xdyi::x1#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:19 [ line_ydxd::y1#6 line_ydxd::y1#1 line_ydxd::y1#0 ]
-Uplifting [line_ydxd] best 13765 combination zp ZP_BYTE:19 [ line_ydxd::y1#6 line_ydxd::y1#1 line_ydxd::y1#0 ] 
+Uplifting [line_ydxd] best 13654 combination zp ZP_BYTE:19 [ line_ydxd::y1#6 line_ydxd::y1#1 line_ydxd::y1#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:25 [ line_xdyd::x1#6 line_xdyd::x1#0 line_xdyd::x1#1 ]
-Uplifting [line_xdyd] best 13765 combination zp ZP_BYTE:25 [ line_xdyd::x1#6 line_xdyd::x1#0 line_xdyd::x1#1 ] 
+Uplifting [line_xdyd] best 13654 combination zp ZP_BYTE:25 [ line_xdyd::x1#6 line_xdyd::x1#0 line_xdyd::x1#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:43 [ line::yd#1 ]
-Uplifting [line] best 13765 combination zp ZP_BYTE:43 [ line::yd#1 ] 
+Uplifting [line] best 13654 combination zp ZP_BYTE:43 [ line::yd#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:44 [ line::yd#0 ]
-Uplifting [line] best 13765 combination zp ZP_BYTE:44 [ line::yd#0 ] 
+Uplifting [line] best 13654 combination zp ZP_BYTE:44 [ line::yd#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:46 [ line::yd#3 ]
-Uplifting [line] best 13765 combination zp ZP_BYTE:46 [ line::yd#3 ] 
+Uplifting [line] best 13654 combination zp ZP_BYTE:46 [ line::yd#3 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:47 [ line::yd#10 ]
-Uplifting [line] best 13765 combination zp ZP_BYTE:47 [ line::yd#10 ] 
+Uplifting [line] best 13654 combination zp ZP_BYTE:47 [ line::yd#10 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:42 [ line::xd#1 ]
-Uplifting [line] best 13765 combination zp ZP_BYTE:42 [ line::xd#1 ] 
+Uplifting [line] best 13654 combination zp ZP_BYTE:42 [ line::xd#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:45 [ line::xd#0 ]
-Uplifting [line] best 13765 combination zp ZP_BYTE:45 [ line::xd#0 ] 
+Uplifting [line] best 13654 combination zp ZP_BYTE:45 [ line::xd#0 ] 
 Coalescing zero page register [ zp ZP_BYTE:2 [ lines::l#2 lines::l#1 ] ] with [ zp ZP_BYTE:62 [ init_plot_tables::$6 ] ]
 Coalescing zero page register [ zp ZP_BYTE:3 [ line_ydxi::xd#2 line_ydxi::xd#1 line_ydxi::xd#0 ] ] with [ zp ZP_BYTE:11 [ line_xdyi::yd#2 line_xdyi::yd#0 line_xdyi::yd#1 ] ]
 Coalescing zero page register [ zp ZP_BYTE:3 [ line_ydxi::xd#2 line_ydxi::xd#1 line_ydxi::xd#0 line_xdyi::yd#2 line_xdyi::yd#0 line_xdyi::yd#1 ] ] with [ zp ZP_BYTE:17 [ line_ydxd::xd#2 line_ydxd::xd#1 line_ydxd::xd#0 ] ]
@@ -7135,7 +7135,7 @@ reg byte a [ init_plot_tables::$10 ]
 
 
 FINAL ASSEMBLER
-Score: 10556
+Score: 10447
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log
index e4a4b4300..17efd2138 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log
@@ -2254,20 +2254,20 @@ Uplift Scope [plot] 15: zp ZP_BYTE:13 [ plot::y#0 ] 9.73: zp ZP_BYTE:12 [ plot::
 Uplift Scope [main] 
 Uplift Scope [] 
 
-Uplifting [plots] best 10580 combination zp ZP_BYTE:2 [ plots::i#2 plots::i#1 ] 
+Uplifting [plots] best 10471 combination zp ZP_BYTE:2 [ plots::i#2 plots::i#1 ] 
 Uplift attempts [init_plot_tables] 10000/138240 (limiting to 10000)
-Uplifting [init_plot_tables] best 9950 combination zp ZP_WORD:6 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 ] reg byte y [ init_plot_tables::bits#3 init_plot_tables::bits#4 init_plot_tables::bits#1 ] reg byte x [ init_plot_tables::x#2 init_plot_tables::x#1 ] reg byte x [ init_plot_tables::y#2 init_plot_tables::y#1 ] reg byte a [ init_plot_tables::$0 ] reg byte a [ init_plot_tables::$7 ] reg byte a [ init_plot_tables::$8 ] reg byte a [ init_plot_tables::$9 ] zp ZP_BYTE:34 [ init_plot_tables::$10 ] zp ZP_BYTE:30 [ init_plot_tables::$6 ] 
+Uplifting [init_plot_tables] best 9841 combination zp ZP_WORD:6 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 ] reg byte y [ init_plot_tables::bits#3 init_plot_tables::bits#4 init_plot_tables::bits#1 ] reg byte x [ init_plot_tables::x#2 init_plot_tables::x#1 ] reg byte x [ init_plot_tables::y#2 init_plot_tables::y#1 ] reg byte a [ init_plot_tables::$0 ] reg byte a [ init_plot_tables::$7 ] reg byte a [ init_plot_tables::$8 ] reg byte a [ init_plot_tables::$9 ] zp ZP_BYTE:34 [ init_plot_tables::$10 ] zp ZP_BYTE:30 [ init_plot_tables::$6 ] 
 Limited combination testing to 10000 combinations of 138240 possible.
-Uplifting [init_screen] best 9950 combination zp ZP_WORD:8 [ init_screen::b#2 init_screen::b#1 ] zp ZP_WORD:10 [ init_screen::c#2 init_screen::c#1 ] 
-Uplifting [plot] best 9705 combination reg byte x [ plot::y#0 ] reg byte y [ plot::x#0 ] reg byte a [ plot::$6 ] reg byte a [ plot::$7 ] reg byte a [ plot::$8 ] reg byte a [ plot::$9 ] zp ZP_WORD:24 [ plot::plotter_y#2 ] reg byte a [ plot::$5 ] zp ZP_WORD:26 [ plot::plotter#0 ] zp ZP_WORD:15 [ plot::plotter_x#1 ] zp ZP_WORD:21 [ plot::plotter_y#1 ] zp ZP_WORD:18 [ plot::plotter_x#2 ] 
-Uplifting [main] best 9705 combination 
-Uplifting [] best 9705 combination 
+Uplifting [init_screen] best 9841 combination zp ZP_WORD:8 [ init_screen::b#2 init_screen::b#1 ] zp ZP_WORD:10 [ init_screen::c#2 init_screen::c#1 ] 
+Uplifting [plot] best 9596 combination reg byte x [ plot::y#0 ] reg byte y [ plot::x#0 ] reg byte a [ plot::$6 ] reg byte a [ plot::$7 ] reg byte a [ plot::$8 ] reg byte a [ plot::$9 ] zp ZP_WORD:24 [ plot::plotter_y#2 ] reg byte a [ plot::$5 ] zp ZP_WORD:26 [ plot::plotter#0 ] zp ZP_WORD:15 [ plot::plotter_x#1 ] zp ZP_WORD:21 [ plot::plotter_y#1 ] zp ZP_WORD:18 [ plot::plotter_x#2 ] 
+Uplifting [main] best 9596 combination 
+Uplifting [] best 9596 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ plots::i#2 plots::i#1 ]
-Uplifting [plots] best 9705 combination zp ZP_BYTE:2 [ plots::i#2 plots::i#1 ] 
+Uplifting [plots] best 9596 combination zp ZP_BYTE:2 [ plots::i#2 plots::i#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:34 [ init_plot_tables::$10 ]
-Uplifting [init_plot_tables] best 9645 combination reg byte a [ init_plot_tables::$10 ] 
+Uplifting [init_plot_tables] best 9536 combination reg byte a [ init_plot_tables::$10 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:30 [ init_plot_tables::$6 ]
-Uplifting [init_plot_tables] best 9645 combination zp ZP_BYTE:30 [ init_plot_tables::$6 ] 
+Uplifting [init_plot_tables] best 9536 combination zp ZP_BYTE:30 [ init_plot_tables::$6 ] 
 Coalescing zero page register [ zp ZP_BYTE:2 [ plots::i#2 plots::i#1 ] ] with [ zp ZP_BYTE:30 [ init_plot_tables::$6 ] ]
 Coalescing zero page register [ zp ZP_WORD:6 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 ] ] with [ zp ZP_WORD:8 [ init_screen::b#2 init_screen::b#1 ] ]
 Coalescing zero page register [ zp ZP_WORD:6 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 init_screen::b#2 init_screen::b#1 ] ] with [ zp ZP_WORD:10 [ init_screen::c#2 init_screen::c#1 ] ]
@@ -2874,7 +2874,7 @@ reg byte a [ init_plot_tables::$10 ]
 
 
 FINAL ASSEMBLER
-Score: 7301
+Score: 7196
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bresenham.log b/src/test/java/dk/camelot64/kickc/test/ref/bresenham.log
index fae21683f..047820816 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/bresenham.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/bresenham.log
@@ -721,12 +721,12 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 55: zp ZP_BYTE:5 [ main::e#3 main::e#5 main::e#1 main::e#2 ] 46.75: zp ZP_WORD:2 [ main::cursor#3 main::cursor#5 main::cursor#1 main::cursor#2 ] 29.33: zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] 14.67: zp ZP_BYTE:4 [ main::x#2 main::x#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 1198 combination reg byte x [ main::e#3 main::e#5 main::e#1 main::e#2 ] zp ZP_WORD:2 [ main::cursor#3 main::cursor#5 main::cursor#1 main::cursor#2 ] zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] zp ZP_BYTE:4 [ main::x#2 main::x#1 ] 
-Uplifting [] best 1198 combination 
+Uplifting [main] best 1168 combination reg byte x [ main::e#3 main::e#5 main::e#1 main::e#2 ] zp ZP_WORD:2 [ main::cursor#3 main::cursor#5 main::cursor#1 main::cursor#2 ] zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] zp ZP_BYTE:4 [ main::x#2 main::x#1 ] 
+Uplifting [] best 1168 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ]
-Uplifting [main] best 1198 combination zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] 
+Uplifting [main] best 1168 combination zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:4 [ main::x#2 main::x#1 ]
-Uplifting [main] best 1198 combination zp ZP_BYTE:4 [ main::x#2 main::x#1 ] 
+Uplifting [main] best 1168 combination zp ZP_BYTE:4 [ main::x#2 main::x#1 ] 
 Allocated (was zp ZP_BYTE:6) zp ZP_BYTE:5 [ main::y#2 main::y#4 main::y#1 ]
 
 ASSEMBLER BEFORE OPTIMIZATION
@@ -921,7 +921,7 @@ zp ZP_BYTE:5 [ main::y#2 main::y#4 main::y#1 ]
 
 
 FINAL ASSEMBLER
-Score: 1022
+Score: 992
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bresenhamarr.log b/src/test/java/dk/camelot64/kickc/test/ref/bresenhamarr.log
index a305ae319..07782b060 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/bresenhamarr.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/bresenhamarr.log
@@ -708,10 +708,10 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 55: zp ZP_BYTE:5 [ main::e#3 main::e#5 main::e#1 main::e#2 ] 46.75: zp ZP_WORD:2 [ main::idx#3 main::idx#5 main::idx#1 main::idx#2 ] 29.33: zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] 14.67: zp ZP_BYTE:4 [ main::x#2 main::x#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 1278 combination reg byte y [ main::e#3 main::e#5 main::e#1 main::e#2 ] zp ZP_WORD:2 [ main::idx#3 main::idx#5 main::idx#1 main::idx#2 ] zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] reg byte x [ main::x#2 main::x#1 ] 
-Uplifting [] best 1278 combination 
+Uplifting [main] best 1238 combination reg byte y [ main::e#3 main::e#5 main::e#1 main::e#2 ] zp ZP_WORD:2 [ main::idx#3 main::idx#5 main::idx#1 main::idx#2 ] zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] reg byte x [ main::x#2 main::x#1 ] 
+Uplifting [] best 1238 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ]
-Uplifting [main] best 1278 combination zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] 
+Uplifting [main] best 1238 combination zp ZP_BYTE:6 [ main::y#2 main::y#4 main::y#1 ] 
 Allocated (was zp ZP_BYTE:6) zp ZP_BYTE:4 [ main::y#2 main::y#4 main::y#1 ]
 
 ASSEMBLER BEFORE OPTIMIZATION
@@ -910,7 +910,7 @@ zp ZP_BYTE:4 [ main::y#2 main::y#4 main::y#1 ]
 
 
 FINAL ASSEMBLER
-Score: 1122
+Score: 1082
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/callconstparam.log b/src/test/java/dk/camelot64/kickc/test/ref/callconstparam.log
index 7faebf758..a1ff40bd5 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/callconstparam.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/callconstparam.log
@@ -497,11 +497,11 @@ Uplift Scope [line] 30.17: zp ZP_BYTE:3 [ line::x#2 line::x#0 line::x#1 ] 1.83:
 Uplift Scope [] 25.5: zp ZP_WORD:4 [ screen#10 screen#14 screen#11 ] 
 Uplift Scope [main] 
 
-Uplifting [line] best 437 combination reg byte x [ line::x#2 line::x#0 line::x#1 ] zp ZP_BYTE:2 [ line::x1#3 ] 
-Uplifting [] best 437 combination zp ZP_WORD:4 [ screen#10 screen#14 screen#11 ] 
-Uplifting [main] best 437 combination 
+Uplifting [line] best 426 combination reg byte x [ line::x#2 line::x#0 line::x#1 ] zp ZP_BYTE:2 [ line::x1#3 ] 
+Uplifting [] best 426 combination zp ZP_WORD:4 [ screen#10 screen#14 screen#11 ] 
+Uplifting [main] best 426 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ line::x1#3 ]
-Uplifting [line] best 437 combination zp ZP_BYTE:2 [ line::x1#3 ] 
+Uplifting [line] best 426 combination zp ZP_BYTE:2 [ line::x1#3 ] 
 Allocated (was zp ZP_WORD:4) zp ZP_WORD:3 [ screen#10 screen#14 screen#11 ]
 
 ASSEMBLER BEFORE OPTIMIZATION
@@ -650,7 +650,7 @@ zp ZP_WORD:3 [ screen#10 screen#14 screen#11 ]
 
 
 FINAL ASSEMBLER
-Score: 365
+Score: 354
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/casting.log b/src/test/java/dk/camelot64/kickc/test/ref/casting.log
index 4a6e36215..31cbbf448 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/casting.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/casting.log
@@ -770,9 +770,9 @@ Uplift Scope [main] 25.93: zp ZP_BYTE:2 [ main::b#2 main::b#1 ] 22: zp ZP_BYTE:4
 Uplift Scope [w] 30.25: zp ZP_BYTE:3 [ w::i#2 w::i#1 ] 11: zp ZP_BYTE:8 [ w::b2#0 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 1056 combination reg byte x [ main::b#2 main::b#1 ] reg byte a [ main::b2#0 ] reg byte a [ main::$1 ] reg byte a [ main::sb#0 ] reg byte a [ main::$3 ] 
-Uplifting [w] best 876 combination reg byte y [ w::i#2 w::i#1 ] reg byte x [ w::b2#0 ] 
-Uplifting [] best 876 combination 
+Uplifting [main] best 1036 combination reg byte x [ main::b#2 main::b#1 ] reg byte a [ main::b2#0 ] reg byte a [ main::$1 ] reg byte a [ main::sb#0 ] reg byte a [ main::$3 ] 
+Uplifting [w] best 856 combination reg byte y [ w::i#2 w::i#1 ] reg byte x [ w::b2#0 ] 
+Uplifting [] best 856 combination 
 
 ASSEMBLER BEFORE OPTIMIZATION
 //SEG0 Basic Upstart
@@ -970,7 +970,7 @@ reg byte x [ w::b2#0 ]
 
 
 FINAL ASSEMBLER
-Score: 714
+Score: 694
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/chargen.log b/src/test/java/dk/camelot64/kickc/test/ref/chargen.log
index 16990c9f5..132c0406a 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/chargen.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/chargen.log
@@ -788,12 +788,12 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 202: zp ZP_BYTE:8 [ main::$1 ] 176.75: zp ZP_BYTE:6 [ main::x#2 main::x#1 ] 134.19: zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] 123.92: zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ] 101: zp ZP_BYTE:7 [ main::c#2 ] 19.04: zp ZP_BYTE:2 [ main::y#2 main::y#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 7352 combination reg byte a [ main::$1 ] reg byte x [ main::x#2 main::x#1 ] zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ] reg byte a [ main::c#2 ] zp ZP_BYTE:2 [ main::y#2 main::y#1 ] 
-Uplifting [] best 7352 combination 
+Uplifting [main] best 7232 combination reg byte a [ main::$1 ] reg byte x [ main::x#2 main::x#1 ] zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ] reg byte a [ main::c#2 ] zp ZP_BYTE:2 [ main::y#2 main::y#1 ] 
+Uplifting [] best 7232 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ]
-Uplifting [main] best 7352 combination zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] 
+Uplifting [main] best 7232 combination zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::y#2 main::y#1 ]
-Uplifting [main] best 7352 combination zp ZP_BYTE:2 [ main::y#2 main::y#1 ] 
+Uplifting [main] best 7232 combination zp ZP_BYTE:2 [ main::y#2 main::y#1 ] 
 
 ASSEMBLER BEFORE OPTIMIZATION
 //SEG0 Basic Upstart
@@ -1020,7 +1020,7 @@ reg byte a [ main::$1 ]
 
 
 FINAL ASSEMBLER
-Score: 5753
+Score: 5633
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/constants.log b/src/test/java/dk/camelot64/kickc/test/ref/constants.log
index fdc9b1235..886aac1a9 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/constants.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/constants.log
@@ -2978,19 +2978,19 @@ Uplift Scope [main]
 Uplift Scope [test_bytes] 
 Uplift Scope [test_sbytes] 
 
-Uplifting [] best 2311 combination zp ZP_WORD:6 [ char_cursor#75 char_cursor#65 char_cursor#2 char_cursor#82 char_cursor#1 char_cursor#88 char_cursor#89 ] zp ZP_WORD:10 [ line_cursor#21 line_cursor#42 line_cursor#45 line_cursor#1 ] 
-Uplifting [print_str] best 2311 combination zp ZP_WORD:8 [ print_str::str#10 print_str::str#11 print_str::str#1 print_str::str#5 print_str::str#0 ] 
-Uplifting [print_cls] best 2311 combination zp ZP_WORD:16 [ print_cls::sc#2 print_cls::sc#1 ] 
-Uplifting [assert_byte] best 2299 combination zp ZP_WORD:12 [ assert_byte::msg#3 ] reg byte x [ assert_byte::b#3 ] zp ZP_BYTE:15 [ assert_byte::c#3 ] 
-Uplifting [assert_sbyte] best 2291 combination zp ZP_WORD:2 [ assert_sbyte::msg#5 ] reg byte x [ assert_sbyte::b#5 ] zp ZP_BYTE:5 [ assert_sbyte::c#5 ] 
-Uplifting [print_ln] best 2291 combination 
-Uplifting [main] best 2291 combination 
-Uplifting [test_bytes] best 2291 combination 
-Uplifting [test_sbytes] best 2291 combination 
+Uplifting [] best 2205 combination zp ZP_WORD:6 [ char_cursor#75 char_cursor#65 char_cursor#2 char_cursor#82 char_cursor#1 char_cursor#88 char_cursor#89 ] zp ZP_WORD:10 [ line_cursor#21 line_cursor#42 line_cursor#45 line_cursor#1 ] 
+Uplifting [print_str] best 2205 combination zp ZP_WORD:8 [ print_str::str#10 print_str::str#11 print_str::str#1 print_str::str#5 print_str::str#0 ] 
+Uplifting [print_cls] best 2205 combination zp ZP_WORD:16 [ print_cls::sc#2 print_cls::sc#1 ] 
+Uplifting [assert_byte] best 2193 combination zp ZP_WORD:12 [ assert_byte::msg#3 ] reg byte x [ assert_byte::b#3 ] zp ZP_BYTE:15 [ assert_byte::c#3 ] 
+Uplifting [assert_sbyte] best 2185 combination zp ZP_WORD:2 [ assert_sbyte::msg#5 ] reg byte x [ assert_sbyte::b#5 ] zp ZP_BYTE:5 [ assert_sbyte::c#5 ] 
+Uplifting [print_ln] best 2185 combination 
+Uplifting [main] best 2185 combination 
+Uplifting [test_bytes] best 2185 combination 
+Uplifting [test_sbytes] best 2185 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:15 [ assert_byte::c#3 ]
-Uplifting [assert_byte] best 2291 combination zp ZP_BYTE:15 [ assert_byte::c#3 ] 
+Uplifting [assert_byte] best 2185 combination zp ZP_BYTE:15 [ assert_byte::c#3 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:5 [ assert_sbyte::c#5 ]
-Uplifting [assert_sbyte] best 2291 combination zp ZP_BYTE:5 [ assert_sbyte::c#5 ] 
+Uplifting [assert_sbyte] best 2185 combination zp ZP_BYTE:5 [ assert_sbyte::c#5 ] 
 Coalescing zero page register [ zp ZP_WORD:2 [ assert_sbyte::msg#5 ] ] with [ zp ZP_WORD:6 [ char_cursor#75 char_cursor#65 char_cursor#2 char_cursor#82 char_cursor#1 char_cursor#88 char_cursor#89 ] ]
 Coalescing zero page register [ zp ZP_WORD:2 [ assert_sbyte::msg#5 char_cursor#75 char_cursor#65 char_cursor#2 char_cursor#82 char_cursor#1 char_cursor#88 char_cursor#89 ] ] with [ zp ZP_WORD:16 [ print_cls::sc#2 print_cls::sc#1 ] ]
 Coalescing zero page register [ zp ZP_BYTE:5 [ assert_sbyte::c#5 ] ] with [ zp ZP_BYTE:15 [ assert_byte::c#3 ] ]
@@ -3785,7 +3785,7 @@ reg byte x [ assert_byte::b#3 ]
 
 
 FINAL ASSEMBLER
-Score: 1972
+Score: 1868
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.log b/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.log
index de70a409b..0729dd70c 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.log
@@ -1512,17 +1512,17 @@ Uplift Scope [main] 218.83: zp ZP_BYTE:2 [ main::c#4 main::c#1 ]
 Uplift Scope [prepare] 38.5: zp ZP_BYTE:13 [ prepare::i#2 prepare::i#1 ] 
 Uplift Scope [] 
 
-Uplifting [flip] best 141922 combination reg byte y [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ] reg byte x [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ] zp ZP_BYTE:11 [ flip::c#2 flip::c#1 ] reg byte x [ flip::i#2 flip::i#1 ] zp ZP_BYTE:8 [ flip::r#4 flip::r#1 ] 
-Uplifting [plot] best 123622 combination reg byte y [ plot::x#2 plot::x#1 ] reg byte x [ plot::i#2 plot::i#3 plot::i#1 ] zp ZP_WORD:3 [ plot::line#4 plot::line#1 ] zp ZP_BYTE:5 [ plot::y#4 plot::y#1 ] 
-Uplifting [main] best 120222 combination reg byte x [ main::c#4 main::c#1 ] 
-Uplifting [prepare] best 120122 combination reg byte x [ prepare::i#2 prepare::i#1 ] 
-Uplifting [] best 120122 combination 
+Uplifting [flip] best 141722 combination reg byte y [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ] reg byte x [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ] zp ZP_BYTE:11 [ flip::c#2 flip::c#1 ] reg byte x [ flip::i#2 flip::i#1 ] zp ZP_BYTE:8 [ flip::r#4 flip::r#1 ] 
+Uplifting [plot] best 123422 combination reg byte y [ plot::x#2 plot::x#1 ] reg byte x [ plot::i#2 plot::i#3 plot::i#1 ] zp ZP_WORD:3 [ plot::line#4 plot::line#1 ] zp ZP_BYTE:5 [ plot::y#4 plot::y#1 ] 
+Uplifting [main] best 120022 combination reg byte x [ main::c#4 main::c#1 ] 
+Uplifting [prepare] best 119922 combination reg byte x [ prepare::i#2 prepare::i#1 ] 
+Uplifting [] best 119922 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:11 [ flip::c#2 flip::c#1 ]
-Uplifting [flip] best 120122 combination zp ZP_BYTE:11 [ flip::c#2 flip::c#1 ] 
+Uplifting [flip] best 119922 combination zp ZP_BYTE:11 [ flip::c#2 flip::c#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:5 [ plot::y#4 plot::y#1 ]
-Uplifting [plot] best 120122 combination zp ZP_BYTE:5 [ plot::y#4 plot::y#1 ] 
+Uplifting [plot] best 119922 combination zp ZP_BYTE:5 [ plot::y#4 plot::y#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:8 [ flip::r#4 flip::r#1 ]
-Uplifting [flip] best 120122 combination zp ZP_BYTE:8 [ flip::r#4 flip::r#1 ] 
+Uplifting [flip] best 119922 combination zp ZP_BYTE:8 [ flip::r#4 flip::r#1 ] 
 Coalescing zero page register [ zp ZP_BYTE:5 [ plot::y#4 plot::y#1 ] ] with [ zp ZP_BYTE:8 [ flip::r#4 flip::r#1 ] ]
 Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ plot::line#4 plot::line#1 ]
 Allocated (was zp ZP_BYTE:5) zp ZP_BYTE:4 [ plot::y#4 plot::y#1 flip::r#4 flip::r#1 ]
@@ -1980,7 +1980,7 @@ reg byte x [ prepare::i#2 prepare::i#1 ]
 
 
 FINAL ASSEMBLER
-Score: 84527
+Score: 84327
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log b/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log
index e78fae72e..2aa5e1722 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log
@@ -1767,67 +1767,67 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 59.71: zp ZP_BYTE:9 [ main::bits_gen#15 main::bits_gen#8 main::bits_gen#16 ] 59.12: zp ZP_BYTE:7 [ main::bits_gen#11 main::bits_gen#1 main::bits_gen#4 ] 59.12: zp ZP_BYTE:8 [ main::bits_gen#13 main::bits_gen#14 main::bits_gen#6 ] 38.5: zp ZP_BYTE:10 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:14 [ main::$2 ] 22: zp ZP_BYTE:15 [ main::$3 ] 22: zp ZP_BYTE:16 [ main::$4 ] 22: zp ZP_BYTE:17 [ main::$5 ] 22: zp ZP_BYTE:18 [ main::$6 ] 22: zp ZP_BYTE:19 [ main::bits#0 ] 22: zp ZP_BYTE:21 [ main::$12 ] 22: zp ZP_BYTE:22 [ main::$13 ] 22: zp ZP_BYTE:23 [ main::$14 ] 22: zp ZP_BYTE:24 [ main::$15 ] 22: zp ZP_BYTE:25 [ main::bits#1 ] 22: zp ZP_BYTE:26 [ main::$20 ] 22: zp ZP_BYTE:28 [ main::$22 ] 22: zp ZP_BYTE:29 [ main::$23 ] 22: zp ZP_BYTE:30 [ main::$24 ] 22: zp ZP_BYTE:31 [ main::bits#2 ] 22: zp ZP_BYTE:32 [ main::$29 ] 22: zp ZP_BYTE:34 [ main::$31 ] 22: zp ZP_BYTE:35 [ main::$32 ] 22: zp ZP_BYTE:36 [ main::bits#3 ] 22: zp ZP_BYTE:37 [ main::bits_gen#7 ] 18.25: zp ZP_WORD:2 [ main::chargen#10 main::chargen#1 ] 11: zp ZP_BYTE:6 [ main::bits_gen#9 ] 11: zp ZP_BYTE:33 [ main::$30 ] 8.1: zp ZP_WORD:4 [ main::charset4#10 main::charset4#1 ] 7.33: zp ZP_BYTE:13 [ main::$1 ] 7.33: zp ZP_BYTE:20 [ main::$11 ] 7.33: zp ZP_BYTE:27 [ main::$21 ] 1.62: zp ZP_WORD:11 [ main::chargen1#0 ] 
 Uplift Scope [] 
 
-Uplifting [] best 5153 combination 
+Uplifting [] best 5083 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:9 [ main::bits_gen#15 main::bits_gen#8 main::bits_gen#16 ]
-Uplifting [main] best 5153 combination zp ZP_BYTE:9 [ main::bits_gen#15 main::bits_gen#8 main::bits_gen#16 ] 
+Uplifting [main] best 5083 combination zp ZP_BYTE:9 [ main::bits_gen#15 main::bits_gen#8 main::bits_gen#16 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:7 [ main::bits_gen#11 main::bits_gen#1 main::bits_gen#4 ]
-Uplifting [main] best 5153 combination zp ZP_BYTE:7 [ main::bits_gen#11 main::bits_gen#1 main::bits_gen#4 ] 
+Uplifting [main] best 5083 combination zp ZP_BYTE:7 [ main::bits_gen#11 main::bits_gen#1 main::bits_gen#4 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:8 [ main::bits_gen#13 main::bits_gen#14 main::bits_gen#6 ]
-Uplifting [main] best 5153 combination zp ZP_BYTE:8 [ main::bits_gen#13 main::bits_gen#14 main::bits_gen#6 ] 
+Uplifting [main] best 5083 combination zp ZP_BYTE:8 [ main::bits_gen#13 main::bits_gen#14 main::bits_gen#6 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:10 [ main::i#2 main::i#1 ]
-Uplifting [main] best 5053 combination reg byte x [ main::i#2 main::i#1 ] 
+Uplifting [main] best 4983 combination reg byte x [ main::i#2 main::i#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:14 [ main::$2 ]
-Uplifting [main] best 4993 combination reg byte a [ main::$2 ] 
+Uplifting [main] best 4923 combination reg byte a [ main::$2 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:15 [ main::$3 ]
-Uplifting [main] best 4933 combination reg byte a [ main::$3 ] 
+Uplifting [main] best 4863 combination reg byte a [ main::$3 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:16 [ main::$4 ]
-Uplifting [main] best 4873 combination reg byte a [ main::$4 ] 
+Uplifting [main] best 4803 combination reg byte a [ main::$4 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:17 [ main::$5 ]
-Uplifting [main] best 4813 combination reg byte a [ main::$5 ] 
+Uplifting [main] best 4743 combination reg byte a [ main::$5 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:18 [ main::$6 ]
-Uplifting [main] best 4773 combination reg byte a [ main::$6 ] 
+Uplifting [main] best 4703 combination reg byte a [ main::$6 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:19 [ main::bits#0 ]
-Uplifting [main] best 4713 combination reg byte a [ main::bits#0 ] 
+Uplifting [main] best 4643 combination reg byte a [ main::bits#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:21 [ main::$12 ]
-Uplifting [main] best 4653 combination reg byte a [ main::$12 ] 
+Uplifting [main] best 4583 combination reg byte a [ main::$12 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:22 [ main::$13 ]
-Uplifting [main] best 4593 combination reg byte a [ main::$13 ] 
+Uplifting [main] best 4523 combination reg byte a [ main::$13 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:23 [ main::$14 ]
-Uplifting [main] best 4533 combination reg byte a [ main::$14 ] 
+Uplifting [main] best 4463 combination reg byte a [ main::$14 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:24 [ main::$15 ]
-Uplifting [main] best 4493 combination reg byte a [ main::$15 ] 
+Uplifting [main] best 4423 combination reg byte a [ main::$15 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:25 [ main::bits#1 ]
-Uplifting [main] best 4433 combination reg byte a [ main::bits#1 ] 
+Uplifting [main] best 4363 combination reg byte a [ main::bits#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:26 [ main::$20 ]
-Uplifting [main] best 4373 combination reg byte a [ main::$20 ] 
+Uplifting [main] best 4303 combination reg byte a [ main::$20 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:28 [ main::$22 ]
-Uplifting [main] best 4313 combination reg byte a [ main::$22 ] 
+Uplifting [main] best 4243 combination reg byte a [ main::$22 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:29 [ main::$23 ]
-Uplifting [main] best 4253 combination reg byte a [ main::$23 ] 
+Uplifting [main] best 4183 combination reg byte a [ main::$23 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:30 [ main::$24 ]
-Uplifting [main] best 4213 combination reg byte a [ main::$24 ] 
+Uplifting [main] best 4143 combination reg byte a [ main::$24 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:31 [ main::bits#2 ]
-Uplifting [main] best 4153 combination reg byte a [ main::bits#2 ] 
+Uplifting [main] best 4083 combination reg byte a [ main::bits#2 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:32 [ main::$29 ]
-Uplifting [main] best 4093 combination reg byte a [ main::$29 ] 
+Uplifting [main] best 4023 combination reg byte a [ main::$29 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:34 [ main::$31 ]
-Uplifting [main] best 4033 combination reg byte a [ main::$31 ] 
+Uplifting [main] best 3963 combination reg byte a [ main::$31 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:35 [ main::$32 ]
-Uplifting [main] best 3993 combination reg byte a [ main::$32 ] 
+Uplifting [main] best 3923 combination reg byte a [ main::$32 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:36 [ main::bits#3 ]
-Uplifting [main] best 3933 combination reg byte a [ main::bits#3 ] 
+Uplifting [main] best 3863 combination reg byte a [ main::bits#3 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:37 [ main::bits_gen#7 ]
-Uplifting [main] best 3873 combination reg byte a [ main::bits_gen#7 ] 
+Uplifting [main] best 3803 combination reg byte a [ main::bits_gen#7 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:6 [ main::bits_gen#9 ]
-Uplifting [main] best 3783 combination reg byte a [ main::bits_gen#9 ] 
+Uplifting [main] best 3713 combination reg byte a [ main::bits_gen#9 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:33 [ main::$30 ]
-Uplifting [main] best 3783 combination zp ZP_BYTE:33 [ main::$30 ] 
+Uplifting [main] best 3713 combination zp ZP_BYTE:33 [ main::$30 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:13 [ main::$1 ]
-Uplifting [main] best 3783 combination zp ZP_BYTE:13 [ main::$1 ] 
+Uplifting [main] best 3713 combination zp ZP_BYTE:13 [ main::$1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:20 [ main::$11 ]
-Uplifting [main] best 3783 combination zp ZP_BYTE:20 [ main::$11 ] 
+Uplifting [main] best 3713 combination zp ZP_BYTE:20 [ main::$11 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:27 [ main::$21 ]
-Uplifting [main] best 3783 combination zp ZP_BYTE:27 [ main::$21 ] 
+Uplifting [main] best 3713 combination zp ZP_BYTE:27 [ main::$21 ] 
 Coalescing zero page register [ zp ZP_BYTE:7 [ main::bits_gen#11 main::bits_gen#1 main::bits_gen#4 ] ] with [ zp ZP_BYTE:8 [ main::bits_gen#13 main::bits_gen#14 main::bits_gen#6 ] ]
 Coalescing zero page register [ zp ZP_BYTE:7 [ main::bits_gen#11 main::bits_gen#1 main::bits_gen#4 main::bits_gen#13 main::bits_gen#14 main::bits_gen#6 ] ] with [ zp ZP_BYTE:9 [ main::bits_gen#15 main::bits_gen#8 main::bits_gen#16 ] ]
 Coalescing zero page register [ zp ZP_BYTE:7 [ main::bits_gen#11 main::bits_gen#1 main::bits_gen#4 main::bits_gen#13 main::bits_gen#14 main::bits_gen#6 main::bits_gen#15 main::bits_gen#8 main::bits_gen#16 ] ] with [ zp ZP_BYTE:13 [ main::$1 ] ]
@@ -2292,7 +2292,7 @@ reg byte a [ main::bits_gen#7 ]
 
 
 FINAL ASSEMBLER
-Score: 3214
+Score: 3144
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/immzero.log b/src/test/java/dk/camelot64/kickc/test/ref/immzero.log
index cee366a6b..8023432f9 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/immzero.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/immzero.log
@@ -313,8 +313,8 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 33: zp ZP_BYTE:2 [ main::i#1 main::j#1 ] 29.33: zp ZP_WORD:3 [ main::w#2 main::w#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 503 combination reg byte x [ main::i#1 main::j#1 ] zp ZP_WORD:3 [ main::w#2 main::w#1 ] 
-Uplifting [] best 503 combination 
+Uplifting [main] best 473 combination reg byte x [ main::i#1 main::j#1 ] zp ZP_WORD:3 [ main::w#2 main::w#1 ] 
+Uplifting [] best 473 combination 
 Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ main::w#2 main::w#1 ]
 
 ASSEMBLER BEFORE OPTIMIZATION
@@ -423,7 +423,7 @@ zp ZP_WORD:2 [ main::w#2 main::w#1 ]
 
 
 FINAL ASSEMBLER
-Score: 387
+Score: 357
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.log b/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.log
index 8bfec46f3..86ab80c42 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.log
@@ -1232,11 +1232,11 @@ Uplift Scope [print_cls] 33: zp ZP_WORD:9 [ print_cls::sc#2 print_cls::sc#1 ]
 Uplift Scope [main] 15.4: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 
 Uplift Scope [print_ln] 
 
-Uplifting [] best 13477 combination zp ZP_WORD:3 [ line_cursor#6 line_cursor#13 line_cursor#1 ] zp ZP_WORD:7 [ char_cursor#10 char_cursor#19 char_cursor#25 char_cursor#1 ] 
-Uplifting [print_str] best 13477 combination zp ZP_WORD:5 [ print_str::str#2 print_str::str#0 ] 
-Uplifting [print_cls] best 13477 combination zp ZP_WORD:9 [ print_cls::sc#2 print_cls::sc#1 ] 
-Uplifting [main] best 13387 combination reg byte x [ main::i#2 main::i#1 ] 
-Uplifting [print_ln] best 13387 combination 
+Uplifting [] best 12807 combination zp ZP_WORD:3 [ line_cursor#6 line_cursor#13 line_cursor#1 ] zp ZP_WORD:7 [ char_cursor#10 char_cursor#19 char_cursor#25 char_cursor#1 ] 
+Uplifting [print_str] best 12807 combination zp ZP_WORD:5 [ print_str::str#2 print_str::str#0 ] 
+Uplifting [print_cls] best 12807 combination zp ZP_WORD:9 [ print_cls::sc#2 print_cls::sc#1 ] 
+Uplifting [main] best 12717 combination reg byte x [ main::i#2 main::i#1 ] 
+Uplifting [print_ln] best 12717 combination 
 Coalescing zero page register [ zp ZP_WORD:3 [ line_cursor#6 line_cursor#13 line_cursor#1 ] ] with [ zp ZP_WORD:9 [ print_cls::sc#2 print_cls::sc#1 ] ]
 Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ line_cursor#6 line_cursor#13 line_cursor#1 print_cls::sc#2 print_cls::sc#1 ]
 Allocated (was zp ZP_WORD:5) zp ZP_WORD:4 [ print_str::str#2 print_str::str#0 ]
@@ -1551,7 +1551,7 @@ zp ZP_WORD:6 [ char_cursor#10 char_cursor#19 char_cursor#25 char_cursor#1 ]
 
 
 FINAL ASSEMBLER
-Score: 11798
+Score: 11128
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/inline-string.log b/src/test/java/dk/camelot64/kickc/test/ref/inline-string.log
index 9deb95b11..7d87d0390 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/inline-string.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/inline-string.log
@@ -566,9 +566,9 @@ Uplift Scope [print] 35.5: zp ZP_WORD:4 [ print::msg#4 print::msg#6 print::msg#3
 Uplift Scope [] 21.88: zp ZP_WORD:2 [ screen#18 screen#12 screen#5 ] 
 Uplift Scope [main] 
 
-Uplifting [print] best 730 combination zp ZP_WORD:4 [ print::msg#4 print::msg#6 print::msg#3 ] 
-Uplifting [] best 730 combination zp ZP_WORD:2 [ screen#18 screen#12 screen#5 ] 
-Uplifting [main] best 730 combination 
+Uplifting [print] best 706 combination zp ZP_WORD:4 [ print::msg#4 print::msg#6 print::msg#3 ] 
+Uplifting [] best 706 combination zp ZP_WORD:2 [ screen#18 screen#12 screen#5 ] 
+Uplifting [main] best 706 combination 
 
 ASSEMBLER BEFORE OPTIMIZATION
 //SEG0 Basic Upstart
@@ -752,7 +752,7 @@ zp ZP_WORD:4 [ print::msg#4 print::msg#6 print::msg#3 ]
 
 
 FINAL ASSEMBLER
-Score: 635
+Score: 611
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/inline-word.log b/src/test/java/dk/camelot64/kickc/test/ref/inline-word.log
index 8b21293a2..c779ca8e8 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/inline-word.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/inline-word.log
@@ -475,10 +475,10 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 227.25: zp ZP_BYTE:3 [ main::l#2 main::l#1 ] 202: zp ZP_WORD:4 [ main::w#0 ] 202: zp ZP_WORD:6 [ main::sc#0 ] 34.07: zp ZP_BYTE:2 [ main::h#4 main::h#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 5883 combination reg byte x [ main::l#2 main::l#1 ] zp ZP_WORD:4 [ main::w#0 ] zp ZP_WORD:6 [ main::sc#0 ] zp ZP_BYTE:2 [ main::h#4 main::h#1 ] 
-Uplifting [] best 5883 combination 
+Uplifting [main] best 5583 combination reg byte x [ main::l#2 main::l#1 ] zp ZP_WORD:4 [ main::w#0 ] zp ZP_WORD:6 [ main::sc#0 ] zp ZP_BYTE:2 [ main::h#4 main::h#1 ] 
+Uplifting [] best 5583 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::h#4 main::h#1 ]
-Uplifting [main] best 5883 combination zp ZP_BYTE:2 [ main::h#4 main::h#1 ] 
+Uplifting [main] best 5583 combination zp ZP_BYTE:2 [ main::h#4 main::h#1 ] 
 Coalescing zero page register [ zp ZP_WORD:4 [ main::w#0 ] ] with [ zp ZP_WORD:6 [ main::sc#0 ] ]
 Allocated (was zp ZP_WORD:4) zp ZP_WORD:3 [ main::w#0 main::sc#0 ]
 
@@ -623,7 +623,7 @@ zp ZP_WORD:3 [ main::w#0 main::sc#0 ]
 
 
 FINAL ASSEMBLER
-Score: 3487
+Score: 3387
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.log b/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.log
index 052842a75..ea86d8e6e 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.log
@@ -449,8 +449,8 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 34.83: zp ZP_BYTE:2 [ main::i#3 main::i#4 main::i#1 ] 22: zp ZP_WORD:3 [ main::cursor#2 main::cursor#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 858 combination reg byte x [ main::i#3 main::i#4 main::i#1 ] zp ZP_WORD:3 [ main::cursor#2 main::cursor#1 ] 
-Uplifting [] best 858 combination 
+Uplifting [main] best 828 combination reg byte x [ main::i#3 main::i#4 main::i#1 ] zp ZP_WORD:3 [ main::cursor#2 main::cursor#1 ] 
+Uplifting [] best 828 combination 
 Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ main::cursor#2 main::cursor#1 ]
 
 ASSEMBLER BEFORE OPTIMIZATION
@@ -603,7 +603,7 @@ zp ZP_WORD:2 [ main::cursor#2 main::cursor#1 ]
 
 
 FINAL ASSEMBLER
-Score: 672
+Score: 642
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/liverange-call-problem.log b/src/test/java/dk/camelot64/kickc/test/ref/liverange-call-problem.log
index 26886152b..a139e1a9a 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/liverange-call-problem.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/liverange-call-problem.log
@@ -524,10 +524,10 @@ Uplift Scope [main]
 Uplift Scope [incw1] 
 Uplift Scope [incw2] 
 
-Uplifting [] best 120 combination zp ZP_WORD:2 [ w2#10 w2#11 ] zp ZP_WORD:4 [ w1#10 w1#11 ] 
-Uplifting [main] best 120 combination 
-Uplifting [incw1] best 120 combination 
-Uplifting [incw2] best 120 combination 
+Uplifting [] best 116 combination zp ZP_WORD:2 [ w2#10 w2#11 ] zp ZP_WORD:4 [ w1#10 w1#11 ] 
+Uplifting [main] best 116 combination 
+Uplifting [incw1] best 116 combination 
+Uplifting [incw2] best 116 combination 
 
 ASSEMBLER BEFORE OPTIMIZATION
 //SEG0 Basic Upstart
@@ -691,7 +691,7 @@ zp ZP_WORD:4 [ w1#10 w1#11 ]
 
 
 FINAL ASSEMBLER
-Score: 92
+Score: 88
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/loopmin.log b/src/test/java/dk/camelot64/kickc/test/ref/loopmin.log
index ee381cefc..112038a7e 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/loopmin.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/loopmin.log
@@ -356,8 +356,8 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 49.5: zp ZP_BYTE:3 [ main::s#2 main::s#4 main::s#1 ] 27.5: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 443 combination reg byte a [ main::s#2 main::s#4 main::s#1 ] reg byte x [ main::i#2 main::i#1 ] 
-Uplifting [] best 443 combination 
+Uplifting [main] best 423 combination reg byte a [ main::s#2 main::s#4 main::s#1 ] reg byte x [ main::i#2 main::i#1 ] 
+Uplifting [] best 423 combination 
 
 ASSEMBLER BEFORE OPTIMIZATION
 //SEG0 Basic Upstart
@@ -477,7 +477,7 @@ reg byte a [ main::s#2 main::s#4 main::s#1 ]
 
 
 FINAL ASSEMBLER
-Score: 287
+Score: 267
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/printmsg.log b/src/test/java/dk/camelot64/kickc/test/ref/printmsg.log
index 15ff0ed4f..736700865 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/printmsg.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/printmsg.log
@@ -1182,10 +1182,10 @@ Uplift Scope [print_str] 35.5: zp ZP_WORD:4 [ print_str::str#4 print_str::str#6
 Uplift Scope [print_ln] 
 Uplift Scope [main] 
 
-Uplifting [] best 1262 combination zp ZP_WORD:2 [ line_cursor#8 line_cursor#16 line_cursor#1 ] zp ZP_WORD:6 [ char_cursor#13 char_cursor#29 char_cursor#31 char_cursor#32 char_cursor#1 ] 
-Uplifting [print_str] best 1262 combination zp ZP_WORD:4 [ print_str::str#4 print_str::str#6 print_str::str#0 ] 
-Uplifting [print_ln] best 1262 combination 
-Uplifting [main] best 1262 combination 
+Uplifting [] best 1203 combination zp ZP_WORD:2 [ line_cursor#8 line_cursor#16 line_cursor#1 ] zp ZP_WORD:6 [ char_cursor#13 char_cursor#29 char_cursor#31 char_cursor#32 char_cursor#1 ] 
+Uplifting [print_str] best 1203 combination zp ZP_WORD:4 [ print_str::str#4 print_str::str#6 print_str::str#0 ] 
+Uplifting [print_ln] best 1203 combination 
+Uplifting [main] best 1203 combination 
 
 ASSEMBLER BEFORE OPTIMIZATION
 //SEG0 Basic Upstart
@@ -1473,7 +1473,7 @@ zp ZP_WORD:6 [ char_cursor#13 char_cursor#29 char_cursor#31 char_cursor#32 char_
 
 
 FINAL ASSEMBLER
-Score: 1098
+Score: 1039
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/ptr-complex.log b/src/test/java/dk/camelot64/kickc/test/ref/ptr-complex.log
index e12841b0d..dd8340de4 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/ptr-complex.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/ptr-complex.log
@@ -642,8 +642,8 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 31.17: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 27.5: zp ZP_BYTE:3 [ main::j#2 main::j#1 ] 22: zp ZP_WORD:4 [ main::$2 ] 22: zp ZP_WORD:8 [ main::$11 ] 11: zp ZP_WORD:6 [ main::$9 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 1195 combination reg byte x [ main::i#2 main::i#1 ] reg byte x [ main::j#2 main::j#1 ] zp ZP_WORD:4 [ main::$2 ] zp ZP_WORD:8 [ main::$11 ] zp ZP_WORD:6 [ main::$9 ] 
-Uplifting [] best 1195 combination 
+Uplifting [main] best 1165 combination reg byte x [ main::i#2 main::i#1 ] reg byte x [ main::j#2 main::j#1 ] zp ZP_WORD:4 [ main::$2 ] zp ZP_WORD:8 [ main::$11 ] zp ZP_WORD:6 [ main::$9 ] 
+Uplifting [] best 1165 combination 
 Coalescing zero page register [ zp ZP_WORD:4 [ main::$2 ] ] with [ zp ZP_WORD:6 [ main::$9 ] ]
 Allocated (was zp ZP_WORD:4) zp ZP_WORD:2 [ main::$2 main::$9 ]
 Allocated (was zp ZP_WORD:8) zp ZP_WORD:4 [ main::$11 ]
@@ -833,7 +833,7 @@ zp ZP_WORD:4 [ main::$11 ]
 
 
 FINAL ASSEMBLER
-Score: 986
+Score: 956
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/ptrtest.log b/src/test/java/dk/camelot64/kickc/test/ref/ptrtest.log
index 0c42aa0fb..6d0774e8c 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/ptrtest.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/ptrtest.log
@@ -1083,12 +1083,12 @@ Uplift Scope [lvalue] 36.67: zp ZP_BYTE:9 [ lvalue::i#2 lvalue::i#1 ]
 Uplift Scope [main] 
 Uplift Scope [] 
 
-Uplifting [rvaluevar] best 1750 combination reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ] zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] 
-Uplifting [lvaluevar] best 1660 combination reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ] zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] 
-Uplifting [rvalue] best 1570 combination reg byte x [ rvalue::i#2 rvalue::i#1 ] 
-Uplifting [lvalue] best 1450 combination reg byte x [ lvalue::i#2 lvalue::i#1 ] 
-Uplifting [main] best 1450 combination 
-Uplifting [] best 1450 combination 
+Uplifting [rvaluevar] best 1710 combination reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ] zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] 
+Uplifting [lvaluevar] best 1620 combination reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ] zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] 
+Uplifting [rvalue] best 1530 combination reg byte x [ rvalue::i#2 rvalue::i#1 ] 
+Uplifting [lvalue] best 1410 combination reg byte x [ lvalue::i#2 lvalue::i#1 ] 
+Uplifting [main] best 1410 combination 
+Uplifting [] best 1410 combination 
 Coalescing zero page register [ zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] ] with [ zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] ]
 Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 rvaluevar::screen#2 rvaluevar::screen#1 ]
 
@@ -1401,7 +1401,7 @@ reg byte x [ lvalue::i#2 lvalue::i#1 ]
 
 
 FINAL ASSEMBLER
-Score: 1192
+Score: 1152
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.log b/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.log
index cbfdb0608..6e490bf29 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.log
@@ -471,8 +471,8 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 55: zp ZP_BYTE:3 [ main::c#2 main::c#0 main::c#1 ] 29.33: zp ZP_WORD:4 [ main::nxt#4 main::nxt#3 main::nxt#1 ] 12.65: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 873 combination reg byte y [ main::c#2 main::c#0 main::c#1 ] zp ZP_WORD:4 [ main::nxt#4 main::nxt#3 main::nxt#1 ] reg byte x [ main::i#2 main::i#1 ] 
-Uplifting [] best 873 combination 
+Uplifting [main] best 843 combination reg byte y [ main::c#2 main::c#0 main::c#1 ] zp ZP_WORD:4 [ main::nxt#4 main::nxt#3 main::nxt#1 ] reg byte x [ main::i#2 main::i#1 ] 
+Uplifting [] best 843 combination 
 Allocated (was zp ZP_WORD:4) zp ZP_WORD:2 [ main::nxt#4 main::nxt#3 main::nxt#1 ]
 
 ASSEMBLER BEFORE OPTIMIZATION
@@ -627,7 +627,7 @@ zp ZP_WORD:2 [ main::nxt#4 main::nxt#3 main::nxt#1 ]
 
 
 FINAL ASSEMBLER
-Score: 681
+Score: 651
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/scroll.log b/src/test/java/dk/camelot64/kickc/test/ref/scroll.log
index 53ee29238..f4026d0b5 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/scroll.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/scroll.log
@@ -1263,9 +1263,9 @@ Uplift Scope [main] 353.5: zp ZP_BYTE:3 [ main::i#2 main::i#1 ] 71.5: zp ZP_BYTE
 Uplift Scope [fillscreen] 33: zp ZP_WORD:7 [ fillscreen::cursor#2 fillscreen::cursor#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 8770 combination reg byte x [ main::i#2 main::i#1 ] reg byte x [ main::c#2 main::c#0 main::c#1 ] zp ZP_WORD:5 [ main::nxt#4 main::nxt#9 main::nxt#10 main::nxt#1 ] reg byte x [ main::scroll#7 main::scroll#10 main::scroll#1 ] 
-Uplifting [fillscreen] best 8770 combination zp ZP_WORD:7 [ fillscreen::cursor#2 fillscreen::cursor#1 ] 
-Uplifting [] best 8770 combination 
+Uplifting [main] best 8620 combination reg byte x [ main::i#2 main::i#1 ] reg byte x [ main::c#2 main::c#0 main::c#1 ] zp ZP_WORD:5 [ main::nxt#4 main::nxt#9 main::nxt#10 main::nxt#1 ] reg byte x [ main::scroll#7 main::scroll#10 main::scroll#1 ] 
+Uplifting [fillscreen] best 8620 combination zp ZP_WORD:7 [ fillscreen::cursor#2 fillscreen::cursor#1 ] 
+Uplifting [] best 8620 combination 
 Coalescing zero page register [ zp ZP_WORD:5 [ main::nxt#4 main::nxt#9 main::nxt#10 main::nxt#1 ] ] with [ zp ZP_WORD:7 [ fillscreen::cursor#2 fillscreen::cursor#1 ] ]
 Allocated (was zp ZP_WORD:5) zp ZP_WORD:2 [ main::nxt#4 main::nxt#9 main::nxt#10 main::nxt#1 fillscreen::cursor#2 fillscreen::cursor#1 ]
 
@@ -1591,7 +1591,7 @@ zp ZP_WORD:2 [ main::nxt#4 main::nxt#9 main::nxt#10 main::nxt#1 fillscreen::curs
 
 
 FINAL ASSEMBLER
-Score: 6088
+Score: 5938
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.log b/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.log
index d967d4e69..0ce242ddb 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.log
@@ -3122,15 +3122,15 @@ Uplift Scope [next_char] 8.5: zp ZP_BYTE:13 [ next_char::return#1 next_char::c#0
 Uplift Scope [main] 
 Uplift Scope [scroll_soft] 
 
-Uplifting [scroll_bit] best 9754 combination reg byte a [ scroll_bit::bits#0 ] reg byte a [ scroll_bit::$9 ] reg byte x [ scroll_bit::r#2 scroll_bit::r#1 ] zp ZP_WORD:7 [ scroll_bit::sc#2 scroll_bit::sc#1 ] reg byte a [ scroll_bit::b#2 ] reg byte a [ scroll_bit::$3 ] zp ZP_WORD:18 [ scroll_bit::c#0 ] zp ZP_WORD:20 [ scroll_bit::$4 ] 
-Uplifting [scroll_hard] best 9424 combination reg byte x [ scroll_hard::i#2 scroll_hard::i#1 ] 
-Uplifting [] best 9112 combination zp ZP_WORD:4 [ current_chargen#27 current_chargen#11 current_chargen#19 current_chargen#5 ] zp ZP_WORD:11 [ nxt#18 nxt#31 nxt#14 nxt#36 nxt#19 ] reg byte x [ scroll#18 scroll#10 scroll#3 ] zp ZP_BYTE:3 [ current_bit#29 current_bit#12 current_bit#21 current_bit#5 ] 
-Uplifting [fillscreen] best 9112 combination zp ZP_WORD:14 [ fillscreen::cursor#2 fillscreen::cursor#1 ] 
-Uplifting [next_char] best 9094 combination reg byte a [ next_char::return#1 next_char::c#0 next_char::c#1 ] reg byte a [ next_char::return#0 ] 
-Uplifting [main] best 9094 combination 
-Uplifting [scroll_soft] best 9094 combination 
+Uplifting [scroll_bit] best 9473 combination reg byte a [ scroll_bit::bits#0 ] reg byte a [ scroll_bit::$9 ] reg byte x [ scroll_bit::r#2 scroll_bit::r#1 ] zp ZP_WORD:7 [ scroll_bit::sc#2 scroll_bit::sc#1 ] reg byte a [ scroll_bit::b#2 ] reg byte a [ scroll_bit::$3 ] zp ZP_WORD:18 [ scroll_bit::c#0 ] zp ZP_WORD:20 [ scroll_bit::$4 ] 
+Uplifting [scroll_hard] best 9143 combination reg byte x [ scroll_hard::i#2 scroll_hard::i#1 ] 
+Uplifting [] best 8831 combination zp ZP_WORD:4 [ current_chargen#27 current_chargen#11 current_chargen#19 current_chargen#5 ] zp ZP_WORD:11 [ nxt#18 nxt#31 nxt#14 nxt#36 nxt#19 ] reg byte x [ scroll#18 scroll#10 scroll#3 ] zp ZP_BYTE:3 [ current_bit#29 current_bit#12 current_bit#21 current_bit#5 ] 
+Uplifting [fillscreen] best 8831 combination zp ZP_WORD:14 [ fillscreen::cursor#2 fillscreen::cursor#1 ] 
+Uplifting [next_char] best 8813 combination reg byte a [ next_char::return#1 next_char::c#0 next_char::c#1 ] reg byte a [ next_char::return#0 ] 
+Uplifting [main] best 8813 combination 
+Uplifting [scroll_soft] best 8813 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:3 [ current_bit#29 current_bit#12 current_bit#21 current_bit#5 ]
-Uplifting [] best 9094 combination zp ZP_BYTE:3 [ current_bit#29 current_bit#12 current_bit#21 current_bit#5 ] 
+Uplifting [] best 8813 combination zp ZP_BYTE:3 [ current_bit#29 current_bit#12 current_bit#21 current_bit#5 ] 
 Coalescing zero page register [ zp ZP_WORD:4 [ current_chargen#27 current_chargen#11 current_chargen#19 current_chargen#5 ] ] with [ zp ZP_WORD:14 [ fillscreen::cursor#2 fillscreen::cursor#1 ] ]
 Coalescing zero page register [ zp ZP_WORD:4 [ current_chargen#27 current_chargen#11 current_chargen#19 current_chargen#5 fillscreen::cursor#2 fillscreen::cursor#1 ] ] with [ zp ZP_WORD:18 [ scroll_bit::c#0 ] ]
 Coalescing zero page register [ zp ZP_WORD:4 [ current_chargen#27 current_chargen#11 current_chargen#19 current_chargen#5 fillscreen::cursor#2 fillscreen::cursor#1 scroll_bit::c#0 ] ] with [ zp ZP_WORD:20 [ scroll_bit::$4 ] ]
@@ -3790,7 +3790,7 @@ reg byte a [ scroll_bit::$9 ]
 
 
 FINAL ASSEMBLER
-Score: 7129
+Score: 6851
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/signed-words.log b/src/test/java/dk/camelot64/kickc/test/ref/signed-words.log
index 3e1054a21..92583baec 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/signed-words.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/signed-words.log
@@ -1936,10 +1936,10 @@ Uplift Scope [] 14.19: zp ZP_WORD:6 [ yvel#9 yvel#12 yvel#10 yvel#22 ] 8.88: zp
 Uplift Scope [anim] 4: zp ZP_WORD:15 [ anim::$10 ] 4: zp ZP_WORD:19 [ anim::$12 ] 4: zp ZP_BYTE:23 [ anim::$14 ] 4: zp ZP_BYTE:24 [ anim::$15 ] 4: zp ZP_BYTE:25 [ anim::$16 ] 1.33: zp ZP_WORD:21 [ anim::sprite_y#0 ] 0.86: zp ZP_WORD:17 [ anim::sprite_x#0 ] 
 Uplift Scope [main] 
 
-Uplifting [init] best 8724 combination zp ZP_WORD:12 [ init::sc#2 init::sc#1 ] reg byte x [ init::i#2 init::i#1 ] 
-Uplifting [] best 8724 combination zp ZP_WORD:6 [ yvel#9 yvel#12 yvel#10 yvel#22 ] zp ZP_WORD:4 [ yvel_init#13 yvel_init#11 yvel#4 yvel_init#3 ] zp ZP_WORD:8 [ xpos#9 xpos#12 xpos#10 ] zp ZP_WORD:10 [ ypos#10 ypos#13 ypos#11 ] zp ZP_WORD:2 [ xvel#12 xvel#10 xvel#14 ] 
-Uplifting [anim] best 8706 combination zp ZP_WORD:15 [ anim::$10 ] zp ZP_WORD:19 [ anim::$12 ] reg byte a [ anim::$14 ] reg byte a [ anim::$15 ] reg byte a [ anim::$16 ] zp ZP_WORD:21 [ anim::sprite_y#0 ] zp ZP_WORD:17 [ anim::sprite_x#0 ] 
-Uplifting [main] best 8706 combination 
+Uplifting [init] best 8154 combination zp ZP_WORD:12 [ init::sc#2 init::sc#1 ] reg byte x [ init::i#2 init::i#1 ] 
+Uplifting [] best 8154 combination zp ZP_WORD:6 [ yvel#9 yvel#12 yvel#10 yvel#22 ] zp ZP_WORD:4 [ yvel_init#13 yvel_init#11 yvel#4 yvel_init#3 ] zp ZP_WORD:8 [ xpos#9 xpos#12 xpos#10 ] zp ZP_WORD:10 [ ypos#10 ypos#13 ypos#11 ] zp ZP_WORD:2 [ xvel#12 xvel#10 xvel#14 ] 
+Uplifting [anim] best 8136 combination zp ZP_WORD:15 [ anim::$10 ] zp ZP_WORD:19 [ anim::$12 ] reg byte a [ anim::$14 ] reg byte a [ anim::$15 ] reg byte a [ anim::$16 ] zp ZP_WORD:21 [ anim::sprite_y#0 ] zp ZP_WORD:17 [ anim::sprite_x#0 ] 
+Uplifting [main] best 8136 combination 
 Coalescing zero page register [ zp ZP_WORD:2 [ xvel#12 xvel#10 xvel#14 ] ] with [ zp ZP_WORD:12 [ init::sc#2 init::sc#1 ] ]
 Coalescing zero page register [ zp ZP_WORD:15 [ anim::$10 ] ] with [ zp ZP_WORD:17 [ anim::sprite_x#0 ] ]
 Coalescing zero page register [ zp ZP_WORD:19 [ anim::$12 ] ] with [ zp ZP_WORD:21 [ anim::sprite_y#0 ] ]
@@ -2494,7 +2494,7 @@ reg byte a [ anim::$16 ]
 
 
 FINAL ASSEMBLER
-Score: 6723
+Score: 6153
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/sinus-basic.log b/src/test/java/dk/camelot64/kickc/test/ref/sinus-basic.log
index d4fcb0315..5002f5008 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/sinus-basic.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/sinus-basic.log
@@ -3259,23 +3259,23 @@ Uplift Scope [divMEMbyFAC]
 Uplift Scope [sinFAC] 
 Uplift Scope [divFACby10] 
 
-Uplifting [] best 6734 combination zp ZP_WORD:3 [ line_cursor#6 line_cursor#13 line_cursor#1 ] zp ZP_WORD:7 [ char_cursor#23 char_cursor#31 char_cursor#32 char_cursor#48 char_cursor#10 ] 
-Uplifting [setFAC] best 6734 combination zp ZP_WORD:13 [ setFAC::w#3 setFAC::w#1 ] 
-Uplifting [getFAC] best 6734 combination zp ZP_WORD:17 [ getFAC::return#2 ] zp ZP_WORD:23 [ getFAC::return#0 ] 
-Uplifting [prepareMEM] best 6722 combination zp ZP_WORD:9 [ prepareMEM::mem#5 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 ] reg byte a [ prepareMEM::$0 ] reg byte a [ prepareMEM::$1 ] 
-Uplifting [print_byte] best 6710 combination reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] reg byte y [ print_byte::$0 ] reg byte a [ print_byte::$2 ] 
-Uplifting [print_char] best 6701 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] 
-Uplifting [main] best 6701 combination zp ZP_BYTE:2 [ main::i#10 main::i#1 ] 
-Uplifting [print_word] best 6701 combination zp ZP_WORD:19 [ print_word::w#0 ] 
-Uplifting [setMEMtoFAC] best 6701 combination zp ZP_WORD:15 [ setMEMtoFAC::mem#2 ] 
-Uplifting [mulFACbyMEM] best 6701 combination zp ZP_WORD:11 [ mulFACbyMEM::mem#2 ] 
-Uplifting [print_ln] best 6701 combination 
-Uplifting [addMEMtoFAC] best 6701 combination 
-Uplifting [divMEMbyFAC] best 6701 combination 
-Uplifting [sinFAC] best 6701 combination 
-Uplifting [divFACby10] best 6701 combination 
+Uplifting [] best 6314 combination zp ZP_WORD:3 [ line_cursor#6 line_cursor#13 line_cursor#1 ] zp ZP_WORD:7 [ char_cursor#23 char_cursor#31 char_cursor#32 char_cursor#48 char_cursor#10 ] 
+Uplifting [setFAC] best 6314 combination zp ZP_WORD:13 [ setFAC::w#3 setFAC::w#1 ] 
+Uplifting [getFAC] best 6314 combination zp ZP_WORD:17 [ getFAC::return#2 ] zp ZP_WORD:23 [ getFAC::return#0 ] 
+Uplifting [prepareMEM] best 6302 combination zp ZP_WORD:9 [ prepareMEM::mem#5 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 ] reg byte a [ prepareMEM::$0 ] reg byte a [ prepareMEM::$1 ] 
+Uplifting [print_byte] best 6290 combination reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] reg byte y [ print_byte::$0 ] reg byte a [ print_byte::$2 ] 
+Uplifting [print_char] best 6281 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] 
+Uplifting [main] best 6281 combination zp ZP_BYTE:2 [ main::i#10 main::i#1 ] 
+Uplifting [print_word] best 6281 combination zp ZP_WORD:19 [ print_word::w#0 ] 
+Uplifting [setMEMtoFAC] best 6281 combination zp ZP_WORD:15 [ setMEMtoFAC::mem#2 ] 
+Uplifting [mulFACbyMEM] best 6281 combination zp ZP_WORD:11 [ mulFACbyMEM::mem#2 ] 
+Uplifting [print_ln] best 6281 combination 
+Uplifting [addMEMtoFAC] best 6281 combination 
+Uplifting [divMEMbyFAC] best 6281 combination 
+Uplifting [sinFAC] best 6281 combination 
+Uplifting [divFACby10] best 6281 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::i#10 main::i#1 ]
-Uplifting [main] best 6701 combination zp ZP_BYTE:2 [ main::i#10 main::i#1 ] 
+Uplifting [main] best 6281 combination zp ZP_BYTE:2 [ main::i#10 main::i#1 ] 
 Coalescing zero page register [ zp ZP_WORD:9 [ prepareMEM::mem#5 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 ] ] with [ zp ZP_WORD:11 [ mulFACbyMEM::mem#2 ] ]
 Coalescing zero page register [ zp ZP_WORD:9 [ prepareMEM::mem#5 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 mulFACbyMEM::mem#2 ] ] with [ zp ZP_WORD:13 [ setFAC::w#3 setFAC::w#1 ] ]
 Coalescing zero page register [ zp ZP_WORD:9 [ prepareMEM::mem#5 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 mulFACbyMEM::mem#2 setFAC::w#3 setFAC::w#1 ] ] with [ zp ZP_WORD:15 [ setMEMtoFAC::mem#2 ] ]
@@ -4043,7 +4043,7 @@ reg byte a [ prepareMEM::$1 ]
 
 
 FINAL ASSEMBLER
-Score: 5347
+Score: 4973
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log
index bbe4cd5ce..839abdadc 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log
@@ -7872,67 +7872,67 @@ Uplift Scope [main]
 Uplift Scope [progress_init] 
 Uplift Scope [progress_inc] 
 
-Uplifting [gen_chargen_sprite] best 1076973 combination zp ZP_BYTE:40 [ gen_chargen_sprite::s_gen#3 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen#6 gen_chargen_sprite::s_gen#1 ] zp ZP_WORD:43 [ gen_chargen_sprite::sprite#3 gen_chargen_sprite::sprite#10 gen_chargen_sprite::sprite#11 gen_chargen_sprite::sprite#0 gen_chargen_sprite::sprite#2 gen_chargen_sprite::sprite#4 gen_chargen_sprite::sprite#1 ] reg byte y [ gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::s_gen_cnt#5 gen_chargen_sprite::s_gen_cnt#1 ] reg byte a [ gen_chargen_sprite::$6 ] reg byte x [ gen_chargen_sprite::b#2 gen_chargen_sprite::b#1 ] reg byte a [ gen_chargen_sprite::$3 ] zp ZP_BYTE:38 [ gen_chargen_sprite::x#6 gen_chargen_sprite::x#1 ] zp ZP_BYTE:37 [ gen_chargen_sprite::bits#2 gen_chargen_sprite::bits#0 gen_chargen_sprite::bits#1 ] zp ZP_BYTE:39 [ gen_chargen_sprite::c#3 ] zp ZP_BYTE:36 [ gen_chargen_sprite::y#2 gen_chargen_sprite::y#1 ] reg byte x [ gen_chargen_sprite::ch#0 ] zp ZP_WORD:66 [ gen_chargen_sprite::$0 ] zp ZP_WORD:68 [ gen_chargen_sprite::$1 ] zp ZP_WORD:70 [ gen_chargen_sprite::chargen#0 ] 
+Uplifting [gen_chargen_sprite] best 1066491 combination zp ZP_BYTE:40 [ gen_chargen_sprite::s_gen#3 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen#6 gen_chargen_sprite::s_gen#1 ] zp ZP_WORD:43 [ gen_chargen_sprite::sprite#3 gen_chargen_sprite::sprite#10 gen_chargen_sprite::sprite#11 gen_chargen_sprite::sprite#0 gen_chargen_sprite::sprite#2 gen_chargen_sprite::sprite#4 gen_chargen_sprite::sprite#1 ] reg byte y [ gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::s_gen_cnt#5 gen_chargen_sprite::s_gen_cnt#1 ] reg byte a [ gen_chargen_sprite::$6 ] reg byte x [ gen_chargen_sprite::b#2 gen_chargen_sprite::b#1 ] reg byte a [ gen_chargen_sprite::$3 ] zp ZP_BYTE:38 [ gen_chargen_sprite::x#6 gen_chargen_sprite::x#1 ] zp ZP_BYTE:37 [ gen_chargen_sprite::bits#2 gen_chargen_sprite::bits#0 gen_chargen_sprite::bits#1 ] zp ZP_BYTE:39 [ gen_chargen_sprite::c#3 ] zp ZP_BYTE:36 [ gen_chargen_sprite::y#2 gen_chargen_sprite::y#1 ] reg byte x [ gen_chargen_sprite::ch#0 ] zp ZP_WORD:66 [ gen_chargen_sprite::$0 ] zp ZP_WORD:68 [ gen_chargen_sprite::$1 ] zp ZP_WORD:70 [ gen_chargen_sprite::chargen#0 ] 
 Uplift attempts [anim] 10000/77760 (limiting to 10000)
-Uplifting [anim] best 1073470 combination reg byte y [ anim::yidx#3 anim::yidx#0 anim::yidx#6 anim::yidx#1 anim::yidx#2 ] zp ZP_BYTE:4 [ anim::xidx#3 anim::xidx#0 anim::xidx#5 anim::xidx#1 anim::xidx#2 ] reg byte alu [ anim::$3 ] reg byte a [ anim::$5 ] reg byte a [ anim::j2#1 ] zp ZP_BYTE:8 [ anim::j#2 anim::j#1 ] zp ZP_BYTE:5 [ anim::x_msb#2 anim::x_msb#1 ] reg byte a [ anim::$2 ] zp ZP_BYTE:6 [ anim::j2#3 anim::j2#2 ] zp ZP_WORD:50 [ anim::x#0 ] 
+Uplifting [anim] best 1062988 combination reg byte y [ anim::yidx#3 anim::yidx#0 anim::yidx#6 anim::yidx#1 anim::yidx#2 ] zp ZP_BYTE:4 [ anim::xidx#3 anim::xidx#0 anim::xidx#5 anim::xidx#1 anim::xidx#2 ] reg byte alu [ anim::$3 ] reg byte a [ anim::$5 ] reg byte a [ anim::j2#1 ] zp ZP_BYTE:8 [ anim::j#2 anim::j#1 ] zp ZP_BYTE:5 [ anim::x_msb#2 anim::x_msb#1 ] reg byte a [ anim::$2 ] zp ZP_BYTE:6 [ anim::j2#3 anim::j2#2 ] zp ZP_WORD:50 [ anim::x#0 ] 
 Limited combination testing to 10000 combinations of 77760 possible.
-Uplifting [place_sprites] best 1073050 combination reg byte x [ place_sprites::j2#1 ] reg byte y [ place_sprites::j#2 place_sprites::j#1 ] zp ZP_BYTE:45 [ place_sprites::spr_id#2 place_sprites::spr_id#1 ] reg byte x [ place_sprites::j2#3 place_sprites::j2#2 ] zp ZP_BYTE:47 [ place_sprites::spr_x#2 place_sprites::spr_x#1 ] zp ZP_BYTE:49 [ place_sprites::col#2 place_sprites::col#1 ] 
-Uplifting [setFAC] best 1073050 combination zp ZP_WORD:29 [ setFAC::w#5 setFAC::w#0 setFAC::w#3 setFAC::w#4 setFAC::w#1 ] 
-Uplifting [gen_sintab] best 1072983 combination zp ZP_WORD:58 [ gen_sintab::$23 ] reg byte a [ gen_sintab::$24 ] zp ZP_BYTE:17 [ gen_sintab::i#10 gen_sintab::i#1 ] reg byte x [ gen_sintab::max#2 ] zp ZP_BYTE:14 [ gen_sintab::length#10 ] zp ZP_BYTE:13 [ gen_sintab::min#2 ] zp ZP_WORD:15 [ gen_sintab::sintab#12 ] 
-Uplifting [gen_sprites] best 1072983 combination zp ZP_BYTE:33 [ gen_sprites::i#2 gen_sprites::i#1 ] zp ZP_WORD:34 [ gen_sprites::spr#2 gen_sprites::spr#1 ] 
-Uplifting [clear_screen] best 1072983 combination zp ZP_WORD:10 [ clear_screen::sc#2 clear_screen::sc#1 ] 
-Uplifting [prepareMEM] best 1072971 combination zp ZP_WORD:23 [ prepareMEM::mem#5 prepareMEM::mem#2 prepareMEM::mem#3 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 ] reg byte a [ prepareMEM::$0 ] reg byte a [ prepareMEM::$1 ] 
-Uplifting [init] best 1072821 combination reg byte x [ init::i#2 init::i#1 ] 
-Uplifting [getFAC] best 1072821 combination zp ZP_WORD:56 [ getFAC::return#2 ] zp ZP_WORD:61 [ getFAC::return#0 ] 
-Uplifting [] best 1072821 combination zp ZP_WORD:19 [ progress_cursor#34 progress_init::line#2 progress_cursor#11 progress_cursor#10 ] zp ZP_BYTE:18 [ progress_idx#34 progress_idx#12 progress_idx#10 ] zp ZP_BYTE:3 [ sin_idx_y#13 sin_idx_y#11 sin_idx_y#3 ] zp ZP_BYTE:2 [ sin_idx_x#13 sin_idx_x#11 sin_idx_x#3 ] 
-Uplifting [setMEMtoFAC] best 1072821 combination zp ZP_WORD:31 [ setMEMtoFAC::mem#5 ] 
-Uplifting [addMEMtoFAC] best 1072821 combination zp ZP_WORD:21 [ addMEMtoFAC::mem#2 ] 
-Uplifting [divMEMbyFAC] best 1072821 combination zp ZP_WORD:27 [ divMEMbyFAC::mem#2 ] 
-Uplifting [mulFACbyMEM] best 1072821 combination zp ZP_WORD:25 [ mulFACbyMEM::mem#2 ] 
-Uplifting [setARGtoFAC] best 1072821 combination 
-Uplifting [subFACfromARG] best 1072821 combination 
-Uplifting [sinFAC] best 1072821 combination 
-Uplifting [main] best 1072821 combination 
-Uplifting [progress_init] best 1072821 combination 
-Uplifting [progress_inc] best 1072821 combination 
+Uplifting [place_sprites] best 1062568 combination reg byte x [ place_sprites::j2#1 ] reg byte y [ place_sprites::j#2 place_sprites::j#1 ] zp ZP_BYTE:45 [ place_sprites::spr_id#2 place_sprites::spr_id#1 ] reg byte x [ place_sprites::j2#3 place_sprites::j2#2 ] zp ZP_BYTE:47 [ place_sprites::spr_x#2 place_sprites::spr_x#1 ] zp ZP_BYTE:49 [ place_sprites::col#2 place_sprites::col#1 ] 
+Uplifting [setFAC] best 1062568 combination zp ZP_WORD:29 [ setFAC::w#5 setFAC::w#0 setFAC::w#3 setFAC::w#4 setFAC::w#1 ] 
+Uplifting [gen_sintab] best 1062501 combination zp ZP_WORD:58 [ gen_sintab::$23 ] reg byte a [ gen_sintab::$24 ] zp ZP_BYTE:17 [ gen_sintab::i#10 gen_sintab::i#1 ] reg byte x [ gen_sintab::max#2 ] zp ZP_BYTE:14 [ gen_sintab::length#10 ] zp ZP_BYTE:13 [ gen_sintab::min#2 ] zp ZP_WORD:15 [ gen_sintab::sintab#12 ] 
+Uplifting [gen_sprites] best 1062501 combination zp ZP_BYTE:33 [ gen_sprites::i#2 gen_sprites::i#1 ] zp ZP_WORD:34 [ gen_sprites::spr#2 gen_sprites::spr#1 ] 
+Uplifting [clear_screen] best 1062501 combination zp ZP_WORD:10 [ clear_screen::sc#2 clear_screen::sc#1 ] 
+Uplifting [prepareMEM] best 1062489 combination zp ZP_WORD:23 [ prepareMEM::mem#5 prepareMEM::mem#2 prepareMEM::mem#3 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 ] reg byte a [ prepareMEM::$0 ] reg byte a [ prepareMEM::$1 ] 
+Uplifting [init] best 1062339 combination reg byte x [ init::i#2 init::i#1 ] 
+Uplifting [getFAC] best 1062339 combination zp ZP_WORD:56 [ getFAC::return#2 ] zp ZP_WORD:61 [ getFAC::return#0 ] 
+Uplifting [] best 1062339 combination zp ZP_WORD:19 [ progress_cursor#34 progress_init::line#2 progress_cursor#11 progress_cursor#10 ] zp ZP_BYTE:18 [ progress_idx#34 progress_idx#12 progress_idx#10 ] zp ZP_BYTE:3 [ sin_idx_y#13 sin_idx_y#11 sin_idx_y#3 ] zp ZP_BYTE:2 [ sin_idx_x#13 sin_idx_x#11 sin_idx_x#3 ] 
+Uplifting [setMEMtoFAC] best 1062339 combination zp ZP_WORD:31 [ setMEMtoFAC::mem#5 ] 
+Uplifting [addMEMtoFAC] best 1062339 combination zp ZP_WORD:21 [ addMEMtoFAC::mem#2 ] 
+Uplifting [divMEMbyFAC] best 1062339 combination zp ZP_WORD:27 [ divMEMbyFAC::mem#2 ] 
+Uplifting [mulFACbyMEM] best 1062339 combination zp ZP_WORD:25 [ mulFACbyMEM::mem#2 ] 
+Uplifting [setARGtoFAC] best 1062339 combination 
+Uplifting [subFACfromARG] best 1062339 combination 
+Uplifting [sinFAC] best 1062339 combination 
+Uplifting [main] best 1062339 combination 
+Uplifting [progress_init] best 1062339 combination 
+Uplifting [progress_inc] best 1062339 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:40 [ gen_chargen_sprite::s_gen#3 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen#6 gen_chargen_sprite::s_gen#1 ]
-Uplifting [gen_chargen_sprite] best 1072821 combination zp ZP_BYTE:40 [ gen_chargen_sprite::s_gen#3 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen#6 gen_chargen_sprite::s_gen#1 ] 
+Uplifting [gen_chargen_sprite] best 1062339 combination zp ZP_BYTE:40 [ gen_chargen_sprite::s_gen#3 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen#6 gen_chargen_sprite::s_gen#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:38 [ gen_chargen_sprite::x#6 gen_chargen_sprite::x#1 ]
-Uplifting [gen_chargen_sprite] best 1072821 combination zp ZP_BYTE:38 [ gen_chargen_sprite::x#6 gen_chargen_sprite::x#1 ] 
+Uplifting [gen_chargen_sprite] best 1062339 combination zp ZP_BYTE:38 [ gen_chargen_sprite::x#6 gen_chargen_sprite::x#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:37 [ gen_chargen_sprite::bits#2 gen_chargen_sprite::bits#0 gen_chargen_sprite::bits#1 ]
-Uplifting [gen_chargen_sprite] best 1072821 combination zp ZP_BYTE:37 [ gen_chargen_sprite::bits#2 gen_chargen_sprite::bits#0 gen_chargen_sprite::bits#1 ] 
+Uplifting [gen_chargen_sprite] best 1062339 combination zp ZP_BYTE:37 [ gen_chargen_sprite::bits#2 gen_chargen_sprite::bits#0 gen_chargen_sprite::bits#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:39 [ gen_chargen_sprite::c#3 ]
-Uplifting [gen_chargen_sprite] best 1072821 combination zp ZP_BYTE:39 [ gen_chargen_sprite::c#3 ] 
+Uplifting [gen_chargen_sprite] best 1062339 combination zp ZP_BYTE:39 [ gen_chargen_sprite::c#3 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:4 [ anim::xidx#3 anim::xidx#0 anim::xidx#5 anim::xidx#1 anim::xidx#2 ]
-Uplifting [anim] best 1072821 combination zp ZP_BYTE:4 [ anim::xidx#3 anim::xidx#0 anim::xidx#5 anim::xidx#1 anim::xidx#2 ] 
+Uplifting [anim] best 1062339 combination zp ZP_BYTE:4 [ anim::xidx#3 anim::xidx#0 anim::xidx#5 anim::xidx#1 anim::xidx#2 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:36 [ gen_chargen_sprite::y#2 gen_chargen_sprite::y#1 ]
-Uplifting [gen_chargen_sprite] best 1072821 combination zp ZP_BYTE:36 [ gen_chargen_sprite::y#2 gen_chargen_sprite::y#1 ] 
+Uplifting [gen_chargen_sprite] best 1062339 combination zp ZP_BYTE:36 [ gen_chargen_sprite::y#2 gen_chargen_sprite::y#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:8 [ anim::j#2 anim::j#1 ]
-Uplifting [anim] best 1072821 combination zp ZP_BYTE:8 [ anim::j#2 anim::j#1 ] 
+Uplifting [anim] best 1062339 combination zp ZP_BYTE:8 [ anim::j#2 anim::j#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:5 [ anim::x_msb#2 anim::x_msb#1 ]
-Uplifting [anim] best 1072821 combination zp ZP_BYTE:5 [ anim::x_msb#2 anim::x_msb#1 ] 
+Uplifting [anim] best 1062339 combination zp ZP_BYTE:5 [ anim::x_msb#2 anim::x_msb#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:6 [ anim::j2#3 anim::j2#2 ]
-Uplifting [anim] best 1072821 combination zp ZP_BYTE:6 [ anim::j2#3 anim::j2#2 ] 
+Uplifting [anim] best 1062339 combination zp ZP_BYTE:6 [ anim::j2#3 anim::j2#2 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:33 [ gen_sprites::i#2 gen_sprites::i#1 ]
-Uplifting [gen_sprites] best 1072821 combination zp ZP_BYTE:33 [ gen_sprites::i#2 gen_sprites::i#1 ] 
+Uplifting [gen_sprites] best 1062339 combination zp ZP_BYTE:33 [ gen_sprites::i#2 gen_sprites::i#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:45 [ place_sprites::spr_id#2 place_sprites::spr_id#1 ]
-Uplifting [place_sprites] best 1072821 combination zp ZP_BYTE:45 [ place_sprites::spr_id#2 place_sprites::spr_id#1 ] 
+Uplifting [place_sprites] best 1062339 combination zp ZP_BYTE:45 [ place_sprites::spr_id#2 place_sprites::spr_id#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:17 [ gen_sintab::i#10 gen_sintab::i#1 ]
-Uplifting [gen_sintab] best 1072821 combination zp ZP_BYTE:17 [ gen_sintab::i#10 gen_sintab::i#1 ] 
+Uplifting [gen_sintab] best 1062339 combination zp ZP_BYTE:17 [ gen_sintab::i#10 gen_sintab::i#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:47 [ place_sprites::spr_x#2 place_sprites::spr_x#1 ]
-Uplifting [place_sprites] best 1072821 combination zp ZP_BYTE:47 [ place_sprites::spr_x#2 place_sprites::spr_x#1 ] 
+Uplifting [place_sprites] best 1062339 combination zp ZP_BYTE:47 [ place_sprites::spr_x#2 place_sprites::spr_x#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:49 [ place_sprites::col#2 place_sprites::col#1 ]
-Uplifting [place_sprites] best 1072821 combination zp ZP_BYTE:49 [ place_sprites::col#2 place_sprites::col#1 ] 
+Uplifting [place_sprites] best 1062339 combination zp ZP_BYTE:49 [ place_sprites::col#2 place_sprites::col#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:18 [ progress_idx#34 progress_idx#12 progress_idx#10 ]
-Uplifting [] best 1072821 combination zp ZP_BYTE:18 [ progress_idx#34 progress_idx#12 progress_idx#10 ] 
+Uplifting [] best 1062339 combination zp ZP_BYTE:18 [ progress_idx#34 progress_idx#12 progress_idx#10 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:3 [ sin_idx_y#13 sin_idx_y#11 sin_idx_y#3 ]
-Uplifting [] best 1072821 combination zp ZP_BYTE:3 [ sin_idx_y#13 sin_idx_y#11 sin_idx_y#3 ] 
+Uplifting [] best 1062339 combination zp ZP_BYTE:3 [ sin_idx_y#13 sin_idx_y#11 sin_idx_y#3 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ sin_idx_x#13 sin_idx_x#11 sin_idx_x#3 ]
-Uplifting [] best 1072821 combination zp ZP_BYTE:2 [ sin_idx_x#13 sin_idx_x#11 sin_idx_x#3 ] 
+Uplifting [] best 1062339 combination zp ZP_BYTE:2 [ sin_idx_x#13 sin_idx_x#11 sin_idx_x#3 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:14 [ gen_sintab::length#10 ]
-Uplifting [gen_sintab] best 1072821 combination zp ZP_BYTE:14 [ gen_sintab::length#10 ] 
+Uplifting [gen_sintab] best 1062339 combination zp ZP_BYTE:14 [ gen_sintab::length#10 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:13 [ gen_sintab::min#2 ]
-Uplifting [gen_sintab] best 1072821 combination zp ZP_BYTE:13 [ gen_sintab::min#2 ] 
+Uplifting [gen_sintab] best 1062339 combination zp ZP_BYTE:13 [ gen_sintab::min#2 ] 
 Coalescing zero page register [ zp ZP_BYTE:2 [ sin_idx_x#13 sin_idx_x#11 sin_idx_x#3 ] ] with [ zp ZP_BYTE:13 [ gen_sintab::min#2 ] ]
 Coalescing zero page register [ zp ZP_BYTE:2 [ sin_idx_x#13 sin_idx_x#11 sin_idx_x#3 gen_sintab::min#2 ] ] with [ zp ZP_BYTE:17 [ gen_sintab::i#10 gen_sintab::i#1 ] ]
 Coalescing zero page register [ zp ZP_BYTE:2 [ sin_idx_x#13 sin_idx_x#11 sin_idx_x#3 gen_sintab::min#2 gen_sintab::i#10 gen_sintab::i#1 ] ] with [ zp ZP_BYTE:33 [ gen_sprites::i#2 gen_sprites::i#1 ] ]
@@ -9966,7 +9966,7 @@ reg byte x [ place_sprites::j2#1 ]
 
 
 FINAL ASSEMBLER
-Score: 779436
+Score: 769007
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/summin.log b/src/test/java/dk/camelot64/kickc/test/ref/summin.log
index 787fbdabf..ecc50079f 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/summin.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/summin.log
@@ -604,13 +604,13 @@ Uplift Scope [sum] 4: zp ZP_BYTE:4 [ sum::return#0 ] 4: zp ZP_BYTE:6 [ sum::retu
 Uplift Scope [main] 4: zp ZP_BYTE:10 [ main::$3 ] 4: zp ZP_BYTE:11 [ main::s4#0 ] 2: zp ZP_BYTE:9 [ main::s3#0 ] 1: zp ZP_BYTE:7 [ main::s2#0 ] 0.57: zp ZP_BYTE:5 [ main::s1#0 ] 
 Uplift Scope [] 
 
-Uplifting [sum] best 117 combination reg byte a [ sum::return#0 ] reg byte a [ sum::return#1 ] reg byte a [ sum::return#2 ] reg byte x [ sum::a#3 ] reg byte a [ sum::b#3 ] reg byte a [ sum::return#3 ] 
-Uplifting [main] best 103 combination reg byte a [ main::$3 ] reg byte a [ main::s4#0 ] zp ZP_BYTE:9 [ main::s3#0 ] reg byte y [ main::s2#0 ] zp ZP_BYTE:5 [ main::s1#0 ] 
-Uplifting [] best 103 combination 
+Uplifting [sum] best 115 combination reg byte a [ sum::return#0 ] reg byte a [ sum::return#1 ] reg byte a [ sum::return#2 ] reg byte x [ sum::a#3 ] reg byte a [ sum::b#3 ] reg byte a [ sum::return#3 ] 
+Uplifting [main] best 101 combination reg byte a [ main::$3 ] reg byte a [ main::s4#0 ] zp ZP_BYTE:9 [ main::s3#0 ] reg byte y [ main::s2#0 ] zp ZP_BYTE:5 [ main::s1#0 ] 
+Uplifting [] best 101 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:9 [ main::s3#0 ]
-Uplifting [main] best 103 combination zp ZP_BYTE:9 [ main::s3#0 ] 
+Uplifting [main] best 101 combination zp ZP_BYTE:9 [ main::s3#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:5 [ main::s1#0 ]
-Uplifting [main] best 103 combination zp ZP_BYTE:5 [ main::s1#0 ] 
+Uplifting [main] best 101 combination zp ZP_BYTE:5 [ main::s1#0 ] 
 Allocated (was zp ZP_BYTE:5) zp ZP_BYTE:2 [ main::s1#0 ]
 Allocated (was zp ZP_BYTE:9) zp ZP_BYTE:3 [ main::s3#0 ]
 
@@ -786,7 +786,7 @@ reg byte a [ sum::return#3 ]
 
 
 FINAL ASSEMBLER
-Score: 82
+Score: 80
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.asm b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.asm
index fd6e375e7..c20aaf10c 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.asm
+++ b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.asm
@@ -34,7 +34,7 @@ signed_multiply_results_compare: {
     sta ms
     lda slow_signed_multiply.return+1
     sta ms+1
-    lda b
+    lda a
     tay
     jsr signed_multiply
     lda ms
@@ -244,33 +244,30 @@ print_sbyte: {
 }
 signed_multiply: {
     .label _6 = $e
-    .label _12 = $e
     .label m = 6
     .label return = 6
-    .label a = 2
-    lda a
-    tax
-    tya
+    .label b = 3
+    sty $ff
+    ldx $ff
+    lda b
     jsr multiply
-    lda a
-    cmp #0
+    cpy #0
     bpl b1
     lda m+1
     sta _6
-    tya
+    lda b
     eor #$ff
     sec
     adc _6
     sta m+1
   b1:
-    cpy #0
+    lda b
+    cmp #0
     bpl b2
     lda m+1
-    sta _12
-    lda a
-    eor #$ff
+    sty $ff
     sec
-    adc _12
+    sbc $ff
     sta m+1
   b2:
     rts
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.log b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.log
index dfb5e2a36..854d2536d 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.log
@@ -8363,64 +8363,62 @@ Uplift Scope [print_ln]
 Uplift Scope [main] 
 Uplift Scope [init_multiply_asm] 
 
-Uplifting [slow_signed_multiply] best 234039 combination zp ZP_WORD:22 [ slow_signed_multiply::m#5 slow_signed_multiply::return#0 slow_signed_multiply::m#3 slow_signed_multiply::m#1 slow_signed_multiply::m#2 ] reg byte y [ slow_signed_multiply::i#2 slow_signed_multiply::i#1 ] reg byte y [ slow_signed_multiply::j#2 slow_signed_multiply::j#1 ] zp ZP_WORD:52 [ slow_signed_multiply::return#2 ] reg byte x [ slow_signed_multiply::b#0 ] zp ZP_BYTE:50 [ slow_signed_multiply::a#0 ] 
-Uplifting [slow_multiply] best 223739 combination zp ZP_WORD:28 [ slow_multiply::return#0 slow_multiply::m#3 slow_multiply::m#1 ] reg byte y [ slow_multiply::i#2 slow_multiply::i#1 ] zp ZP_WORD:84 [ slow_multiply::return#2 ] reg byte x [ slow_multiply::b#0 ] zp ZP_BYTE:82 [ slow_multiply::a#0 ] 
-Uplifting [multiply] best 223129 combination reg byte a [ multiply::b#2 multiply::b#1 multiply::b#0 ] reg byte x [ multiply::a#2 multiply::a#1 multiply::a#0 ] zp ZP_WORD:88 [ multiply::return#3 ] zp ZP_WORD:80 [ multiply::return#0 ] zp ZP_WORD:70 [ multiply::return#2 ] 
+Uplifting [slow_signed_multiply] best 214696 combination zp ZP_WORD:22 [ slow_signed_multiply::m#5 slow_signed_multiply::return#0 slow_signed_multiply::m#3 slow_signed_multiply::m#1 slow_signed_multiply::m#2 ] reg byte y [ slow_signed_multiply::i#2 slow_signed_multiply::i#1 ] reg byte y [ slow_signed_multiply::j#2 slow_signed_multiply::j#1 ] zp ZP_WORD:52 [ slow_signed_multiply::return#2 ] reg byte x [ slow_signed_multiply::b#0 ] zp ZP_BYTE:50 [ slow_signed_multiply::a#0 ] 
+Uplifting [slow_multiply] best 204396 combination zp ZP_WORD:28 [ slow_multiply::return#0 slow_multiply::m#3 slow_multiply::m#1 ] reg byte y [ slow_multiply::i#2 slow_multiply::i#1 ] zp ZP_WORD:84 [ slow_multiply::return#2 ] reg byte x [ slow_multiply::b#0 ] zp ZP_BYTE:82 [ slow_multiply::a#0 ] 
+Uplifting [multiply] best 203786 combination reg byte a [ multiply::b#2 multiply::b#1 multiply::b#0 ] reg byte x [ multiply::a#2 multiply::a#1 multiply::a#0 ] zp ZP_WORD:88 [ multiply::return#3 ] zp ZP_WORD:80 [ multiply::return#0 ] zp ZP_WORD:70 [ multiply::return#2 ] 
 Uplift attempts [signed_multiply] 10000/16384 (limiting to 10000)
-Uplifting [signed_multiply] best 223004 combination zp ZP_WORD:58 [ signed_multiply::return#2 ] zp ZP_WORD:78 [ signed_multiply::return#0 ] zp ZP_WORD:17 [ signed_multiply::m#4 signed_multiply::m#5 signed_multiply::m#1 signed_multiply::m#0 signed_multiply::m#2 ] reg byte y [ signed_multiply::b#0 ] zp ZP_BYTE:56 [ signed_multiply::a#0 ] reg byte a [ signed_multiply::$7 ] reg byte a [ signed_multiply::$16 ] reg byte a [ signed_multiply::$13 ] reg byte a [ signed_multiply::$17 ] zp ZP_BYTE:72 [ signed_multiply::$6 ] zp ZP_BYTE:75 [ signed_multiply::$12 ] 
+Uplifting [signed_multiply] best 203659 combination zp ZP_WORD:58 [ signed_multiply::return#2 ] zp ZP_WORD:78 [ signed_multiply::return#0 ] zp ZP_WORD:17 [ signed_multiply::m#4 signed_multiply::m#5 signed_multiply::m#1 signed_multiply::m#0 signed_multiply::m#2 ] zp ZP_BYTE:57 [ signed_multiply::b#0 ] reg byte y [ signed_multiply::a#0 ] reg byte a [ signed_multiply::$7 ] reg byte a [ signed_multiply::$16 ] reg byte y [ signed_multiply::$13 ] reg byte a [ signed_multiply::$17 ] zp ZP_BYTE:72 [ signed_multiply::$6 ] reg byte a [ signed_multiply::$12 ] 
 Limited combination testing to 10000 combinations of 16384 possible.
-Uplifting [multiply_results_compare] best 223004 combination zp ZP_BYTE:26 [ multiply_results_compare::b#2 multiply_results_compare::b#1 ] zp ZP_WORD:90 [ multiply_results_compare::ma#0 ] zp ZP_BYTE:25 [ multiply_results_compare::a#6 multiply_results_compare::a#1 ] zp ZP_WORD:86 [ multiply_results_compare::ms#0 ] 
-Uplifting [signed_multiply_results_compare] best 223004 combination zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 ] zp ZP_WORD:60 [ signed_multiply_results_compare::ma#0 ] zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 ] zp ZP_WORD:54 [ signed_multiply_results_compare::ms#0 ] 
-Uplifting [init_multiply] best 222654 combination zp ZP_WORD:40 [ init_multiply::sqr#3 init_multiply::sqr#4 init_multiply::sqr#1 init_multiply::sqr#2 ] reg byte x [ init_multiply::c#2 init_multiply::c#1 ] zp ZP_BYTE:39 [ init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 ] reg byte a [ init_multiply::$2 ] reg byte a [ init_multiply::$5 ] reg byte a [ init_multiply::$6 ] zp ZP_WORD:43 [ init_multiply::sqr2_lo#2 init_multiply::sqr2_lo#1 ] zp ZP_WORD:35 [ init_multiply::sqr1_lo#2 init_multiply::sqr1_lo#1 ] reg byte x [ init_multiply::x_255#2 init_multiply::x_255#1 ] zp ZP_WORD:45 [ init_multiply::sqr2_hi#2 init_multiply::sqr2_hi#1 ] zp ZP_BYTE:47 [ init_multiply::dir#2 init_multiply::dir#3 ] zp ZP_WORD:37 [ init_multiply::sqr1_hi#2 init_multiply::sqr1_hi#1 ] 
-Uplifting [] best 222654 combination zp ZP_WORD:14 [ char_cursor#75 char_cursor#124 char_cursor#123 char_cursor#119 char_cursor#135 char_cursor#27 char_cursor#118 char_cursor#17 char_cursor#117 char_cursor#172 char_cursor#176 char_cursor#1 char_cursor#121 char_cursor#197 ] zp ZP_WORD:4 [ line_cursor#20 line_cursor#40 line_cursor#27 line_cursor#1 ] 
-Uplifting [multiply_tables_compare] best 222654 combination zp ZP_WORD:30 [ multiply_tables_compare::kc_sqr#2 multiply_tables_compare::kc_sqr#1 ] zp ZP_WORD:32 [ multiply_tables_compare::asm_sqr#2 multiply_tables_compare::asm_sqr#1 ] 
-Uplifting [print_str] best 222654 combination zp ZP_WORD:6 [ print_str::str#14 print_str::str#16 print_str::str#0 ] 
-Uplifting [print_cls] best 222654 combination zp ZP_WORD:48 [ print_cls::sc#2 print_cls::sc#1 ] 
-Uplifting [print_byte] best 222635 combination reg byte x [ print_byte::b#5 print_byte::b#3 print_byte::b#4 print_byte::b#0 print_byte::b#1 print_byte::b#2 ] reg byte y [ print_byte::$0 ] reg byte a [ print_byte::$2 ] 
-Uplifting [print_word] best 222635 combination zp ZP_WORD:10 [ print_word::w#5 print_word::w#3 print_word::w#4 print_word::w#1 print_word::w#2 print_word::w#0 ] 
-Uplifting [print_sword] best 222635 combination zp ZP_WORD:8 [ print_sword::w#4 print_sword::w#3 print_sword::w#1 print_sword::w#2 print_sword::w#0 ] 
-Uplifting [print_sbyte] best 222623 combination reg byte x [ print_sbyte::b#4 print_sbyte::b#3 print_sbyte::b#1 print_sbyte::b#2 print_sbyte::b#0 ] 
-Uplifting [print_char] best 222608 combination reg byte a [ print_char::ch#4 print_char::ch#2 print_char::ch#3 ] 
-Uplifting [multiply_error] best 222602 combination reg byte x [ multiply_error::a#0 ] zp ZP_BYTE:93 [ multiply_error::b#0 ] zp ZP_WORD:94 [ multiply_error::ms#0 ] zp ZP_WORD:96 [ multiply_error::ma#0 ] 
-Uplifting [signed_multiply_error] best 222596 combination reg byte x [ signed_multiply_error::a#0 ] zp ZP_BYTE:63 [ signed_multiply_error::b#0 ] zp ZP_WORD:64 [ signed_multiply_error::ms#0 ] zp ZP_WORD:66 [ signed_multiply_error::ma#0 ] 
-Uplifting [print_ln] best 222596 combination 
-Uplifting [main] best 222596 combination 
-Uplifting [init_multiply_asm] best 222596 combination 
+Uplifting [multiply_results_compare] best 203659 combination zp ZP_BYTE:26 [ multiply_results_compare::b#2 multiply_results_compare::b#1 ] zp ZP_WORD:90 [ multiply_results_compare::ma#0 ] zp ZP_BYTE:25 [ multiply_results_compare::a#6 multiply_results_compare::a#1 ] zp ZP_WORD:86 [ multiply_results_compare::ms#0 ] 
+Uplifting [signed_multiply_results_compare] best 203659 combination zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 ] zp ZP_WORD:60 [ signed_multiply_results_compare::ma#0 ] zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 ] zp ZP_WORD:54 [ signed_multiply_results_compare::ms#0 ] 
+Uplifting [init_multiply] best 203309 combination zp ZP_WORD:40 [ init_multiply::sqr#3 init_multiply::sqr#4 init_multiply::sqr#1 init_multiply::sqr#2 ] reg byte x [ init_multiply::c#2 init_multiply::c#1 ] zp ZP_BYTE:39 [ init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 ] reg byte a [ init_multiply::$2 ] reg byte a [ init_multiply::$5 ] reg byte a [ init_multiply::$6 ] zp ZP_WORD:43 [ init_multiply::sqr2_lo#2 init_multiply::sqr2_lo#1 ] zp ZP_WORD:35 [ init_multiply::sqr1_lo#2 init_multiply::sqr1_lo#1 ] reg byte x [ init_multiply::x_255#2 init_multiply::x_255#1 ] zp ZP_WORD:45 [ init_multiply::sqr2_hi#2 init_multiply::sqr2_hi#1 ] zp ZP_BYTE:47 [ init_multiply::dir#2 init_multiply::dir#3 ] zp ZP_WORD:37 [ init_multiply::sqr1_hi#2 init_multiply::sqr1_hi#1 ] 
+Uplifting [] best 203309 combination zp ZP_WORD:14 [ char_cursor#75 char_cursor#124 char_cursor#123 char_cursor#119 char_cursor#135 char_cursor#27 char_cursor#118 char_cursor#17 char_cursor#117 char_cursor#172 char_cursor#176 char_cursor#1 char_cursor#121 char_cursor#197 ] zp ZP_WORD:4 [ line_cursor#20 line_cursor#40 line_cursor#27 line_cursor#1 ] 
+Uplifting [multiply_tables_compare] best 203309 combination zp ZP_WORD:30 [ multiply_tables_compare::kc_sqr#2 multiply_tables_compare::kc_sqr#1 ] zp ZP_WORD:32 [ multiply_tables_compare::asm_sqr#2 multiply_tables_compare::asm_sqr#1 ] 
+Uplifting [print_str] best 203309 combination zp ZP_WORD:6 [ print_str::str#14 print_str::str#16 print_str::str#0 ] 
+Uplifting [print_cls] best 203309 combination zp ZP_WORD:48 [ print_cls::sc#2 print_cls::sc#1 ] 
+Uplifting [print_byte] best 203290 combination reg byte x [ print_byte::b#5 print_byte::b#3 print_byte::b#4 print_byte::b#0 print_byte::b#1 print_byte::b#2 ] reg byte y [ print_byte::$0 ] reg byte a [ print_byte::$2 ] 
+Uplifting [print_word] best 203290 combination zp ZP_WORD:10 [ print_word::w#5 print_word::w#3 print_word::w#4 print_word::w#1 print_word::w#2 print_word::w#0 ] 
+Uplifting [print_sword] best 203290 combination zp ZP_WORD:8 [ print_sword::w#4 print_sword::w#3 print_sword::w#1 print_sword::w#2 print_sword::w#0 ] 
+Uplifting [print_sbyte] best 203278 combination reg byte x [ print_sbyte::b#4 print_sbyte::b#3 print_sbyte::b#1 print_sbyte::b#2 print_sbyte::b#0 ] 
+Uplifting [print_char] best 203263 combination reg byte a [ print_char::ch#4 print_char::ch#2 print_char::ch#3 ] 
+Uplifting [multiply_error] best 203257 combination reg byte x [ multiply_error::a#0 ] zp ZP_BYTE:93 [ multiply_error::b#0 ] zp ZP_WORD:94 [ multiply_error::ms#0 ] zp ZP_WORD:96 [ multiply_error::ma#0 ] 
+Uplifting [signed_multiply_error] best 203251 combination reg byte x [ signed_multiply_error::a#0 ] zp ZP_BYTE:63 [ signed_multiply_error::b#0 ] zp ZP_WORD:64 [ signed_multiply_error::ms#0 ] zp ZP_WORD:66 [ signed_multiply_error::ma#0 ] 
+Uplifting [print_ln] best 203251 combination 
+Uplifting [main] best 203251 combination 
+Uplifting [init_multiply_asm] best 203251 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 ]
-Uplifting [signed_multiply_results_compare] best 222596 combination zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 ] 
+Uplifting [signed_multiply_results_compare] best 203251 combination zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:26 [ multiply_results_compare::b#2 multiply_results_compare::b#1 ]
-Uplifting [multiply_results_compare] best 222596 combination zp ZP_BYTE:26 [ multiply_results_compare::b#2 multiply_results_compare::b#1 ] 
+Uplifting [multiply_results_compare] best 203251 combination zp ZP_BYTE:26 [ multiply_results_compare::b#2 multiply_results_compare::b#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:50 [ slow_signed_multiply::a#0 ]
-Uplifting [slow_signed_multiply] best 222596 combination zp ZP_BYTE:50 [ slow_signed_multiply::a#0 ] 
+Uplifting [slow_signed_multiply] best 203251 combination zp ZP_BYTE:50 [ slow_signed_multiply::a#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:82 [ slow_multiply::a#0 ]
-Uplifting [slow_multiply] best 222596 combination zp ZP_BYTE:82 [ slow_multiply::a#0 ] 
+Uplifting [slow_multiply] best 203251 combination zp ZP_BYTE:82 [ slow_multiply::a#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 ]
-Uplifting [signed_multiply_results_compare] best 222596 combination zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 ] 
+Uplifting [signed_multiply_results_compare] best 203251 combination zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:25 [ multiply_results_compare::a#6 multiply_results_compare::a#1 ]
-Uplifting [multiply_results_compare] best 222596 combination zp ZP_BYTE:25 [ multiply_results_compare::a#6 multiply_results_compare::a#1 ] 
+Uplifting [multiply_results_compare] best 203251 combination zp ZP_BYTE:25 [ multiply_results_compare::a#6 multiply_results_compare::a#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:39 [ init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 ]
-Uplifting [init_multiply] best 222596 combination zp ZP_BYTE:39 [ init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 ] 
+Uplifting [init_multiply] best 203251 combination zp ZP_BYTE:39 [ init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:47 [ init_multiply::dir#2 init_multiply::dir#3 ]
-Uplifting [init_multiply] best 222596 combination zp ZP_BYTE:47 [ init_multiply::dir#2 init_multiply::dir#3 ] 
-Attempting to uplift remaining variables inzp ZP_BYTE:56 [ signed_multiply::a#0 ]
-Uplifting [signed_multiply] best 222596 combination zp ZP_BYTE:56 [ signed_multiply::a#0 ] 
+Uplifting [init_multiply] best 203251 combination zp ZP_BYTE:47 [ init_multiply::dir#2 init_multiply::dir#3 ] 
+Attempting to uplift remaining variables inzp ZP_BYTE:57 [ signed_multiply::b#0 ]
+Uplifting [signed_multiply] best 203251 combination zp ZP_BYTE:57 [ signed_multiply::b#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:72 [ signed_multiply::$6 ]
-Uplifting [signed_multiply] best 222596 combination zp ZP_BYTE:72 [ signed_multiply::$6 ] 
-Attempting to uplift remaining variables inzp ZP_BYTE:75 [ signed_multiply::$12 ]
-Uplifting [signed_multiply] best 222596 combination zp ZP_BYTE:75 [ signed_multiply::$12 ] 
+Uplifting [signed_multiply] best 203251 combination zp ZP_BYTE:72 [ signed_multiply::$6 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:63 [ signed_multiply_error::b#0 ]
-Uplifting [signed_multiply_error] best 222596 combination zp ZP_BYTE:63 [ signed_multiply_error::b#0 ] 
+Uplifting [signed_multiply_error] best 203251 combination zp ZP_BYTE:63 [ signed_multiply_error::b#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:93 [ multiply_error::b#0 ]
-Uplifting [multiply_error] best 222596 combination zp ZP_BYTE:93 [ multiply_error::b#0 ] 
+Uplifting [multiply_error] best 203251 combination zp ZP_BYTE:93 [ multiply_error::b#0 ] 
 Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 ] ] with [ zp ZP_BYTE:25 [ multiply_results_compare::a#6 multiply_results_compare::a#1 ] ]
 Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 ] ] with [ zp ZP_BYTE:39 [ init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 ] ]
 Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 ] ] with [ zp ZP_BYTE:47 [ init_multiply::dir#2 init_multiply::dir#3 ] ]
 Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 ] ] with [ zp ZP_BYTE:50 [ slow_signed_multiply::a#0 ] ]
-Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 ] ] with [ zp ZP_BYTE:56 [ signed_multiply::a#0 ] ]
-Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 signed_multiply::a#0 ] ] with [ zp ZP_BYTE:63 [ signed_multiply_error::b#0 ] ]
-Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 signed_multiply::a#0 signed_multiply_error::b#0 ] ] with [ zp ZP_BYTE:82 [ slow_multiply::a#0 ] ]
-Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 signed_multiply::a#0 signed_multiply_error::b#0 slow_multiply::a#0 ] ] with [ zp ZP_BYTE:93 [ multiply_error::b#0 ] ]
+Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 ] ] with [ zp ZP_BYTE:63 [ signed_multiply_error::b#0 ] ]
+Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 signed_multiply_error::b#0 ] ] with [ zp ZP_BYTE:82 [ slow_multiply::a#0 ] ]
+Coalescing zero page register [ zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 signed_multiply_error::b#0 slow_multiply::a#0 ] ] with [ zp ZP_BYTE:93 [ multiply_error::b#0 ] ]
 Coalescing zero page register [ zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 ] ] with [ zp ZP_BYTE:26 [ multiply_results_compare::b#2 multiply_results_compare::b#1 ] ]
+Coalescing zero page register [ zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 multiply_results_compare::b#2 multiply_results_compare::b#1 ] ] with [ zp ZP_BYTE:57 [ signed_multiply::b#0 ] ]
 Coalescing zero page register [ zp ZP_WORD:4 [ line_cursor#20 line_cursor#40 line_cursor#27 line_cursor#1 ] ] with [ zp ZP_WORD:30 [ multiply_tables_compare::kc_sqr#2 multiply_tables_compare::kc_sqr#1 ] ]
 Coalescing zero page register [ zp ZP_WORD:4 [ line_cursor#20 line_cursor#40 line_cursor#27 line_cursor#1 multiply_tables_compare::kc_sqr#2 multiply_tables_compare::kc_sqr#1 ] ] with [ zp ZP_WORD:35 [ init_multiply::sqr1_lo#2 init_multiply::sqr1_lo#1 ] ]
 Coalescing zero page register [ zp ZP_WORD:4 [ line_cursor#20 line_cursor#40 line_cursor#27 line_cursor#1 multiply_tables_compare::kc_sqr#2 multiply_tables_compare::kc_sqr#1 init_multiply::sqr1_lo#2 init_multiply::sqr1_lo#1 ] ] with [ zp ZP_WORD:43 [ init_multiply::sqr2_lo#2 init_multiply::sqr2_lo#1 ] ]
@@ -8447,11 +8445,10 @@ Coalescing zero page register [ zp ZP_WORD:32 [ multiply_tables_compare::asm_sqr
 Coalescing zero page register [ zp ZP_WORD:32 [ multiply_tables_compare::asm_sqr#2 multiply_tables_compare::asm_sqr#1 signed_multiply_error::ms#0 ] ] with [ zp ZP_WORD:86 [ multiply_results_compare::ms#0 ] ]
 Coalescing zero page register [ zp ZP_WORD:32 [ multiply_tables_compare::asm_sqr#2 multiply_tables_compare::asm_sqr#1 signed_multiply_error::ms#0 multiply_results_compare::ms#0 ] ] with [ zp ZP_WORD:94 [ multiply_error::ms#0 ] ]
 Coalescing zero page register [ zp ZP_WORD:66 [ signed_multiply_error::ma#0 ] ] with [ zp ZP_WORD:96 [ multiply_error::ma#0 ] ]
-Coalescing zero page register [ zp ZP_BYTE:72 [ signed_multiply::$6 ] ] with [ zp ZP_BYTE:75 [ signed_multiply::$12 ] ]
 Allocated (was zp ZP_WORD:14) zp ZP_WORD:8 [ char_cursor#75 char_cursor#124 char_cursor#123 char_cursor#119 char_cursor#135 char_cursor#27 char_cursor#118 char_cursor#17 char_cursor#117 char_cursor#172 char_cursor#176 char_cursor#1 char_cursor#121 char_cursor#197 init_multiply::sqr#3 init_multiply::sqr#4 init_multiply::sqr#1 init_multiply::sqr#2 signed_multiply_results_compare::ms#0 ]
 Allocated (was zp ZP_WORD:32) zp ZP_WORD:10 [ multiply_tables_compare::asm_sqr#2 multiply_tables_compare::asm_sqr#1 signed_multiply_error::ms#0 multiply_results_compare::ms#0 multiply_error::ms#0 ]
 Allocated (was zp ZP_WORD:66) zp ZP_WORD:12 [ signed_multiply_error::ma#0 multiply_error::ma#0 ]
-Allocated (was zp ZP_BYTE:72) zp ZP_BYTE:14 [ signed_multiply::$6 signed_multiply::$12 ]
+Allocated (was zp ZP_BYTE:72) zp ZP_BYTE:14 [ signed_multiply::$6 ]
 
 ASSEMBLER BEFORE OPTIMIZATION
 //SEG0 Basic Upstart
@@ -8581,11 +8578,11 @@ signed_multiply_results_compare: {
     sta ms
     lda slow_signed_multiply.return+1
     sta ms+1
-  //SEG50 [25] (signed byte) signed_multiply::a#0 ← (signed byte) signed_multiply_results_compare::a#6 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 line_cursor#1 ] )
-    // (signed byte) signed_multiply::a#0 = (signed byte) signed_multiply_results_compare::a#6  // register copy zp ZP_BYTE:2
-  //SEG51 [26] (signed byte) signed_multiply::b#0 ← (signed byte) signed_multiply_results_compare::b#2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 signed_multiply::b#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 signed_multiply::b#0 line_cursor#1 ] ) -- vbsyy=vbsz1 
-    lda b
+  //SEG50 [25] (signed byte) signed_multiply::a#0 ← (signed byte) signed_multiply_results_compare::a#6 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 line_cursor#1 ] ) -- vbsyy=vbsz1 
+    lda a
     tay
+  //SEG51 [26] (signed byte) signed_multiply::b#0 ← (signed byte) signed_multiply_results_compare::b#2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 signed_multiply::b#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 signed_multiply::b#0 line_cursor#1 ] )
+    // (signed byte) signed_multiply::b#0 = (signed byte) signed_multiply_results_compare::b#2  // register copy zp ZP_BYTE:3
   //SEG52 [27] call signed_multiply param-assignment [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::return#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::return#0 line_cursor#1 ] )
     jsr signed_multiply
   //SEG53 [28] (signed word) signed_multiply::return#2 ← (signed word) signed_multiply::return#0 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::return#2 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::return#2 line_cursor#1 ] )
@@ -9073,15 +9070,14 @@ print_sbyte: {
 //SEG233 signed_multiply
 signed_multiply: {
     .label _6 = $e
-    .label _12 = $e
     .label m = 6
     .label return = 6
-    .label a = 2
-  //SEG234 [113] (byte) multiply::a#0 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 ] ) -- vbuxx=_byte_vbsz1 
-    lda a
-    tax
-  //SEG235 [114] (byte) multiply::b#0 ← ((byte)) (signed byte) signed_multiply::b#0 [ signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 multiply::b#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 multiply::b#0 ] ) -- vbuaa=_byte_vbsyy 
-    tya
+    .label b = 3
+  //SEG234 [113] (byte) multiply::a#0 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 ] ) -- vbuxx=_byte_vbsyy 
+    sty $ff
+    ldx $ff
+  //SEG235 [114] (byte) multiply::b#0 ← ((byte)) (signed byte) signed_multiply::b#0 [ signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 multiply::b#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 multiply::b#0 ] ) -- vbuaa=_byte_vbsz1 
+    lda b
   //SEG236 [115] call multiply param-assignment [ signed_multiply::a#0 signed_multiply::b#0 multiply::return#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::return#0 ] )
   //SEG237 [132] phi from signed_multiply to multiply [phi:signed_multiply->multiply]
   multiply_from_signed_multiply:
@@ -9095,9 +9091,8 @@ signed_multiply: {
   b6:
   //SEG242 [117] (word) signed_multiply::m#0 ← (word) multiply::return#2 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] )
     // (word) signed_multiply::m#0 = (word) multiply::return#2  // register copy zp ZP_WORD:6
-  //SEG243 [118] if((signed byte) signed_multiply::a#0>=(byte/signed byte/word/signed word) 0) goto signed_multiply::@1 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ) -- vbsz1_ge_0_then_la1 
-    lda a
-    cmp #0
+  //SEG243 [118] if((signed byte) signed_multiply::a#0>=(byte/signed byte/word/signed word) 0) goto signed_multiply::@1 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ) -- vbsyy_ge_0_then_la1 
+    cpy #0
     bpl b1_from_b6
     jmp b3
   //SEG244 signed_multiply::@3
@@ -9105,8 +9100,8 @@ signed_multiply: {
   //SEG245 [119] (byte~) signed_multiply::$6 ← > (word) signed_multiply::m#0 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 ] ) -- vbuz1=_hi_vwuz2 
     lda m+1
     sta _6
-  //SEG246 [120] (byte~) signed_multiply::$7 ← ((byte)) (signed byte) signed_multiply::b#0 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 signed_multiply::$7 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 signed_multiply::$7 ] ) -- vbuaa=_byte_vbsyy 
-    tya
+  //SEG246 [120] (byte~) signed_multiply::$7 ← ((byte)) (signed byte) signed_multiply::b#0 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 signed_multiply::$7 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 signed_multiply::$7 ] ) -- vbuaa=_byte_vbsz1 
+    lda b
   //SEG247 [121] (byte/signed byte/word/signed word~) signed_multiply::$16 ← (byte~) signed_multiply::$6 - (byte~) signed_multiply::$7 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$16 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$16 ] ) -- vbuaa=vbuz1_minus_vbuaa 
     eor #$ff
     sec
@@ -9120,21 +9115,20 @@ signed_multiply: {
     jmp b1
   //SEG251 signed_multiply::@1
   b1:
-  //SEG252 [124] if((signed byte) signed_multiply::b#0>=(byte/signed byte/word/signed word) 0) goto signed_multiply::@2 [ signed_multiply::a#0 signed_multiply::m#5 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 ] ) -- vbsyy_ge_0_then_la1 
-    cpy #0
+  //SEG252 [124] if((signed byte) signed_multiply::b#0>=(byte/signed byte/word/signed word) 0) goto signed_multiply::@2 [ signed_multiply::a#0 signed_multiply::m#5 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 ] ) -- vbsz1_ge_0_then_la1 
+    lda b
+    cmp #0
     bpl b2_from_b1
     jmp b4
   //SEG253 signed_multiply::@4
   b4:
-  //SEG254 [125] (byte~) signed_multiply::$12 ← > (word) signed_multiply::m#5 [ signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ) -- vbuz1=_hi_vwuz2 
+  //SEG254 [125] (byte~) signed_multiply::$12 ← > (word) signed_multiply::m#5 [ signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ) -- vbuaa=_hi_vwuz1 
     lda m+1
-    sta _12
-  //SEG255 [126] (byte~) signed_multiply::$13 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ) -- vbuaa=_byte_vbsz1 
-    lda a
-  //SEG256 [127] (byte/signed byte/word/signed word~) signed_multiply::$17 ← (byte~) signed_multiply::$12 - (byte~) signed_multiply::$13 [ signed_multiply::m#5 signed_multiply::$17 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$17 ] ) -- vbuaa=vbuz1_minus_vbuaa 
-    eor #$ff
+  //SEG255 [126] (byte~) signed_multiply::$13 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ) -- vbuyy=_byte_vbsyy 
+  //SEG256 [127] (byte/signed byte/word/signed word~) signed_multiply::$17 ← (byte~) signed_multiply::$12 - (byte~) signed_multiply::$13 [ signed_multiply::m#5 signed_multiply::$17 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$17 ] ) -- vbuaa=vbuaa_minus_vbuyy 
+    sty $ff
     sec
-    adc _12
+    sbc $ff
   //SEG257 [128] (word) signed_multiply::m#2 ← (word) signed_multiply::m#5 hi= (byte/signed byte/word/signed word~) signed_multiply::$17 [ signed_multiply::m#2 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#2 ] ) -- vwuz1=vwuz1_sethi_vbuaa 
     sta m+1
   //SEG258 [129] phi from signed_multiply::@1 signed_multiply::@4 to signed_multiply::@2 [phi:signed_multiply::@1/signed_multiply::@4->signed_multiply::@2]
@@ -10709,8 +10703,8 @@ FINAL SYMBOL TABLE
 (word) print_word::w#4 w zp ZP_WORD:6 4.0
 (word) print_word::w#5 w zp ZP_WORD:6 4.666666666666666
 (signed word()) signed_multiply((signed byte) signed_multiply::a , (signed byte) signed_multiply::b)
-(byte~) signed_multiply::$12 $12 zp ZP_BYTE:14 2.0
-(byte~) signed_multiply::$13 reg byte a 4.0
+(byte~) signed_multiply::$12 reg byte a 2.0
+(byte~) signed_multiply::$13 reg byte y 4.0
 (byte/signed byte/word/signed word~) signed_multiply::$16 reg byte a 4.0
 (byte/signed byte/word/signed word~) signed_multiply::$17 reg byte a 4.0
 (byte~) signed_multiply::$6 $6 zp ZP_BYTE:14 2.0
@@ -10722,9 +10716,9 @@ FINAL SYMBOL TABLE
 (label) signed_multiply::@6
 (label) signed_multiply::@return
 (signed byte) signed_multiply::a
-(signed byte) signed_multiply::a#0 a zp ZP_BYTE:2 7.133333333333335
+(signed byte) signed_multiply::a#0 reg byte y 7.133333333333335
 (signed byte) signed_multiply::b
-(signed byte) signed_multiply::b#0 reg byte y 8.916666666666664
+(signed byte) signed_multiply::b#0 b zp ZP_BYTE:3 8.916666666666664
 (word) signed_multiply::m
 (word) signed_multiply::m#0 m zp ZP_WORD:6 1.6
 (word) signed_multiply::m#1 m zp ZP_WORD:6 4.0
@@ -10820,8 +10814,8 @@ FINAL SYMBOL TABLE
 (signed word) slow_signed_multiply::return#0 return zp ZP_WORD:6 701.0
 (signed word) slow_signed_multiply::return#2 return zp ZP_WORD:6 202.0
 
-zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 signed_multiply::a#0 signed_multiply_error::b#0 slow_multiply::a#0 multiply_error::b#0 ]
-zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 multiply_results_compare::b#2 multiply_results_compare::b#1 ]
+zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 signed_multiply_error::b#0 slow_multiply::a#0 multiply_error::b#0 ]
+zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 multiply_results_compare::b#2 multiply_results_compare::b#1 signed_multiply::b#0 ]
 zp ZP_WORD:4 [ line_cursor#20 line_cursor#40 line_cursor#27 line_cursor#1 multiply_tables_compare::kc_sqr#2 multiply_tables_compare::kc_sqr#1 init_multiply::sqr1_lo#2 init_multiply::sqr1_lo#1 init_multiply::sqr2_lo#2 init_multiply::sqr2_lo#1 print_cls::sc#2 print_cls::sc#1 ]
 zp ZP_WORD:6 [ print_str::str#14 print_str::str#16 print_str::str#0 print_sword::w#4 print_sword::w#3 print_sword::w#1 print_sword::w#2 print_sword::w#0 print_word::w#5 print_word::w#3 print_word::w#4 print_word::w#1 print_word::w#2 print_word::w#0 signed_multiply::m#4 signed_multiply::m#5 signed_multiply::m#1 signed_multiply::m#0 signed_multiply::m#2 slow_signed_multiply::m#5 slow_signed_multiply::return#0 slow_signed_multiply::m#3 slow_signed_multiply::m#1 slow_signed_multiply::m#2 slow_multiply::return#0 slow_multiply::m#3 slow_multiply::m#1 init_multiply::sqr1_hi#2 init_multiply::sqr1_hi#1 init_multiply::sqr2_hi#2 init_multiply::sqr2_hi#1 slow_signed_multiply::return#2 signed_multiply::return#2 signed_multiply_results_compare::ma#0 multiply::return#2 signed_multiply::return#0 multiply::return#0 slow_multiply::return#2 multiply::return#3 multiply_results_compare::ma#0 ]
 reg byte x [ print_byte::b#5 print_byte::b#3 print_byte::b#4 print_byte::b#0 print_byte::b#1 print_byte::b#2 ]
@@ -10837,15 +10831,16 @@ zp ZP_WORD:10 [ multiply_tables_compare::asm_sqr#2 multiply_tables_compare::asm_
 reg byte x [ init_multiply::c#2 init_multiply::c#1 ]
 reg byte x [ init_multiply::x_255#2 init_multiply::x_255#1 ]
 reg byte x [ slow_signed_multiply::b#0 ]
-reg byte y [ signed_multiply::b#0 ]
+reg byte y [ signed_multiply::a#0 ]
 reg byte x [ signed_multiply_error::a#0 ]
 zp ZP_WORD:12 [ signed_multiply_error::ma#0 multiply_error::ma#0 ]
 reg byte y [ print_byte::$0 ]
 reg byte a [ print_byte::$2 ]
-zp ZP_BYTE:14 [ signed_multiply::$6 signed_multiply::$12 ]
+zp ZP_BYTE:14 [ signed_multiply::$6 ]
 reg byte a [ signed_multiply::$7 ]
 reg byte a [ signed_multiply::$16 ]
-reg byte a [ signed_multiply::$13 ]
+reg byte a [ signed_multiply::$12 ]
+reg byte y [ signed_multiply::$13 ]
 reg byte a [ signed_multiply::$17 ]
 reg byte x [ slow_multiply::b#0 ]
 reg byte x [ multiply_error::a#0 ]
@@ -10855,7 +10850,7 @@ reg byte a [ init_multiply::$6 ]
 
 
 FINAL ASSEMBLER
-Score: 179627
+Score: 161492
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
@@ -10945,11 +10940,11 @@ signed_multiply_results_compare: {
     sta ms
     lda slow_signed_multiply.return+1
     sta ms+1
-  //SEG50 [25] (signed byte) signed_multiply::a#0 ← (signed byte) signed_multiply_results_compare::a#6 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 line_cursor#1 ] )
-    // (signed byte) signed_multiply::a#0 = (signed byte) signed_multiply_results_compare::a#6  // register copy zp ZP_BYTE:2
-  //SEG51 [26] (signed byte) signed_multiply::b#0 ← (signed byte) signed_multiply_results_compare::b#2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 signed_multiply::b#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 signed_multiply::b#0 line_cursor#1 ] ) -- vbsyy=vbsz1 
-    lda b
+  //SEG50 [25] (signed byte) signed_multiply::a#0 ← (signed byte) signed_multiply_results_compare::a#6 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 line_cursor#1 ] ) -- vbsyy=vbsz1 
+    lda a
     tay
+  //SEG51 [26] (signed byte) signed_multiply::b#0 ← (signed byte) signed_multiply_results_compare::b#2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 signed_multiply::b#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::a#0 signed_multiply::b#0 line_cursor#1 ] )
+    // (signed byte) signed_multiply::b#0 = (signed byte) signed_multiply_results_compare::b#2  // register copy zp ZP_BYTE:3
   //SEG52 [27] call signed_multiply param-assignment [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::return#0 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::return#0 line_cursor#1 ] )
     jsr signed_multiply
   //SEG53 [28] (signed word) signed_multiply::return#2 ← (signed word) signed_multiply::return#0 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::return#2 line_cursor#1 ] ( main:2::signed_multiply_results_compare:15 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 signed_multiply::return#2 line_cursor#1 ] )
@@ -11343,15 +11338,14 @@ print_sbyte: {
 //SEG233 signed_multiply
 signed_multiply: {
     .label _6 = $e
-    .label _12 = $e
     .label m = 6
     .label return = 6
-    .label a = 2
-  //SEG234 [113] (byte) multiply::a#0 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 ] ) -- vbuxx=_byte_vbsz1 
-    lda a
-    tax
-  //SEG235 [114] (byte) multiply::b#0 ← ((byte)) (signed byte) signed_multiply::b#0 [ signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 multiply::b#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 multiply::b#0 ] ) -- vbuaa=_byte_vbsyy 
-    tya
+    .label b = 3
+  //SEG234 [113] (byte) multiply::a#0 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 ] ) -- vbuxx=_byte_vbsyy 
+    sty $ff
+    ldx $ff
+  //SEG235 [114] (byte) multiply::b#0 ← ((byte)) (signed byte) signed_multiply::b#0 [ signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 multiply::b#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::a#0 multiply::b#0 ] ) -- vbuaa=_byte_vbsz1 
+    lda b
   //SEG236 [115] call multiply param-assignment [ signed_multiply::a#0 signed_multiply::b#0 multiply::return#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 multiply::return#0 ] )
   //SEG237 [132] phi from signed_multiply to multiply [phi:signed_multiply->multiply]
   //SEG238 [132] phi (byte) multiply::b#2 = (byte) multiply::b#0 [phi:signed_multiply->multiply#0] -- register_copy 
@@ -11362,16 +11356,15 @@ signed_multiply: {
   //SEG241 signed_multiply::@6
   //SEG242 [117] (word) signed_multiply::m#0 ← (word) multiply::return#2 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] )
     // (word) signed_multiply::m#0 = (word) multiply::return#2  // register copy zp ZP_WORD:6
-  //SEG243 [118] if((signed byte) signed_multiply::a#0>=(byte/signed byte/word/signed word) 0) goto signed_multiply::@1 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ) -- vbsz1_ge_0_then_la1 
-    lda a
-    cmp #0
+  //SEG243 [118] if((signed byte) signed_multiply::a#0>=(byte/signed byte/word/signed word) 0) goto signed_multiply::@1 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 ] ) -- vbsyy_ge_0_then_la1 
+    cpy #0
     bpl b1
   //SEG244 signed_multiply::@3
   //SEG245 [119] (byte~) signed_multiply::$6 ← > (word) signed_multiply::m#0 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 ] ) -- vbuz1=_hi_vwuz2 
     lda m+1
     sta _6
-  //SEG246 [120] (byte~) signed_multiply::$7 ← ((byte)) (signed byte) signed_multiply::b#0 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 signed_multiply::$7 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 signed_multiply::$7 ] ) -- vbuaa=_byte_vbsyy 
-    tya
+  //SEG246 [120] (byte~) signed_multiply::$7 ← ((byte)) (signed byte) signed_multiply::b#0 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 signed_multiply::$7 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$6 signed_multiply::$7 ] ) -- vbuaa=_byte_vbsz1 
+    lda b
   //SEG247 [121] (byte/signed byte/word/signed word~) signed_multiply::$16 ← (byte~) signed_multiply::$6 - (byte~) signed_multiply::$7 [ signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$16 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::b#0 signed_multiply::m#0 signed_multiply::$16 ] ) -- vbuaa=vbuz1_minus_vbuaa 
     eor #$ff
     sec
@@ -11382,19 +11375,18 @@ signed_multiply: {
   //SEG250 [123] phi (word) signed_multiply::m#5 = (word) signed_multiply::m#1 [phi:signed_multiply::@3/signed_multiply::@6->signed_multiply::@1#0] -- register_copy 
   //SEG251 signed_multiply::@1
   b1:
-  //SEG252 [124] if((signed byte) signed_multiply::b#0>=(byte/signed byte/word/signed word) 0) goto signed_multiply::@2 [ signed_multiply::a#0 signed_multiply::m#5 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 ] ) -- vbsyy_ge_0_then_la1 
-    cpy #0
+  //SEG252 [124] if((signed byte) signed_multiply::b#0>=(byte/signed byte/word/signed word) 0) goto signed_multiply::@2 [ signed_multiply::a#0 signed_multiply::m#5 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 ] ) -- vbsz1_ge_0_then_la1 
+    lda b
+    cmp #0
     bpl b2
   //SEG253 signed_multiply::@4
-  //SEG254 [125] (byte~) signed_multiply::$12 ← > (word) signed_multiply::m#5 [ signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ) -- vbuz1=_hi_vwuz2 
+  //SEG254 [125] (byte~) signed_multiply::$12 ← > (word) signed_multiply::m#5 [ signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ) -- vbuaa=_hi_vwuz1 
     lda m+1
-    sta _12
-  //SEG255 [126] (byte~) signed_multiply::$13 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ) -- vbuaa=_byte_vbsz1 
-    lda a
-  //SEG256 [127] (byte/signed byte/word/signed word~) signed_multiply::$17 ← (byte~) signed_multiply::$12 - (byte~) signed_multiply::$13 [ signed_multiply::m#5 signed_multiply::$17 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$17 ] ) -- vbuaa=vbuz1_minus_vbuaa 
-    eor #$ff
+  //SEG255 [126] (byte~) signed_multiply::$13 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ) -- vbuyy=_byte_vbsyy 
+  //SEG256 [127] (byte/signed byte/word/signed word~) signed_multiply::$17 ← (byte~) signed_multiply::$12 - (byte~) signed_multiply::$13 [ signed_multiply::m#5 signed_multiply::$17 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$17 ] ) -- vbuaa=vbuaa_minus_vbuyy 
+    sty $ff
     sec
-    adc _12
+    sbc $ff
   //SEG257 [128] (word) signed_multiply::m#2 ← (word) signed_multiply::m#5 hi= (byte/signed byte/word/signed word~) signed_multiply::$17 [ signed_multiply::m#2 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#2 ] ) -- vwuz1=vwuz1_sethi_vbuaa 
     sta m+1
   //SEG258 [129] phi from signed_multiply::@1 signed_multiply::@4 to signed_multiply::@2 [phi:signed_multiply::@1/signed_multiply::@4->signed_multiply::@2]
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.sym b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.sym
index 7d34e8c57..e09f65328 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.sym
+++ b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.sym
@@ -243,8 +243,8 @@
 (word) print_word::w#4 w zp ZP_WORD:6 4.0
 (word) print_word::w#5 w zp ZP_WORD:6 4.666666666666666
 (signed word()) signed_multiply((signed byte) signed_multiply::a , (signed byte) signed_multiply::b)
-(byte~) signed_multiply::$12 $12 zp ZP_BYTE:14 2.0
-(byte~) signed_multiply::$13 reg byte a 4.0
+(byte~) signed_multiply::$12 reg byte a 2.0
+(byte~) signed_multiply::$13 reg byte y 4.0
 (byte/signed byte/word/signed word~) signed_multiply::$16 reg byte a 4.0
 (byte/signed byte/word/signed word~) signed_multiply::$17 reg byte a 4.0
 (byte~) signed_multiply::$6 $6 zp ZP_BYTE:14 2.0
@@ -256,9 +256,9 @@
 (label) signed_multiply::@6
 (label) signed_multiply::@return
 (signed byte) signed_multiply::a
-(signed byte) signed_multiply::a#0 a zp ZP_BYTE:2 7.133333333333335
+(signed byte) signed_multiply::a#0 reg byte y 7.133333333333335
 (signed byte) signed_multiply::b
-(signed byte) signed_multiply::b#0 reg byte y 8.916666666666664
+(signed byte) signed_multiply::b#0 b zp ZP_BYTE:3 8.916666666666664
 (word) signed_multiply::m
 (word) signed_multiply::m#0 m zp ZP_WORD:6 1.6
 (word) signed_multiply::m#1 m zp ZP_WORD:6 4.0
@@ -354,8 +354,8 @@
 (signed word) slow_signed_multiply::return#0 return zp ZP_WORD:6 701.0
 (signed word) slow_signed_multiply::return#2 return zp ZP_WORD:6 202.0
 
-zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 signed_multiply::a#0 signed_multiply_error::b#0 slow_multiply::a#0 multiply_error::b#0 ]
-zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 multiply_results_compare::b#2 multiply_results_compare::b#1 ]
+zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 multiply_results_compare::a#6 multiply_results_compare::a#1 init_multiply::x_2#3 init_multiply::x_2#2 init_multiply::x_2#1 init_multiply::dir#2 init_multiply::dir#3 slow_signed_multiply::a#0 signed_multiply_error::b#0 slow_multiply::a#0 multiply_error::b#0 ]
+zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 multiply_results_compare::b#2 multiply_results_compare::b#1 signed_multiply::b#0 ]
 zp ZP_WORD:4 [ line_cursor#20 line_cursor#40 line_cursor#27 line_cursor#1 multiply_tables_compare::kc_sqr#2 multiply_tables_compare::kc_sqr#1 init_multiply::sqr1_lo#2 init_multiply::sqr1_lo#1 init_multiply::sqr2_lo#2 init_multiply::sqr2_lo#1 print_cls::sc#2 print_cls::sc#1 ]
 zp ZP_WORD:6 [ print_str::str#14 print_str::str#16 print_str::str#0 print_sword::w#4 print_sword::w#3 print_sword::w#1 print_sword::w#2 print_sword::w#0 print_word::w#5 print_word::w#3 print_word::w#4 print_word::w#1 print_word::w#2 print_word::w#0 signed_multiply::m#4 signed_multiply::m#5 signed_multiply::m#1 signed_multiply::m#0 signed_multiply::m#2 slow_signed_multiply::m#5 slow_signed_multiply::return#0 slow_signed_multiply::m#3 slow_signed_multiply::m#1 slow_signed_multiply::m#2 slow_multiply::return#0 slow_multiply::m#3 slow_multiply::m#1 init_multiply::sqr1_hi#2 init_multiply::sqr1_hi#1 init_multiply::sqr2_hi#2 init_multiply::sqr2_hi#1 slow_signed_multiply::return#2 signed_multiply::return#2 signed_multiply_results_compare::ma#0 multiply::return#2 signed_multiply::return#0 multiply::return#0 slow_multiply::return#2 multiply::return#3 multiply_results_compare::ma#0 ]
 reg byte x [ print_byte::b#5 print_byte::b#3 print_byte::b#4 print_byte::b#0 print_byte::b#1 print_byte::b#2 ]
@@ -371,15 +371,16 @@ zp ZP_WORD:10 [ multiply_tables_compare::asm_sqr#2 multiply_tables_compare::asm_
 reg byte x [ init_multiply::c#2 init_multiply::c#1 ]
 reg byte x [ init_multiply::x_255#2 init_multiply::x_255#1 ]
 reg byte x [ slow_signed_multiply::b#0 ]
-reg byte y [ signed_multiply::b#0 ]
+reg byte y [ signed_multiply::a#0 ]
 reg byte x [ signed_multiply_error::a#0 ]
 zp ZP_WORD:12 [ signed_multiply_error::ma#0 multiply_error::ma#0 ]
 reg byte y [ print_byte::$0 ]
 reg byte a [ print_byte::$2 ]
-zp ZP_BYTE:14 [ signed_multiply::$6 signed_multiply::$12 ]
+zp ZP_BYTE:14 [ signed_multiply::$6 ]
 reg byte a [ signed_multiply::$7 ]
 reg byte a [ signed_multiply::$16 ]
-reg byte a [ signed_multiply::$13 ]
+reg byte a [ signed_multiply::$12 ]
+reg byte y [ signed_multiply::$13 ]
 reg byte a [ signed_multiply::$17 ]
 reg byte x [ slow_multiply::b#0 ]
 reg byte x [ multiply_error::a#0 ]
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/voronoi.log b/src/test/java/dk/camelot64/kickc/test/ref/voronoi.log
index a74e3cf9d..726f4efd1 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/voronoi.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/voronoi.log
@@ -2588,33 +2588,33 @@ Uplift Scope [main]
 Uplift Scope [] 
 
 Uplift attempts [findcol] 10000/2239488 (limiting to 10000)
-Uplifting [findcol] best 1714235 combination reg byte a [ findcol::mindiff#11 findcol::diff#6 findcol::diff#3 findcol::diff#2 findcol::mindiff#15 ] zp ZP_BYTE:9 [ findcol::diff#4 findcol::diff#1 findcol::diff#0 ] reg byte y [ findcol::return#2 findcol::mincol#10 findcol::mincol#2 findcol::mincol#1 ] zp ZP_BYTE:7 [ findcol::mindiff#10 findcol::mindiff#13 ] reg byte a [ findcol::$10 ] reg byte a [ findcol::$12 ] reg byte x [ findcol::i#10 findcol::i#1 ] zp ZP_BYTE:24 [ findcol::xp#0 ] zp ZP_BYTE:25 [ findcol::yp#0 ] zp ZP_BYTE:22 [ findcol::return#0 ] zp ZP_BYTE:21 [ findcol::y#0 ] zp ZP_BYTE:20 [ findcol::x#0 ] 
+Uplifting [findcol] best 1714005 combination reg byte a [ findcol::mindiff#11 findcol::diff#6 findcol::diff#3 findcol::diff#2 findcol::mindiff#15 ] zp ZP_BYTE:9 [ findcol::diff#4 findcol::diff#1 findcol::diff#0 ] reg byte y [ findcol::return#2 findcol::mincol#10 findcol::mincol#2 findcol::mincol#1 ] zp ZP_BYTE:7 [ findcol::mindiff#10 findcol::mindiff#13 ] reg byte a [ findcol::$10 ] reg byte a [ findcol::$12 ] reg byte x [ findcol::i#10 findcol::i#1 ] zp ZP_BYTE:24 [ findcol::xp#0 ] zp ZP_BYTE:25 [ findcol::yp#0 ] zp ZP_BYTE:22 [ findcol::return#0 ] zp ZP_BYTE:21 [ findcol::y#0 ] zp ZP_BYTE:20 [ findcol::x#0 ] 
 Limited combination testing to 10000 combinations of 2239488 possible.
-Uplifting [render] best 1708235 combination zp ZP_BYTE:5 [ render::x#2 render::x#1 ] reg byte a [ render::col#0 ] zp ZP_BYTE:2 [ render::y#4 render::y#1 ] zp ZP_WORD:3 [ render::colline#5 render::colline#1 ] 
-Uplifting [initscreen] best 1708235 combination zp ZP_WORD:11 [ initscreen::screen#2 initscreen::screen#1 ] 
+Uplifting [render] best 1708005 combination zp ZP_BYTE:5 [ render::x#2 render::x#1 ] reg byte a [ render::col#0 ] zp ZP_BYTE:2 [ render::y#4 render::y#1 ] zp ZP_WORD:3 [ render::colline#5 render::colline#1 ] 
+Uplifting [initscreen] best 1708005 combination zp ZP_WORD:11 [ initscreen::screen#2 initscreen::screen#1 ] 
 Uplift attempts [animate] 10000/16384 (limiting to 10000)
-Uplifting [animate] best 1708193 combination reg byte a [ animate::$0 ] reg byte a [ animate::$3 ] reg byte a [ animate::$6 ] reg byte a [ animate::$9 ] reg byte a [ animate::$12 ] reg byte a [ animate::$15 ] reg byte a [ animate::$18 ] 
+Uplifting [animate] best 1707963 combination reg byte a [ animate::$0 ] reg byte a [ animate::$3 ] reg byte a [ animate::$6 ] reg byte a [ animate::$9 ] reg byte a [ animate::$12 ] reg byte a [ animate::$15 ] reg byte a [ animate::$18 ] 
 Limited combination testing to 10000 combinations of 16384 possible.
-Uplifting [main] best 1708193 combination 
-Uplifting [] best 1708193 combination 
+Uplifting [main] best 1707963 combination 
+Uplifting [] best 1707963 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:9 [ findcol::diff#4 findcol::diff#1 findcol::diff#0 ]
-Uplifting [findcol] best 1708193 combination zp ZP_BYTE:9 [ findcol::diff#4 findcol::diff#1 findcol::diff#0 ] 
+Uplifting [findcol] best 1707963 combination zp ZP_BYTE:9 [ findcol::diff#4 findcol::diff#1 findcol::diff#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:7 [ findcol::mindiff#10 findcol::mindiff#13 ]
-Uplifting [findcol] best 1708193 combination zp ZP_BYTE:7 [ findcol::mindiff#10 findcol::mindiff#13 ] 
+Uplifting [findcol] best 1707963 combination zp ZP_BYTE:7 [ findcol::mindiff#10 findcol::mindiff#13 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:24 [ findcol::xp#0 ]
-Uplifting [findcol] best 1708193 combination zp ZP_BYTE:24 [ findcol::xp#0 ] 
+Uplifting [findcol] best 1707963 combination zp ZP_BYTE:24 [ findcol::xp#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:25 [ findcol::yp#0 ]
-Uplifting [findcol] best 1708193 combination zp ZP_BYTE:25 [ findcol::yp#0 ] 
+Uplifting [findcol] best 1707963 combination zp ZP_BYTE:25 [ findcol::yp#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:5 [ render::x#2 render::x#1 ]
-Uplifting [render] best 1708193 combination zp ZP_BYTE:5 [ render::x#2 render::x#1 ] 
+Uplifting [render] best 1707963 combination zp ZP_BYTE:5 [ render::x#2 render::x#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:22 [ findcol::return#0 ]
-Uplifting [findcol] best 1704193 combination reg byte a [ findcol::return#0 ] 
+Uplifting [findcol] best 1703963 combination reg byte a [ findcol::return#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:21 [ findcol::y#0 ]
-Uplifting [findcol] best 1704193 combination zp ZP_BYTE:21 [ findcol::y#0 ] 
+Uplifting [findcol] best 1703963 combination zp ZP_BYTE:21 [ findcol::y#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:20 [ findcol::x#0 ]
-Uplifting [findcol] best 1704193 combination zp ZP_BYTE:20 [ findcol::x#0 ] 
+Uplifting [findcol] best 1703963 combination zp ZP_BYTE:20 [ findcol::x#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ render::y#4 render::y#1 ]
-Uplifting [render] best 1704193 combination zp ZP_BYTE:2 [ render::y#4 render::y#1 ] 
+Uplifting [render] best 1703963 combination zp ZP_BYTE:2 [ render::y#4 render::y#1 ] 
 Coalescing zero page register [ zp ZP_BYTE:2 [ render::y#4 render::y#1 ] ] with [ zp ZP_BYTE:21 [ findcol::y#0 ] ]
 Coalescing zero page register [ zp ZP_WORD:3 [ render::colline#5 render::colline#1 ] ] with [ zp ZP_WORD:11 [ initscreen::screen#2 initscreen::screen#1 ] ]
 Coalescing zero page register [ zp ZP_BYTE:5 [ render::x#2 render::x#1 ] ] with [ zp ZP_BYTE:20 [ findcol::x#0 ] ]
@@ -3318,7 +3318,7 @@ reg byte a [ findcol::$12 ]
 
 
 FINAL ASSEMBLER
-Score: 1439007
+Score: 1438777
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/wordexpr.log b/src/test/java/dk/camelot64/kickc/test/ref/wordexpr.log
index 605467709..ac9264672 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/wordexpr.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/wordexpr.log
@@ -298,8 +298,8 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 29.33: zp ZP_WORD:2 [ main::b#2 main::b#1 ] 27.5: zp ZP_BYTE:4 [ main::i#2 main::i#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 503 combination zp ZP_WORD:2 [ main::b#2 main::b#1 ] reg byte x [ main::i#2 main::i#1 ] 
-Uplifting [] best 503 combination 
+Uplifting [main] best 473 combination zp ZP_WORD:2 [ main::b#2 main::b#1 ] reg byte x [ main::i#2 main::i#1 ] 
+Uplifting [] best 473 combination 
 
 ASSEMBLER BEFORE OPTIMIZATION
 //SEG0 Basic Upstart
@@ -406,7 +406,7 @@ reg byte x [ main::i#2 main::i#1 ]
 
 
 FINAL ASSEMBLER
-Score: 387
+Score: 357
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.log b/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.log
index 8baa84329..698ec1c67 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.log
@@ -811,13 +811,13 @@ Uplift Scope [sum2] 22: zp ZP_BYTE:11 [ sum2::return#0 ] 13: zp ZP_BYTE:10 [ sum
 Uplift Scope [] 
 
 Uplifting [main] best 1115 combination reg byte x [ main::i#2 main::i#1 ] reg byte a [ main::$2 ] reg byte a [ main::$5 ] 
-Uplifting [sum] best 970 combination reg byte a [ sum::return#0 ] reg byte x [ sum::a#0 ] reg byte y [ sum::b#0 ] zp ZP_BYTE:4 [ sum::c#0 ] reg byte a [ sum::return#1 ] reg byte a [ sum::$0 ] 
-Uplifting [sum2] best 825 combination reg byte a [ sum2::return#0 ] reg byte x [ sum2::a#0 ] reg byte y [ sum2::b#0 ] zp ZP_BYTE:9 [ sum2::c#0 ] reg byte a [ sum2::return#1 ] reg byte a [ sum2::$0 ] 
-Uplifting [] best 825 combination 
+Uplifting [sum] best 968 combination reg byte a [ sum::return#0 ] reg byte x [ sum::a#0 ] reg byte y [ sum::b#0 ] zp ZP_BYTE:4 [ sum::c#0 ] reg byte a [ sum::return#1 ] reg byte a [ sum::$0 ] 
+Uplifting [sum2] best 821 combination reg byte a [ sum2::return#0 ] reg byte x [ sum2::a#0 ] reg byte y [ sum2::b#0 ] zp ZP_BYTE:9 [ sum2::c#0 ] reg byte a [ sum2::return#1 ] reg byte a [ sum2::$0 ] 
+Uplifting [] best 821 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:4 [ sum::c#0 ]
-Uplifting [sum] best 825 combination zp ZP_BYTE:4 [ sum::c#0 ] 
+Uplifting [sum] best 821 combination zp ZP_BYTE:4 [ sum::c#0 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:9 [ sum2::c#0 ]
-Uplifting [sum2] best 825 combination zp ZP_BYTE:9 [ sum2::c#0 ] 
+Uplifting [sum2] best 821 combination zp ZP_BYTE:9 [ sum2::c#0 ] 
 Coalescing zero page register [ zp ZP_BYTE:4 [ sum::c#0 ] ] with [ zp ZP_BYTE:9 [ sum2::c#0 ] ]
 Allocated (was zp ZP_BYTE:4) zp ZP_BYTE:2 [ sum::c#0 sum2::c#0 ]
 
@@ -1037,7 +1037,7 @@ reg byte a [ sum::return#1 ]
 
 
 FINAL ASSEMBLER
-Score: 663
+Score: 659
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"
diff --git a/src/test/java/dk/camelot64/kickc/test/ref/zpptr.log b/src/test/java/dk/camelot64/kickc/test/ref/zpptr.log
index 0df4736f5..387048fc2 100644
--- a/src/test/java/dk/camelot64/kickc/test/ref/zpptr.log
+++ b/src/test/java/dk/camelot64/kickc/test/ref/zpptr.log
@@ -578,12 +578,12 @@ REGISTER UPLIFT SCOPES
 Uplift Scope [main] 2,102.1: zp ZP_BYTE:4 [ main::k#2 main::k#1 ] 2,002: zp ZP_WORD:7 [ main::w#0 ] 2,002: zp ZP_WORD:9 [ main::zpptr2#1 ] 1,001: zp ZP_WORD:5 [ main::zpptr2#0 ] 301.88: zp ZP_BYTE:3 [ main::i#4 main::i#1 ] 109.5: zp ZP_BYTE:2 [ main::j#6 main::j#1 ] 
 Uplift Scope [] 
 
-Uplifting [main] best 83433 combination reg byte x [ main::k#2 main::k#1 ] zp ZP_WORD:7 [ main::w#0 ] zp ZP_WORD:9 [ main::zpptr2#1 ] zp ZP_WORD:5 [ main::zpptr2#0 ] zp ZP_BYTE:3 [ main::i#4 main::i#1 ] zp ZP_BYTE:2 [ main::j#6 main::j#1 ] 
-Uplifting [] best 83433 combination 
+Uplifting [main] best 78433 combination reg byte x [ main::k#2 main::k#1 ] zp ZP_WORD:7 [ main::w#0 ] zp ZP_WORD:9 [ main::zpptr2#1 ] zp ZP_WORD:5 [ main::zpptr2#0 ] zp ZP_BYTE:3 [ main::i#4 main::i#1 ] zp ZP_BYTE:2 [ main::j#6 main::j#1 ] 
+Uplifting [] best 78433 combination 
 Attempting to uplift remaining variables inzp ZP_BYTE:3 [ main::i#4 main::i#1 ]
-Uplifting [main] best 83433 combination zp ZP_BYTE:3 [ main::i#4 main::i#1 ] 
+Uplifting [main] best 78433 combination zp ZP_BYTE:3 [ main::i#4 main::i#1 ] 
 Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::j#6 main::j#1 ]
-Uplifting [main] best 83433 combination zp ZP_BYTE:2 [ main::j#6 main::j#1 ] 
+Uplifting [main] best 78433 combination zp ZP_BYTE:2 [ main::j#6 main::j#1 ] 
 Coalescing zero page register [ zp ZP_WORD:5 [ main::zpptr2#0 ] ] with [ zp ZP_WORD:9 [ main::zpptr2#1 ] ]
 Allocated (was zp ZP_WORD:5) zp ZP_WORD:4 [ main::zpptr2#0 main::zpptr2#1 ]
 Allocated (was zp ZP_WORD:7) zp ZP_WORD:6 [ main::w#0 ]
@@ -778,7 +778,7 @@ zp ZP_WORD:6 [ main::w#0 ]
 
 
 FINAL ASSEMBLER
-Score: 73437
+Score: 68437
 
 //SEG0 Basic Upstart
 .pc = $801 "Basic"