Changeset 531dda8035e8700b48033ceb0e9a1015537944c7
- Timestamp:
- 23/08/07 01:26:16
(1 year ago)
- Author:
- Damien Fouilleul <damienf@videolan.org>
- git-committer:
- Damien Fouilleul <damienf@videolan.org> 1187825176 +0000
- git-parent:
[dbcad1d80868a0854570ef3c6049634ad8d959d6]
- git-author:
- Damien Fouilleul <damienf@videolan.org> 1187825176 +0000
- Message:
i420_yuy2: for MMX and SSE2, split inline assembly to avoid register starvation
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r1048cc3 |
r531dda8 |
|
| 1046 | 1046 | if test "${ac_cv_c_omit_frame_pointer}" != "no"; then |
|---|
| 1047 | 1047 | CFLAGS_OPTIM_NODEBUG="${CFLAGS_OPTIM_NODEBUG} -fomit-frame-pointer" |
|---|
| 1048 | | # these plugins do not compile without -fomit-frame-pointer, damn gcc! |
|---|
| 1049 | | VLC_ADD_CFLAGS([i420_yuy2_mmx i420_yuy2_sse2],[-fomit-frame-pointer]) |
|---|
| 1050 | 1048 | fi |
|---|
| 1051 | 1049 | |
|---|
| rdf3b5ee |
r531dda8 |
|
| 32 | 32 | do { \ |
|---|
| 33 | 33 | __asm__ __volatile__( \ |
|---|
| | 34 | ".p2align 3 \n\t \ |
|---|
| | 35 | movd (%1), %%mm1 # Load 4 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| | 36 | movd (%2), %%mm2 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| | 37 | movq (%2), %%mm0 # Load 8 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| | 38 | movq (%3), %%mm3 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| | 39 | " \ |
|---|
| | 40 | : \ |
|---|
| | 41 | : "r" (p_u), "r" (p_v), \ |
|---|
| | 42 | "r" (p_y1), "r" (p_y2) ); \ |
|---|
| | 43 | __asm__ __volatile__( \ |
|---|
| 34 | 44 | ".p2align 3 \n\t" \ |
|---|
| 35 | 45 | MMX_INSTRUCTIONS \ |
|---|
| 36 | 46 | : \ |
|---|
| 37 | | : "r" (p_line1), "r" (p_line2), \ |
|---|
| 38 | | "r" (p_y1), "r" (p_y2), \ |
|---|
| 39 | | "r" (p_u), "r" (p_v) ); \ |
|---|
| | 47 | : "r" (p_line1), "r" (p_line2) ); \ |
|---|
| 40 | 48 | p_line1 += 16; p_line2 += 16; \ |
|---|
| 41 | 49 | p_y1 += 8; p_y2 += 8; \ |
|---|
| … | … | |
| 46 | 54 | |
|---|
| 47 | 55 | #define MMX_YUV420_YUYV " \n\ |
|---|
| 48 | | movd (%4), %%mm1 # Load 4 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| 49 | | movd (%5), %%mm2 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| 50 | | movq (%2), %%mm0 # Load 8 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 51 | | movq (%3), %%mm3 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| 52 | 56 | punpcklbw %%mm2, %%mm1 # v3 u3 v2 u2 v1 u1 v0 u0 \n\ |
|---|
| 53 | 57 | movq %%mm0, %%mm2 # y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| … | … | |
| 64 | 68 | |
|---|
| 65 | 69 | #define MMX_YUV420_YVYU " \n\ |
|---|
| 66 | | movd (%4), %%mm2 # Load 4 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| 67 | | movd (%5), %%mm1 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| 68 | | movq (%2), %%mm0 # Load 8 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 69 | | movq (%3), %%mm3 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| 70 | | punpcklbw %%mm2, %%mm1 # u3 v3 u2 v2 u1 v1 u0 v0 \n\ |
|---|
| 71 | | movq %%mm0, %%mm2 # y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 72 | | punpcklbw %%mm1, %%mm2 # u1 y3 v1 y2 u0 y1 v0 y0 \n\ |
|---|
| 73 | | movq %%mm2, (%0) # Store low YUYV \n\ |
|---|
| 74 | | punpckhbw %%mm1, %%mm0 # u3 y7 v3 y6 u2 y5 v2 y4 \n\ |
|---|
| | 70 | punpcklbw %%mm1, %%mm2 # u3 v3 u2 v2 u1 v1 u0 v0 \n\ |
|---|
| | 71 | movq %%mm0, %%mm1 # y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| | 72 | punpcklbw %%mm2, %%mm1 # u1 y3 v1 y2 u0 y1 v0 y0 \n\ |
|---|
| | 73 | movq %%mm1, (%0) # Store low YUYV \n\ |
|---|
| | 74 | punpckhbw %%mm2, %%mm0 # u3 y7 v3 y6 u2 y5 v2 y4 \n\ |
|---|
| 75 | 75 | movq %%mm0, 8(%0) # Store high YUYV \n\ |
|---|
| 76 | 76 | movq %%mm3, %%mm4 # Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| 77 | | punpcklbw %%mm1, %%mm4 # u1 Y3 v1 Y2 u0 Y1 v0 Y0 \n\ |
|---|
| | 77 | punpcklbw %%mm2, %%mm4 # u1 Y3 v1 Y2 u0 Y1 v0 Y0 \n\ |
|---|
| 78 | 78 | movq %%mm4, (%1) # Store low YUYV \n\ |
|---|
| 79 | | punpckhbw %%mm1, %%mm3 # u3 Y7 v3 Y6 u2 Y5 v2 Y4 \n\ |
|---|
| | 79 | punpckhbw %%mm2, %%mm3 # u3 Y7 v3 Y6 u2 Y5 v2 Y4 \n\ |
|---|
| 80 | 80 | movq %%mm3, 8(%1) # Store high YUYV \n\ |
|---|
| 81 | 81 | " |
|---|
| 82 | 82 | |
|---|
| 83 | 83 | #define MMX_YUV420_UYVY " \n\ |
|---|
| 84 | | movd (%4), %%mm1 # Load 4 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| 85 | | movd (%5), %%mm2 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| 86 | | movq (%2), %%mm0 # Load 8 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 87 | | movq (%3), %%mm3 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| 88 | 84 | punpcklbw %%mm2, %%mm1 # v3 u3 v2 u2 v1 u1 v0 u0 \n\ |
|---|
| 89 | 85 | movq %%mm1, %%mm2 # v3 u3 v2 u2 v1 u1 v0 u0 \n\ |
|---|
| … | … | |
| 102 | 98 | /* FIXME: this code does not work ! Chroma seems to be wrong. */ |
|---|
| 103 | 99 | #define MMX_YUV420_Y211 " \n\ |
|---|
| 104 | | movq (%2), %%mm0 # Load 8 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 105 | | movq (%3), %%mm1 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| 106 | 100 | movd (%4), %%mm2 # Load 4 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| 107 | 101 | movd (%5), %%mm3 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| … | … | |
| 201 | 195 | do { \ |
|---|
| 202 | 196 | __asm__ __volatile__( \ |
|---|
| | 197 | ".p2align 3 \n\t \ |
|---|
| | 198 | movq (%0), %%xmm1 # Load 8 Cb u7 u6 u5 u4 u3 u2 u1 u0 \n\ |
|---|
| | 199 | movq (%1), %%xmm2 # Load 8 Cr v7 06 v5 v4 v3 v2 v1 v0 \n\ |
|---|
| | 200 | " \ |
|---|
| | 201 | : \ |
|---|
| | 202 | : "r" (p_u), "r" (p_v) ); \ |
|---|
| | 203 | __asm__ __volatile__( \ |
|---|
| 203 | 204 | ".p2align 3 \n\t" \ |
|---|
| 204 | 205 | SSE2_INSTRUCTIONS \ |
|---|
| 205 | 206 | : \ |
|---|
| 206 | 207 | : "r" (p_line1), "r" (p_line2), \ |
|---|
| 207 | | "r" (p_y1), "r" (p_y2), \ |
|---|
| 208 | | "r" (p_u), "r" (p_v) ); \ |
|---|
| | 208 | "r" (p_y1), "r" (p_y2) ); \ |
|---|
| 209 | 209 | p_line1 += 32; p_line2 += 32; \ |
|---|
| 210 | 210 | p_y1 += 16; p_y2 += 16; \ |
|---|
| … | … | |
| 215 | 215 | |
|---|
| 216 | 216 | #define SSE2_YUV420_YUYV_ALIGNED " \n\ |
|---|
| 217 | | movq (%4), %%xmm1 # Load 8 Cb u7 u6 u5 u4 u3 u2 u1 u0 \n\ |
|---|
| 218 | | movq (%5), %%xmm2 # Load 8 Cr v7 06 v5 v4 v3 v2 v1 v0 \n\ |
|---|
| 219 | 217 | movdqa (%2), %%xmm0 # Load 16 Y y15 y14 y13 .. y2 y1 y0 \n\ |
|---|
| 220 | 218 | movdqa (%3), %%xmm3 # Load 16 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| … | … | |
| 233 | 231 | |
|---|
| 234 | 232 | #define SSE2_YUV420_YUYV_UNALIGNED " \n\ |
|---|
| 235 | | movq (%4), %%xmm1 # Load 8 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| 236 | | movq (%5), %%xmm2 # Load 8 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| 237 | 233 | movdqu (%2), %%xmm0 # Load 16 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 238 | 234 | movdqu (%3), %%xmm3 # Load 16 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| … | … | |
| 253 | 249 | |
|---|
| 254 | 250 | #define SSE2_YUV420_YVYU_ALIGNED " \n\ |
|---|
| 255 | | movq (%4), %%xmm2 # Load 8 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| 256 | | movq (%5), %%xmm1 # Load 8 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| 257 | 251 | movdqa (%2), %%xmm0 # Load 16 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 258 | 252 | movdqa (%3), %%xmm3 # Load 16 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| 259 | | punpcklbw %%xmm2, %%xmm1 # u3 v3 u2 v2 u1 v1 u0 v0 \n\ |
|---|
| 260 | | movdqa %%xmm0, %%xmm2 # y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 261 | | punpcklbw %%xmm1, %%xmm2 # u1 y3 v1 y2 u0 y1 v0 y0 \n\ |
|---|
| 262 | | movntdq %%xmm2, (%0) # Store low YUYV \n\ |
|---|
| 263 | | punpckhbw %%xmm1, %%xmm0 # u3 y7 v3 y6 u2 y5 v2 y4 \n\ |
|---|
| | 253 | punpcklbw %%xmm1, %%xmm2 # u3 v3 u2 v2 u1 v1 u0 v0 \n\ |
|---|
| | 254 | movdqa %%xmm0, %%xmm1 # y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| | 255 | punpcklbw %%xmm2, %%xmm1 # u1 y3 v1 y2 u0 y1 v0 y0 \n\ |
|---|
| | 256 | movntdq %%xmm1, (%0) # Store low YUYV \n\ |
|---|
| | 257 | punpckhbw %%xmm2, %%xmm0 # u3 y7 v3 y6 u2 y5 v2 y4 \n\ |
|---|
| 264 | 258 | movntdq %%xmm0, 16(%0) # Store high YUYV \n\ |
|---|
| 265 | 259 | movdqa %%xmm3, %%xmm4 # Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| 266 | | punpcklbw %%xmm1, %%xmm4 # u1 Y3 v1 Y2 u0 Y1 v0 Y0 \n\ |
|---|
| | 260 | punpcklbw %%xmm2, %%xmm4 # u1 Y3 v1 Y2 u0 Y1 v0 Y0 \n\ |
|---|
| 267 | 261 | movntdq %%xmm4, (%1) # Store low YUYV \n\ |
|---|
| 268 | | punpckhbw %%xmm1, %%xmm3 # u3 Y7 v3 Y6 u2 Y5 v2 Y4 \n\ |
|---|
| | 262 | punpckhbw %%xmm2, %%xmm3 # u3 Y7 v3 Y6 u2 Y5 v2 Y4 \n\ |
|---|
| 269 | 263 | movntdq %%xmm3, 16(%1) # Store high YUYV \n\ |
|---|
| 270 | 264 | " |
|---|
| 271 | 265 | |
|---|
| 272 | 266 | #define SSE2_YUV420_YVYU_UNALIGNED " \n\ |
|---|
| 273 | | movq (%4), %%xmm2 # Load 8 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| 274 | | movq (%5), %%xmm1 # Load 8 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| 275 | 267 | movdqu (%2), %%xmm0 # Load 16 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 276 | 268 | movdqu (%3), %%xmm3 # Load 16 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| 277 | 269 | prefetchnta (%0) # Tell CPU not to cache output YVYU data \n\ |
|---|
| 278 | 270 | prefetchnta (%1) # Tell CPU not to cache output YVYU data \n\ |
|---|
| 279 | | punpcklbw %%xmm2, %%xmm1 # u3 v3 u2 v2 u1 v1 u0 v0 \n\ |
|---|
| 280 | | movdqu %%xmm0, %%xmm2 # y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 281 | | punpcklbw %%xmm1, %%xmm2 # u1 y3 v1 y2 u0 y1 v0 y0 \n\ |
|---|
| 282 | | movdqu %%xmm2, (%0) # Store low YUYV \n\ |
|---|
| 283 | | punpckhbw %%xmm1, %%xmm0 # u3 y7 v3 y6 u2 y5 v2 y4 \n\ |
|---|
| | 271 | punpcklbw %%xmm1, %%xmm2 # u3 v3 u2 v2 u1 v1 u0 v0 \n\ |
|---|
| | 272 | movdqu %%xmm0, %%xmm1 # y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| | 273 | punpcklbw %%xmm2, %%xmm1 # u1 y3 v1 y2 u0 y1 v0 y0 \n\ |
|---|
| | 274 | movdqu %%xmm1, (%0) # Store low YUYV \n\ |
|---|
| | 275 | punpckhbw %%xmm2, %%xmm0 # u3 y7 v3 y6 u2 y5 v2 y4 \n\ |
|---|
| 284 | 276 | movdqu %%xmm0, 16(%0) # Store high YUYV \n\ |
|---|
| 285 | 277 | movdqu %%xmm3, %%xmm4 # Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| 286 | | punpcklbw %%xmm1, %%xmm4 # u1 Y3 v1 Y2 u0 Y1 v0 Y0 \n\ |
|---|
| | 278 | punpcklbw %%xmm2, %%xmm4 # u1 Y3 v1 Y2 u0 Y1 v0 Y0 \n\ |
|---|
| 287 | 279 | movdqu %%xmm4, (%1) # Store low YUYV \n\ |
|---|
| 288 | | punpckhbw %%xmm1, %%xmm3 # u3 Y7 v3 Y6 u2 Y5 v2 Y4 \n\ |
|---|
| | 280 | punpckhbw %%xmm2, %%xmm3 # u3 Y7 v3 Y6 u2 Y5 v2 Y4 \n\ |
|---|
| 289 | 281 | movdqu %%xmm3, 16(%1) # Store high YUYV \n\ |
|---|
| 290 | 282 | " |
|---|
| 291 | 283 | |
|---|
| 292 | 284 | #define SSE2_YUV420_UYVY_ALIGNED " \n\ |
|---|
| 293 | | movq (%4), %%xmm1 # Load 8 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| 294 | | movq (%5), %%xmm2 # Load 8 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| 295 | 285 | movdqa (%2), %%xmm0 # Load 16 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 296 | 286 | movdqa (%3), %%xmm3 # Load 16 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|
| … | … | |
| 310 | 300 | |
|---|
| 311 | 301 | #define SSE2_YUV420_UYVY_UNALIGNED " \n\ |
|---|
| 312 | | movq (%4), %%xmm1 # Load 8 Cb 00 00 00 00 u3 u2 u1 u0 \n\ |
|---|
| 313 | | movq (%5), %%xmm2 # Load 8 Cr 00 00 00 00 v3 v2 v1 v0 \n\ |
|---|
| 314 | 302 | movdqu (%2), %%xmm0 # Load 16 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\ |
|---|
| 315 | 303 | movdqu (%3), %%xmm3 # Load 16 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ |
|---|