shithub: dav1d

Download patch

ref: aa0fc4718bca67f521ac5ef21b29719764182cf1
parent: 2df874896225540b91bb31838845c80e2f854845
author: Henrik Gramner <gramner@twoorioles.com>
date: Wed Oct 3 16:08:28 EDT 2018

x86: Enable ITX AVX2 asm on 64-bit Windows

--- a/src/x86/itx.asm
+++ b/src/x86/itx.asm
@@ -26,7 +26,7 @@
 %include "config.asm"
 %include "ext/x86/x86inc.asm"
 
-%if ARCH_X86_64 && UNIX64 ; Fixme: Windows
+%if ARCH_X86_64
 
 SECTION_RODATA 32
 
@@ -117,10 +117,6 @@
 
 SECTION .text
 
-; Callee-saved registers has to be explicitly handled when jumping around
-; different functions since RET can't automatically deal with it.
-ASSERT ARCH_X86_64 && WIN64 == 0
-
 ; Code size reduction trickery: Intead of using rip-relative loads with
 ; mandatory 4-byte offsets everywhere, we can set up a base pointer with a
 ; single rip-relative lea and then address things relative from that with
@@ -373,8 +369,8 @@
     vpblendd             m0, m0, m2, 0x03
     ITX4_END              3, 0, 2, 1, 0
 
-%macro INV_TXFM_FN 5 ; type1, type2, fast_thresh, size, num_mmregs
-cglobal inv_txfm_add_%1_%2_%4, 4, 5, %5, dst, stride, c, eob, tx2
+%macro INV_TXFM_FN 4 ; type1, type2, fast_thresh, size
+cglobal inv_txfm_add_%1_%2_%4, 4, 5, 0, dst, stride, c, eob, tx2
     %undef cmp
     %define %%p1 m(i%1_%4_internal)
     lea                 rax, [o_base]
@@ -396,7 +392,7 @@
 %endmacro
 
 %macro INV_TXFM_4X4_FN 2-3 -1 ; type1, type2, fast_thresh
-    INV_TXFM_FN          %1, %2, %3, 4x4, 6
+    INV_TXFM_FN          %1, %2, %3, 4x4
 %ifidn %1_%2, dct_identity
     vpbroadcastd         m0, [o(pw_2896x8)]
     pmulhrsw             m0, [cq]
@@ -500,7 +496,7 @@
 INV_TXFM_4X4_FN dct, flipadst, 0
 INV_TXFM_4X4_FN dct, identity, 3
 
-cglobal idct_4x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal idct_4x4_internal, 0, 5, 6, dst, stride, c, eob, tx2
     mova                 m0, [cq+16*0]
     mova                 m1, [cq+16*1]
     IDCT4_1D_PACKED
@@ -522,7 +518,7 @@
 INV_TXFM_4X4_FN adst, flipadst, 0
 INV_TXFM_4X4_FN adst, identity
 
-cglobal iadst_4x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iadst_4x4_internal, 0, 5, 6, dst, stride, c, eob, tx2
     mova                 m0, [cq+16*0]
     mova                 m1, [cq+16*1]
     call .main
@@ -550,7 +546,7 @@
 INV_TXFM_4X4_FN flipadst, flipadst, 0
 INV_TXFM_4X4_FN flipadst, identity
 
-cglobal iflipadst_4x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iflipadst_4x4_internal, 0, 5, 6, dst, stride, c, eob, tx2
     mova                 m0, [cq+16*0]
     mova                 m1, [cq+16*1]
     call m(iadst_4x4_internal).main
@@ -574,7 +570,7 @@
 INV_TXFM_4X4_FN identity, flipadst
 INV_TXFM_4X4_FN identity, identity
 
-cglobal iidentity_4x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iidentity_4x4_internal, 0, 5, 6, dst, stride, c, eob, tx2
     mova                 m0, [cq+16*0]
     mova                 m1, [cq+16*1]
     vpbroadcastd         m2, [o(pw_5793x4)]
