INIT_XMM avx
RGB24_FUNCS 11, 13
-cglobal %2%3%4%5 %+ ToY, 3, 3, %1, dst, src, w
+ ; %1 = nr. of XMM registers
+ ; %2-5 = rgba, bgra, argb or abgr (in individual characters)
+ %macro RGB32_TO_Y_FN 5-6
- movu m0, [srcq+wq*4+0] ; (byte) { Bx, Gx, Rx, xx }[0-3]
- movu m2, [srcq+wq*4+mmsize] ; (byte) { Bx, Gx, Rx, xx }[4-7]
++cglobal %2%3%4%5 %+ ToY, 6, 6, %1, dst, src, u1, u2, w, u3
+ mova m5, [rgba_Ycoeff_%2%4]
+ mova m6, [rgba_Ycoeff_%3%5]
+ %if %0 == 6
+ jmp mangle(program_name %+ _ %+ %6 %+ ToY %+ SUFFIX).body
+ %else ; %0 == 6
+ .body:
+ %if ARCH_X86_64
+ movsxd wq, wd
+ %endif
+ lea srcq, [srcq+wq*4]
++ add wq, wq
+ add dstq, wq
+ neg wq
+ mova m4, [rgb_Yrnd]
+ pcmpeqb m7, m7
+ psrlw m7, 8 ; (word) { 0x00ff } x4
+ .loop:
+ ; FIXME check alignment and use mova
- psrad m0, 15
- psrad m2, 15
++ movu m0, [srcq+wq*2+0] ; (byte) { Bx, Gx, Rx, xx }[0-3]
++ movu m2, [srcq+wq*2+mmsize] ; (byte) { Bx, Gx, Rx, xx }[4-7]
+ DEINTB 1, 0, 3, 2, 7 ; (word) { Gx, xx (m0/m2) or Bx, Rx (m1/m3) }[0-3]/[4-7]
+ pmaddwd m1, m5 ; (dword) { Bx*BY + Rx*RY }[0-3]
+ pmaddwd m0, m6 ; (dword) { Gx*GY }[0-3]
+ pmaddwd m3, m5 ; (dword) { Bx*BY + Rx*RY }[4-7]
+ pmaddwd m2, m6 ; (dword) { Gx*GY }[4-7]
+ paddd m0, m4 ; += rgb_Yrnd
+ paddd m2, m4 ; += rgb_Yrnd
+ paddd m0, m1 ; (dword) { Y[0-3] }
+ paddd m2, m3 ; (dword) { Y[4-7] }
- packuswb m0, m0 ; (byte) { Y[0-7] }
- movh [dstq+wq], m0
- add wq, mmsize / 2
++ psrad m0, 9
++ psrad m2, 9
+ packssdw m0, m2 ; (word) { Y[0-7] }
-cglobal %2%3%4%5 %+ ToUV, 3, 4, %1, dstU, dstV, src, w
++ mova [dstq+wq], m0
++ add wq, mmsize
+ jl .loop
+ REP_RET
+ %endif ; %0 == 3
+ %endmacro
+
+ ; %1 = nr. of XMM registers
+ ; %2-5 = rgba, bgra, argb or abgr (in individual characters)
+ %macro RGB32_TO_UV_FN 5-6
- movsxd wq, dword r4m
++cglobal %2%3%4%5 %+ ToUV, 7, 7, %1, dstU, dstV, u1, src, u2, w, u3
+ %if ARCH_X86_64
+ mova m8, [rgba_Ucoeff_%2%4]
+ mova m9, [rgba_Ucoeff_%3%5]
+ mova m10, [rgba_Vcoeff_%2%4]
+ mova m11, [rgba_Vcoeff_%3%5]
+ %define coeffU1 m8
+ %define coeffU2 m9
+ %define coeffV1 m10
+ %define coeffV2 m11
+ %else ; x86-32
+ %define coeffU1 [rgba_Ucoeff_%2%4]
+ %define coeffU2 [rgba_Ucoeff_%3%5]
+ %define coeffV1 [rgba_Vcoeff_%2%4]
+ %define coeffV2 [rgba_Vcoeff_%3%5]
+ %endif ; x86-64/32
+ %if ARCH_X86_64 && %0 == 6
+ jmp mangle(program_name %+ _ %+ %6 %+ ToUV %+ SUFFIX).body
+ %else ; ARCH_X86_64 && %0 == 6
+ .body:
+ %if ARCH_X86_64
- mov wq, r4m
++ movsxd wq, dword r5m
+ %else ; x86-32
- lea srcq, [srcq+wq*4]
++ mov wq, r5m
+ %endif
++ add wq, wq
+ add dstUq, wq
+ add dstVq, wq
- movu m0, [srcq+wq*4+0] ; (byte) { Bx, Gx, Rx, xx }[0-3]
- movu m4, [srcq+wq*4+mmsize] ; (byte) { Bx, Gx, Rx, xx }[4-7]
++ lea srcq, [srcq+wq*2]
+ neg wq
+ pcmpeqb m7, m7
+ psrlw m7, 8 ; (word) { 0x00ff } x4
+ mova m6, [rgb_UVrnd]
+ .loop:
+ ; FIXME check alignment and use mova
- psrad m0, 15
++ movu m0, [srcq+wq*2+0] ; (byte) { Bx, Gx, Rx, xx }[0-3]
++ movu m4, [srcq+wq*2+mmsize] ; (byte) { Bx, Gx, Rx, xx }[4-7]
+ DEINTB 1, 0, 5, 4, 7 ; (word) { Gx, xx (m0/m4) or Bx, Rx (m1/m5) }[0-3]/[4-7]
+ pmaddwd m3, m1, coeffV1 ; (dword) { Bx*BV + Rx*RV }[0-3]
+ pmaddwd m2, m0, coeffV2 ; (dword) { Gx*GV }[0-3]
+ pmaddwd m1, coeffU1 ; (dword) { Bx*BU + Rx*RU }[0-3]
+ pmaddwd m0, coeffU2 ; (dword) { Gx*GU }[0-3]
+ paddd m3, m6 ; += rgb_UVrnd
+ paddd m1, m6 ; += rgb_UVrnd
+ paddd m2, m3 ; (dword) { V[0-3] }
+ paddd m0, m1 ; (dword) { U[0-3] }
+ pmaddwd m3, m5, coeffV1 ; (dword) { Bx*BV + Rx*RV }[4-7]
+ pmaddwd m1, m4, coeffV2 ; (dword) { Gx*GV }[4-7]
+ pmaddwd m5, coeffU1 ; (dword) { Bx*BU + Rx*RU }[4-7]
+ pmaddwd m4, coeffU2 ; (dword) { Gx*GU }[4-7]
+ paddd m3, m6 ; += rgb_UVrnd
+ paddd m5, m6 ; += rgb_UVrnd
- psrad m2, 15
- psrad m4, 15
- psrad m1, 15
++ psrad m0, 9
+ paddd m1, m3 ; (dword) { V[4-7] }
+ paddd m4, m5 ; (dword) { U[4-7] }
- packuswb m0, m0 ; (byte) { U[0-7] }
- packuswb m2, m2 ; (byte) { V[0-7] }
- movh [dstUq+wq], m0
- movh [dstVq+wq], m2
++ psrad m2, 9
++ psrad m4, 9
++ psrad m1, 9
+ packssdw m0, m4 ; (word) { U[0-7] }
+ packssdw m2, m1 ; (word) { V[0-7] }
+ %if mmsize == 8
- packuswb m0, m2 ; (byte) { U[0-7], V[0-7] }
- movh [dstUq+wq], m0
- movhps [dstVq+wq], m0
++ mova [dstUq+wq], m0
++ mova [dstVq+wq], m2
+ %else ; mmsize == 16
- add wq, mmsize / 2
++ mova [dstUq+wq], m0
++ mova [dstVq+wq], m2
+ %endif ; mmsize == 8/16
++ add wq, mmsize
+ jl .loop
+ REP_RET
+ %endif ; ARCH_X86_64 && %0 == 3
+ %endmacro
+
+ ; %1 = nr. of XMM registers for rgb-to-Y func
+ ; %2 = nr. of XMM registers for rgb-to-UV func
+ %macro RGB32_FUNCS 2
+ RGB32_TO_Y_FN %1, r, g, b, a
+ RGB32_TO_Y_FN %1, b, g, r, a, rgba
+ RGB32_TO_Y_FN %1, a, r, g, b, rgba
+ RGB32_TO_Y_FN %1, a, b, g, r, rgba
+
+ RGB32_TO_UV_FN %2, r, g, b, a
+ RGB32_TO_UV_FN %2, b, g, r, a, rgba
+ RGB32_TO_UV_FN %2, a, r, g, b, rgba
+ RGB32_TO_UV_FN %2, a, b, g, r, rgba
+ %endmacro
+
+ %if ARCH_X86_32
+ INIT_MMX mmx
+ RGB32_FUNCS 0, 0
+ %endif
+
+ INIT_XMM sse2
+ RGB32_FUNCS 8, 12
+
+ INIT_XMM avx
+ RGB32_FUNCS 8, 12
+
;-----------------------------------------------------------------------------
; YUYV/UYVY/NV12/NV21 packed pixel shuffling.
;
0, 0, 37440, 0xd1bc5235
-0, 3750, 37440, 0x158e6167
-0, 7500, 37440, 0x0faa4481
-0, 11250, 37440, 0x427158c5
-0, 15000, 37440, 0x4eb53ac6
-0, 18750, 37440, 0x99304eea
-0, 22500, 37440, 0xcc554a6f
-0, 26250, 37440, 0xabeb6c35
-0, 30000, 37440, 0xddfc7e18
-0, 33750, 37440, 0xaa79b504
-0, 37500, 37440, 0x5cb1c839
-0, 41250, 37440, 0x7e36ecca
-0, 45000, 37440, 0xf486f425
-0, 48750, 37440, 0xf1b4138f
-0, 52500, 37440, 0x966f1a49
-0, 56250, 37440, 0x5eff21da
-0, 60000, 37440, 0x333f39b1
-0, 63750, 37440, 0x62e5963e
-0, 67500, 37440, 0x26930671
-0, 71250, 37440, 0x27b4bb6c
-0, 75000, 37440, 0xdbd07766
-0, 78750, 37440, 0x04260104
-0, 82500, 37440, 0x9b1e078b
-0, 86250, 37440, 0xdf4e2474
-0, 90000, 37440, 0x57d44986
-0, 93750, 37440, 0x8780e34c
-0, 97500, 37440, 0xf80c8bc0
-0, 101250, 37440, 0x630a7583
-0, 105000, 37440, 0x235ae089
-0, 108750, 37440, 0x984b8f0e
-0, 112500, 37440, 0x865cf592
-0, 116250, 37440, 0x70f376f2
-0, 120000, 37440, 0x8b30c035
-0, 123750, 37440, 0xde772d79
-0, 127500, 37440, 0x8e076be5
-0, 131250, 37440, 0x3dc2bd9f
-0, 135000, 37440, 0xb782eb67
-0, 138750, 37440, 0x02025d73
-0, 142500, 37440, 0x86bbbce8
-0, 146250, 37440, 0xd6554f62
-0, 150000, 37440, 0xb831b917
-0, 153750, 37440, 0x80643560
-0, 157500, 37440, 0x4ecf9afd
-0, 161250, 37440, 0x9ce51e0b
-0, 165000, 37440, 0x179466cd
-0, 168750, 37440, 0x145fc900
-0, 172500, 37440, 0xb1b50402
-0, 176250, 37440, 0x0a87552a
-0, 180000, 37440, 0x8f53821d
-0, 183750, 37440, 0x1c07c825
-0, 187500, 37440, 0x49dde82f
-0, 191250, 37440, 0xb1a32605
-0, 195000, 37440, 0x410f3cd5
-0, 198750, 37440, 0xff5e6696
-0, 202500, 37440, 0x96f678c9
-0, 206250, 37440, 0x6c9e9e68
-0, 210000, 37440, 0x79a2a655
-0, 213750, 37440, 0xf237bd6c
-0, 217500, 37440, 0x4051b611
-0, 221250, 37440, 0xc7ccc918
-0, 225000, 37440, 0xbd02c122
-0, 228750, 37440, 0xacb3c881
-0, 232500, 37440, 0x2abdb940
-0, 236250, 37440, 0x19d5be85
-0, 240000, 37440, 0xfa5fb1ba
-0, 243750, 37440, 0xdae7a7aa
-0, 247500, 37440, 0x6b0f9f69
-0, 251250, 37440, 0x353e8201
-0, 255000, 37440, 0xa21443aa
-0, 258750, 37440, 0x66c8d7e0
-0, 262500, 37440, 0xc332068e
-0, 266250, 37440, 0x71431b9b
-0, 270000, 37440, 0x392f15cb
-0, 273750, 37440, 0x95a146bb
-0, 277500, 37440, 0x7c51740a
-0, 281250, 37440, 0xa3bdd43c
-0, 285000, 37440, 0xa079f965
-0, 288750, 37440, 0xa95423ea
-0, 292500, 37440, 0xd1bd2c67
-0, 296250, 37440, 0x6cf82844
-0, 300000, 37440, 0xd401e128
-0, 303750, 37440, 0x1f7db118
-0, 307500, 37440, 0x2e0a65a9
-0, 311250, 37440, 0x321c1c40
-0, 315000, 37440, 0x95b2a127
-0, 318750, 37440, 0xa1471f4b
-0, 322500, 37440, 0x29d148c0
-0, 326250, 37440, 0x24c07107
-0, 330000, 37440, 0x0ead678d
-0, 333750, 37440, 0xd0ca6495
-0, 337500, 37440, 0x08f935ef
-0, 341250, 37440, 0xb5ec3c38
-0, 345000, 37440, 0xce371628
-0, 348750, 37440, 0x68170812
-0, 352500, 37440, 0xe222699e
-0, 356250, 37440, 0xd688706c
-0, 360000, 37440, 0x81a033f9
-0, 363750, 37440, 0x28bd0fbf
-0, 367500, 37440, 0xe36db7b2
-0, 371250, 37440, 0x30559121
-0, 375000, 37440, 0xbf2b5fc8
-0, 378750, 37440, 0x4b427672
-0, 382500, 37440, 0x0544b0b4
-0, 386250, 37440, 0x38a70b06
-0, 390000, 37440, 0x4ed62607
-0, 393750, 37440, 0x6efe8ea6
-0, 397500, 37440, 0x81197e11
-0, 401250, 37440, 0xf4060050
-0, 405000, 37440, 0xaf205f13
-0, 408750, 37440, 0x5fa21382
-0, 412500, 37440, 0x8627ad05
-0, 416250, 37440, 0xf7130133
-0, 420000, 37440, 0x76dea7ba
-0, 423750, 37440, 0x1dbae1be
-0, 427500, 37440, 0x74a933f7
-0, 431250, 37440, 0xbdcd41a3
-0, 435000, 37440, 0xf0fe8c1c
-0, 438750, 37440, 0xc0036222
-0, 442500, 37440, 0x3058385c
-0, 446250, 37440, 0x68141016
+0, 7500, 37440, 0x158e6167
+0, 11250, 37440, 0x0faa4481
+0, 15000, 37440, 0x427158c5
+0, 18750, 37440, 0x4eb53ac6
+0, 22500, 37440, 0x99304eea
+0, 26250, 37440, 0xcc554a6f
+0, 30000, 37440, 0xabeb6c35
+0, 33750, 37440, 0xddfc7e18
+0, 37500, 37440, 0xaa79b504
+0, 41250, 37440, 0x5cb1c839
+0, 45000, 37440, 0x7e36ecca
+0, 48750, 37440, 0xf486f425
+0, 52500, 37440, 0xf1b4138f
+0, 56250, 37440, 0x966f1a49
+0, 60000, 37440, 0x5eff21da
+0, 63750, 37440, 0x333f39b1
+0, 67500, 37440, 0x62e5963e
+0, 71250, 37440, 0x26930671
+0, 75000, 37440, 0x27b4bb6c
+0, 78750, 37440, 0xdbd07766
+0, 82500, 37440, 0x04260104
+0, 86250, 37440, 0x9b1e078b
+0, 90000, 37440, 0xdf4e2474
+0, 93750, 37440, 0x57d44986
+0, 97500, 37440, 0x8780e34c
+0, 101250, 37440, 0xf80c8bc0
+0, 105000, 37440, 0x630a7583
+0, 108750, 37440, 0x235ae089
+0, 112500, 37440, 0x984b8f0e
+0, 116250, 37440, 0x865cf592
+0, 120000, 37440, 0x70f376f2
+0, 123750, 37440, 0x8b30c035
+0, 127500, 37440, 0xde772d79
+0, 131250, 37440, 0x8e076be5
+0, 135000, 37440, 0x3dc2bd9f
+0, 138750, 37440, 0xb782eb67
+0, 142500, 37440, 0x02025d73
+0, 146250, 37440, 0x86bbbce8
+0, 150000, 37440, 0xd6554f62
+0, 153750, 37440, 0xb831b917
+0, 157500, 37440, 0x80643560
+0, 161250, 37440, 0x4ecf9afd
+0, 165000, 37440, 0x9ce51e0b
+0, 168750, 37440, 0x179466cd
+0, 172500, 37440, 0x145fc900
+0, 176250, 37440, 0xb1b50402
+0, 180000, 37440, 0x0a87552a
+0, 183750, 37440, 0x8f53821d
+0, 187500, 37440, 0x1c07c825
+0, 191250, 37440, 0x49dde82f
+0, 195000, 37440, 0xb1a32605
+0, 198750, 37440, 0x410f3cd5
+0, 202500, 37440, 0xff5e6696
+0, 206250, 37440, 0x96f678c9
+0, 210000, 37440, 0x6c9e9e68
+0, 213750, 37440, 0x79a2a655
+0, 217500, 37440, 0xf237bd6c
+0, 221250, 37440, 0x4051b611
+0, 225000, 37440, 0xc7ccc918
+0, 228750, 37440, 0xbd02c122
+0, 232500, 37440, 0xacb3c881
+0, 236250, 37440, 0x2abdb940
+0, 240000, 37440, 0x19d5be85
+0, 243750, 37440, 0xfa5fb1ba
+0, 247500, 37440, 0xdae7a7aa
+0, 251250, 37440, 0x6b0f9f69
+0, 255000, 37440, 0x353e8201
+0, 258750, 37440, 0xa21443aa
+0, 262500, 37440, 0x66c8d7e0
+0, 266250, 37440, 0xc332068e
+0, 270000, 37440, 0x71431b9b
+0, 273750, 37440, 0x392f15cb
+0, 277500, 37440, 0x95a146bb
+0, 281250, 37440, 0x7c51740a
+0, 285000, 37440, 0xa3bdd43c
+0, 288750, 37440, 0xa079f965
+0, 292500, 37440, 0xa95423ea
+0, 296250, 37440, 0xd1bd2c67
+0, 300000, 37440, 0x6cf82844
+0, 303750, 37440, 0xd401e128
+0, 307500, 37440, 0x1f7db118
+0, 311250, 37440, 0x2e0a65a9
+0, 315000, 37440, 0x321c1c40
+0, 318750, 37440, 0x95b2a127
+0, 322500, 37440, 0xa1471f4b
+0, 326250, 37440, 0x29d148c0
+0, 330000, 37440, 0x24c07107
+0, 333750, 37440, 0x0ead678d
+0, 337500, 37440, 0xd0ca6495
+0, 341250, 37440, 0x08f935ef
+0, 345000, 37440, 0xb5ec3c38
+0, 348750, 37440, 0xce371628
+0, 352500, 37440, 0x68170812
+0, 356250, 37440, 0xe222699e
+0, 360000, 37440, 0xd688706c
+0, 363750, 37440, 0x81a033f9
+0, 367500, 37440, 0x28bd0fbf
+0, 371250, 37440, 0xe36db7b2
+0, 375000, 37440, 0x30559121
+0, 378750, 37440, 0xbf2b5fc8
+0, 382500, 37440, 0x4b427672
+0, 386250, 37440, 0x0544b0b4
+0, 390000, 37440, 0x38a70b06
+0, 393750, 37440, 0x4ed62607
+0, 397500, 37440, 0x6efe8ea6
+0, 401250, 37440, 0x81197e11
+0, 405000, 37440, 0xf4060050
+0, 408750, 37440, 0xaf205f13
+0, 412500, 37440, 0x5fa21382
+0, 416250, 37440, 0x8627ad05
+0, 420000, 37440, 0xf7130133
+0, 423750, 37440, 0x76dea7ba
+0, 427500, 37440, 0x1dbae1be
+0, 431250, 37440, 0x74a933f7
+0, 435000, 37440, 0xbdcd41a3
+0, 438750, 37440, 0xf0fe8c1c
+0, 442500, 37440, 0xc0036222
+0, 446250, 37440, 0x3058385c
- 0, 450000, 37440, 0x68141016