460 lines
7.9 KiB
ArmAsm
460 lines
7.9 KiB
ArmAsm
|
@*****************************************************************************
|
||
|
@*
|
||
|
@* 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_wmmx.s 271 2005-08-09 08:31:35Z picard $
|
||
|
@*
|
||
|
@* The Core Pocket Media Player
|
||
|
@* Copyright (c) 2004-2005 Gabor Kovacs
|
||
|
@*
|
||
|
@*****************************************************************************
|
||
|
|
||
|
@R0 src
|
||
|
@R1 dst
|
||
|
@R2 srcpitch
|
||
|
@R3 dstpitch
|
||
|
|
||
|
|
||
|
.macro CopyBegin
|
||
|
add ip,r2,#7
|
||
|
.dc.l 0x0f7d0f002
|
||
|
.dc.l 0x0f5d0f007
|
||
|
stmdb sp!,{lr}
|
||
|
.dc.l 0x0f7d0f00c
|
||
|
.dc.l 0x0f5d0f000
|
||
|
.endm
|
||
|
|
||
|
.macro CopyEnd
|
||
|
ldmia sp!,{pc}
|
||
|
.endm
|
||
|
|
||
|
.macro PreLoad
|
||
|
|
||
|
.dc.l 0x0f7d0f082
|
||
|
.endm
|
||
|
|
||
|
.macro PreLoad2Init
|
||
|
|
||
|
add ip,r2,#4
|
||
|
.endm
|
||
|
|
||
|
.macro PreLoad2
|
||
|
|
||
|
.dc.l 0x0f7d0f082 @2*pitch
|
||
|
.dc.l 0x0f7d0f08c @2*pitch+8
|
||
|
.endm
|
||
|
|
||
|
.macro PrepareAlignVer Name, Height
|
||
|
ands r14,r0,#7
|
||
|
tmcr wcgr1,r14
|
||
|
mov r14,#&Height
|
||
|
beq &Name.Aligned
|
||
|
bic r0,r0,#7
|
||
|
.endm
|
||
|
|
||
|
.macro PrepareAlignHor Name
|
||
|
and r14,r0,#7
|
||
|
tmcr wcgr1,r14
|
||
|
add r14,r14,#1
|
||
|
bic r0,r0,#7
|
||
|
cmp r14,#8
|
||
|
beq &Name.Wrap
|
||
|
tmcr wcgr2,r14
|
||
|
mov r14,#8
|
||
|
.endm
|
||
|
|
||
|
@------------------------------------------
|
||
|
@COPYBLOCK
|
||
|
@------------------------------------------
|
||
|
|
||
|
.macro CopyBlock Name
|
||
|
|
||
|
.align 2
|
||
|
.global &Name
|
||
|
&Name:
|
||
|
CopyBegin
|
||
|
sub r1,r1,r3
|
||
|
PrepareAlignVer &Name,8
|
||
|
|
||
|
PreLoad2Init
|
||
|
&Name.Loop:
|
||
|
PreLoad2
|
||
|
wldrd wr0,[r0]
|
||
|
wldrd wr1,[r0,#8]
|
||
|
add r0,r0,r2
|
||
|
add r1,r1,r3
|
||
|
walignr1 wr0,wr0,wr1
|
||
|
wstrd wr0,[r1]
|
||
|
subs r14,r14,#1
|
||
|
bne &Name.Loop
|
||
|
CopyEnd
|
||
|
|
||
|
&Name.Aligned:
|
||
|
PreLoad
|
||
|
wldrd wr0,[r0]
|
||
|
add r0,r0,r2
|
||
|
add r1,r1,r3
|
||
|
wstrd wr0,[r1]
|
||
|
subs r14,r14,#1
|
||
|
bne &Name.Aligned
|
||
|
CopyEnd
|
||
|
|
||
|
.endm
|
||
|
|
||
|
@------------------------------------------
|
||
|
@COPYBLOCKM
|
||
|
@------------------------------------------
|
||
|
|
||
|
.macro CopyBlockM Name
|
||
|
|
||
|
.align 2
|
||
|
.global &Name
|
||
|
&Name:
|
||
|
CopyBegin
|
||
|
sub r1,r1,r3
|
||
|
PrepareAlignVer &Name,16
|
||
|
|
||
|
PreLoad2Init
|
||
|
&Name.Loop:
|
||
|
PreLoad2
|
||
|
wldrd wr0,[r0]
|
||
|
wldrd wr1,[r0,#8]
|
||
|
wldrd wr2,[r0,#16]
|
||
|
add r0,r0,r2
|
||
|
add r1,r1,r3
|
||
|
walignr1 wr0,wr0,wr1
|
||
|
walignr1 wr1,wr1,wr2
|
||
|
wstrd wr0,[r1]
|
||
|
wstrd wr1,[r1,#8]
|
||
|
subs r14,r14,#1
|
||
|
bne &Name.Loop
|
||
|
CopyEnd
|
||
|
|
||
|
&Name.Aligned:
|
||
|
PreLoad
|
||
|
wldrd wr0,[r0]
|
||
|
wldrd wr1,[r0,#8]
|
||
|
add r0,r0,r2
|
||
|
add r1,r1,r3
|
||
|
wstrd wr0,[r1]
|
||
|
wstrd wr1,[r1,#8]
|
||
|
subs r14,r14,#1
|
||
|
bne &Name.Aligned
|
||
|
CopyEnd
|
||
|
|
||
|
.endm
|
||
|
|
||
|
@------------------------------------------
|
||
|
@ADDBLOCK
|
||
|
@------------------------------------------
|
||
|
|
||
|
.macro AddBlock Name
|
||
|
.align 2
|
||
|
.global &Name
|
||
|
&Name:
|
||
|
CopyBegin
|
||
|
PrepareAlignVer &Name,8
|
||
|
|
||
|
PreLoad2Init
|
||
|
&Name.Loop:
|
||
|
PreLoad2
|
||
|
wldrd wr0,[r0]
|
||
|
wldrd wr1,[r0,#8]
|
||
|
add r0,r0,r2
|
||
|
wldrd wr5,[r1]
|
||
|
walignr1 wr0,wr0,wr1
|
||
|
wavg2br wr0,wr0,wr5
|
||
|
wstrd wr0,[r1],#8
|
||
|
subs r14,r14,#1
|
||
|
bne &Name.Loop
|
||
|
CopyEnd
|
||
|
|
||
|
&Name.Aligned:
|
||
|
PreLoad
|
||
|
wldrd wr0,[r0]
|
||
|
add r0,r0,r2
|
||
|
wldrd wr5,[r1]
|
||
|
wavg2br wr0,wr0,wr5
|
||
|
wstrd wr0,[r1],#8
|
||
|
subs r14,r14,#1
|
||
|
bne &Name.Aligned
|
||
|
CopyEnd
|
||
|
|
||
|
.endm
|
||
|
|
||
|
@------------------------------------------
|
||
|
@ COPYBLOCKHOR
|
||
|
@------------------------------------------
|
||
|
|
||
|
.macro CopyHorRow Round, Add, Wrap
|
||
|
PreLoad2
|
||
|
wldrd wr0,[r0]
|
||
|
wldrd wr1,[r0,#8]
|
||
|
add r0,r0,r2
|
||
|
.if &Add > 0
|
||
|
wldrd wr5,[r1]
|
||
|
.else
|
||
|
add r1,r1,r3
|
||
|
.endif
|
||
|
walignr1 wr2,wr0,wr1
|
||
|
.if &Wrap == 0
|
||
|
walignr2 wr1,wr0,wr1
|
||
|
.endif
|
||
|
.if &Round > 0
|
||
|
wavg2b wr0,wr1,wr2
|
||
|
.else
|
||
|
wavg2br wr0,wr1,wr2
|
||
|
.endif
|
||
|
.if &Add > 0
|
||
|
wavg2br wr0,wr0,wr5
|
||
|
wstrd wr0,[r1],#8
|
||
|
.else
|
||
|
wstrd wr0,[r1]
|
||
|
.endif
|
||
|
.endm
|
||
|
|
||
|
.macro CopyBlockHor Name, Round, Add
|
||
|
.align 2
|
||
|
.global &Name
|
||
|
&Name:
|
||
|
CopyBegin
|
||
|
.if &Add == 0
|
||
|
sub r1,r1,r3
|
||
|
.endif
|
||
|
PreLoad2Init
|
||
|
PrepareAlignHor &Name
|
||
|
|
||
|
&Name.Loop:
|
||
|
CopyHorRow &Round,&Add,0
|
||
|
subs r14,r14,#1
|
||
|
bne &Name.Loop
|
||
|
CopyEnd
|
||
|
|
||
|
&Name.Wrap:
|
||
|
CopyHorRow &Round,&Add,1
|
||
|
subs r14,r14,#1
|
||
|
bne &Name.Wrap
|
||
|
CopyEnd
|
||
|
|
||
|
.endm
|
||
|
|
||
|
@------------------------------------------
|
||
|
@ COPYBLOCKVER
|
||
|
@------------------------------------------
|
||
|
|
||
|
.macro SetVerRow Round, Add
|
||
|
.if &Add > 0
|
||
|
wldrd wr5,[r1]
|
||
|
.else
|
||
|
add r1,r1,r3
|
||
|
.endif
|
||
|
.if &Round > 0
|
||
|
wavg2b wr1,wr0,wr2
|
||
|
.else
|
||
|
wavg2br wr1,wr0,wr2
|
||
|
.endif
|
||
|
.if &Add > 0
|
||
|
wavg2br wr1,wr1,wr5
|
||
|
wstrd wr1,[r1],#8
|
||
|
.else
|
||
|
wstrd wr1,[r1]
|
||
|
.endif
|
||
|
.endm
|
||
|
|
||
|
.macro CopyBlockVer Name, Round, Add
|
||
|
.align 2
|
||
|
.global &Name
|
||
|
&Name:
|
||
|
CopyBegin
|
||
|
.if &Add == 0
|
||
|
sub r1,r1,r3
|
||
|
.endif
|
||
|
PrepareAlignVer &Name,8
|
||
|
|
||
|
PreLoad2Init
|
||
|
PreLoad2
|
||
|
wldrd wr0,[r0]
|
||
|
wldrd wr1,[r0,#8]
|
||
|
add r0,r0,r2
|
||
|
walignr1 wr0,wr0,wr1
|
||
|
|
||
|
&Name.Loop:
|
||
|
PreLoad2
|
||
|
wldrd wr2,[r0]
|
||
|
wldrd wr1,[r0,#8]
|
||
|
add r0,r0,r2
|
||
|
walignr1 wr2,wr2,wr1
|
||
|
SetVerRow &Round,&Add
|
||
|
PreLoad2
|
||
|
wldrd wr0,[r0]
|
||
|
wldrd wr1,[r0,#8]
|
||
|
add r0,r0,r2
|
||
|
walignr1 wr0,wr0,wr1
|
||
|
SetVerRow &Round,&Add
|
||
|
subs r14,r14,#2
|
||
|
bne &Name.Loop
|
||
|
CopyEnd
|
||
|
|
||
|
&Name.Aligned:
|
||
|
|
||
|
PreLoad
|
||
|
wldrd wr0,[r0]
|
||
|
add r0,r0,r2
|
||
|
|
||
|
&Name.Loop2:
|
||
|
PreLoad
|
||
|
wldrd wr2,[r0]
|
||
|
add r0,r0,r2
|
||
|
SetVerRow &Round,&Add
|
||
|
PreLoad
|
||
|
wldrd wr0,[r0]
|
||
|
add r0,r0,r2
|
||
|
SetVerRow &Round,&Add
|
||
|
subs r14,r14,#2
|
||
|
bne &Name.Loop2
|
||
|
CopyEnd
|
||
|
.endm
|
||
|
|
||
|
@------------------------------------------
|
||
|
@ COPYBLOCKHORVER
|
||
|
@------------------------------------------
|
||
|
|
||
|
@ wr6 0x03
|
||
|
@ wr7 ~0x03
|
||
|
|
||
|
.macro LoadHorVerRow Parity, Wrap
|
||
|
PreLoad2
|
||
|
.if &Parity
|
||
|
wldrd wr0,[r0]
|
||
|
wldrd wr1,[r0,#8]
|
||
|
add r0,r0,r2
|
||
|
walignr1 wr2,wr0,wr1
|
||
|
.if &Wrap == 0
|
||
|
walignr2 wr1,wr0,wr1
|
||
|
.endif
|
||
|
|
||
|
wand wr0,wr2,wr6
|
||
|
wand wr3,wr1,wr6
|
||
|
wand wr2,wr2,wr7
|
||
|
wand wr1,wr1,wr7
|
||
|
wsrldg wr2,wr2,wcgr0
|
||
|
wsrldg wr1,wr1,wcgr0
|
||
|
waddb wr2,wr2,wr1
|
||
|
waddb wr1,wr3,wr0
|
||
|
.else
|
||
|
wldrd wr3,[r0]
|
||
|
wldrd wr4,[r0,#8]
|
||
|
add r0,r0,r2
|
||
|
walignr1 wr5,wr3,wr4
|
||
|
.if &Wrap == 0
|
||
|
walignr2 wr4,wr3,wr4
|
||
|
.endif
|
||
|
|
||
|
wand wr0,wr5,wr6
|
||
|
wand wr3,wr4,wr6
|
||
|
wand wr5,wr5,wr7
|
||
|
wand wr4,wr4,wr7
|
||
|
wsrldg wr5,wr5,wcgr0
|
||
|
wsrldg wr4,wr4,wcgr0
|
||
|
waddb wr5,wr5,wr4
|
||
|
waddb wr4,wr3,wr0
|
||
|
.endif
|
||
|
.endm
|
||
|
|
||
|
.macro SetHorVerRow Add
|
||
|
.if &Add > 0
|
||
|
wldrd wr9,[r1]
|
||
|
.else
|
||
|
add r1,r1,r3
|
||
|
.endif
|
||
|
waddb wr0,wr1,wr4
|
||
|
waddb wr0,wr0,wr8 @rounding
|
||
|
wand wr0,wr0,wr7
|
||
|
waddb wr3,wr2,wr5
|
||
|
wsrldg wr0,wr0,wcgr0
|
||
|
waddb wr0,wr0,wr3
|
||
|
.if &Add > 0
|
||
|
wavg2br wr0,wr0,wr9
|
||
|
wstrd wr0,[r1],#8
|
||
|
.else
|
||
|
wstrd wr0,[r1]
|
||
|
.endif
|
||
|
.endm
|
||
|
|
||
|
.macro CopyBlockHorVer Name, Round, Add
|
||
|
.align 2
|
||
|
.global &Name
|
||
|
&Name:
|
||
|
CopyBegin
|
||
|
.if &Add == 0
|
||
|
sub r1,r1,r3
|
||
|
.endif
|
||
|
.if &Round > 0
|
||
|
mov r14,#1
|
||
|
.else
|
||
|
mov r14,#2
|
||
|
.endif
|
||
|
tbcstb wr8,r14
|
||
|
mov r14,#3
|
||
|
tbcstb wr6,r14
|
||
|
mvn r14,#3
|
||
|
tbcstb wr7,r14
|
||
|
mov r14,#2
|
||
|
tmcr wcgr0,r14
|
||
|
PreLoad2Init
|
||
|
PrepareAlignHor &Name
|
||
|
|
||
|
LoadHorVerRow 1,0
|
||
|
|
||
|
&Name.Loop:
|
||
|
LoadHorVerRow 0,0
|
||
|
SetHorVerRow &Add
|
||
|
LoadHorVerRow 1,0
|
||
|
SetHorVerRow &Add
|
||
|
subs r14,r14,#2
|
||
|
bne &Name.Loop
|
||
|
CopyEnd
|
||
|
|
||
|
&Name.Wrap:
|
||
|
LoadHorVerRow 1,1
|
||
|
|
||
|
&Name.Loop2:
|
||
|
LoadHorVerRow 0,1
|
||
|
SetHorVerRow &Add
|
||
|
LoadHorVerRow 1,1
|
||
|
SetHorVerRow &Add
|
||
|
subs r14,r14,#2
|
||
|
bne &Name.Loop2
|
||
|
CopyEnd
|
||
|
.endm
|
||
|
|
||
|
CopyBlock WMMXCopyBlock
|
||
|
CopyBlockVer WMMXCopyBlockVer,0,0
|
||
|
CopyBlockHor WMMXCopyBlockHor,0,0
|
||
|
CopyBlockHorVer WMMXCopyBlockHorVer,0,0
|
||
|
|
||
|
CopyBlockVer WMMXCopyBlockVerRound,1,0
|
||
|
CopyBlockHor WMMXCopyBlockHorRound,1,0
|
||
|
CopyBlockHorVer WMMXCopyBlockHorVerRound,1,0
|
||
|
|
||
|
AddBlock WMMXAddBlock
|
||
|
CopyBlockVer WMMXAddBlockVer,0,1
|
||
|
CopyBlockHor WMMXAddBlockHor,0,1
|
||
|
CopyBlockHorVer WMMXAddBlockHorVer,0,1
|
||
|
|
||
|
CopyBlockM WMMXCopyBlockM
|
||
|
|
||
|
|