@@ -621,7 +617,7 @@
 %endmacro
 
 %macro INV_TXFM_4X8_FN 2-3 -1 ; type1, type2, fast_thresh
-    INV_TXFM_FN          %1, %2, %3, 4x8, 7
+    INV_TXFM_FN          %1, %2, %3, 4x8
 %if %3 >= 0
 %ifidn %1_%2, dct_identity
     vpbroadcastd        xm0, [o(pw_2896x8)]
@@ -753,7 +749,7 @@
 INV_TXFM_4X8_FN dct, adst
 INV_TXFM_4X8_FN dct, flipadst
 
-cglobal idct_4x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal idct_4x8_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpermq               m0, [cq+32*0], q3120
     vpermq               m1, [cq+32*1], q3120
     vpbroadcastd         m5, [o(pw_2896x8)]
@@ -785,7 +781,7 @@
 INV_TXFM_4X8_FN adst, flipadst
 INV_TXFM_4X8_FN adst, identity
 
-cglobal iadst_4x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iadst_4x8_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpermq               m0, [cq+32*0], q3120
     vpermq               m1, [cq+32*1], q3120
     vpbroadcastd         m2, [o(pw_2896x8)]
@@ -813,6 +809,7 @@
 .end2:
     pmulhrsw             m0, m4
     pmulhrsw             m1, m4
+    WIN64_RESTORE_XMM
 .end3:
     pxor                 m2, m2
     mova          [cq+32*0], m2
@@ -832,7 +829,7 @@
 INV_TXFM_4X8_FN flipadst, flipadst
 INV_TXFM_4X8_FN flipadst, identity
 
-cglobal iflipadst_4x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iflipadst_4x8_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpermq               m0, [cq+32*0], q3120
     vpermq               m1, [cq+32*1], q3120
     vpbroadcastd         m2, [o(pw_2896x8)]
@@ -864,7 +861,7 @@
 INV_TXFM_4X8_FN identity, flipadst
 INV_TXFM_4X8_FN identity, identity
 
-cglobal iidentity_4x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iidentity_4x8_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpermq               m2, [cq+32*0], q3120
     vpermq               m0, [cq+32*1], q3120
     vpbroadcastd         m3, [o(pw_2896x8)]
@@ -885,7 +882,7 @@
     jmp m(iadst_4x8_internal).end2
 
 %macro INV_TXFM_4X16_FN 2-3 -1 ; type1, type2, fast_thresh
-    INV_TXFM_FN          %1, %2, %3, 4x16, 11
+    INV_TXFM_FN          %1, %2, %3, 4x16
 %if %3 >= 0
 %ifidn %1_%2, dct_identity
     vpbroadcastd         m0, [o(pw_2896x8)]
@@ -1040,7 +1037,7 @@
 INV_TXFM_4X16_FN dct, adst
 INV_TXFM_4X16_FN dct, flipadst
 
-cglobal idct_4x16_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal idct_4x16_internal, 0, 5, 11, dst, stride, c, eob, tx2
     mova                 m0, [cq+32*0]
     mova                 m1, [cq+32*1]
     mova                 m2, [cq+32*2]
@@ -1081,7 +1078,7 @@
 INV_TXFM_4X16_FN adst, flipadst
 INV_TXFM_4X16_FN adst, identity
 
-cglobal iadst_4x16_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iadst_4x16_internal, 0, 5, 11, dst, stride, c, eob, tx2
     mova                 m0, [cq+32*0]
     mova                 m1, [cq+32*1]
     mova                 m2, [cq+32*2]
@@ -1115,6 +1112,7 @@
     vpblendd             m5, m5, m6, 0xcc
 .end2:
     REPX   {pmulhrsw x, m5}, m0, m1, m2, m3
+    WIN64_RESTORE_XMM
 .end3:
     pxor                 m4, m4
     mova          [cq+32*0], m4
@@ -1195,7 +1193,7 @@
 INV_TXFM_4X16_FN flipadst, flipadst
 INV_TXFM_4X16_FN flipadst, identity
 
