📄 mcomp_arm.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_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 + -