sha/asm/*-x86_64.pl: add CFI annotations.
authorAndy Polyakov <appro@openssl.org>
Mon, 13 Feb 2017 21:34:51 +0000 (22:34 +0100)
committerAndy Polyakov <appro@openssl.org>
Wed, 15 Feb 2017 14:43:05 +0000 (15:43 +0100)
Reviewed-by: Rich Salz <rsalz@openssl.org>
crypto/sha/asm/sha1-mb-x86_64.pl
crypto/sha/asm/sha256-mb-x86_64.pl
crypto/sha/asm/sha512-x86_64.pl

index 2f6b35f..56e1529 100644 (file)
@@ -363,6 +363,7 @@ $code.=<<___;
 .type  sha1_multi_block,\@function,3
 .align 32
 sha1_multi_block:
+.cfi_startproc
        mov     OPENSSL_ia32cap_P+4(%rip),%rcx
        bt      \$61,%rcx                       # check SHA bit
        jc      _shaext_shortcut
@@ -373,8 +374,11 @@ $code.=<<___ if ($avx);
 ___
 $code.=<<___;
        mov     %rsp,%rax
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbx
 ___
 $code.=<<___ if ($win64);
        lea     -0xa8(%rsp),%rsp
@@ -393,6 +397,7 @@ $code.=<<___;
        sub     \$`$REG_SZ*18`,%rsp
        and     \$-256,%rsp
        mov     %rax,`$REG_SZ*17`(%rsp)         # original %rsp
+.cfi_cfa_expression    %rsp+`$REG_SZ*17`,deref,+8
 .Lbody:
        lea     K_XX_XX(%rip),$Tbl
        lea     `$REG_SZ*16`(%rsp),%rbx
@@ -487,6 +492,7 @@ $code.=<<___;
 
 .Ldone:
        mov     `$REG_SZ*17`(%rsp),%rax         # original %rsp
+.cfi_def_cfa   %rax,8
 ___
 $code.=<<___ if ($win64);
        movaps  -0xb8(%rax),%xmm6
@@ -502,10 +508,14 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        mov     -16(%rax),%rbp
+.cfi_restore   %rbp
        mov     -8(%rax),%rbx
+.cfi_restore   %rbx
        lea     (%rax),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue:
        ret
+.cfi_endproc
 .size  sha1_multi_block,.-sha1_multi_block
 ___
                                                {{{
@@ -517,10 +527,14 @@ $code.=<<___;
 .type  sha1_multi_block_shaext,\@function,3
 .align 32
 sha1_multi_block_shaext:
+.cfi_startproc
 _shaext_shortcut:
        mov     %rsp,%rax
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
 ___
 $code.=<<___ if ($win64);
        lea     -0xa8(%rsp),%rsp
@@ -756,10 +770,14 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        mov     -16(%rax),%rbp
+.cfi_restore   %rbp
        mov     -8(%rax),%rbx
+.cfi_restore   %rbx
        lea     (%rax),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_shaext:
        ret
+.cfi_endproc
 .size  sha1_multi_block_shaext,.-sha1_multi_block_shaext
 ___
                                                }}}
@@ -1002,6 +1020,7 @@ $code.=<<___;
 .type  sha1_multi_block_avx,\@function,3
 .align 32
 sha1_multi_block_avx:
+.cfi_startproc
 _avx_shortcut:
 ___
 $code.=<<___ if ($avx>1);
@@ -1016,8 +1035,11 @@ $code.=<<___ if ($avx>1);
 ___
 $code.=<<___;
        mov     %rsp,%rax
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
 ___
 $code.=<<___ if ($win64);
        lea     -0xa8(%rsp),%rsp
@@ -1036,6 +1058,7 @@ $code.=<<___;
        sub     \$`$REG_SZ*18`, %rsp
        and     \$-256,%rsp
        mov     %rax,`$REG_SZ*17`(%rsp)         # original %rsp
+.cfi_cfa_expression    %rsp+`$REG_SZ*17`,deref,+8
 .Lbody_avx:
        lea     K_XX_XX(%rip),$Tbl
        lea     `$REG_SZ*16`(%rsp),%rbx
@@ -1125,6 +1148,7 @@ $code.=<<___;
 
 .Ldone_avx:
        mov     `$REG_SZ*17`(%rsp),%rax         # original %rsp
+.cfi_def_cfa   %rax,8
        vzeroupper
 ___
 $code.=<<___ if ($win64);
@@ -1141,10 +1165,14 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        mov     -16(%rax),%rbp
+.cfi_restore   %rbp
        mov     -8(%rax),%rbx
+.cfi_restore   %rbx
        lea     (%rax),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_avx:
        ret
+.cfi_endproc
 .size  sha1_multi_block_avx,.-sha1_multi_block_avx
 ___
 
@@ -1164,14 +1192,22 @@ $code.=<<___;
 .type  sha1_multi_block_avx2,\@function,3
 .align 32
 sha1_multi_block_avx2:
+.cfi_startproc
 _avx2_shortcut:
        mov     %rsp,%rax
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
        push    %r12
+.cfi_push      %r12
        push    %r13
+.cfi_push      %r13
        push    %r14
+.cfi_push      %r14
        push    %r15
+.cfi_push      %r15
 ___
 $code.=<<___ if ($win64);
        lea     -0xa8(%rsp),%rsp
@@ -1190,6 +1226,7 @@ $code.=<<___;
        sub     \$`$REG_SZ*18`, %rsp
        and     \$-256,%rsp
        mov     %rax,`$REG_SZ*17`(%rsp)         # original %rsp
+.cfi_cfa_expression    %rsp+`$REG_SZ*17`,deref,+8
 .Lbody_avx2:
        lea     K_XX_XX(%rip),$Tbl
        shr     \$1,$num
@@ -1280,6 +1317,7 @@ $code.=<<___;
 
 .Ldone_avx2:
        mov     `$REG_SZ*17`(%rsp),%rax         # original %rsp
+.cfi_def_cfa   %rax,8
        vzeroupper
 ___
 $code.=<<___ if ($win64);
@@ -1296,14 +1334,22 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        mov     -48(%rax),%r15
+.cfi_restore   %r15
        mov     -40(%rax),%r14
+.cfi_restore   %r14
        mov     -32(%rax),%r13
+.cfi_restore   %r13
        mov     -24(%rax),%r12
+.cfi_restore   %r12
        mov     -16(%rax),%rbp
+.cfi_restore   %rbp
        mov     -8(%rax),%rbx
+.cfi_restore   %rbx
        lea     (%rax),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_avx2:
        ret
+.cfi_endproc
 .size  sha1_multi_block_avx2,.-sha1_multi_block_avx2
 ___
                                                }       }}}
index b8a77c7..24276f9 100644 (file)
@@ -244,6 +244,7 @@ $code.=<<___;
 .type  sha256_multi_block,\@function,3
 .align 32
 sha256_multi_block:
+.cfi_startproc
        mov     OPENSSL_ia32cap_P+4(%rip),%rcx
        bt      \$61,%rcx                       # check SHA bit
        jc      _shaext_shortcut
@@ -254,8 +255,11 @@ $code.=<<___ if ($avx);
 ___
 $code.=<<___;
        mov     %rsp,%rax
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
 ___
 $code.=<<___ if ($win64);
        lea     -0xa8(%rsp),%rsp
@@ -274,6 +278,7 @@ $code.=<<___;
        sub     \$`$REG_SZ*18`, %rsp
        and     \$-256,%rsp
        mov     %rax,`$REG_SZ*17`(%rsp)         # original %rsp
+.cfi_cfa_expression    %rsp+`$REG_SZ*17`,deref,+8
 .Lbody:
        lea     K256+128(%rip),$Tbl
        lea     `$REG_SZ*16`(%rsp),%rbx
@@ -391,6 +396,7 @@ $code.=<<___;
 
 .Ldone:
        mov     `$REG_SZ*17`(%rsp),%rax         # original %rsp
+.cfi_def_cfa   %rax,8
 ___
 $code.=<<___ if ($win64);
        movaps  -0xb8(%rax),%xmm6
@@ -406,10 +412,14 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        mov     -16(%rax),%rbp
+.cfi_restore   %rbp
        mov     -8(%rax),%rbx
+.cfi_restore   %rbx
        lea     (%rax),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue:
        ret
+.cfi_endproc
 .size  sha256_multi_block,.-sha256_multi_block
 ___
                                                {{{
@@ -421,10 +431,14 @@ $code.=<<___;
 .type  sha256_multi_block_shaext,\@function,3
 .align 32
 sha256_multi_block_shaext:
+.cfi_startproc
 _shaext_shortcut:
        mov     %rsp,%rax
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
 ___
 $code.=<<___ if ($win64);
        lea     -0xa8(%rsp),%rsp
@@ -758,10 +772,14 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        mov     -16(%rax),%rbp
+.cfi_restore   %rbp
        mov     -8(%rax),%rbx
+.cfi_restore   %rbx
        lea     (%rax),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_shaext:
        ret
+.cfi_endproc
 .size  sha256_multi_block_shaext,.-sha256_multi_block_shaext
 ___
                                                }}}
@@ -921,6 +939,7 @@ $code.=<<___;
 .type  sha256_multi_block_avx,\@function,3
 .align 32
 sha256_multi_block_avx:
+.cfi_startproc
 _avx_shortcut:
 ___
 $code.=<<___ if ($avx>1);
@@ -935,8 +954,11 @@ $code.=<<___ if ($avx>1);
 ___
 $code.=<<___;
        mov     %rsp,%rax
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
 ___
 $code.=<<___ if ($win64);
        lea     -0xa8(%rsp),%rsp
@@ -955,6 +977,7 @@ $code.=<<___;
        sub     \$`$REG_SZ*18`, %rsp
        and     \$-256,%rsp
        mov     %rax,`$REG_SZ*17`(%rsp)         # original %rsp
+.cfi_cfa_expression    %rsp+`$REG_SZ*17`,deref,+8
 .Lbody_avx:
        lea     K256+128(%rip),$Tbl
        lea     `$REG_SZ*16`(%rsp),%rbx
@@ -1070,6 +1093,7 @@ $code.=<<___;
 
 .Ldone_avx:
        mov     `$REG_SZ*17`(%rsp),%rax         # original %rsp
+.cfi_def_cfa   %rax,8
        vzeroupper
 ___
 $code.=<<___ if ($win64);
@@ -1086,10 +1110,14 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        mov     -16(%rax),%rbp
+.cfi_restore   %rbp
        mov     -8(%rax),%rbx
+.cfi_restore   %rbx
        lea     (%rax),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_avx:
        ret
+.cfi_endproc
 .size  sha256_multi_block_avx,.-sha256_multi_block_avx
 ___
                                                if ($avx>1) {
@@ -1105,14 +1133,22 @@ $code.=<<___;
 .type  sha256_multi_block_avx2,\@function,3
 .align 32
 sha256_multi_block_avx2:
+.cfi_startproc
 _avx2_shortcut:
        mov     %rsp,%rax
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
        push    %r12
+.cfi_push      %r12
        push    %r13
+.cfi_push      %r13
        push    %r14
+.cfi_push      %r14
        push    %r15
+.cfi_push      %r15
 ___
 $code.=<<___ if ($win64);
        lea     -0xa8(%rsp),%rsp
@@ -1131,6 +1167,7 @@ $code.=<<___;
        sub     \$`$REG_SZ*18`, %rsp
        and     \$-256,%rsp
        mov     %rax,`$REG_SZ*17`(%rsp)         # original %rsp
+.cfi_cfa_expression    %rsp+`$REG_SZ*17`,deref,+8
 .Lbody_avx2:
        lea     K256+128(%rip),$Tbl
        lea     0x80($ctx),$ctx                 # size optimization
@@ -1246,6 +1283,7 @@ $code.=<<___;
 
 .Ldone_avx2:
        mov     `$REG_SZ*17`(%rsp),%rax         # original %rsp
+.cfi_def_cfa   %rax,8
        vzeroupper
 ___
 $code.=<<___ if ($win64);
@@ -1262,14 +1300,22 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        mov     -48(%rax),%r15
+.cfi_restore   %r15
        mov     -40(%rax),%r14
+.cfi_restore   %r14
        mov     -32(%rax),%r13
+.cfi_restore   %r13
        mov     -24(%rax),%r12
+.cfi_restore   %r12
        mov     -16(%rax),%rbp
+.cfi_restore   %rbp
        mov     -8(%rax),%rbx
+.cfi_restore   %rbx
        lea     (%rax),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_avx2:
        ret
+.cfi_endproc
 .size  sha256_multi_block_avx2,.-sha256_multi_block_avx2
 ___
                                        }       }}}
index 7a8ed7c..bdf1d28 100755 (executable)
@@ -176,7 +176,7 @@ $Tbl="%rbp";
 $_ctx="16*$SZ+0*8(%rsp)";
 $_inp="16*$SZ+1*8(%rsp)";
 $_end="16*$SZ+2*8(%rsp)";
-$_rsp="16*$SZ+3*8(%rsp)";
+$_rsp="`16*$SZ+3*8`(%rsp)";
 $framesz="16*$SZ+4*8";
 
 
@@ -269,6 +269,7 @@ $code=<<___;
 .type  $func,\@function,3
 .align 16
 $func:
+.cfi_startproc
 ___
 $code.=<<___ if ($SZ==4 || $avx);
        lea     OPENSSL_ia32cap_P(%rip),%r11
@@ -302,12 +303,19 @@ $code.=<<___ if ($SZ==4);
 ___
 $code.=<<___;
        mov     %rsp,%rax               # copy %rsp
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
        push    %r12
+.cfi_push      %r12
        push    %r13
+.cfi_push      %r13
        push    %r14
+.cfi_push      %r14
        push    %r15
+.cfi_push      %r15
        shl     \$4,%rdx                # num*16
        sub     \$$framesz,%rsp
        lea     ($inp,%rdx,$SZ),%rdx    # inp+num*16*$SZ
@@ -316,6 +324,7 @@ $code.=<<___;
        mov     $inp,$_inp              # save inp, 2nd arh
        mov     %rdx,$_end              # save end pointer, "3rd" arg
        mov     %rax,$_rsp              # save copy of %rsp
+.cfi_cfa_expression    $_rsp,deref,+8
 .Lprologue:
 
        mov     $SZ*0($ctx),$A
@@ -382,15 +391,24 @@ $code.=<<___;
        jb      .Lloop
 
        mov     $_rsp,%rsi
+.cfi_def_cfa   %rsi,8
        mov     -48(%rsi),%r15
+.cfi_restore   %r15
        mov     -40(%rsi),%r14
+.cfi_restore   %r14
        mov     -32(%rsi),%r13
+.cfi_restore   %r13
        mov     -24(%rsi),%r12
+.cfi_restore   %r12
        mov     -16(%rsi),%rbp
+.cfi_restore   %rbp
        mov     -8(%rsi),%rbx
+.cfi_restore   %rbx
        lea     (%rsi),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue:
        ret
+.cfi_endproc
 .size  $func,.-$func
 ___
 
@@ -760,14 +778,22 @@ $code.=<<___;
 .type  ${func}_ssse3,\@function,3
 .align 64
 ${func}_ssse3:
+.cfi_startproc
 .Lssse3_shortcut:
        mov     %rsp,%rax               # copy %rsp
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
        push    %r12
+.cfi_push      %r12
        push    %r13
+.cfi_push      %r13
        push    %r14
+.cfi_push      %r14
        push    %r15
+.cfi_push      %r15
        shl     \$4,%rdx                # num*16
        sub     \$`$framesz+$win64*16*4`,%rsp
        lea     ($inp,%rdx,$SZ),%rdx    # inp+num*16*$SZ
@@ -776,6 +802,7 @@ ${func}_ssse3:
        mov     $inp,$_inp              # save inp, 2nd arh
        mov     %rdx,$_end              # save end pointer, "3rd" arg
        mov     %rax,$_rsp              # save copy of %rsp
+.cfi_cfa_expression    $_rsp,deref,+8
 ___
 $code.=<<___ if ($win64);
        movaps  %xmm6,16*$SZ+32(%rsp)
@@ -1074,6 +1101,7 @@ $code.=<<___;
        jb      .Lloop_ssse3
 
        mov     $_rsp,%rsi
+.cfi_def_cfa   %rsi,8
 ___
 $code.=<<___ if ($win64);
        movaps  16*$SZ+32(%rsp),%xmm6
@@ -1083,14 +1111,22 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        mov     -48(%rsi),%r15
+.cfi_restore   %r15
        mov     -40(%rsi),%r14
+.cfi_restore   %r14
        mov     -32(%rsi),%r13
+.cfi_restore   %r13
        mov     -24(%rsi),%r12
+.cfi_restore   %r12
        mov     -16(%rsi),%rbp
+.cfi_restore   %rbp
        mov     -8(%rsi),%rbx
+.cfi_restore   %rbx
        lea     (%rsi),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_ssse3:
        ret
+.cfi_endproc
 .size  ${func}_ssse3,.-${func}_ssse3
 ___
 }
@@ -1104,14 +1140,22 @@ $code.=<<___;
 .type  ${func}_xop,\@function,3
 .align 64
 ${func}_xop:
+.cfi_startproc
 .Lxop_shortcut:
        mov     %rsp,%rax               # copy %rsp
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
        push    %r12
+.cfi_push      %r12
        push    %r13
+.cfi_push      %r13
        push    %r14
+.cfi_push      %r14
        push    %r15
+.cfi_push      %r15
        shl     \$4,%rdx                # num*16
        sub     \$`$framesz+$win64*16*($SZ==4?4:6)`,%rsp
        lea     ($inp,%rdx,$SZ),%rdx    # inp+num*16*$SZ
@@ -1120,6 +1164,7 @@ ${func}_xop:
        mov     $inp,$_inp              # save inp, 2nd arh
        mov     %rdx,$_end              # save end pointer, "3rd" arg
        mov     %rax,$_rsp              # save copy of %rsp
+.cfi_cfa_expression    $_rsp,deref,+8
 ___
 $code.=<<___ if ($win64);
        movaps  %xmm6,16*$SZ+32(%rsp)
@@ -1446,6 +1491,7 @@ $code.=<<___;
        jb      .Lloop_xop
 
        mov     $_rsp,%rsi
+.cfi_def_cfa   %rsi,8
        vzeroupper
 ___
 $code.=<<___ if ($win64);
@@ -1460,14 +1506,22 @@ $code.=<<___ if ($win64 && $SZ>4);
 ___
 $code.=<<___;
        mov     -48(%rsi),%r15
+.cfi_restore   %r15
        mov     -40(%rsi),%r14
+.cfi_restore   %r14
        mov     -32(%rsi),%r13
+.cfi_restore   %r13
        mov     -24(%rsi),%r12
+.cfi_restore   %r12
        mov     -16(%rsi),%rbp
+.cfi_restore   %rbp
        mov     -8(%rsi),%rbx
+.cfi_restore   %rbx
        lea     (%rsi),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_xop:
        ret
+.cfi_endproc
 .size  ${func}_xop,.-${func}_xop
 ___
 }
@@ -1480,14 +1534,22 @@ $code.=<<___;
 .type  ${func}_avx,\@function,3
 .align 64
 ${func}_avx:
+.cfi_startproc
 .Lavx_shortcut:
        mov     %rsp,%rax               # copy %rsp
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
        push    %r12
+.cfi_push      %r12
        push    %r13
+.cfi_push      %r13
        push    %r14
+.cfi_push      %r14
        push    %r15
+.cfi_push      %r15
        shl     \$4,%rdx                # num*16
        sub     \$`$framesz+$win64*16*($SZ==4?4:6)`,%rsp
        lea     ($inp,%rdx,$SZ),%rdx    # inp+num*16*$SZ
@@ -1496,6 +1558,7 @@ ${func}_avx:
        mov     $inp,$_inp              # save inp, 2nd arh
        mov     %rdx,$_end              # save end pointer, "3rd" arg
        mov     %rax,$_rsp              # save copy of %rsp
+.cfi_cfa_expression    $_rsp,deref,+8
 ___
 $code.=<<___ if ($win64);
        movaps  %xmm6,16*$SZ+32(%rsp)
@@ -1754,6 +1817,7 @@ $code.=<<___;
        jb      .Lloop_avx
 
        mov     $_rsp,%rsi
+.cfi_def_cfa   %rsi,8
        vzeroupper
 ___
 $code.=<<___ if ($win64);
@@ -1768,14 +1832,22 @@ $code.=<<___ if ($win64 && $SZ>4);
 ___
 $code.=<<___;
        mov     -48(%rsi),%r15
+.cfi_restore   %r15
        mov     -40(%rsi),%r14
+.cfi_restore   %r14
        mov     -32(%rsi),%r13
+.cfi_restore   %r13
        mov     -24(%rsi),%r12
+.cfi_restore   %r12
        mov     -16(%rsi),%rbp
+.cfi_restore   %rbp
        mov     -8(%rsi),%rbx
+.cfi_restore   %rbx
        lea     (%rsi),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_avx:
        ret
+.cfi_endproc
 .size  ${func}_avx,.-${func}_avx
 ___
 
@@ -1831,14 +1903,22 @@ $code.=<<___;
 .type  ${func}_avx2,\@function,3
 .align 64
 ${func}_avx2:
+.cfi_startproc
 .Lavx2_shortcut:
        mov     %rsp,%rax               # copy %rsp
+.cfi_def_cfa_register  %rax
        push    %rbx
+.cfi_push      %rbx
        push    %rbp
+.cfi_push      %rbp
        push    %r12
+.cfi_push      %r12
        push    %r13
+.cfi_push      %r13
        push    %r14
+.cfi_push      %r14
        push    %r15
+.cfi_push      %r15
        sub     \$`2*$SZ*$rounds+4*8+$win64*16*($SZ==4?4:6)`,%rsp
        shl     \$4,%rdx                # num*16
        and     \$-256*$SZ,%rsp         # align stack frame
@@ -1848,6 +1928,7 @@ ${func}_avx2:
        mov     $inp,$_inp              # save inp, 2nd arh
        mov     %rdx,$_end              # save end pointer, "3rd" arg
        mov     %rax,$_rsp              # save copy of %rsp
+.cfi_cfa_expression    $_rsp,deref,+8
 ___
 $code.=<<___ if ($win64);
        movaps  %xmm6,16*$SZ+32(%rsp)
@@ -2128,6 +2209,7 @@ $code.=<<___;
 .Ldone_avx2:
        lea     ($Tbl),%rsp
        mov     $_rsp,%rsi
+.cfi_def_cfa   %rsi,8
        vzeroupper
 ___
 $code.=<<___ if ($win64);
@@ -2142,14 +2224,22 @@ $code.=<<___ if ($win64 && $SZ>4);
 ___
 $code.=<<___;
        mov     -48(%rsi),%r15
+.cfi_restore   %r15
        mov     -40(%rsi),%r14
+.cfi_restore   %r14
        mov     -32(%rsi),%r13
+.cfi_restore   %r13
        mov     -24(%rsi),%r12
+.cfi_restore   %r12
        mov     -16(%rsi),%rbp
+.cfi_restore   %rbp
        mov     -8(%rsi),%rbx
+.cfi_restore   %rbx
        lea     (%rsi),%rsp
+.cfi_def_cfa_register  %rsp
 .Lepilogue_avx2:
        ret
+.cfi_endproc
 .size  ${func}_avx2,.-${func}_avx2
 ___
 }}