-cglobal iflipadst_4x16_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iflipadst_4x16_internal, 0, 5, 11, dst, stride, c, eob, tx2
     mova                 m0, [cq+32*0]
     mova                 m1, [cq+32*1]
     mova                 m2, [cq+32*2]
@@ -1232,7 +1230,7 @@
 INV_TXFM_4X16_FN identity, flipadst
 INV_TXFM_4X16_FN identity, identity
 
-cglobal iidentity_4x16_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iidentity_4x16_internal, 0, 5, 11, dst, stride, c, eob, tx2
     mova                 m3, [cq+32*0]
     mova                 m2, [cq+32*1]
     mova                 m4, [cq+32*2]
@@ -1284,7 +1282,7 @@
 %endmacro
 
 %macro INV_TXFM_8X4_FN 2-3 -1 ; type1, type2, fast_thresh
-    INV_TXFM_FN          %1, %2, %3, 8x4, 7
+    INV_TXFM_FN          %1, %2, %3, 8x4
 %if %3 >= 0
 %ifidn %1_%2, dct_identity
     vpbroadcastd        xm0, [o(pw_2896x8)]
@@ -1347,7 +1345,7 @@
 INV_TXFM_8X4_FN dct, flipadst, 0
 INV_TXFM_8X4_FN dct, identity, 3
 
-cglobal idct_8x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal idct_8x4_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpbroadcastd        xm3, [o(pw_2896x8)]
     pmulhrsw            xm0, xm3, [cq+16*0]
     pmulhrsw            xm1, xm3, [cq+16*1]
@@ -1373,7 +1371,7 @@
 INV_TXFM_8X4_FN adst, flipadst
 INV_TXFM_8X4_FN adst, identity
 
-cglobal iadst_8x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iadst_8x4_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpbroadcastd        xm0, [o(pw_2896x8)]
     pshufd              xm4,      [cq+16*0], q1032
     pmulhrsw            xm3, xm0, [cq+16*3]
@@ -1401,6 +1399,7 @@
     vpbroadcastd         m2, [o(pw_2048)]
     pmulhrsw             m0, m2
     pmulhrsw             m1, m2
+    WIN64_RESTORE_XMM
 .end3:
     pxor                 m2, m2
     mova          [cq+32*0], m2
@@ -1418,7 +1417,7 @@
 INV_TXFM_8X4_FN flipadst, flipadst
 INV_TXFM_8X4_FN flipadst, identity
 
-cglobal iflipadst_8x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iflipadst_8x4_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpbroadcastd        xm0, [o(pw_2896x8)]
     pshufd              xm4,      [cq+16*0], q1032
     pmulhrsw            xm3, xm0, [cq+16*3]
@@ -1448,7 +1447,7 @@
 INV_TXFM_8X4_FN identity, flipadst
 INV_TXFM_8X4_FN identity, identity
 
-cglobal iidentity_8x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iidentity_8x4_internal, 0, 5, 7, dst, stride, c, eob, tx2
     mova                xm2,     [cq+16*0]
     mova                xm0,     [cq+16*1]
     vinserti128          m2, m2, [cq+16*2], 1
@@ -1472,7 +1471,7 @@
     jmp m(iadst_8x4_internal).end
 
 %macro INV_TXFM_8X8_FN 2-3 -1 ; type1, type2, fast_thresh
-    INV_TXFM_FN          %1, %2, %3, 8x8, 7
+    INV_TXFM_FN          %1, %2, %3, 8x8
 %ifidn %1_%2, dct_identity
     vpbroadcastd        xm0, [o(pw_2896x8)]
     pmulhrsw            xm0, [cq]
@@ -1537,7 +1536,7 @@
 INV_TXFM_8X8_FN dct, adst
 INV_TXFM_8X8_FN dct, flipadst
 
