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

📄 mcomp_arm.s

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


  .macro PreLoad ARM5,Pos

    .if &ARM5>0
	  .if &Pos >= 0
  	    .if &Pos > 0
	      .dc.l 0x0f7d0f082
	      add r0,r0,#8
	      .dc.l 0x0f7d0f082
	      sub r0,r0,#8
	    .else
	      .dc.l 0x0f7d0f082
	      add r0,r0,#4
	      .dc.l 0x0f7d0f082
	      sub r0,r0,#4
	    .endif
	  .else
	    .dc.l 0x0f7d0f082
	    add r0,r0,#7
	    .dc.l 0x0f7d0f082
	    sub r0,r0,#7
	  .endif
	.endif
  .endm

  .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
  .endm

  .macro PreLoad2 ARM5,Pos

	.if &ARM5>0
      .dc.l 0x0f7d0f082
      .dc.l 0x0f7d0f00a
	.endif
  .endm

  .macro CopyBuild Name,Sub,Round,Add,Fast,ARM5


	.align 2
	.global &Name
&Name:
	.if &ARM5>0
	add ip,r2,#7
	.dc.l 0x0f7d0f002
	.dc.l 0x0f5d0f007
	.endif
	stmdb	sp!, {r4 - r11, lr}
	.if &ARM5>0
	.dc.l 0x0f7d0f00c
	.dc.l 0x0f5d0f000
	.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
  .endm

@------------------------------------------
@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
  .endm

  .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}
  .endm

@------------------------------------------
@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
  .endm

  .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}
  .endm

@------------------------------------------
@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
  .endm

  .macro CopyBlock16x16 Id, Pos, Round, Add, ARM5

	mov		r11,#15

&Id.Loop:
    .dc.l 0x0f7d0f082
	CopyBlock16x16Row
	subs r11,r11,#1 
	bne  &Id.Loop

	@unroll last (no preload needed)
	CopyBlock16x16Row
	ldmia	sp!, {r4 - r11, pc}
  .endm

@------------------------------------------
@COPYBLOCK8x8: no aligment!, only used in Copy()
@------------------------------------------

  .macro CopyBlock8x8 Id, Pos, Round, Add, ARM5

	mov		r11,#3

&Id.Loop:
    .dc.l 0x0f7d0f082
	ldr		r7,[r0,#4]
	ldr		r6,[r0],r2
    .dc.l 0x0f7d0f082
	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}
  .endm

@------------------------------------------
@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
  .endm

  .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: .dc.l 0x01010101
  .endm

@------------------------------------------
@ 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
  .endm

  .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
  .endm

  .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: .dc.l 0x01010101
  .endm

@------------------------------------------
@ 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

⌨️ 快捷键说明

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