⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcomp_wmmx.s

📁 大名鼎鼎的CE下播放软件,TCPPMP的源代码!!!2410下可以流畅的解QVGA的H264,MPEG4等格式.
💻 S
字号:
@*****************************************************************************
@*
@* 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


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -