History

Merge "fix armv6 simpleloop filter"

Johann committed 16 years ago

Commit a522be22 parents 6ea5bb8 467a0b91 file · +47 −68Browse files

Unified · Split

vp8/common/arm/armv6/simpleloopfilter_v6.asm+47−68
@@ -63,23 +63,22 @@ pstep RN r1 · 62 unmodified lines
63;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-63;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
64 stmdb sp!, {r4 - r11, lr}64 stmdb sp!, {r4 - r11, lr}
65 65
66 sub src, src, pstep, lsl #1 ; move src pointer down by 2 lines66 ldr r12, [r3] ; limit
67 ldr r3, [src, -pstep, lsl #1] ; p1
67 68
68 ldr r12, [r3], #4 ; limit69 ldr r9, [sp, #40] ; count for 8-in-parallel
69 ldr r3, [src], pstep ; p170 ldr r4, [src, -pstep] ; p0
70 71
71 ldr r9, [sp, #36] ; count for 8-in-parallel72 ldr r7, [r2] ; flimit
72 ldr r4, [src], pstep ; p073 ldr r5, [src] ; q0
73
74 ldr r7, [r2], #4 ; flimit
75 ldr r5, [src], pstep ; q0
76 ldr r2, c0x8080808074 ldr r2, c0x80808080
77 75
78 ldr r6, [src] ; q176 ldr r6, [src, pstep] ; q1
79 77
80 uadd8 r7, r7, r7 ; flimit * 278 uadd8 r7, r7, r7 ; flimit * 2
81 mov r9, r9, lsl #1 ; 4-in-parallel79 mov r9, r9, lsl #1 ; double the count. we're doing 4 at a time
82 uadd8 r12, r7, r12 ; flimit * 2 + limit80 uadd8 r12, r7, r12 ; flimit * 2 + limit
81 mov lr, #0
83 82
84|simple_hnext8|83|simple_hnext8|
85 ; vp8_simple_filter_mask() function84 ; vp8_simple_filter_mask() function
@@ -89,22 +88,19 @@ pstep RN r1 · 3 unmodified lines
89 uqsub8 r10, r4, r5 ; p0 - q088 uqsub8 r10, r4, r5 ; p0 - q0
90 uqsub8 r11, r5, r4 ; q0 - p089 uqsub8 r11, r5, r4 ; q0 - p0
91 orr r8, r8, r7 ; abs(p1 - q1)90 orr r8, r8, r7 ; abs(p1 - q1)
92 ldr lr, c0x7F7F7F7F ; 01111111 mask
93 orr r10, r10, r11 ; abs(p0 - q0)91 orr r10, r10, r11 ; abs(p0 - q0)
94 and r8, lr, r8, lsr #1 ; abs(p1 - q1) / 292 uhadd8 r8, r8, lr ; abs(p1 - q2) >> 1
95 uqadd8 r10, r10, r10 ; abs(p0 - q0) * 293 uqadd8 r10, r10, r10 ; abs(p0 - q0) * 2
96 mvn lr, #0 ; r10 == -194 ; STALL waiting on r10
97 uqadd8 r10, r10, r8 ; abs(p0 - q0)*2 + abs(p1 - q1)/295 uqadd8 r10, r10, r8 ; abs(p0 - q0)*2 + abs(p1 - q1)/2
98 ; STALL waiting on r10 :(96 ; STALL waiting on r10
99 uqsub8 r10, r10, r12 ; compare to flimit97 mvn r8, #0
100 mov r8, #098 uqsub8 r10, r10, r12 ; compare to flimit. need to do this twice because uqsub8 doesn't set GE flags
101 99 ; and usub8 doesn't saturate
102 usub8 r10, r8, r10 ; use usub8 instead of ssub8100 usub8 r10, lr, r10 ; set GE flags for each byte
103 ; STALL (maybe?) when are flags set? :/101 sel r10, r8, lr ; filter mask: F or 0
104 sel r10, lr, r8 ; filter mask: lr
105
106 cmp r10, #0102 cmp r10, #0
107 beq simple_hskip_filter ; skip filtering103 beq simple_hskip_filter ; skip filtering if we're &ing with 0s. would just write out the same values
108 104
109 ;vp8_simple_filter() function105 ;vp8_simple_filter() function
110 106
@@ -113,55 +109,45 @@ pstep RN r1 · 2 unmodified lines
113 eor r4, r4, r2 ; p0 offset to convert to a signed value109 eor r4, r4, r2 ; p0 offset to convert to a signed value
114 eor r5, r5, r2 ; q0 offset to convert to a signed value110 eor r5, r5, r2 ; q0 offset to convert to a signed value
115 111
116 qsub8 r3, r3, r6 ; vp8_filter (r3) = vp8_signed_char_clamp(p1-q1)112 qsub8 r3, r3, r6 ; vp8_signed_char_clamp(p1-q1)
117 qsub8 r6, r5, r4 ; vp8_filter = vp8_signed_char_clamp(vp8_filter + 3 * ( q0 - p0))113 qsub8 r6, r5, r4 ; vp8_signed_char_clamp(q0-p0)
114 qadd8 r3, r3, r6 ; += q0-p0
115 qadd8 r3, r3, r6 ; += q0-p0
116 qadd8 r3, r3, r6 ; p1-q1 + 3*(q0-p0))
117 and r3, r3, r10 ; &= mask
118 118
119 qadd8 r3, r3, r6
120 ldr r8, c0x03030303 ; r8 = 3
121
122 qadd8 r3, r3, r6
123 ldr r7, c0x04040404119 ldr r7, c0x04040404
124 120 ldr r8, c0x03030303
125 qadd8 r3, r3, r6
126 and r3, r3, lr ; vp8_filter &= mask;
127 121
128 ;save bottom 3 bits so that we round one side +4 and the other +3122 ;save bottom 3 bits so that we round one side +4 and the other +3
123 qadd8 r7 , r3 , r7 ; Filter1 (r3) = vp8_signed_char_clamp(vp8_filter+4)
129 qadd8 r8 , r3 , r8 ; Filter2 (r8) = vp8_signed_char_clamp(vp8_filter+3)124 qadd8 r8 , r3 , r8 ; Filter2 (r8) = vp8_signed_char_clamp(vp8_filter+3)
130 qadd8 r3 , r3 , r7 ; Filter1 (r3) = vp8_signed_char_clamp(vp8_filter+4)
131 125
132 mov r7, #0126 mov r3, #0
133 shadd8 r8 , r8 , r7 ; Filter2 >>= 3127 shadd8 r7 , r7 , r3
134 shadd8 r3 , r3 , r7 ; Filter1 >>= 3128 shadd8 r8 , r8 , r3
135 shadd8 r8 , r8 , r7129 shadd8 r7 , r7 , r3
136 shadd8 r3 , r3 , r7130 shadd8 r8 , r8 , r3
137 shadd8 r8 , r8 , r7 ; r8: Filter2131 shadd8 r7 , r7 , r3 ; Filter1 >>= 3
138 shadd8 r3 , r3 , r7 ; r7: filter1132 shadd8 r8 , r8 , r3 ; Filter2 >>= 3
139 133
140 ;calculate output
141 sub src, src, pstep, lsl #1
142 134
135 qsub8 r5 ,r5, r7 ; u = vp8_signed_char_clamp(q0 - Filter1)
143 qadd8 r4, r4, r8 ; u = vp8_signed_char_clamp(p0 + Filter2)136 qadd8 r4, r4, r8 ; u = vp8_signed_char_clamp(p0 + Filter2)
144 qsub8 r5 ,r5, r3 ; u = vp8_signed_char_clamp(q0 - Filter1)
145 eor r4, r4, r2 ; *op0 = u^0x80
146 str r4, [src], pstep ; store op0 result
147 eor r5, r5, r2 ; *oq0 = u^0x80137 eor r5, r5, r2 ; *oq0 = u^0x80
148 str r5, [src], pstep ; store oq0 result138 str r5, [src] ; store oq0 result
139 eor r4, r4, r2 ; *op0 = u^0x80
140 str r4, [src, -pstep] ; store op0 result
149 141
150|simple_hskip_filter|142|simple_hskip_filter|
151 add src, src, #4
152 sub src, src, pstep
153 sub src, src, pstep, lsl #1
154 143
155 subs r9, r9, #1144 subs r9, r9, #1
145 addne src, src, #4 ; next row
156 146
157 ;pld [src]147 ldrne r3, [src, -pstep, lsl #1] ; p1
158 ;pld [src, pstep]148 ldrne r4, [src, -pstep] ; p0
159 ;pld [src, pstep, lsl #1]149 ldrne r5, [src] ; q0
160 150 ldrne r6, [src, pstep] ; q1
161 ldrne r3, [src], pstep ; p1
162 ldrne r4, [src], pstep ; p0
163 ldrne r5, [src], pstep ; q0
164 ldrne r6, [src] ; q1
165 151
166 bne simple_hnext8152 bne simple_hnext8
167 153
@@ -174,9 +160,9 @@ pstep RN r1 · 6 unmodified lines
174;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-160;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
175 stmdb sp!, {r4 - r11, lr}161 stmdb sp!, {r4 - r11, lr}
176 162
177 ldr r12, [r2], #4 ; r12: flimit163 ldr r12, [r2] ; r12: flimit
178 ldr r2, c0x80808080164 ldr r2, c0x80808080
179 ldr r7, [r3], #4 ; limit165 ldr r7, [r3] ; limit
180 166
181 ; load soure data to r7, r8, r9, r10167 ; load soure data to r7, r8, r9, r10
182 ldrh r3, [src, #-2]168 ldrh r3, [src, #-2]
@@ -213,16 +199,15 @@ pstep RN r1 · 30 unmodified lines
213 uqsub8 r10, r5, r4 ; q0 - p0199 uqsub8 r10, r5, r4 ; q0 - p0
214 orr r7, r7, r8 ; abs(p1 - q1)200 orr r7, r7, r8 ; abs(p1 - q1)
215 orr r9, r9, r10 ; abs(p0 - q0)201 orr r9, r9, r10 ; abs(p0 - q0)
216 ldr lr, c0x7F7F7F7F ; 0111 1111 mask
217 uqadd8 r9, r9, r9 ; abs(p0 - q0) * 2
218 and r7, lr, r7, lsr #1 ; abs(p1 - q1) / 2
219 mov r8, #0202 mov r8, #0
203 uqadd8 r9, r9, r9 ; abs(p0 - q0) * 2
204 uhadd8 r7, r7, r8 ; abs(p1 - q1) / 2
220 uqadd8 r7, r7, r9 ; abs(p0 - q0)*2 + abs(p1 - q1)/2205 uqadd8 r7, r7, r9 ; abs(p0 - q0)*2 + abs(p1 - q1)/2
221 mvn r10, #0 ; r10 == -1206 mvn r10, #0 ; r10 == -1
222 uqsub8 r7, r7, r12 ; compare to flimit207 uqsub8 r7, r7, r12 ; compare to flimit
223 208
224 usub8 r7, r8, r7209 usub8 r7, r8, r7
225 sel r7, r10, r8 ; filter mask: lr210 sel lr, r10, r8 ; filter mask
226 211
227 cmp lr, #0212 cmp lr, #0
228 beq simple_vskip_filter ; skip filtering213 beq simple_vskip_filter ; skip filtering
@@ -286,10 +271,6 @@ pstep RN r1 · 57 unmodified lines
286|simple_vskip_filter|271|simple_vskip_filter|
287 subs r11, r11, #1272 subs r11, r11, #1
288 273
289 ;pld [src]
290 ;pld [src, pstep]
291 ;pld [src, pstep, lsl #1]
292
293 ; load soure data to r7, r8, r9, r10274 ; load soure data to r7, r8, r9, r10
294 ldrneh r3, [src, #-2]275 ldrneh r3, [src, #-2]
295 ldrneh r4, [src], pstep276 ldrneh r4, [src], pstep
@@ -316,7 +297,5 @@ pstep RN r1 · 20 unmodified lines
316c0x80808080 DCD 0x80808080297c0x80808080 DCD 0x80808080
317c0x03030303 DCD 0x03030303298c0x03030303 DCD 0x03030303
318c0x04040404 DCD 0x04040404299c0x04040404 DCD 0x04040404
319c0x01010101 DCD 0x01010101
320c0x7F7F7F7F DCD 0x7F7F7F7F
321 300
322 END301 END

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t