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.
Unified · Split
| @@ -95,6 +95,7 @@ endfunc · 94 unmodified lines | |||
| 95 | .endm | 95 | .endm |
| 96 | 96 | ||
| 97 | .macro pixels16_y2 rnd=1, avg=0 | 97 | .macro pixels16_y2 rnd=1, avg=0 |
| 98 | sub r3, r3, #2 | ||
| 98 | vld1.64 {q0}, [r1], r2 | 99 | vld1.64 {q0}, [r1], r2 |
| 99 | vld1.64 {q1}, [r1], r2 | 100 | vld1.64 {q1}, [r1], r2 |
| 100 | 1: subs r3, r3, #2 | 101 | 1: subs r3, r3, #2 |
| @@ -114,10 +115,25 @@ endfunc · 13 unmodified lines | |||
| 114 | vst1.64 {q2}, [r0,:128], r2 | 115 | vst1.64 {q2}, [r0,:128], r2 |
| 115 | vst1.64 {q3}, [r0,:128], r2 | 116 | vst1.64 {q3}, [r0,:128], r2 |
| 116 | bne 1b | 117 | 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 | |||
| 117 | bx lr | 132 | bx lr |
| 118 | .endm | 133 | .endm |
| 119 | 134 | ||
| 120 | .macro pixels16_xy2 rnd=1, avg=0 | 135 | .macro pixels16_xy2 rnd=1, avg=0 |
| 136 | sub r3, r3, #2 | ||
| 121 | vld1.64 {d0-d2}, [r1], r2 | 137 | vld1.64 {d0-d2}, [r1], r2 |
| 122 | vld1.64 {d4-d6}, [r1], r2 | 138 | vld1.64 {d4-d6}, [r1], r2 |
| 123 | .ifeq \rnd | 139 | .ifeq \rnd |
| @@ -173,6 +189,42 @@ endfunc · 49 unmodified lines | |||
| 173 | vaddl.u8 q11, d3, d5 | 189 | vaddl.u8 q11, d3, d5 |
| 174 | vst1.64 {q15}, [r0,:128], r2 | 190 | vst1.64 {q15}, [r0,:128], r2 |
| 175 | bgt 1b | 191 | 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 | |||
| 176 | bx lr | 228 | bx lr |
| 177 | .endm | 229 | .endm |
| 178 | 230 | ||
| @@ -228,6 +280,7 @@ endfunc · 49 unmodified lines | |||
| 228 | .endm | 280 | .endm |
| 229 | 281 | ||
| 230 | .macro pixels8_y2 rnd=1, avg=0 | 282 | .macro pixels8_y2 rnd=1, avg=0 |
| 283 | sub r3, r3, #2 | ||
| 231 | vld1.64 {d0}, [r1], r2 | 284 | vld1.64 {d0}, [r1], r2 |
| 232 | vld1.64 {d1}, [r1], r2 | 285 | vld1.64 {d1}, [r1], r2 |
| 233 | 1: subs r3, r3, #2 | 286 | 1: subs r3, r3, #2 |
| @@ -246,10 +299,24 @@ endfunc · 12 unmodified lines | |||
| 246 | vst1.64 {d4}, [r0,:64], r2 | 299 | vst1.64 {d4}, [r0,:64], r2 |
| 247 | vst1.64 {d5}, [r0,:64], r2 | 300 | vst1.64 {d5}, [r0,:64], r2 |
| 248 | bne 1b | 301 | 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 | |||
| 249 | bx lr | 315 | bx lr |
| 250 | .endm | 316 | .endm |
| 251 | 317 | ||
| 252 | .macro pixels8_xy2 rnd=1, avg=0 | 318 | .macro pixels8_xy2 rnd=1, avg=0 |
| 319 | sub r3, r3, #2 | ||
| 253 | vld1.64 {q0}, [r1], r2 | 320 | vld1.64 {q0}, [r1], r2 |
| 254 | vld1.64 {q1}, [r1], r2 | 321 | vld1.64 {q1}, [r1], r2 |
| 255 | .ifeq \rnd | 322 | .ifeq \rnd |
| @@ -291,6 +358,31 @@ endfunc · 35 unmodified lines | |||
| 291 | vaddl.u8 q9, d2, d6 | 358 | vaddl.u8 q9, d2, d6 |
| 292 | vst1.64 {d7}, [r0,:64], r2 | 359 | vst1.64 {d7}, [r0,:64], r2 |
| 293 | bgt 1b | 360 | 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 | |||
| 294 | bx lr | 386 | bx lr |
| 295 | .endm | 387 | .endm |
| 296 | 388 | ||