Fix overflow for coeff -32768 in function ADD_RES_MMX_4_8 with no performance drop. ./checkasm --test=hevc_add_res --bench Mainline: - hevc_add_res.add_residual [OK] hevc_add_res_4x4_8_mmxext: 15.5 Add overflow test case: - hevc_add_res.add_residual [FAILED] After: - hevc_add_res.add_residual [OK] hevc_add_res_4x4_8_mmxext: 15.0
Unified · Split
| @@ -30,27 +30,26 @@ cextern pw_1023 · 29 unmodified lines | ||
| 30 | 30 | %macro ADD_RES_MMX_4_8 0 |
| 31 | 31 | mova m0, [r1] |
| 32 | 32 | mova m2, [r1+8] |
| 33 | − pxor m1, m1 | |
| 34 | − pxor m3, m3 | |
| 35 | − psubw m1, m0 | |
| 36 | − psubw m3, m2 | |
| 37 | − packuswb m0, m2 | |
| 38 | − packuswb m1, m3 | |
| 39 | 33 | |
| 40 | − movd m2, [r0] | |
| 34 | + movd m1, [r0] | |
| 41 | 35 | movd m3, [r0+r2] |
| 42 | − punpckldq m2, m3 | |
| 43 | − paddusb m0, m2 | |
| 44 | − psubusb m0, m1 | |
| 36 | + punpcklbw m1, m4 | |
| 37 | + punpcklbw m3, m4 | |
| 38 | + | |
| 39 | + paddsw m0, m1 | |
| 40 | + paddsw m2, m3 | |
| 41 | + packuswb m0, m4 | |
| 42 | + packuswb m2, m4 | |
| 43 | + | |
| 45 | 44 | movd [r0], m0 |
| 46 | − psrlq m0, 32 | |
| 47 | − movd [r0+r2], m0 | |
| 45 | + movd [r0+r2], m2 | |
| 48 | 46 | %endmacro |
| 49 | 47 | |
| 50 | 48 | |
| 51 | 49 | INIT_MMX mmxext |
| 52 | 50 | ; void ff_hevc_add_residual_4_8_mmxext(uint8_t *dst, int16_t *res, ptrdiff_t stride) |
| 53 | 51 | cglobal hevc_add_residual_4_8, 3, 3, 6 |
| 52 | + pxor m4, m4 | |
| 54 | 53 | ADD_RES_MMX_4_8 |
| 55 | 54 | add r1, 16 |
| 56 | 55 | lea r0, [r0+r2*2] |