History

arm: dsputil: fix overreads in put/avg_pixels functions

The vertically interpolating variants of these functions read ahead one line to optimise the loop. On the last line processed, this might be outside the buffer. Fix these invalid reads by processing the last line outside the loop.

Mans Rullgard committed 14 years ago

Commit cbc7d601 parent 1de53d01 file · +92 −0Browse files

Unified · Split

libavcodec/arm/dsputil_neon.S+92−0
@@ -95,6 +95,7 @@ endfunc · 94 unmodified lines
9595 .endm
9696
9797 .macro pixels16_y2 rnd=1, avg=0
98+ sub r3, r3, #2
9899 vld1.64 {q0}, [r1], r2
99100 vld1.64 {q1}, [r1], r2
100101 1: subs r3, r3, #2
@@ -114,10 +115,25 @@ endfunc · 13 unmodified lines
114115 vst1.64 {q2}, [r0,:128], r2
115116 vst1.64 {q3}, [r0,:128], r2
116117 bne 1b
118+
119+ avg q2, q0, q1
120+ vld1.64 {q0}, [r1], r2
121+ avg q3, q0, q1
122+ .if \avg
123+ vld1.8 {q8}, [r0,:128], r2
124+ vld1.8 {q9}, [r0,:128]
125+ vrhadd.u8 q2, q2, q8
126+ vrhadd.u8 q3, q3, q9
127+ sub r0, r0, r2
128+ .endif
129+ vst1.64 {q2}, [r0,:128], r2
130+ vst1.64 {q3}, [r0,:128], r2
131+
117132 bx lr
118133 .endm
119134
120135 .macro pixels16_xy2 rnd=1, avg=0
136+ sub r3, r3, #2
121137 vld1.64 {d0-d2}, [r1], r2
122138 vld1.64 {d4-d6}, [r1], r2
123139 .ifeq \rnd
@@ -173,6 +189,42 @@ endfunc · 49 unmodified lines
173189 vaddl.u8 q11, d3, d5
174190 vst1.64 {q15}, [r0,:128], r2
175191 bgt 1b
192+
193+ vld1.64 {d0-d2}, [r1], r2
194+ vadd.u16 q12, q8, q9
195+ .ifeq \rnd
196+ vadd.u16 q12, q12, q13
197+ .endif
198+ vext.8 q15, q0, q1, #1
199+ vadd.u16 q1 , q10, q11
200+ shrn d28, q12, #2
201+ .ifeq \rnd
202+ vadd.u16 q1, q1, q13
203+ .endif
204+ shrn d29, q1, #2
205+ .if \avg
206+ vld1.8 {q8}, [r0,:128]
207+ vrhadd.u8 q14, q14, q8
208+ .endif
209+ vaddl.u8 q8, d0, d30
210+ vaddl.u8 q10, d1, d31
211+ vst1.64 {q14}, [r0,:128], r2
212+ vadd.u16 q12, q8, q9
213+ .ifeq \rnd
214+ vadd.u16 q12, q12, q13
215+ .endif
216+ vadd.u16 q0, q10, q11
217+ shrn d30, q12, #2
218+ .ifeq \rnd
219+ vadd.u16 q0, q0, q13
220+ .endif
221+ shrn d31, q0, #2
222+ .if \avg
223+ vld1.8 {q9}, [r0,:128]
224+ vrhadd.u8 q15, q15, q9
225+ .endif
226+ vst1.64 {q15}, [r0,:128], r2
227+
176228 bx lr
177229 .endm
178230
@@ -228,6 +280,7 @@ endfunc · 49 unmodified lines
228280 .endm
229281
230282 .macro pixels8_y2 rnd=1, avg=0
283+ sub r3, r3, #2
231284 vld1.64 {d0}, [r1], r2
232285 vld1.64 {d1}, [r1], r2
233286 1: subs r3, r3, #2
@@ -246,10 +299,24 @@ endfunc · 12 unmodified lines
246299 vst1.64 {d4}, [r0,:64], r2
247300 vst1.64 {d5}, [r0,:64], r2
248301 bne 1b
302+
303+ avg d4, d0, d1
304+ vld1.64 {d0}, [r1], r2
305+ avg d5, d0, d1
306+ .if \avg
307+ vld1.8 {d2}, [r0,:64], r2
308+ vld1.8 {d3}, [r0,:64]
309+ vrhadd.u8 q2, q2, q1
310+ sub r0, r0, r2
311+ .endif
312+ vst1.64 {d4}, [r0,:64], r2
313+ vst1.64 {d5}, [r0,:64], r2
314+
249315 bx lr
250316 .endm
251317
252318 .macro pixels8_xy2 rnd=1, avg=0
319+ sub r3, r3, #2
253320 vld1.64 {q0}, [r1], r2
254321 vld1.64 {q1}, [r1], r2
255322 .ifeq \rnd
@@ -291,6 +358,31 @@ endfunc · 35 unmodified lines
291358 vaddl.u8 q9, d2, d6
292359 vst1.64 {d7}, [r0,:64], r2
293360 bgt 1b
361+
362+ vld1.64 {q0}, [r1], r2
363+ vadd.u16 q10, q8, q9
364+ vext.8 d4, d0, d1, #1
365+ .ifeq \rnd
366+ vadd.u16 q10, q10, q11
367+ .endif
368+ vaddl.u8 q8, d0, d4
369+ shrn d5, q10, #2
370+ vadd.u16 q10, q8, q9
371+ .if \avg
372+ vld1.8 {d7}, [r0,:64]
373+ vrhadd.u8 d5, d5, d7
374+ .endif
375+ .ifeq \rnd
376+ vadd.u16 q10, q10, q11
377+ .endif
378+ vst1.64 {d5}, [r0,:64], r2
379+ shrn d7, q10, #2
380+ .if \avg
381+ vld1.8 {d5}, [r0,:64]
382+ vrhadd.u8 d7, d7, d5
383+ .endif
384+ vst1.64 {d7}, [r0,:64], r2
385+
294386 bx lr
295387 .endm
296388

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