476 lines
7.9 KiB
NASM
476 lines
7.9 KiB
NASM
|
;*****************************************************************************
|
||
|
;*
|
||
|
;* 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.asm 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
|
||
|
|
||
|
AREA |.text|, CODE
|
||
|
|
||
|
macro
|
||
|
CopyBegin
|
||
|
add ip,r2,#7
|
||
|
pld [r0,r2]
|
||
|
pld [r0,#7]
|
||
|
stmdb sp!,{lr}
|
||
|
pld [r0,ip]
|
||
|
pld [r0]
|
||
|
mend
|
||
|
|
||
|
macro
|
||
|
CopyEnd
|
||
|
ldmia sp!,{pc}
|
||
|
mend
|
||
|
|
||
|
macro
|
||
|
PreLoad
|
||
|
pld [r0,r2,lsl #1]
|
||
|
mend
|
||
|
|
||
|
macro
|
||
|
PreLoad2Init
|
||
|
add ip,r2,#4
|
||
|
mend
|
||
|
|
||
|
macro
|
||
|
PreLoad2
|
||
|
pld [r0,r2,lsl #1] ;2*pitch
|
||
|
pld [r0,ip,lsl #1] ;2*pitch+8
|
||
|
mend
|
||
|
|
||
|
macro
|
||
|
PrepareAlignVer $Name, $Height
|
||
|
ands r14,r0,#7
|
||
|
tmcr wcgr1,r14
|
||
|
mov r14,#$Height
|
||
|
beq $Name.Aligned
|
||
|
bic r0,r0,#7
|
||
|
mend
|
||
|
|
||
|
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
|
||
|
mend
|
||
|
|
||
|
;------------------------------------------
|
||
|
;COPYBLOCK
|
||
|
;------------------------------------------
|
||
|
|
||
|
macro
|
||
|
CopyBlock $Name
|
||
|
|
||
|
align 16
|
||
|
export $Name
|
||
|
$Name proc
|
||
|
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
|
||
|
|
||
|
mend
|
||
|
|
||
|
;------------------------------------------
|
||
|
;COPYBLOCKM
|
||
|
;------------------------------------------
|
||
|
|
||
|
macro
|
||
|
CopyBlockM $Name
|
||
|
|
||
|
align 16
|
||
|
export $Name
|
||
|
$Name proc
|
||
|
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
|
||
|
|
||
|
mend
|
||
|
|
||
|
;------------------------------------------
|
||
|
;ADDBLOCK
|
||
|
;------------------------------------------
|
||
|
|
||
|
macro
|
||
|
AddBlock $Name
|
||
|
align 16
|
||
|
export $Name
|
||
|
$Name proc
|
||
|
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
|
||
|
|
||
|
mend
|
||
|
|
||
|
;------------------------------------------
|
||
|
; 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
|
||
|
mend
|
||
|
|
||
|
macro
|
||
|
CopyBlockHor $Name, $Round, $Add
|
||
|
align 16
|
||
|
export $Name
|
||
|
$Name proc
|
||
|
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
|
||
|
|
||
|
mend
|
||
|
|
||
|
;------------------------------------------
|
||
|
; 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
|
||
|
mend
|
||
|
|
||
|
macro
|
||
|
CopyBlockVer $Name, $Round, $Add
|
||
|
align 16
|
||
|
export $Name
|
||
|
$Name proc
|
||
|
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
|
||
|
mend
|
||
|
|
||
|
;------------------------------------------
|
||
|
; 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
|
||
|
mend
|
||
|
|
||
|
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
|
||
|
mend
|
||
|
|
||
|
macro
|
||
|
CopyBlockHorVer $Name, $Round, $Add
|
||
|
align 16
|
||
|
export $Name
|
||
|
$Name proc
|
||
|
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
|
||
|
mend
|
||
|
|
||
|
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
|
||
|
|
||
|
END
|
||
|
|