| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/base/yuv_row.h" | 5 #include "media/base/yuv_row.h" |
| 6 | 6 |
| 7 #ifdef _DEBUG | 7 #ifdef _DEBUG |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #else | 9 #else |
| 10 #define DCHECK(a) | 10 #define DCHECK(a) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 | 32 |
| 33 #define RGBV(i) { \ | 33 #define RGBV(i) { \ |
| 34 0, \ | 34 0, \ |
| 35 static_cast<int16>(-0.813 * 64 * (i - 128) + 0.5), \ | 35 static_cast<int16>(-0.813 * 64 * (i - 128) + 0.5), \ |
| 36 static_cast<int16>(1.596 * 64 * (i - 128) + 0.5), \ | 36 static_cast<int16>(1.596 * 64 * (i - 128) + 0.5), \ |
| 37 0 \ | 37 0 \ |
| 38 } | 38 } |
| 39 | 39 |
| 40 #define MMX_ALIGNED(var) var __attribute__((aligned(16))) | 40 #define MMX_ALIGNED(var) var __attribute__((aligned(16))) |
| 41 | 41 |
| 42 MMX_ALIGNED(int16 kCoefficientsRgbY[256][4]) = { | 42 |
| 43 MMX_ALIGNED(int16 kCoefficientsRgbY[768][4]) = { |
| 43 RGBY(0x00), RGBY(0x01), RGBY(0x02), RGBY(0x03), | 44 RGBY(0x00), RGBY(0x01), RGBY(0x02), RGBY(0x03), |
| 44 RGBY(0x04), RGBY(0x05), RGBY(0x06), RGBY(0x07), | 45 RGBY(0x04), RGBY(0x05), RGBY(0x06), RGBY(0x07), |
| 45 RGBY(0x08), RGBY(0x09), RGBY(0x0A), RGBY(0x0B), | 46 RGBY(0x08), RGBY(0x09), RGBY(0x0A), RGBY(0x0B), |
| 46 RGBY(0x0C), RGBY(0x0D), RGBY(0x0E), RGBY(0x0F), | 47 RGBY(0x0C), RGBY(0x0D), RGBY(0x0E), RGBY(0x0F), |
| 47 RGBY(0x10), RGBY(0x11), RGBY(0x12), RGBY(0x13), | 48 RGBY(0x10), RGBY(0x11), RGBY(0x12), RGBY(0x13), |
| 48 RGBY(0x14), RGBY(0x15), RGBY(0x16), RGBY(0x17), | 49 RGBY(0x14), RGBY(0x15), RGBY(0x16), RGBY(0x17), |
| 49 RGBY(0x18), RGBY(0x19), RGBY(0x1A), RGBY(0x1B), | 50 RGBY(0x18), RGBY(0x19), RGBY(0x1A), RGBY(0x1B), |
| 50 RGBY(0x1C), RGBY(0x1D), RGBY(0x1E), RGBY(0x1F), | 51 RGBY(0x1C), RGBY(0x1D), RGBY(0x1E), RGBY(0x1F), |
| 51 RGBY(0x20), RGBY(0x21), RGBY(0x22), RGBY(0x23), | 52 RGBY(0x20), RGBY(0x21), RGBY(0x22), RGBY(0x23), |
| 52 RGBY(0x24), RGBY(0x25), RGBY(0x26), RGBY(0x27), | 53 RGBY(0x24), RGBY(0x25), RGBY(0x26), RGBY(0x27), |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 RGBY(0xD8), RGBY(0xD9), RGBY(0xDA), RGBY(0xDB), | 98 RGBY(0xD8), RGBY(0xD9), RGBY(0xDA), RGBY(0xDB), |
| 98 RGBY(0xDC), RGBY(0xDD), RGBY(0xDE), RGBY(0xDF), | 99 RGBY(0xDC), RGBY(0xDD), RGBY(0xDE), RGBY(0xDF), |
| 99 RGBY(0xE0), RGBY(0xE1), RGBY(0xE2), RGBY(0xE3), | 100 RGBY(0xE0), RGBY(0xE1), RGBY(0xE2), RGBY(0xE3), |
| 100 RGBY(0xE4), RGBY(0xE5), RGBY(0xE6), RGBY(0xE7), | 101 RGBY(0xE4), RGBY(0xE5), RGBY(0xE6), RGBY(0xE7), |
| 101 RGBY(0xE8), RGBY(0xE9), RGBY(0xEA), RGBY(0xEB), | 102 RGBY(0xE8), RGBY(0xE9), RGBY(0xEA), RGBY(0xEB), |
| 102 RGBY(0xEC), RGBY(0xED), RGBY(0xEE), RGBY(0xEF), | 103 RGBY(0xEC), RGBY(0xED), RGBY(0xEE), RGBY(0xEF), |
| 103 RGBY(0xF0), RGBY(0xF1), RGBY(0xF2), RGBY(0xF3), | 104 RGBY(0xF0), RGBY(0xF1), RGBY(0xF2), RGBY(0xF3), |
| 104 RGBY(0xF4), RGBY(0xF5), RGBY(0xF6), RGBY(0xF7), | 105 RGBY(0xF4), RGBY(0xF5), RGBY(0xF6), RGBY(0xF7), |
| 105 RGBY(0xF8), RGBY(0xF9), RGBY(0xFA), RGBY(0xFB), | 106 RGBY(0xF8), RGBY(0xF9), RGBY(0xFA), RGBY(0xFB), |
| 106 RGBY(0xFC), RGBY(0xFD), RGBY(0xFE), RGBY(0xFF), | 107 RGBY(0xFC), RGBY(0xFD), RGBY(0xFE), RGBY(0xFF), |
| 107 }; | |
| 108 | 108 |
| 109 MMX_ALIGNED(int16 kCoefficientsRgbU[256][4]) = { | 109 // Chroma U table. |
| 110 RGBU(0x00), RGBU(0x01), RGBU(0x02), RGBU(0x03), | 110 RGBU(0x00), RGBU(0x01), RGBU(0x02), RGBU(0x03), |
| 111 RGBU(0x04), RGBU(0x05), RGBU(0x06), RGBU(0x07), | 111 RGBU(0x04), RGBU(0x05), RGBU(0x06), RGBU(0x07), |
| 112 RGBU(0x08), RGBU(0x09), RGBU(0x0A), RGBU(0x0B), | 112 RGBU(0x08), RGBU(0x09), RGBU(0x0A), RGBU(0x0B), |
| 113 RGBU(0x0C), RGBU(0x0D), RGBU(0x0E), RGBU(0x0F), | 113 RGBU(0x0C), RGBU(0x0D), RGBU(0x0E), RGBU(0x0F), |
| 114 RGBU(0x10), RGBU(0x11), RGBU(0x12), RGBU(0x13), | 114 RGBU(0x10), RGBU(0x11), RGBU(0x12), RGBU(0x13), |
| 115 RGBU(0x14), RGBU(0x15), RGBU(0x16), RGBU(0x17), | 115 RGBU(0x14), RGBU(0x15), RGBU(0x16), RGBU(0x17), |
| 116 RGBU(0x18), RGBU(0x19), RGBU(0x1A), RGBU(0x1B), | 116 RGBU(0x18), RGBU(0x19), RGBU(0x1A), RGBU(0x1B), |
| 117 RGBU(0x1C), RGBU(0x1D), RGBU(0x1E), RGBU(0x1F), | 117 RGBU(0x1C), RGBU(0x1D), RGBU(0x1E), RGBU(0x1F), |
| 118 RGBU(0x20), RGBU(0x21), RGBU(0x22), RGBU(0x23), | 118 RGBU(0x20), RGBU(0x21), RGBU(0x22), RGBU(0x23), |
| 119 RGBU(0x24), RGBU(0x25), RGBU(0x26), RGBU(0x27), | 119 RGBU(0x24), RGBU(0x25), RGBU(0x26), RGBU(0x27), |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 RGBU(0xD8), RGBU(0xD9), RGBU(0xDA), RGBU(0xDB), | 164 RGBU(0xD8), RGBU(0xD9), RGBU(0xDA), RGBU(0xDB), |
| 165 RGBU(0xDC), RGBU(0xDD), RGBU(0xDE), RGBU(0xDF), | 165 RGBU(0xDC), RGBU(0xDD), RGBU(0xDE), RGBU(0xDF), |
| 166 RGBU(0xE0), RGBU(0xE1), RGBU(0xE2), RGBU(0xE3), | 166 RGBU(0xE0), RGBU(0xE1), RGBU(0xE2), RGBU(0xE3), |
| 167 RGBU(0xE4), RGBU(0xE5), RGBU(0xE6), RGBU(0xE7), | 167 RGBU(0xE4), RGBU(0xE5), RGBU(0xE6), RGBU(0xE7), |
| 168 RGBU(0xE8), RGBU(0xE9), RGBU(0xEA), RGBU(0xEB), | 168 RGBU(0xE8), RGBU(0xE9), RGBU(0xEA), RGBU(0xEB), |
| 169 RGBU(0xEC), RGBU(0xED), RGBU(0xEE), RGBU(0xEF), | 169 RGBU(0xEC), RGBU(0xED), RGBU(0xEE), RGBU(0xEF), |
| 170 RGBU(0xF0), RGBU(0xF1), RGBU(0xF2), RGBU(0xF3), | 170 RGBU(0xF0), RGBU(0xF1), RGBU(0xF2), RGBU(0xF3), |
| 171 RGBU(0xF4), RGBU(0xF5), RGBU(0xF6), RGBU(0xF7), | 171 RGBU(0xF4), RGBU(0xF5), RGBU(0xF6), RGBU(0xF7), |
| 172 RGBU(0xF8), RGBU(0xF9), RGBU(0xFA), RGBU(0xFB), | 172 RGBU(0xF8), RGBU(0xF9), RGBU(0xFA), RGBU(0xFB), |
| 173 RGBU(0xFC), RGBU(0xFD), RGBU(0xFE), RGBU(0xFF), | 173 RGBU(0xFC), RGBU(0xFD), RGBU(0xFE), RGBU(0xFF), |
| 174 }; | |
| 175 | 174 |
| 176 MMX_ALIGNED(int16 kCoefficientsRgbV[256][4]) = { | 175 // Chroma V table. |
| 177 RGBV(0x00), RGBV(0x01), RGBV(0x02), RGBV(0x03), | 176 RGBV(0x00), RGBV(0x01), RGBV(0x02), RGBV(0x03), |
| 178 RGBV(0x04), RGBV(0x05), RGBV(0x06), RGBV(0x07), | 177 RGBV(0x04), RGBV(0x05), RGBV(0x06), RGBV(0x07), |
| 179 RGBV(0x08), RGBV(0x09), RGBV(0x0A), RGBV(0x0B), | 178 RGBV(0x08), RGBV(0x09), RGBV(0x0A), RGBV(0x0B), |
| 180 RGBV(0x0C), RGBV(0x0D), RGBV(0x0E), RGBV(0x0F), | 179 RGBV(0x0C), RGBV(0x0D), RGBV(0x0E), RGBV(0x0F), |
| 181 RGBV(0x10), RGBV(0x11), RGBV(0x12), RGBV(0x13), | 180 RGBV(0x10), RGBV(0x11), RGBV(0x12), RGBV(0x13), |
| 182 RGBV(0x14), RGBV(0x15), RGBV(0x16), RGBV(0x17), | 181 RGBV(0x14), RGBV(0x15), RGBV(0x16), RGBV(0x17), |
| 183 RGBV(0x18), RGBV(0x19), RGBV(0x1A), RGBV(0x1B), | 182 RGBV(0x18), RGBV(0x19), RGBV(0x1A), RGBV(0x1B), |
| 184 RGBV(0x1C), RGBV(0x1D), RGBV(0x1E), RGBV(0x1F), | 183 RGBV(0x1C), RGBV(0x1D), RGBV(0x1E), RGBV(0x1F), |
| 185 RGBV(0x20), RGBV(0x21), RGBV(0x22), RGBV(0x23), | 184 RGBV(0x20), RGBV(0x21), RGBV(0x22), RGBV(0x23), |
| 186 RGBV(0x24), RGBV(0x25), RGBV(0x26), RGBV(0x27), | 185 RGBV(0x24), RGBV(0x25), RGBV(0x26), RGBV(0x27), |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 RGBV(0xFC), RGBV(0xFD), RGBV(0xFE), RGBV(0xFF), | 239 RGBV(0xFC), RGBV(0xFD), RGBV(0xFE), RGBV(0xFF), |
| 241 }; | 240 }; |
| 242 | 241 |
| 243 #undef RGBY | 242 #undef RGBY |
| 244 #undef RGBU | 243 #undef RGBU |
| 245 #undef RGBV | 244 #undef RGBV |
| 246 #undef MMX_ALIGNED | 245 #undef MMX_ALIGNED |
| 247 | 246 |
| 248 #if defined(ARCH_CPU_X86_64) | 247 #if defined(ARCH_CPU_X86_64) |
| 249 | 248 |
| 249 // AMD64 ABI uses register paremters. |
| 250 void FastConvertYUVToRGB32Row(const uint8* y_buf, // rdi | 250 void FastConvertYUVToRGB32Row(const uint8* y_buf, // rdi |
| 251 const uint8* u_buf, // rsi | 251 const uint8* u_buf, // rsi |
| 252 const uint8* v_buf, // rdx | 252 const uint8* v_buf, // rdx |
| 253 uint8* rgb_buf, // rcx | 253 uint8* rgb_buf, // rcx |
| 254 int width); // r8 | 254 int width) { // r8 |
| 255 | |
| 256 asm( | 255 asm( |
| 257 ".global FastConvertYUVToRGB32Row\n" | |
| 258 "FastConvertYUVToRGB32Row:\n" | |
| 259 "jmp convertend\n" | 256 "jmp convertend\n" |
| 260 | |
| 261 "convertloop:" | 257 "convertloop:" |
| 262 "movzb (%rsi),%r10\n" | 258 "movzb (%1),%%r10\n" |
| 263 "add $0x1,%rsi\n" | 259 "add $0x1,%1\n" |
| 264 "movzb (%rdx),%r11\n" | 260 "movzb (%2),%%r11\n" |
| 265 "add $0x1,%rdx\n" | 261 "add $0x1,%2\n" |
| 266 "movq kCoefficientsRgbU(,%r10,8),%xmm0\n" | 262 "movq 2048(%5,%%r10,8),%%xmm0\n" |
| 267 "movzb (%rdi),%r10\n" | 263 "movzb (%0),%%r10\n" |
| 268 "movq kCoefficientsRgbV(,%r11,8),%xmm1\n" | 264 "movq 4096(%5,%%r11,8),%%xmm1\n" |
| 269 "movzb 0x1(%rdi),%r11\n" | 265 "movzb 0x1(%0),%%r11\n" |
| 270 "paddsw %xmm1,%xmm0\n" | 266 "paddsw %%xmm1,%%xmm0\n" |
| 271 "movq kCoefficientsRgbY(,%r10,8),%xmm2\n" | 267 "movq (%5,%%r10,8),%%xmm2\n" |
| 272 "add $0x2,%rdi\n" | 268 "add $0x2,%0\n" |
| 273 "movq kCoefficientsRgbY(,%r11,8),%xmm3\n" | 269 "movq (%5,%%r11,8),%%xmm3\n" |
| 274 "paddsw %xmm0,%xmm2\n" | 270 "paddsw %%xmm0,%%xmm2\n" |
| 275 "paddsw %xmm0,%xmm3\n" | 271 "paddsw %%xmm0,%%xmm3\n" |
| 276 "shufps $0x44,%xmm3,%xmm2\n" | 272 "shufps $0x44,%%xmm3,%%xmm2\n" |
| 277 "psraw $0x6,%xmm2\n" | 273 "psraw $0x6,%%xmm2\n" |
| 278 "packuswb %xmm2,%xmm2\n" | 274 "packuswb %%xmm2,%%xmm2\n" |
| 279 "movq %xmm2,0x0(%rcx)\n" | 275 "movq %%xmm2,0x0(%3)\n" |
| 280 "add $0x8,%rcx\n" | 276 "add $0x8,%3\n" |
| 281 "convertend:" | 277 "convertend:" |
| 282 "sub $0x2,%r8\n" | 278 "sub $0x2,%4\n" |
| 283 "jns convertloop\n" | 279 "jns convertloop\n" |
| 284 | 280 |
| 285 "convertnext:" | 281 "convertnext:" |
| 286 "add $0x1,%r8\n" | 282 "add $0x1,%4\n" |
| 287 "js convertdone\n" | 283 "js convertdone\n" |
| 288 | 284 |
| 289 "movzb (%rsi),%r10\n" | 285 "movzb (%1),%%r10\n" |
| 290 "movq kCoefficientsRgbU(,%r10,8),%xmm0\n" | 286 "movq 2048(%5,%%r10,8),%%xmm0\n" |
| 291 "movzb (%rdx),%r10\n" | 287 "movzb (%2),%%r10\n" |
| 292 "movq kCoefficientsRgbV(,%r10,8),%xmm1\n" | 288 "movq 4096(%5,%%r10,8),%%xmm1\n" |
| 293 "paddsw %xmm1,%xmm0\n" | 289 "paddsw %%xmm1,%%xmm0\n" |
| 294 "movzb (%rdi),%r10\n" | 290 "movzb (%0),%%r10\n" |
| 295 "movq kCoefficientsRgbY(,%r10,8),%xmm1\n" | 291 "movq (%5,%%r10,8),%%xmm1\n" |
| 296 "paddsw %xmm0,%xmm1\n" | 292 "paddsw %%xmm0,%%xmm1\n" |
| 297 "psraw $0x6,%xmm1\n" | 293 "psraw $0x6,%%xmm1\n" |
| 298 "packuswb %xmm1,%xmm1\n" | 294 "packuswb %%xmm1,%%xmm1\n" |
| 299 "movd %xmm1,0x0(%rcx)\n" | 295 "movd %%xmm1,0x0(%3)\n" |
| 300 "convertdone:" | 296 "convertdone:" |
| 301 "ret\n" | 297 : |
| 298 : "r"(y_buf), // %0 |
| 299 "r"(u_buf), // %1 |
| 300 "r"(v_buf), // %2 |
| 301 "r"(rgb_buf), // %3 |
| 302 "r"(width), // %4 |
| 303 "r" (kCoefficientsRgbY) // %5 |
| 304 : "memory", "r10", "r11", "xmm0", "xmm1", "xmm2", "xmm3" |
| 302 ); | 305 ); |
| 303 | 306 } |
| 304 | 307 |
| 305 void ScaleYUVToRGB32Row(const uint8* y_buf, // rdi | 308 void ScaleYUVToRGB32Row(const uint8* y_buf, // rdi |
| 306 const uint8* u_buf, // rsi | 309 const uint8* u_buf, // rsi |
| 307 const uint8* v_buf, // rdx | 310 const uint8* v_buf, // rdx |
| 308 uint8* rgb_buf, // rcx | 311 uint8* rgb_buf, // rcx |
| 309 int width, // r8 | 312 int width, // r8 |
| 310 int scaled_dx); // r9 | 313 int scaled_dx) { // r9 |
| 311 | |
| 312 asm( | 314 asm( |
| 313 ".global ScaleYUVToRGB32Row\n" | 315 "xor %%r11,%%r11\n" |
| 314 "ScaleYUVToRGB32Row:\n" | 316 "sub $0x2,%4\n" |
| 315 "xor %r11,%r11\n" | |
| 316 "sub $0x2,%r8\n" | |
| 317 "js scalenext\n" | 317 "js scalenext\n" |
| 318 | 318 |
| 319 "scaleloop:" | 319 "scaleloop:" |
| 320 "mov %r11,%r10\n" | 320 "mov %%r11,%%r10\n" |
| 321 "sar $0x5,%r10\n" | 321 "sar $0x5,%%r10\n" |
| 322 "movzb (%rsi,%r10,1),%rax\n" | 322 "movzb (%1,%%r10,1),%%rax\n" |
| 323 "movq kCoefficientsRgbU(,%rax,8),%xmm0\n" | 323 "movq 2048(%5,%%rax,8),%%xmm0\n" |
| 324 "movzb (%rdx,%r10,1),%rax\n" | 324 "movzb (%2,%%r10,1),%%rax\n" |
| 325 "movq kCoefficientsRgbV(,%rax,8),%xmm1\n" | 325 "movq 4096(%5,%%rax,8),%%xmm1\n" |
| 326 "lea (%r11,%r9),%r10\n" | 326 "lea (%%r11,%6),%%r10\n" |
| 327 "sar $0x4,%r11\n" | 327 "sar $0x4,%%r11\n" |
| 328 "movzb (%rdi,%r11,1),%rax\n" | 328 "movzb (%0,%%r11,1),%%rax\n" |
| 329 "paddsw %xmm1,%xmm0\n" | 329 "paddsw %%xmm1,%%xmm0\n" |
| 330 "movq kCoefficientsRgbY(,%rax,8),%xmm1\n" | 330 "movq (%5,%%rax,8),%%xmm1\n" |
| 331 "lea (%r10,%r9),%r11\n" | 331 "lea (%%r10,%6),%%r11\n" |
| 332 "sar $0x4,%r10\n" | 332 "sar $0x4,%%r10\n" |
| 333 "movzb (%rdi,%r10,1),%rax\n" | 333 "movzb (%0,%%r10,1),%%rax\n" |
| 334 "movq kCoefficientsRgbY(,%rax,8),%xmm2\n" | 334 "movq (%5,%%rax,8),%%xmm2\n" |
| 335 "paddsw %xmm0,%xmm1\n" | 335 "paddsw %%xmm0,%%xmm1\n" |
| 336 "paddsw %xmm0,%xmm2\n" | 336 "paddsw %%xmm0,%%xmm2\n" |
| 337 "shufps $0x44,%xmm2,%xmm1\n" | 337 "shufps $0x44,%%xmm2,%%xmm1\n" |
| 338 "psraw $0x6,%xmm1\n" | 338 "psraw $0x6,%%xmm1\n" |
| 339 "packuswb %xmm1,%xmm1\n" | 339 "packuswb %%xmm1,%%xmm1\n" |
| 340 "movq %xmm1,0x0(%rcx)\n" | 340 "movq %%xmm1,0x0(%3)\n" |
| 341 "add $0x8,%rcx\n" | 341 "add $0x8,%3\n" |
| 342 "sub $0x2,%r8\n" | 342 "sub $0x2,%4\n" |
| 343 "jns scaleloop\n" | 343 "jns scaleloop\n" |
| 344 | 344 |
| 345 "scalenext:" | 345 "scalenext:" |
| 346 "add $0x1,%r8\n" | 346 "add $0x1,%4\n" |
| 347 "js scaledone\n" | 347 "js scaledone\n" |
| 348 | 348 |
| 349 "mov %r11,%r10\n" | 349 "mov %%r11,%%r10\n" |
| 350 "sar $0x5,%r10\n" | 350 "sar $0x5,%%r10\n" |
| 351 "movzb (%rsi,%r10,1),%rax\n" | 351 "movzb (%1,%%r10,1),%%rax\n" |
| 352 "movq kCoefficientsRgbU(,%rax,8),%xmm0\n" | 352 "movq 2048(%5,%%rax,8),%%xmm0\n" |
| 353 "movzb (%rdx,%r10,1),%rax\n" | 353 "movzb (%2,%%r10,1),%%rax\n" |
| 354 "movq kCoefficientsRgbV(,%rax,8),%xmm1\n" | 354 "movq 4096(%5,%%rax,8),%%xmm1\n" |
| 355 "paddsw %xmm1,%xmm0\n" | 355 "paddsw %%xmm1,%%xmm0\n" |
| 356 "sar $0x4,%r11\n" | 356 "sar $0x4,%%r11\n" |
| 357 "movzb (%rdi,%r11,1),%rax\n" | 357 "movzb (%0,%%r11,1),%%rax\n" |
| 358 "movq kCoefficientsRgbY(,%rax,8),%xmm1\n" | 358 "movq (%5,%%rax,8),%%xmm1\n" |
| 359 "paddsw %xmm0,%xmm1\n" | 359 "paddsw %%xmm0,%%xmm1\n" |
| 360 "psraw $0x6,%xmm1\n" | 360 "psraw $0x6,%%xmm1\n" |
| 361 "packuswb %xmm1,%xmm1\n" | 361 "packuswb %%xmm1,%%xmm1\n" |
| 362 "movd %xmm1,0x0(%rcx)\n" | 362 "movd %%xmm1,0x0(%3)\n" |
| 363 | 363 |
| 364 "scaledone:" | 364 "scaledone:" |
| 365 "ret\n" | 365 : |
| 366 : "r"(y_buf), // %0 |
| 367 "r"(u_buf), // %1 |
| 368 "r"(v_buf), // %2 |
| 369 "r"(rgb_buf), // %3 |
| 370 "r"(width), // %4 |
| 371 "r" (kCoefficientsRgbY), // %5 |
| 372 "r"(static_cast<long>(scaled_dx)) // %6 |
| 373 : "memory", "r10", "r11", "rax", "xmm0", "xmm1", "xmm2" |
| 366 ); | 374 ); |
| 375 } |
| 367 | 376 |
| 368 #else | 377 #else |
| 369 | 378 |
| 370 void FastConvertYUVToRGB32Row(const uint8* y_buf, | 379 void FastConvertYUVToRGB32Row(const uint8* y_buf, |
| 371 const uint8* u_buf, | 380 const uint8* u_buf, |
| 372 const uint8* v_buf, | 381 const uint8* v_buf, |
| 373 uint8* rgb_buf, | 382 uint8* rgb_buf, |
| 374 int width); | 383 int width); |
| 375 | 384 |
| 376 asm( | 385 asm( |
| 377 ".global FastConvertYUVToRGB32Row\n" | 386 ".global FastConvertYUVToRGB32Row\n" |
| 378 "FastConvertYUVToRGB32Row:\n" | 387 "FastConvertYUVToRGB32Row:\n" |
| 379 "pusha\n" | 388 "pusha\n" |
| 380 "mov 0x24(%esp),%edx\n" | 389 "mov 0x24(%esp),%edx\n" |
| 381 "mov 0x28(%esp),%edi\n" | 390 "mov 0x28(%esp),%edi\n" |
| 382 "mov 0x2c(%esp),%esi\n" | 391 "mov 0x2c(%esp),%esi\n" |
| 383 "mov 0x30(%esp),%ebp\n" | 392 "mov 0x30(%esp),%ebp\n" |
| 384 "mov 0x34(%esp),%ecx\n" | 393 "mov 0x34(%esp),%ecx\n" |
| 385 "jmp convertend\n" | 394 "jmp convertend\n" |
| 386 | 395 |
| 387 "convertloop:" | 396 "convertloop:" |
| 388 "movzbl (%edi),%eax\n" | 397 "movzbl (%edi),%eax\n" |
| 389 "add $0x1,%edi\n" | 398 "add $0x1,%edi\n" |
| 390 "movzbl (%esi),%ebx\n" | 399 "movzbl (%esi),%ebx\n" |
| 391 "add $0x1,%esi\n" | 400 "add $0x1,%esi\n" |
| 392 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" | 401 "movq kCoefficientsRgbY+2048(,%eax,8),%mm0\n" |
| 393 "movzbl (%edx),%eax\n" | 402 "movzbl (%edx),%eax\n" |
| 394 "paddsw kCoefficientsRgbV(,%ebx,8),%mm0\n" | 403 "paddsw kCoefficientsRgbY+4096(,%ebx,8),%mm0\n" |
| 395 "movzbl 0x1(%edx),%ebx\n" | 404 "movzbl 0x1(%edx),%ebx\n" |
| 396 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 405 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 397 "add $0x2,%edx\n" | 406 "add $0x2,%edx\n" |
| 398 "movq kCoefficientsRgbY(,%ebx,8),%mm2\n" | 407 "movq kCoefficientsRgbY(,%ebx,8),%mm2\n" |
| 399 "paddsw %mm0,%mm1\n" | 408 "paddsw %mm0,%mm1\n" |
| 400 "paddsw %mm0,%mm2\n" | 409 "paddsw %mm0,%mm2\n" |
| 401 "psraw $0x6,%mm1\n" | 410 "psraw $0x6,%mm1\n" |
| 402 "psraw $0x6,%mm2\n" | 411 "psraw $0x6,%mm2\n" |
| 403 "packuswb %mm2,%mm1\n" | 412 "packuswb %mm2,%mm1\n" |
| 404 "movntq %mm1,0x0(%ebp)\n" | 413 "movntq %mm1,0x0(%ebp)\n" |
| 405 "add $0x8,%ebp\n" | 414 "add $0x8,%ebp\n" |
| 406 "convertend:" | 415 "convertend:" |
| 407 "sub $0x2,%ecx\n" | 416 "sub $0x2,%ecx\n" |
| 408 "jns convertloop\n" | 417 "jns convertloop\n" |
| 409 | 418 |
| 410 "and $0x1,%ecx\n" | 419 "and $0x1,%ecx\n" |
| 411 "je convertdone\n" | 420 "je convertdone\n" |
| 412 | 421 |
| 413 "movzbl (%edi),%eax\n" | 422 "movzbl (%edi),%eax\n" |
| 414 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" | 423 "movq kCoefficientsRgbY+2048(,%eax,8),%mm0\n" |
| 415 "movzbl (%esi),%eax\n" | 424 "movzbl (%esi),%eax\n" |
| 416 "paddsw kCoefficientsRgbV(,%eax,8),%mm0\n" | 425 "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n" |
| 417 "movzbl (%edx),%eax\n" | 426 "movzbl (%edx),%eax\n" |
| 418 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 427 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 419 "paddsw %mm0,%mm1\n" | 428 "paddsw %mm0,%mm1\n" |
| 420 "psraw $0x6,%mm1\n" | 429 "psraw $0x6,%mm1\n" |
| 421 "packuswb %mm1,%mm1\n" | 430 "packuswb %mm1,%mm1\n" |
| 422 "movd %mm1,0x0(%ebp)\n" | 431 "movd %mm1,0x0(%ebp)\n" |
| 423 "convertdone:" | 432 "convertdone:" |
| 424 "popa\n" | 433 "popa\n" |
| 425 "ret\n" | 434 "ret\n" |
| 426 ); | 435 ); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 442 "mov 0x2c(%esp),%esi\n" | 451 "mov 0x2c(%esp),%esi\n" |
| 443 "mov 0x30(%esp),%ebp\n" | 452 "mov 0x30(%esp),%ebp\n" |
| 444 "mov 0x34(%esp),%ecx\n" | 453 "mov 0x34(%esp),%ecx\n" |
| 445 "xor %ebx,%ebx\n" | 454 "xor %ebx,%ebx\n" |
| 446 "jmp scaleend\n" | 455 "jmp scaleend\n" |
| 447 | 456 |
| 448 "scaleloop:" | 457 "scaleloop:" |
| 449 "mov %ebx,%eax\n" | 458 "mov %ebx,%eax\n" |
| 450 "sar $0x5,%eax\n" | 459 "sar $0x5,%eax\n" |
| 451 "movzbl (%edi,%eax,1),%eax\n" | 460 "movzbl (%edi,%eax,1),%eax\n" |
| 452 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" | 461 "movq kCoefficientsRgbY+2048(,%eax,8),%mm0\n" |
| 453 "mov %ebx,%eax\n" | 462 "mov %ebx,%eax\n" |
| 454 "sar $0x5,%eax\n" | 463 "sar $0x5,%eax\n" |
| 455 "movzbl (%esi,%eax,1),%eax\n" | 464 "movzbl (%esi,%eax,1),%eax\n" |
| 456 "paddsw kCoefficientsRgbV(,%eax,8),%mm0\n" | 465 "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n" |
| 457 "mov %ebx,%eax\n" | 466 "mov %ebx,%eax\n" |
| 458 "add 0x38(%esp),%ebx\n" | 467 "add 0x38(%esp),%ebx\n" |
| 459 "sar $0x4,%eax\n" | 468 "sar $0x4,%eax\n" |
| 460 "movzbl (%edx,%eax,1),%eax\n" | 469 "movzbl (%edx,%eax,1),%eax\n" |
| 461 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 470 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 462 "mov %ebx,%eax\n" | 471 "mov %ebx,%eax\n" |
| 463 "add 0x38(%esp),%ebx\n" | 472 "add 0x38(%esp),%ebx\n" |
| 464 "sar $0x4,%eax\n" | 473 "sar $0x4,%eax\n" |
| 465 "movzbl (%edx,%eax,1),%eax\n" | 474 "movzbl (%edx,%eax,1),%eax\n" |
| 466 "movq kCoefficientsRgbY(,%eax,8),%mm2\n" | 475 "movq kCoefficientsRgbY(,%eax,8),%mm2\n" |
| 467 "paddsw %mm0,%mm1\n" | 476 "paddsw %mm0,%mm1\n" |
| 468 "paddsw %mm0,%mm2\n" | 477 "paddsw %mm0,%mm2\n" |
| 469 "psraw $0x6,%mm1\n" | 478 "psraw $0x6,%mm1\n" |
| 470 "psraw $0x6,%mm2\n" | 479 "psraw $0x6,%mm2\n" |
| 471 "packuswb %mm2,%mm1\n" | 480 "packuswb %mm2,%mm1\n" |
| 472 "movntq %mm1,0x0(%ebp)\n" | 481 "movntq %mm1,0x0(%ebp)\n" |
| 473 "add $0x8,%ebp\n" | 482 "add $0x8,%ebp\n" |
| 474 "scaleend:" | 483 "scaleend:" |
| 475 "sub $0x2,%ecx\n" | 484 "sub $0x2,%ecx\n" |
| 476 "jns scaleloop\n" | 485 "jns scaleloop\n" |
| 477 | 486 |
| 478 "and $0x1,%ecx\n" | 487 "and $0x1,%ecx\n" |
| 479 "je scaledone\n" | 488 "je scaledone\n" |
| 480 | 489 |
| 481 "mov %ebx,%eax\n" | 490 "mov %ebx,%eax\n" |
| 482 "sar $0x5,%eax\n" | 491 "sar $0x5,%eax\n" |
| 483 "movzbl (%edi,%eax,1),%eax\n" | 492 "movzbl (%edi,%eax,1),%eax\n" |
| 484 "movq kCoefficientsRgbU(,%eax,8),%mm0\n" | 493 "movq kCoefficientsRgbY+2048(,%eax,8),%mm0\n" |
| 485 "mov %ebx,%eax\n" | 494 "mov %ebx,%eax\n" |
| 486 "sar $0x5,%eax\n" | 495 "sar $0x5,%eax\n" |
| 487 "movzbl (%esi,%eax,1),%eax\n" | 496 "movzbl (%esi,%eax,1),%eax\n" |
| 488 "paddsw kCoefficientsRgbV(,%eax,8),%mm0\n" | 497 "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n" |
| 489 "mov %ebx,%eax\n" | 498 "mov %ebx,%eax\n" |
| 490 "sar $0x4,%eax\n" | 499 "sar $0x4,%eax\n" |
| 491 "movzbl (%edx,%eax,1),%eax\n" | 500 "movzbl (%edx,%eax,1),%eax\n" |
| 492 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 501 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 493 "paddsw %mm0,%mm1\n" | 502 "paddsw %mm0,%mm1\n" |
| 494 "psraw $0x6,%mm1\n" | 503 "psraw $0x6,%mm1\n" |
| 495 "packuswb %mm1,%mm1\n" | 504 "packuswb %mm1,%mm1\n" |
| 496 "movd %mm1,0x0(%ebp)\n" | 505 "movd %mm1,0x0(%ebp)\n" |
| 497 | 506 |
| 498 "scaledone:" | 507 "scaledone:" |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 uint8 v = v_buf[scaled_x >> 5]; | 690 uint8 v = v_buf[scaled_x >> 5]; |
| 682 uint8 y0 = y_buf[scaled_x >> 4]; | 691 uint8 y0 = y_buf[scaled_x >> 4]; |
| 683 YuvPixel(y0, u, v, rgb_buf); | 692 YuvPixel(y0, u, v, rgb_buf); |
| 684 rgb_buf += 4; | 693 rgb_buf += 4; |
| 685 scaled_x += scaled_dx; | 694 scaled_x += scaled_dx; |
| 686 } | 695 } |
| 687 } | 696 } |
| 688 #endif // USE_MMX | 697 #endif // USE_MMX |
| 689 } // extern "C" | 698 } // extern "C" |
| 690 | 699 |
| OLD | NEW |