static void h263_h_loop_filter_mmx(uint8_t *src, int stride, int qscale) { if (CONFIG_H263_DECODER || CONFIG_H263_ENCODER) { const int strength = ff_h263_loop_filter_strength[qscale]; DECLARE_ALIGNED(8, uint64_t, temp)[4]; uint8_t *btemp = (uint8_t*)temp; src -= 2; transpose4x4(btemp, src, 8, stride); transpose4x4(btemp + 4, src + 4 * stride, 8, stride); __asm__ volatile ( H263_LOOP_FILTER // 5 3 4 6 : "+m"(temp[0]), "+m"(temp[1]), "+m"(temp[2]), "+m"(temp[3]) : "g"(2 * strength), "m"(ff_pb_FC) ); __asm__ volatile ( "movq %%mm5, %%mm1 \n\t" "movq %%mm4, %%mm0 \n\t" "punpcklbw %%mm3, %%mm5 \n\t" "punpcklbw %%mm6, %%mm4 \n\t" "punpckhbw %%mm3, %%mm1 \n\t" "punpckhbw %%mm6, %%mm0 \n\t" "movq %%mm5, %%mm3 \n\t" "movq %%mm1, %%mm6 \n\t" "punpcklwd %%mm4, %%mm5 \n\t" "punpcklwd %%mm0, %%mm1 \n\t" "punpckhwd %%mm4, %%mm3 \n\t" "punpckhwd %%mm0, %%mm6 \n\t" "movd %%mm5, (%0) \n\t" "punpckhdq %%mm5, %%mm5 \n\t" "movd %%mm5, (%0, %2) \n\t" "movd %%mm3, (%0, %2, 2) \n\t" "punpckhdq %%mm3, %%mm3 \n\t" "movd %%mm3, (%0, %3) \n\t" "movd %%mm1, (%1) \n\t" "punpckhdq %%mm1, %%mm1 \n\t" "movd %%mm1, (%1, %2) \n\t" "movd %%mm6, (%1, %2, 2) \n\t" "punpckhdq %%mm6, %%mm6 \n\t" "movd %%mm6, (%1, %3) \n\t" :: "r"(src), "r"(src + 4 * stride), "r"((x86_reg)stride), "r"((x86_reg)(3 * stride)) ); } }