gps/GPSResources/tcpmp 0.73/common/softidct/mcomp_arm.asm

1016 lines
20 KiB
NASM
Executable File

;*****************************************************************************
;*
;* This program is free software ; you can redistribute it and/or modify
;* it under the terms of the GNU General Public License as published by
;* the Free Software Foundation; either version 2 of the License, or
;* (at your option) any later version.
;*
;* This program is distributed in the hope that it will be useful,
;* but WITHOUT ANY WARRANTY; without even the implied warranty of
;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;* GNU General Public License for more details.
;*
;* You should have received a copy of the GNU General Public License
;* along with this program; if not, write to the Free Software
;* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;*
;* $Id: mcomp_arm.asm 327 2005-11-04 07:09:17Z picard $
;*
;* The Core Pocket Media Player
;* Copyright (c) 2004-2005 Gabor Kovacs
;*
;*****************************************************************************
;R0 src
;R1 dst
;R2 srcpitch
;R3 dstpitch
AREA |.text|, CODE
macro
PreLoad $ARM5,$Pos
if $ARM5>0
if $Pos >= 0
if $Pos > 0
pld [r0,r2,lsl #1]
add r0,r0,#8
pld [r0,r2,lsl #1]
sub r0,r0,#8
else
pld [r0,r2,lsl #1]
add r0,r0,#4
pld [r0,r2,lsl #1]
sub r0,r0,#4
endif
else
pld [r0,r2,lsl #1]
add r0,r0,#7
pld [r0,r2,lsl #1]
sub r0,r0,#7
endif
endif
mend
macro
PreLoad2Init $ARM5,$Pos
if $ARM5>0
if $Pos >= 0
if $Pos > 0
add r10,r2,r2
add r10,r10,#8
else
add r10,r2,r2
add r10,r10,#4
endif
else
add r10,r2,r2
add r10,r10,#7
endif
endif
mend
macro
PreLoad2 $ARM5,$Pos
if $ARM5>0
pld [r0,r2,lsl #1]
pld [r0,r10]
endif
mend
macro
CopyBuild $Name,$Sub,$Round,$Add,$Fast,$ARM5
align 16
export $Name
$Name proc
if $ARM5>0
add ip,r2,#7
pld [r0,r2]
pld [r0,#7]
endif
stmdb sp!, {r4 - r11, lr}
if $ARM5>0
pld [r0,ip]
pld [r0]
endif
if $Fast>0
movs r4,r0,lsl #30
beq $Name.L00
cmps r4,#0x80000000
beq $Name.L10
bhi $Name.L11
$Name.L01
bic r0,r0,#3
$Sub $Name.8,8,$Round,$Add,$ARM5
$Name.L10
bic r0,r0,#3
$Sub $Name.16,16,$Round,$Add,$ARM5
$Name.L11
bic r0,r0,#3
$Sub $Name.24,24,$Round,$Add,$ARM5
$Name.L00
$Sub $Name.0,0,$Round,$Add,$ARM5
else
$Sub $Name.s,-1,$Round,$Add,$ARM5
endif
endp
mend
;------------------------------------------
;COPYBLOCK
;------------------------------------------
macro
CopyBlockRow $Pos
if $Pos > 0
ldr r5,[r0,#8]
ldr r6,[r0,#4]
ldr r4,[r0],r2
mov r5,r5,lsl #32-$Pos
orr r5,r5,r6,lsr #$Pos
mov r4,r4,lsr #$Pos
orr r4,r4,r6,lsl #32-$Pos
else
ldr r5,[r0,#4]
ldr r4,[r0],r2
endif
str r5,[r1,#4]
str r4,[r1],r3
mend
macro
CopyBlock $Id, $Pos, $Round, $Add, $ARM5
PreLoad2Init $ARM5,$Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
ldmia sp!, {r4 - r11, pc}
mend
;------------------------------------------
;COPYBLOCKM
;------------------------------------------
macro
CopyBlockMRow $Pos
if $Pos > 0
ldr r14,[r0,#16]
ldr r6,[r0,#12]
ldr r12,[r0,#8]
mov r14,r14,lsl #32-$Pos
orr r14,r14,r6,lsr #$Pos
mov r12,r12,lsr #$Pos
orr r12,r12,r6,lsl #32-$Pos
ldr r5,[r0,#8]
ldr r6,[r0,#4]
ldr r4,[r0],r2
mov r5,r5,lsl #32-$Pos
orr r5,r5,r6,lsr #$Pos
mov r4,r4,lsr #$Pos
orr r4,r4,r6,lsl #32-$Pos
else
ldr r5,[r0,#4]
ldr r12,[r0,#8]
ldr r14,[r0,#12]
ldr r4,[r0],r2
endif
str r5,[r1,#4]
str r12,[r1,#8]
str r14,[r1,#12]
str r4,[r1],r3
mend
macro
CopyBlockM $Id, $Pos, $Round, $Add, $ARM5
PreLoad2Init $ARM5,$Pos
mov r11,#16
$Id.Loop
PreLoad2 $ARM5,$Pos
CopyBlockMRow $Pos
subs r11,r11,#1
bne $Id.Loop
ldmia sp!, {r4 - r11, pc}
mend
;------------------------------------------
;COPYBLOCK16x16: no aligment!, only used in Copy()
;------------------------------------------
macro
CopyBlock16x16Row
ldr r7,[r0,#12]
ldr r6,[r0,#8]
ldr r5,[r0,#4]
ldr r4,[r0],r2
str r7,[r1,#12]
str r6,[r1,#8]
str r5,[r1,#4]
str r4,[r1],r3
mend
macro
CopyBlock16x16 $Id, $Pos, $Round, $Add, $ARM5
mov r11,#15
$Id.Loop
pld [r0,r2,lsl #1]
CopyBlock16x16Row
subs r11,r11,#1
bne $Id.Loop
;unroll last (no preload needed)
CopyBlock16x16Row
ldmia sp!, {r4 - r11, pc}
mend
;------------------------------------------
;COPYBLOCK8x8: no aligment!, only used in Copy()
;------------------------------------------
macro
CopyBlock8x8 $Id, $Pos, $Round, $Add, $ARM5
mov r11,#3
$Id.Loop
pld [r0,r2,lsl #1]
ldr r7,[r0,#4]
ldr r6,[r0],r2
pld [r0,r2,lsl #1]
ldr r5,[r0,#4]
ldr r4,[r0],r2
str r7,[r1,#4]
str r6,[r1],r3
str r5,[r1,#4]
str r4,[r1],r3
subs r11,r11,#1
bne $Id.Loop
;unroll last (no preload needed)
ldr r7,[r0,#4]
ldr r6,[r0],r2
ldr r5,[r0,#4]
ldr r4,[r0],r2
str r7,[r1,#4]
str r6,[r1],r3
str r5,[r1,#4]
str r4,[r1],r3
ldmia sp!, {r4 - r11, pc}
mend
;------------------------------------------
;ADDBLOCK
;------------------------------------------
macro
AddBlockRow $Pos
if $Pos < 0
ldrb r4,[r0]
ldrb r6,[r0,#1]
ldrb r5,[r0,#4]
ldrb r7,[r0,#5]
orr r4,r4,r6,lsl #8
ldrb r6,[r0,#2]
orr r5,r5,r7,lsl #8
ldrb r7,[r0,#6]
orr r4,r4,r6,lsl #16
ldrb r6,[r0,#3]
orr r5,r5,r7,lsl #16
ldrb r7,[r0,#7]
orr r4,r4,r6,lsl #24
add r0,r0,r2
orr r5,r5,r7,lsl #24
else
if $Pos > 0
ldr r5,[r0,#8]
ldr r6,[r0,#4]
ldr r4,[r0],r2
mov r5,r5,lsl #32-$Pos
orr r5,r5,r6,lsr #$Pos
mov r4,r4,lsr #$Pos
orr r4,r4,r6,lsl #32-$Pos
else
ldr r5,[r0,#4]
ldr r4,[r0],r2
endif
endif
ldr r7,[r1,#4]
ldr r6,[r1]
and r9,r12,r5,lsr #1
and r8,r12,r4,lsr #1
orr r5,r7,r5
orr r4,r6,r4
and r7,r12,r7,lsr #1
and r6,r12,r6,lsr #1
add r7,r7,r9
add r6,r6,r8
and r5,r5,r14
and r4,r4,r14
add r7,r7,r5
add r6,r6,r4
str r7,[r1,#4]
str r6,[r1],#8
mend
macro
AddBlock $Id, $Pos, $Round, $Add, $ARM5
PreLoad2Init $ARM5,$Pos
ldr r14,$Id.Mask
mov r11,#8
mvn r12,r14,lsl #7
$Id.Loop
PreLoad2 $ARM5,$Pos
AddBlockRow $Pos
subs r11,r11,#1
bne $Id.Loop
ldmia sp!, {r4 - r11, pc}
$Id.Mask dcd 0x01010101
mend
;------------------------------------------
; COPYBLOCKHOR
;------------------------------------------
macro
LoadHorRow $Id, $Pos
; result is r4,r5 and r8,r9 (one pixel to the right)
; r6,r7 can be used
if $Pos < 0
ldrb r4,[r0]
ldrb r6,[r0,#1]
ldrb r5,[r0,#4]
ldrb r7,[r0,#5]
orr r4,r4,r6,lsl #8
ldrb r6,[r0,#2]
orr r5,r5,r7,lsl #8
ldrb r7,[r0,#6]
orr r4,r4,r6,lsl #16
ldrb r6,[r0,#3]
orr r5,r5,r7,lsl #16
ldrb r7,[r0,#7]
orr r4,r4,r6,lsl #24
ldrb r6,[r0,#8]
orr r5,r5,r7,lsl #24
mov r8,r4,lsr #8
mov r9,r5,lsr #8
orr r8,r8,r5,lsl #24
orr r9,r9,r6,lsl #24
add r0,r0,r2
else
ldr r5,[r0,#4]
ldr r6,[r0,#8]
ldr r4,[r0],r2
if $Pos+8 < 32
mov r9,r5,lsr #$Pos+8
orr r9,r9,r6,lsl #32-$Pos-8
mov r8,r4,lsr #$Pos+8
orr r8,r8,r5,lsl #32-$Pos-8
else
mov r8,r5
mov r9,r6
endif
if $Pos > 0
mov r4,r4,lsr #$Pos
mov r6,r6,lsl #32-$Pos
orr r4,r4,r5,lsl #32-$Pos
orr r5,r6,r5,lsr #$Pos
endif
endif
mend
macro
CopyHorRow $Id, $Pos, $Round, $Add
;r14 01010101
;r12 7f7f7f7f
LoadHorRow $Id,$Pos
and r6,r12,r4,lsr #1
and r7,r12,r5,lsr #1
if $Round
and r4,r4,r8
and r5,r5,r9
else
orr r4,r4,r8
orr r5,r5,r9
endif
and r8,r12,r8,lsr #1
and r9,r12,r9,lsr #1
and r4,r4,r14
and r5,r5,r14
add r4,r4,r6
add r5,r5,r7
add r4,r4,r8
add r5,r5,r9
if $Add
ldr r7,[r1,#4]
ldr r6,[r1]
and r9,r12,r5,lsr #1
and r8,r12,r4,lsr #1
orr r5,r7,r5
orr r4,r6,r4
and r7,r12,r7,lsr #1
and r6,r12,r6,lsr #1
add r7,r7,r9
add r6,r6,r8
and r5,r5,r14
and r4,r4,r14
add r7,r7,r5
add r6,r6,r4
str r7,[r1,#4]
str r6,[r1],#8
else
str r5,[r1,#4]
str r4,[r1],r3
endif
mend
macro
CopyBlockHor $Id, $Pos, $Round, $Add, $ARM5
PreLoad2Init $ARM5,$Pos
ldr r14,$Id.Mask
mov r11,#8
mvn r12,r14,lsl #7
$Id.Loop
PreLoad2 $ARM5,$Pos
CopyHorRow $Id,$Pos,$Round,$Add
subs r11,r11,#1
bne $Id.Loop
ldmia sp!, {r4 - r11, pc}
$Id.Mask dcd 0x01010101
mend
;------------------------------------------
; COPYBLOCKVER
;------------------------------------------
macro
LoadVerRow $Id, $Pos, $Parity
if $Parity
; result is r8,r9 (r10=r8>>1,r11=r9>>1)
; r10,r11 can be used
if $Pos < 0
ldrb r8,[r0]
ldrb r10,[r0,#1]
ldrb r9,[r0,#4]
ldrb r11,[r0,#5]
orr r8,r8,r10,lsl #8
ldrb r10,[r0,#2]
orr r9,r9,r11,lsl #8
ldrb r11,[r0,#6]
orr r8,r8,r10,lsl #16
ldrb r10,[r0,#3]
orr r9,r9,r11,lsl #16
ldrb r11,[r0,#7]
orr r8,r8,r10,lsl #24
add r0,r0,r2
orr r9,r9,r11,lsl #24
else
if $Pos > 0
ldr r9,[r0,#8]
ldr r10,[r0,#4]
ldr r8,[r0],r2
mov r9,r9,lsl #32-$Pos
orr r9,r9,r10,lsr #$Pos
mov r8,r8,lsr #$Pos
orr r8,r8,r10,lsl #32-$Pos
else
ldr r9,[r0,#4]
ldr r8,[r0],r2
endif
endif
and r11,r12,r9,lsr #1
and r10,r12,r8,lsr #1
else
; result is r4,r5 (r6=r4>>1,r7=r5>>1)
; r6,r7 can be used
if $Pos < 0
ldrb r4,[r0]
ldrb r6,[r0,#1]
ldrb r5,[r0,#4]
ldrb r7,[r0,#5]
orr r4,r4,r6,lsl #8
ldrb r6,[r0,#2]
orr r5,r5,r7,lsl #8
ldrb r7,[r0,#6]
orr r4,r4,r6,lsl #16
ldrb r6,[r0,#3]
orr r5,r5,r7,lsl #16
ldrb r7,[r0,#7]
orr r4,r4,r6,lsl #24
add r0,r0,r2
orr r5,r5,r7,lsl #24
else
if $Pos > 0
ldr r5,[r0,#8]
ldr r6,[r0,#4]
ldr r4,[r0],r2
mov r5,r5,lsl #32-$Pos
orr r5,r5,r6,lsr #$Pos
mov r4,r4,lsr #$Pos
orr r4,r4,r6,lsl #32-$Pos
else
ldr r5,[r0,#4]
ldr r4,[r0],r2
endif
endif
and r7,r12,r5,lsr #1
and r6,r12,r4,lsr #1
endif
mend
macro
CopyVerRow $Id, $Pos, $Parity, $Round, $Add
;r14 01010101
;r12 7f7f7f7f
LoadVerRow $Id,$Pos,$Parity
if $Parity
if $Round
and r4,r4,r8
and r5,r5,r9
else
orr r4,r4,r8
orr r5,r5,r9
endif
and r4,r4,r14
and r5,r5,r14
add r4,r4,r6
add r5,r5,r7
add r4,r4,r10
add r5,r5,r11
if $Add
ldr r7,[r1,#4]
ldr r6,[r1]
and r3,r12,r5,lsr #1
orr r5,r7,r5
and r7,r12,r7,lsr #1
add r7,r7,r3
and r3,r12,r4,lsr #1
orr r4,r6,r4
and r6,r12,r6,lsr #1
add r6,r6,r3
and r5,r5,r14
and r4,r4,r14
add r5,r5,r7
add r4,r4,r6
ldr r7,[sp] ;end src for loop compare
str r5,[r1,#4]
str r4,[r1],#8
else
ldr r7,[sp] ;end src for loop compare
str r5,[r1,#4]
str r4,[r1],r3
endif
else
if $Round
and r8,r8,r4
and r9,r9,r5
else
orr r8,r8,r4
orr r9,r9,r5
endif
and r8,r8,r14
and r9,r9,r14
add r8,r8,r10
add r9,r9,r11
add r8,r8,r6
add r9,r9,r7
if $Add
ldr r11,[r1,#4]
ldr r10,[r1]
and r3,r12,r9,lsr #1
orr r9,r11,r9
and r11,r12,r11,lsr #1
add r11,r11,r3
and r3,r12,r8,lsr #1
orr r8,r10,r8
and r10,r12,r10,lsr #1
add r10,r10,r3
and r9,r9,r14
and r8,r8,r14
add r11,r11,r9
add r10,r10,r8
str r11,[r1,#4]
str r10,[r1],#8
else
str r9,[r1,#4]
str r8,[r1],r3
endif
endif
mend
macro
CopyBlockVer $Id, $Pos, $Round, $Add, $ARM5
sub sp,sp,#4
add r4,r0,r2,lsl #3
add r4,r4,r2
str r4,[sp] ;end src
ldr r14,$Id.Mask
mvn r12,r14,lsl #7
PreLoad $ARM5,$Pos
LoadVerRow $Id,$Pos,1
$Id.Loop
PreLoad $ARM5,$Pos
CopyVerRow $Id,$Pos,0,$Round,$Add
PreLoad $ARM5,$Pos
CopyVerRow $Id,$Pos,1,$Round,$Add
cmp r0,r7
bne $Id.Loop
add sp,sp,#4
ldmia sp!, {r4 - r11, pc}
$Id.Mask dcd 0x01010101
mend
;------------------------------------------
; COPYBLOCKHORVER
;------------------------------------------
; load needs r2,r3 for temporary (r2 is restored from stack)
macro
LoadHorVerRow $Id, $Pos, $Parity
if $Parity
;read result r4,r5 and r2,r3 (one pixel to right)
;r6,r7 can be used
if $Pos<0
ldrb r4,[r0]
ldrb r6,[r0,#1]
ldrb r5,[r0,#4]
ldrb r7,[r0,#5]
orr r4,r4,r6,lsl #8
ldrb r6,[r0,#2]
orr r5,r5,r7,lsl #8
ldrb r7,[r0,#6]
orr r4,r4,r6,lsl #16
ldrb r6,[r0,#3]
orr r5,r5,r7,lsl #16
ldrb r7,[r0,#7]
orr r4,r4,r6,lsl #24
ldrb r6,[r0,#8]
orr r5,r5,r7,lsl #24
add r0,r0,r2
mov r2,r4,lsr #8
mov r3,r5,lsr #8
orr r2,r2,r5,lsl #24
orr r3,r3,r6,lsl #24
else
ldr r5,[r0,#4]
ldr r6,[r0,#8]
ldr r4,[r0],r2
if $Pos+8 < 32
mov r3,r5,lsr #$Pos+8
orr r3,r3,r6,lsl #32-$Pos-8
mov r2,r4,lsr #$Pos+8
orr r2,r2,r5,lsl #32-$Pos-8
else
mov r2,r5
mov r3,r6
endif
if $Pos > 0
mov r4,r4,lsr #$Pos
mov r6,r6,lsl #32-$Pos
orr r4,r4,r5,lsl #32-$Pos
orr r5,r6,r5,lsr #$Pos
endif
endif
and r6,r2,r14
and r2,r12,r2,lsr #2
and r7,r4,r14
and r4,r12,r4,lsr #2
add r4,r4,r2
add r6,r6,r7
and r2,r3,r14
and r3,r12,r3,lsr #2
and r7,r5,r14
and r5,r12,r5,lsr #2
add r5,r5,r3
add r7,r2,r7
else
;read result r8,r9 and r2,r3 (one pixel to right)
;r10,r11 can be used
if $Pos<0
ldrb r8,[r0]
ldrb r10,[r0,#1]
ldrb r9,[r0,#4]
ldrb r11,[r0,#5]
orr r8,r8,r10,lsl #8
ldrb r10,[r0,#2]
orr r9,r9,r11,lsl #8
ldrb r11,[r0,#6]
orr r8,r8,r10,lsl #16
ldrb r10,[r0,#3]
orr r9,r9,r11,lsl #16
ldrb r11,[r0,#7]
orr r8,r8,r10,lsl #24
ldrb r10,[r0,#8]
orr r9,r9,r11,lsl #24
add r0,r0,r2
mov r2,r8,lsr #8
mov r3,r9,lsr #8
orr r2,r2,r9,lsl #24
orr r3,r3,r10,lsl #24
else
ldr r9,[r0,#4]
ldr r10,[r0,#8]
ldr r8,[r0],r2
if $Pos+8 < 32
mov r3,r9,lsr #$Pos+8
orr r3,r3,r10,lsl #32-$Pos-8
mov r2,r8,lsr #$Pos+8
orr r2,r2,r9,lsl #32-$Pos-8
else
mov r2,r9
mov r3,r10
endif
if $Pos > 0
mov r8,r8,lsr #$Pos
mov r10,r10,lsl #32-$Pos
orr r8,r8,r9,lsl #32-$Pos
orr r9,r10,r9,lsr #$Pos
endif
endif
and r10,r2,r14
and r2,r12,r2,lsr #2
and r11,r8,r14
and r8,r12,r8,lsr #2
add r8,r8,r2
add r10,r10,r11
and r2,r3,r14
and r3,r12,r3,lsr #2
and r11,r9,r14
and r9,r12,r9,lsr #2
add r9,r9,r3
add r11,r2,r11
endif
ldr r2,[sp]
mend
macro
CopyHorVerRow $Id, $Pos, $Parity, $Round, $Add
;r14 03030303
;r12 3f3f3f3f
LoadHorVerRow $Id,$Pos,$Parity
if $Round
and r3,r14,r14,lsr #1 ;0x01010101
else
and r3,r14,r14,lsl #1 ;0x02020202
endif
if $Parity
add r8,r8,r4
add r9,r9,r5
add r10,r10,r6
add r11,r11,r7
add r10,r10,r3
add r11,r11,r3
and r10,r14,r10,lsr #2
and r11,r14,r11,lsr #2
if $Add
add r8,r8,r10
add r9,r9,r11
orr r12,r12,r12,lsl #1 ;0x7F7F7F7F
ldr r11,[r1,#4]
ldr r10,[r1]
and r3,r12,r9,lsr #1
orr r9,r11,r9
and r11,r12,r11,lsr #1
add r11,r11,r3
and r3,r12,r8,lsr #1
orr r8,r10,r8
and r10,r12,r10,lsr #1
add r10,r10,r3
and r3,r14,r14,lsr #1 ;0x01010101
mvn r12,r14,lsl #6 ;restore r12
and r9,r9,r3
and r8,r8,r3
add r11,r11,r9
add r10,r10,r8
ldr r3,[sp,#4] ;end src for loop compare
str r11,[r1,#4]
str r10,[r1],#8
else
add r8,r8,r10
ldr r10,[sp,#8] ;dstpitch
add r9,r9,r11
ldr r3,[sp,#4] ;end src for loop compare
str r9,[r1,#4]
str r8,[r1],r10
endif
else
add r4,r4,r8
add r5,r5,r9
add r6,r6,r10
add r7,r7,r11
add r6,r6,r3
add r7,r7,r3
and r6,r14,r6,lsr #2
and r7,r14,r7,lsr #2
if $Add
add r4,r4,r6
add r5,r5,r7
orr r12,r12,r12,lsl #1 ;0x7F7F7F7F
ldr r7,[r1,#4]
ldr r6,[r1]
and r3,r12,r5,lsr #1
orr r5,r7,r5
and r7,r12,r7,lsr #1
add r7,r7,r3
and r3,r12,r4,lsr #1
orr r4,r6,r4
and r6,r12,r6,lsr #1
add r6,r6,r3
and r3,r14,r14,lsr #1 ;0x01010101
mvn r12,r14,lsl #6 ;restore r12
and r5,r5,r3
and r4,r4,r3
add r7,r7,r5
add r6,r6,r4
str r7,[r1,#4]
str r6,[r1],#8
else
ldr r3,[sp,#8] ;dstpitch
add r4,r4,r6
add r5,r5,r7
str r5,[r1,#4]
str r4,[r1],r3
endif
endif
mend
macro
CopyBlockHorVer $Id, $Pos, $Round, $Add, $ARM5
sub sp,sp,#12
add r4,r0,r2,lsl #3
add r4,r4,r2
str r2,[sp] ;srcpitch
str r4,[sp,#4] ;end src
str r3,[sp,#8] ;dstpitch
ldr r14,$Id.Mask
mvn r12,r14,lsl #6
PreLoad $ARM5,$Pos
LoadHorVerRow $Id,$Pos,1
$Id.Loop
PreLoad $ARM5,$Pos
CopyHorVerRow $Id,$Pos,0,$Round,$Add
PreLoad $ARM5,$Pos
CopyHorVerRow $Id,$Pos,1,$Round,$Add
cmp r0,r3
bne $Id.Loop
add sp,sp,#12
ldmia sp!, {r4 - r11, pc}
$Id.Mask dcd 0x03030303
mend
;---------------------------------------------------
; general unaligned copy (use preload)
CopyBuild CopyBlock8x8,CopyBlock8x8,0,0,0,1
CopyBuild CopyBlock16x16,CopyBlock16x16,0,0,0,1
;---------------------------------------------------
; smaller versions without preload
;
; CopyBuild CopyBlock,CopyBlock,0,0,1,0
; CopyBuild CopyBlockVer,CopyBlockVer,0,0,0,0
; CopyBuild CopyBlockHor,CopyBlockHor,0,0,0,0
; CopyBuild CopyBlockHorVer,CopyBlockHorVer,0,0,0,0
; CopyBuild CopyBlockVerRound,CopyBlockVer,1,0,0,0
; CopyBuild CopyBlockHorRound,CopyBlockHor,1,0,0,0
; CopyBuild CopyBlockHorVerRound,CopyBlockHorVer,1,0,0,0
;
; CopyBuild AddBlock,AddBlock,0,1,0,0
; CopyBuild AddBlockVer,CopyBlockVer,0,1,0,0
; CopyBuild AddBlockHor,CopyBlockHor,0,1,0,0
; CopyBuild AddBlockHorVer,CopyBlockHorVer,0,1,0,0
;
;---------------------------------------------------
; smaller versions with preload
;
; CopyBuild PreLoadCopyBlock,CopyBlock,0,0,1,1
; CopyBuild PreLoadCopyBlockVer,CopyBlockVer,0,0,0,1
; CopyBuild PreLoadCopyBlockHor,CopyBlockHor,0,0,0,1
; CopyBuild PreLoadCopyBlockHorVer,CopyBlockHorVer,0,0,0,1
; CopyBuild PreLoadCopyBlockVerRound,CopyBlockVer,1,0,0,1
; CopyBuild PreLoadCopyBlockHorRound,CopyBlockHor,1,0,0,1
; CopyBuild PreLoadCopyBlockHorVerRound,CopyBlockHorVer,1,0,0,1
;
; CopyBuild PreLoadAddBlock,AddBlock,0,1,0,1
; CopyBuild PreLoadAddBlockVer,CopyBlockVer,0,1,0,1
; CopyBuild PreLoadAddBlockHor,CopyBlockHor,0,1,0,1
; CopyBuild PreLoadAddBlockHorVer,CopyBlockHorVer,0,1,0,1
;
;---------------------------------------------------
; larger versions with preload
; (faster if there is enough intstruction cache available)
CopyBuild CopyBlock,CopyBlock,0,0,1,1
CopyBuild CopyBlockVer,CopyBlockVer,0,0,1,1
CopyBuild CopyBlockHor,CopyBlockHor,0,0,1,1
CopyBuild CopyBlockHorVer,CopyBlockHorVer,0,0,1,1
CopyBuild CopyBlockVerRound,CopyBlockVer,1,0,1,1
CopyBuild CopyBlockHorRound,CopyBlockHor,1,0,1,1
CopyBuild CopyBlockHorVerRound,CopyBlockHorVer,1,0,1,1
CopyBuild AddBlock,AddBlock,0,1,1,1
CopyBuild AddBlockVer,CopyBlockVer,0,1,1,1
CopyBuild AddBlockHor,CopyBlockHor,0,1,1,1
CopyBuild AddBlockHorVer,CopyBlockHorVer,0,1,1,1
CopyBuild CopyBlockM,CopyBlockM,0,0,1,1
END