]> git.sur5r.net Git - cc65/commitdiff
Track sreg in OptDecouple
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 11 Oct 2001 07:01:16 +0000 (07:01 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 11 Oct 2001 07:01:16 +0000 (07:01 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1019 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/codeopt.c

index 288a069b7799b5cc75b3a1e0172bf9a09cce8ccb..7d9dddcb614396e723ce4352482ca85ceede9314 100644 (file)
@@ -952,14 +952,17 @@ static unsigned OptPtrLoad6 (CodeSeg* S)
 static unsigned OptDecouple (CodeSeg* S)
 /* Decouple operations, that is, do the following replacements:
  *
- *   dex  -> ldx
- *   inx  -> ldx
- *   dey  -> ldy
- *   iny  -> ldy
- *   tax  -> ldx
- *   txa  -> lda
- *   tay  -> ldy
- *   tya  -> lda
+ *   dex        -> ldx #imm
+ *   inx        -> ldx #imm
+ *   dey        -> ldy #imm
+ *   iny        -> ldy #imm
+ *   tax        -> ldx #imm
+ *   txa        -> lda #imm
+ *   tay        -> ldy #imm
+ *   tya        -> lda #imm
+ *   lda sreg   -> lda #imm
+ *   ldx sreg   -> ldx #imm
+ *   ldy sreg   -> ldy #imm
  *
  * Provided that the register values are known of course.
  */
@@ -1013,6 +1016,42 @@ static unsigned OptDecouple (CodeSeg* S)
                }
                break;
 
+           case OP65_LDA:
+               if (E->AM == AM65_ZP) {
+                   if ((E->Use & REG_SREG_LO) != 0 && E->RI->In.SRegLo >= 0) {
+                       xsprintf (Buf, sizeof (Buf), "$%02X", E->RI->In.SRegLo);
+                       X = NewCodeEntry (OP65_LDA, AM65_IMM, Buf, 0, E->LI);
+                   } else if ((E->Use & REG_SREG_HI) != 0 && E->RI->In.SRegHi >= 0) {
+                       xsprintf (Buf, sizeof (Buf), "$%02X", E->RI->In.SRegHi);
+                       X = NewCodeEntry (OP65_LDA, AM65_IMM, Buf, 0, E->LI);
+                   }
+               }
+               break;
+
+           case OP65_LDX:
+               if (E->AM == AM65_ZP) {
+                   if ((E->Use & REG_SREG_LO) != 0 && E->RI->In.SRegLo >= 0) {
+                       xsprintf (Buf, sizeof (Buf), "$%02X", E->RI->In.SRegLo);
+                       X = NewCodeEntry (OP65_LDX, AM65_IMM, Buf, 0, E->LI);
+                   } else if ((E->Use & REG_SREG_HI) != 0 && E->RI->In.SRegHi >= 0) {
+                       xsprintf (Buf, sizeof (Buf), "$%02X", E->RI->In.SRegHi);
+                       X = NewCodeEntry (OP65_LDX, AM65_IMM, Buf, 0, E->LI);
+                   }
+               }
+               break;
+
+           case OP65_LDY:
+               if (E->AM == AM65_ZP) {
+                   if ((E->Use & REG_SREG_LO) != 0 && E->RI->In.SRegLo >= 0) {
+                       xsprintf (Buf, sizeof (Buf), "$%02X", E->RI->In.SRegLo);
+                       X = NewCodeEntry (OP65_LDY, AM65_IMM, Buf, 0, E->LI);
+                   } else if ((E->Use & REG_SREG_HI) != 0 && E->RI->In.SRegHi >= 0) {
+                       xsprintf (Buf, sizeof (Buf), "$%02X", E->RI->In.SRegHi);
+                       X = NewCodeEntry (OP65_LDY, AM65_IMM, Buf, 0, E->LI);
+                   }
+               }
+               break;
+
            case OP65_TAX:
                if (E->RI->In.RegA >= 0) {
                    xsprintf (Buf, sizeof (Buf), "$%02X", E->RI->In.RegA);