]> git.sur5r.net Git - cc65/blobdiff - libsrc/runtime/add.s
few 6502 and some 65SC02 optimizations
[cc65] / libsrc / runtime / add.s
index 6fb2dacf7ee48b70d49453e410476ac63a0b61f1..e644671c0eb23a8acf93f44b508ede46141243eb 100644 (file)
@@ -1,5 +1,6 @@
 ;
 ; Ullrich von Bassewitz, 05.08.1998
+; Christian Krueger, 11-Mar-2017, spend two bytes for one cycle, improved 65SC02 optimization
 ;
 ; CC65 runtime: add ints
 ;
@@ -8,32 +9,46 @@
 ; called a lot!
 
         .export         tosadda0, tosaddax
-        .importzp       sp
+        .importzp       sp, tmp1
 
         .macpack        cpu
 
 tosadda0:
         ldx     #0
 tosaddax:
-        clc
-.if (.cpu .bitand CPU_ISET_65SC02)
-        adc     (sp)            ; 65SC02 version - saves 2 cycles
-        ldy     #1
-.else
-        ldy     #0
-        adc     (sp),y          ; lo byte
-        iny
-.endif
-        pha                     ; save it
-        txa
-        adc     (sp),y          ; hi byte
-        tax
-        clc
-        lda     sp
-        adc     #2
-        sta     sp
-        bcc     L1
-        inc     sp+1
-L1:     pla                     ; Restore low byte
-        rts
+        clc                     ; (2)
+
+.if (.cpu .bitand ::CPU_ISET_65SC02)
+
+        adc     (sp)            ; (7)
+        tay                     ; (9)
+        inc     sp              ; (14)
+        bne     hiadd           ; (17)
+        inc     sp+1            ; (-1+5)
+hiadd:  txa                     ; (19)
+        adc     (sp)            ; (24)
+        tax                     ; (26)
+        inc     sp              ; (31)
+        bne     done            ; (34)
+        inc     sp+1            ; (-1+5)
+done:   tya                     ; (36)
 
+.else        
+
+        ldy     #0              ; (4)
+        adc     (sp),y          ; (9) lo byte
+        iny                     ; (11)
+        sta     tmp1            ; (14) save it
+        txa                     ; (16) 
+        adc     (sp),y          ; (21) hi byte
+        tax                     ; (23)
+        clc                     ; (25)
+        lda     sp              ; (28)
+        adc     #2              ; (30)
+        sta     sp              ; (33)
+        bcc     L1              ; (36)
+        inc     sp+1            ; (-1+5)
+L1:     lda     tmp1            ; (39) restore low byte
+
+.endif
+        rts                     ; (6502: 45 cycles, 26 bytes <-> 65SC02: 42 cycles, 22 bytes )