gps/GPSResources/tcpmp 0.73/common/softidct/mcomp_wmmx.s

460 lines
7.9 KiB
ArmAsm
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_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