-cglobal idct_8x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal idct_8x8_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpermq               m0, [cq+32*0], q3120 ; 0 1
     vpermq               m3, [cq+32*3], q3120 ; 6 7
     vpermq               m2, [cq+32*2], q3120 ; 4 5
@@ -1574,7 +1573,7 @@
 INV_TXFM_8X8_FN adst, flipadst
 INV_TXFM_8X8_FN adst, identity
 
-cglobal iadst_8x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iadst_8x8_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpermq               m4, [cq+32*0], q1302 ; 1 0
     vpermq               m3, [cq+32*3], q3120 ; 6 7
     vpermq               m5, [cq+32*1], q1302 ; 3 2
@@ -1615,6 +1614,7 @@
 .end3:
     pmulhrsw             m2, m4
     pmulhrsw             m3, m4
+    WIN64_RESTORE_XMM
 .end4:
     pxor                 m4, m4
     mova          [cq+32*0], m4
@@ -1636,7 +1636,7 @@
 INV_TXFM_8X8_FN flipadst, flipadst
 INV_TXFM_8X8_FN flipadst, identity
 
-cglobal iflipadst_8x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iflipadst_8x8_internal, 0, 5, 7, dst, stride, c, eob, tx2
     vpermq               m4, [cq+32*0], q1302 ; 1 0
     vpermq               m3, [cq+32*3], q3120 ; 6 7
     vpermq               m5, [cq+32*1], q1302 ; 3 2
@@ -1682,7 +1682,7 @@
 INV_TXFM_8X8_FN identity, flipadst
 INV_TXFM_8X8_FN identity, identity
 
-cglobal iidentity_8x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iidentity_8x8_internal, 0, 5, 7, dst, stride, c, eob, tx2
     mova                xm3,     [cq+16*0]
     mova                xm2,     [cq+16*1]
     vinserti128          m3, m3, [cq+16*4], 1
@@ -1705,7 +1705,7 @@
     jmp m(iadst_8x8_internal).end
 
 %macro INV_TXFM_8X16_FN 2-3 -1 ; type1, type2, fast_thresh
-    INV_TXFM_FN          %1, %2, %3, 8x16, 13
+    INV_TXFM_FN          %1, %2, %3, 8x16
 %ifidn %1_%2, dct_dct
     movd                xm1, [o(pw_2896x8)]
     pmulhrsw            xm0, xm1, [cq]
@@ -1720,6 +1720,7 @@
     mov                 r2d, 4
     jmp m(inv_txfm_add_dct_dct_8x8).end2
 %elifidn %1_%2, dct_identity
+    WIN64_SPILL_XMM      13
     vpbroadcastd         m0, [o(pw_2896x8)]
     pmulhrsw             m7, m0, [cq]
     vpbroadcastd         m1, [o(pw_16384)]
@@ -1798,7 +1799,7 @@
 INV_TXFM_8X16_FN dct, adst
 INV_TXFM_8X16_FN dct, flipadst
 
-cglobal idct_8x16_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal idct_8x16_internal, 0, 5, 13, dst, stride, c, eob, tx2
     ITX_8X16_LOAD_COEFS
     call m(idct_16x8_internal).main
     vpbroadcastd        m10, [o(pw_16384)]
@@ -1861,7 +1862,7 @@
 INV_TXFM_8X16_FN adst, flipadst
 INV_TXFM_8X16_FN adst, identity
 
-cglobal iadst_8x16_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iadst_8x16_internal, 0, 5, 13, dst, stride, c, eob, tx2
     ITX_8X16_LOAD_COEFS
     call m(iadst_16x8_internal).main
     vpbroadcastd        m10, [o(pw_16384)]
@@ -1966,7 +1967,7 @@
 INV_TXFM_8X16_FN flipadst, flipadst
 INV_TXFM_8X16_FN flipadst, identity
 
-cglobal iflipadst_8x16_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iflipadst_8x16_internal, 0, 5, 13, dst, stride, c, eob, tx2
     ITX_8X16_LOAD_COEFS
     call m(iadst_16x8_internal).main
     vpbroadcastd         m9, [o(pw_16384)]
