32x, arm asm draw optimization
authorkub <derkub@gmail.com>
Fri, 2 Apr 2021 19:54:54 +0000 (21:54 +0200)
committerkub <derkub@gmail.com>
Fri, 2 Apr 2021 19:54:54 +0000 (21:54 +0200)
pico/32x/draw_arm.S

index bf26f74..cdcb211 100644 (file)
     mov     r6, #320
     add     r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
 
+    ldrh    r7, [r5], #2
 2: @ loop_inner:
-    ldrh    r8, [r5], #2
+    mov     r8, r7
     subs    lr, r6, #1
     blt     0b @ loop_outer
+    beq     7f @ single_pix
+    ldrh    r7, [r5], #2     @ 32x pixel
+    cmp     r7, r8           @ do RLE only if we have at least 2 px
+@    ldreqh  r7, [r5]
+@    cmpeq   r7, r8
+    subeq   lr, lr, #1
+    beq     3f @ loop_innermost
+
+7: @ single_pix:
+    mov     r6, lr
+
+    eor     r12,r8, r10
+    tst     r12, #0x8000     @ !((t ^ inv) & 0x8000)
+    addeq   r11,r11,#1
+    beq     8f @ single_pix_32x
+
+    ldrb    r12,[r11], #1    @ MD pixel
+    cmp     r3, r12,lsl #26  @ MD has bg pixel?
+.if \do_md
+    movne   r12,r12,lsl #1
+    ldrneh  r12,[r9, r12]
+    strneh  r12,[r0], #2     @ *dst++ = palmd[*pmd]
+.else
+    addne   r0, r0, #2
+.endif
+    bne     2b @ loop_inner
+
+8: @ single_pix_32x:
+    and     r12,r8, #0x03e0
+    mov     r8, r8, lsl #11
+    orr     r8, r8, r8, lsr #(10+11)
+    orr     r8, r8, r12,lsl #1
+    bic     r8, r8, #0x0020  @ kill prio bit
+    strh    r8, [r0], #2
+    b       2b @ loop_inner
 
 3: @ loop_innermost:
     ldrh    r7, [r5], #2     @ 32x pixel
     cmpge   r7, r8
     beq     3b @ loop_innermost
 
-    sub     r5, r5, #2
     add     lr, lr, #1
     sub     lr, r6, lr
     sub     r6, r6, lr
     tst     r12, #0x8000     @ !((t ^ inv) & 0x8000)
     bne     5f @ draw_md
 
-    and     r,r8, #0x03e0
+    and     r12,r8, #0x03e0
     mov     r8, r8, lsl #11
     orr     r8, r8, r8, lsr #(10+11)
-    orr     r8, r8, r,lsl #1
+    orr     r8, r8, r12,lsl #1
     bic     r8, r8, #0x0020  @ kill prio bit
 
     add     r11,r11,lr
 
 5: @ draw_md:
     subs    lr, lr, #1
-    ldrgeb  r7, [r11], #1    @ MD pixel
+    ldrgeb  r12,[r11], #1    @ MD pixel
     blt     2b @ loop_inner
-    cmp     r3, r7, lsl #26  @ MD has bg pixel?
+    cmp     r3, r12,lsl #26  @ MD has bg pixel?
 .if \do_md
-    mov     r7, r7, lsl #1
-    ldrneh  r7 ,[r9, r7]
-    strneh  r,[r0], #2     @ *dst++ = palmd[*pmd]
+    mov     r12,r12,lsl #1
+    ldrneh  r12,[r9, r12]
+    strneh  r12,[r0], #2     @ *dst++ = palmd[*pmd]
 .else
     addne   r0, r0, #2
 .endif
     bne     5b @ draw_md
 
-    and     r,r8, #0x03e0
+    and     r12,r8, #0x03e0
     mov     r8, r8, lsl #11
     orr     r8, r8, r8, lsr #(10+11)
-    orr     r8, r8, r,lsl #1
+    orr     r8, r8, r12,lsl #1
     bic     r8, r8, #0x0020  @ kill prio bit
     strh    r8, [r0], #2     @ *dst++ = bgr2rgb(*p32x++)
 
 6: @ draw_md_32x:
     subs    lr, lr, #1
-    ldrgeb  r7, [r11], #1    @ MD pixel
+    ldrgeb  r12,[r11], #1    @ MD pixel
     blt     2b @ loop_inner
-    cmp     r3, r7, lsl #26  @ MD has bg pixel?
+    cmp     r3, r12,lsl #26  @ MD has bg pixel?
 .if \do_md
-    mov     r7, r7, lsl #1
-    ldrneh  r7 ,[r9, r7]     @ *dst++ = palmd[*pmd]
-    moveq   r,r8           @ *dst++ = bgr2rgb(*p32x++)
-    strh    r,[r0], #2
+    mov     r12,r12,lsl #1
+    ldrneh  r12,[r9, r12]    @ *dst++ = palmd[*pmd]
+    moveq   r12,r8           @ *dst++ = bgr2rgb(*p32x++)
+    strh    r12,[r0], #2
 .else
     streqh  r8, [r0]         @ *dst++ = bgr2rgb(*p32x++)
     add     r0, r0, #2