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 | %macro ADD_RES_MMX_4_8 0 | 30 | %macro ADD_RES_MMX_4_8 0 |
| 31 | mova m0, [r1] | 31 | mova m0, [r1] |
| 32 | mova m2, [r1+8] | 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 | movd m3, [r0+r2] | 35 | movd m3, [r0+r2] |
| 42 | punpckldq m2, m3 | 36 | punpcklbw m1, m4 |
| 43 | paddusb m0, m2 | 37 | punpcklbw m3, m4 |
| 44 | psubusb m0, m1 | 38 | |
| 39 | paddsw m0, m1 | ||
| 40 | paddsw m2, m3 | ||
| 41 | packuswb m0, m4 | ||
| 42 | packuswb m2, m4 | ||
| 43 | |||
| 45 | movd [r0], m0 | 44 | movd [r0], m0 |
| 46 | psrlq m0, 32 | 45 | movd [r0+r2], m2 |
| 47 | movd [r0+r2], m0 | ||
| 48 | %endmacro | 46 | %endmacro |
| 49 | 47 | ||
| 50 | 48 | ||
| 51 | INIT_MMX mmxext | 49 | INIT_MMX mmxext |
| 52 | ; void ff_hevc_add_residual_4_8_mmxext(uint8_t *dst, int16_t *res, ptrdiff_t stride) | 50 | ; void ff_hevc_add_residual_4_8_mmxext(uint8_t *dst, int16_t *res, ptrdiff_t stride) |
| 53 | cglobal hevc_add_residual_4_8, 3, 3, 6 | 51 | cglobal hevc_add_residual_4_8, 3, 3, 6 |
| 52 | pxor m4, m4 | ||
| 54 | ADD_RES_MMX_4_8 | 53 | ADD_RES_MMX_4_8 |
| 55 | add r1, 16 | 54 | add r1, 16 |
| 56 | lea r0, [r0+r2*2] | 55 | lea r0, [r0+r2*2] |