@@ -2013,7 +2014,7 @@
 INV_TXFM_8X16_FN identity, flipadst
 INV_TXFM_8X16_FN identity, identity
 
-cglobal iidentity_8x16_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iidentity_8x16_internal, 0, 5, 13, dst, stride, c, eob, tx2
     mova                xm3,     [cq+16*0]
     mova                xm2,     [cq+16*2]
     add                  cq, 16*8
@@ -2077,7 +2078,7 @@
 %endmacro
 
 %macro INV_TXFM_16X4_FN 2-3 -1 ; type1, type2, fast_thresh
-    INV_TXFM_FN          %1, %2, %3, 16x4, 11
+    INV_TXFM_FN          %1, %2, %3, 16x4
 %if %3 >= 0
 %ifidn %1_%2, dct_identity
     vpbroadcastd        xm3, [o(pw_2896x8)]
@@ -2188,7 +2189,7 @@
 INV_TXFM_16X4_FN dct, flipadst, 0
 INV_TXFM_16X4_FN dct, identity, 3
 
-cglobal idct_16x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal idct_16x4_internal, 0, 5, 11, dst, stride, c, eob, tx2
     mova                xm0, [cq+16*0]
     mova                xm1, [cq+16*1]
     mova                xm2, [cq+16*2]
@@ -2223,7 +2224,7 @@
 INV_TXFM_16X4_FN adst, flipadst
 INV_TXFM_16X4_FN adst, identity
 
-cglobal iadst_16x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iadst_16x4_internal, 0, 5, 11, dst, stride, c, eob, tx2
     vpermq               m0, [cq+32*0], q1230
     vpermq               m3, [cq+32*3], q2103
     vpermq               m1, [cq+32*1], q1230
@@ -2259,6 +2260,7 @@
 .end:
     vpbroadcastd         m4, [o(pw_2048)]
     REPX   {pmulhrsw x, m4}, m0, m1, m2, m3
+    WIN64_RESTORE_XMM
 .end2:
     pxor                 m4, m4
     mova          [cq+32*0], m4
@@ -2319,7 +2321,7 @@
 INV_TXFM_16X4_FN flipadst, flipadst
 INV_TXFM_16X4_FN flipadst, identity
 
-cglobal iflipadst_16x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iflipadst_16x4_internal, 0, 5, 11, dst, stride, c, eob, tx2
     vpermq               m0, [cq+32*0], q1230
     vpermq               m3, [cq+32*3], q2103
     vpermq               m1, [cq+32*1], q1230
@@ -2357,7 +2359,7 @@
 INV_TXFM_16X4_FN identity, flipadst
 INV_TXFM_16X4_FN identity, identity
 
-cglobal iidentity_16x4_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iidentity_16x4_internal, 0, 5, 11, dst, stride, c, eob, tx2
     mova                xm2,     [cq+16*0]
     mova                xm4,     [cq+16*1]
     vinserti128          m2, m2, [cq+16*4], 1
@@ -2391,7 +2393,7 @@
     jmp m(iadst_16x4_internal).end
 
 %macro INV_TXFM_16X8_FN 2-3 -1 ; type1, type2, fast_thresh
-    INV_TXFM_FN          %1, %2, %3, 16x8, 13
+    INV_TXFM_FN          %1, %2, %3, 16x8
 %ifidn %1_%2, dct_dct
     movd                xm1, [o(pw_2896x8)]
     pmulhrsw            xm0, xm1, [cq]
@@ -2401,6 +2403,7 @@
     mov                 r2d, 4
     jmp m(inv_txfm_add_dct_dct_16x4).dconly
 %elifidn %1_%2, dct_identity
+    WIN64_SPILL_XMM      13
     vbroadcasti128       m7, [cq]
     vpbroadcastd         m0, [o(pw_2896x8)]
     vpbroadcastd         m1, [o(pw_16384)]
@@ -2474,7 +2477,7 @@
 INV_TXFM_16X8_FN dct, adst
 INV_TXFM_16X8_FN dct, flipadst
 
-cglobal idct_16x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal idct_16x8_internal, 0, 5, 13, dst, stride, c, eob, tx2
     ITX_16X8_LOAD_COEFS 3120
     call m(idct_8x16_internal).main
     vpbroadcastd        m10, [o(pw_16384)]
@@ -2544,7 +2547,7 @@
 INV_TXFM_16X8_FN adst, flipadst
 INV_TXFM_16X8_FN adst, identity
 
-cglobal iadst_16x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iadst_16x8_internal, 0, 5, 13, dst, stride, c, eob, tx2
     ITX_16X8_LOAD_COEFS 1302
     call m(iadst_8x16_internal).main2
     vpbroadcastd        m10, [o(pw_16384)]
@@ -2608,7 +2611,7 @@
 INV_TXFM_16X8_FN flipadst, flipadst
 INV_TXFM_16X8_FN flipadst, identity
 
-cglobal iflipadst_16x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iflipadst_16x8_internal, 0, 5, 13, dst, stride, c, eob, tx2
     ITX_16X8_LOAD_COEFS 1302
     call m(iadst_8x16_internal).main2
     vpbroadcastd        m10, [o(pw_16384)]
@@ -2671,7 +2674,7 @@
 INV_TXFM_16X8_FN identity, flipadst
 INV_TXFM_16X8_FN identity, identity
 
-cglobal iidentity_16x8_internal, 0, 0, 0, dst, stride, c, eob, tx2
+cglobal iidentity_16x8_internal, 0, 5, 13, dst, stride, c, eob, tx2
     mova                xm7,     [cq+16*0]
     mova                xm2,     [cq+16*1]
     add                  cq, 16*8
@@ -2728,7 +2731,7 @@
 %define o_base pw_5 + 128
 
 %macro INV_TXFM_16X16_FN 2-3 -1 ; type1, type2, fast_thresh
-    INV_TXFM_FN          %1, %2, %3, 16x16, 16
+    INV_TXFM_FN          %1, %2, %3, 16x16
 %ifidn %1_%2, dct_dct
     movd                xm1, [o(pw_2896x8)]
     pmulhrsw            xm0, xm1, [cq]
@@ -2737,6 +2740,7 @@
     mov                 r2d, 8
     jmp m(inv_txfm_add_dct_dct_16x4).dconly
 %elifidn %1_%2, dct_identity
+    WIN64_SPILL_XMM       7
     vpbroadcastd         m3, [o(pw_2896x8)]
     pmulhrsw             m3, [cq]
     vpbroadcastd         m0, [o(pw_8192)]
@@ -2832,7 +2836,7 @@
 INV_TXFM_16X16_FN dct, adst
 INV_TXFM_16X16_FN dct, flipadst
 
-cglobal idct_16x16_internal, 0, 0, 0, 32*3, dst, stride, c, eob, tx2
+cglobal idct_16x16_internal, 0, 5, 16, 32*3, dst, stride, c, eob, tx2
     ITX_16X16_LOAD_COEFS
     call .main
 .pass1_end:
@@ -2977,7 +2981,7 @@
 INV_TXFM_16X16_FN adst, adst
 INV_TXFM_16X16_FN adst, flipadst
 
-cglobal iadst_16x16_internal, 0, 0, 0, 32*3, dst, stride, c, eob, tx2
+cglobal iadst_16x16_internal, 0, 5, 16, 32*3, dst, stride, c, eob, tx2
     ITX_16X16_LOAD_COEFS
     call .main
     vpbroadcastd         m1, [o(pw_8192)]
@@ -3091,7 +3095,7 @@
 INV_TXFM_16X16_FN flipadst, adst
 INV_TXFM_16X16_FN flipadst, flipadst
 
-cglobal iflipadst_16x16_internal, 0, 0, 0, 32*3, dst, stride, c, eob, tx2
+cglobal iflipadst_16x16_internal, 0, 5, 16, 32*3, dst, stride, c, eob, tx2
     ITX_16X16_LOAD_COEFS
     call m(iadst_16x16_internal).main
     vpbroadcastd         m1, [o(pw_8192)]
@@ -3163,7 +3167,7 @@
 INV_TXFM_16X16_FN identity, dct,      15
 INV_TXFM_16X16_FN identity, identity
 
-cglobal iidentity_16x16_internal, 0, 0, 0, 32*3, dst, stride, c, eob, tx2
+cglobal iidentity_16x16_internal, 0, 5, 16, 32*3, dst, stride, c, eob, tx2
     mova                xm0,      [cq+16*0]
     mova               xm15,      [cq+16*1]
     mova                xm1,      [cq+16*2]
@@ -3277,7 +3281,7 @@
     lea                 rax, [o_base]
     test               eobd, eobd
     jz .dconly
-    PROLOGUE              0, 0, 16, 32*3, dst, stride, c, eob
+    PROLOGUE              0, 4, 16, 32*3, dst, stride, c, eob
     %undef cmp
     cmp                eobd, 106
     jle .fast
@@ -3575,7 +3579,7 @@
     jg .dconly_loop
     RET
 .normal:
-    PROLOGUE              0, 0, 16, 32*3, dst, stride, c, eob
+    PROLOGUE              0, 4, 16, 32*3, dst, stride, c, eob
     %undef cmp
     LOAD_PACKED_16X2      0,  7,  0,  2 ; in0  in2
     LOAD_PACKED_16X2      4,  7,  1,  3 ; in1  in3
@@ -3882,11 +3886,11 @@
     vextracti128    [r2+%7], m%3, 1
 %endmacro
 
-cglobal inv_txfm_add_dct_dct_16x32, 4, 8, 0, dst, stride, c, eob
+cglobal inv_txfm_add_dct_dct_16x32, 4, 4, 0, dst, stride, c, eob
     lea                 rax, [o_base]
     test               eobd, eobd
     jz .dconly
-    PROLOGUE              0, 0, 16, 32*35, dst, stride, c, eob, tmp1, tmp2, \
+    PROLOGUE              0, 8, 16, 32*35, dst, stride, c, eob, tmp1, tmp2, \
                                            base, tmp3
     %undef cmp
     LOAD_16ROWS          cq, 64, 1
@@ -4250,7 +4254,7 @@
     vinserti128         m%1, m%1, xm%4, 1
 %endmacro
 
-cglobal inv_txfm_add_dct_dct_32x16, 4, 6, 0, dst, stride, c, eob
+cglobal inv_txfm_add_dct_dct_32x16, 4, 4, 0, dst, stride, c, eob
     lea                 rax, [o_base]
     test               eobd, eobd
     jnz .normal
@@ -4262,7 +4266,7 @@
     mov                 r2d, 16
     jmp m(inv_txfm_add_dct_dct_32x8).dconly
 .normal:
-    PROLOGUE              0, 0, 16, 32*19, dst, stride, c, eob, tmp1, tmp2
+    PROLOGUE              0, 6, 16, 32*19, dst, stride, c, eob, tmp1, tmp2
     vpbroadcastd        m15, [o(pw_2896x8)]
     pmulhrsw             m0, m15, [cq+32* 1]
     pmulhrsw             m1, m15, [cq+32* 3]
--- a/src/x86/itx_init.c
+++ b/src/x86/itx_init.c
@@ -117,7 +117,7 @@
 
     if (!(flags & DAV1D_X86_CPU_FLAG_AVX2)) return;
 
-#if BITDEPTH == 8 && ARCH_X86_64 && !defined(_WIN32) // FIXME: Windows
+#if BITDEPTH == 8 && ARCH_X86_64
     assign_itx17_fn( ,  4,  4, avx2);
     assign_itx16_fn(R,  4,  8, avx2);
     assign_itx16_fn(R,  4, 16, avx2);