]> git.sesse.net Git - ffmpeg/blobdiff - libswresample/x86/resample.asm
Merge commit '85b8403c6fd11e1c570caa970c7f435ac5f9583e'
[ffmpeg] / libswresample / x86 / resample.asm
index 4989aa69915d0ede44a4db8185de204dfb0c6e1f..4163df1aa1a079a3902f8e75adcb43e2e69aa5e2 100644 (file)
@@ -41,8 +41,7 @@ struc ResampleContext
     .frac:                  resd 1
     .src_incr:              resd 1
     .compensation_distance: resd 1
-    .phase_shift:           resd 1
-    .phase_mask:            resd 1
+    .phase_count:           resd 1
 
     ; there's a few more here but we only care about the first few
 endstruc
@@ -55,11 +54,12 @@ pd_0x4000: dd 0x4000
 
 SECTION .text
 
+; FIXME remove unneeded variables (index_incr, phase_mask)
 %macro RESAMPLE_FNS 3-5 ; format [float or int16], bps, log2_bps, float op suffix [s or d], 1.0 constant
 ; int resample_common_$format(ResampleContext *ctx, $format *dst,
 ;                             const $format *src, int size, int update_ctx)
 %if ARCH_X86_64 ; unix64 and win64
-cglobal resample_common_%1, 0, 15, 2, ctx, dst, src, phase_shift, index, frac, \
+cglobal resample_common_%1, 0, 15, 2, ctx, dst, src, phase_count, index, frac, \
                                       dst_incr_mod, size, min_filter_count_x4, \
                                       min_filter_len_x4, dst_incr_div, src_incr, \
                                       phase_mask, dst_end, filter_bank
@@ -76,7 +76,6 @@ cglobal resample_common_%1, 0, 15, 2, ctx, dst, src, phase_shift, index, frac, \
     ; load as many variables in registers as possible; for the rest, store
     ; on stack so that we have 'ctx' available as one extra register
     mov                        sized, r3d
-    mov                  phase_maskd, [ctxq+ResampleContext.phase_mask]
 %if UNIX64
     mov        update_context_stackd, r4d
 %endif
@@ -92,17 +91,17 @@ cglobal resample_common_%1, 0, 15, 2, ctx, dst, src, phase_shift, index, frac, \
     lea                     dst_endq, [dstq+sizeq*%2]
 
 %if UNIX64
-    mov                          ecx, [ctxq+ResampleContext.phase_shift]
+    mov                          ecx, [ctxq+ResampleContext.phase_count]
     mov                          edi, [ctxq+ResampleContext.filter_alloc]
 
-    DEFINE_ARGS filter_alloc, dst, src, phase_shift, index, frac, dst_incr_mod, \
+    DEFINE_ARGS filter_alloc, dst, src, phase_count, index, frac, dst_incr_mod, \
                 filter, min_filter_count_x4, min_filter_len_x4, dst_incr_div, \
                 src_incr, phase_mask, dst_end, filter_bank
 %elif WIN64
     mov                          R9d, [ctxq+ResampleContext.filter_alloc]
-    mov                          ecx, [ctxq+ResampleContext.phase_shift]
+    mov                          ecx, [ctxq+ResampleContext.phase_count]
 
-    DEFINE_ARGS phase_shift, dst, src, filter_alloc, index, frac, dst_incr_mod, \
+    DEFINE_ARGS phase_count, dst, src, filter_alloc, index, frac, dst_incr_mod, \
                 filter, min_filter_count_x4, min_filter_len_x4, dst_incr_div, \
                 src_incr, phase_mask, dst_end, filter_bank
 %endif
@@ -112,7 +111,7 @@ cglobal resample_common_%1, 0, 15, 2, ctx, dst, src, phase_shift, index, frac, \
     sub                         srcq, min_filter_len_x4q
     mov                   src_stackq, srcq
 %else ; x86-32
-cglobal resample_common_%1, 1, 7, 2, ctx, phase_shift, dst, frac, \
+cglobal resample_common_%1, 1, 7, 2, ctx, phase_count, dst, frac, \
                                      index, min_filter_length_x4, filter_bank
 
     ; push temp variables to stack
@@ -127,7 +126,7 @@ cglobal resample_common_%1, 1, 7, 2, ctx, phase_shift, dst, frac, \
     PUSH                              dword [ctxq+ResampleContext.dst_incr_mod]
     PUSH                              dword [ctxq+ResampleContext.filter_alloc]
     PUSH                              r3
-    PUSH                              dword [ctxq+ResampleContext.phase_mask]
+    PUSH                              dword [ctxq+ResampleContext.phase_count]  ; unneeded replacement for phase_mask
     PUSH                              dword [ctxq+ResampleContext.src_incr]
     mov        min_filter_length_x4d, [ctxq+ResampleContext.filter_length]
     mov                       indexd, [ctxq+ResampleContext.index]
@@ -139,9 +138,9 @@ cglobal resample_common_%1, 1, 7, 2, ctx, phase_shift, dst, frac, \
     sub                 filter_bankq, min_filter_length_x4q
     PUSH                              min_filter_length_x4q
     PUSH                              filter_bankq
-    mov                 phase_shiftd, [ctxq+ResampleContext.phase_shift]
+    mov                 phase_countd, [ctxq+ResampleContext.phase_count]
 
-    DEFINE_ARGS src, phase_shift, dst, frac, index, min_filter_count_x4, filter
+    DEFINE_ARGS src, phase_count, dst, frac, index, min_filter_count_x4, filter
 
 %define filter_bankq          dword [rsp+0x0]
 %define min_filter_length_x4q dword [rsp+0x4]
@@ -222,28 +221,32 @@ cglobal resample_common_%1, 1, 7, 2, ctx, phase_shift, dst, frac, \
     inc                       indexd
 
 %if UNIX64
-    DEFINE_ARGS filter_alloc, dst, src, phase_shift, index, frac, dst_incr_mod, \
+    DEFINE_ARGS filter_alloc, dst, src, phase_count, index, frac, dst_incr_mod, \
                 index_incr, min_filter_count_x4, min_filter_len_x4, dst_incr_div, \
                 src_incr, phase_mask, dst_end, filter_bank
 %elif WIN64
-    DEFINE_ARGS phase_shift, dst, src, filter_alloc, index, frac, dst_incr_mod, \
+    DEFINE_ARGS phase_count, dst, src, filter_alloc, index, frac, dst_incr_mod, \
                 index_incr, min_filter_count_x4, min_filter_len_x4, dst_incr_div, \
                 src_incr, phase_mask, dst_end, filter_bank
 %else ; x86-32
-    DEFINE_ARGS src, phase_shift, dst, frac, index, index_incr
+    DEFINE_ARGS src, phase_count, dst, frac, index, index_incr
 %endif
 
 .skip:
-    mov                  index_incrd, indexd
     add                         dstq, %2
-    and                       indexd, phase_maskd
-    sar                  index_incrd, phase_shiftb
-    lea                         srcq, [srcq+index_incrq*%2]
+    cmp                       indexd, phase_countd
+    jb .index_skip
+.index_while:
+    sub                       indexd, phase_countd
+    lea                         srcq, [srcq+%2]
+    cmp                       indexd, phase_countd
+    jnb .index_while
+.index_skip:
     cmp                         dstq, dst_endq
     jne .loop
 
 %if ARCH_X86_64
-    DEFINE_ARGS ctx, dst, src, phase_shift, index, frac
+    DEFINE_ARGS ctx, dst, src, phase_count, index, frac
 %else ; x86-32
     DEFINE_ARGS src, ctx, update_context, frac, index
 %endif
@@ -270,14 +273,14 @@ cglobal resample_common_%1, 1, 7, 2, ctx, phase_shift, dst, frac, \
 ;                             const float *src, int size, int update_ctx)
 %if ARCH_X86_64 ; unix64 and win64
 %if UNIX64
-cglobal resample_linear_%1, 0, 15, 5, ctx, dst, phase_mask, phase_shift, index, frac, \
+cglobal resample_linear_%1, 0, 15, 5, ctx, dst, phase_mask, phase_count, index, frac, \
                                       size, dst_incr_mod, min_filter_count_x4, \
                                       min_filter_len_x4, dst_incr_div, src_incr, \
                                       src, dst_end, filter_bank
 
     mov                         srcq, r2mp
 %else ; win64
-cglobal resample_linear_%1, 0, 15, 5, ctx, phase_mask, src, phase_shift, index, frac, \
+cglobal resample_linear_%1, 0, 15, 5, ctx, phase_mask, src, phase_count, index, frac, \
                                       size, dst_incr_mod, min_filter_count_x4, \
                                       min_filter_len_x4, dst_incr_div, src_incr, \
                                       dst, dst_end, filter_bank
@@ -298,7 +301,6 @@ cglobal resample_linear_%1, 0, 15, 5, ctx, phase_mask, src, phase_shift, index,
     ; load as many variables in registers as possible; for the rest, store
     ; on stack so that we have 'ctx' available as one extra register
     mov                        sized, r3d
-    mov                  phase_maskd, [ctxq+ResampleContext.phase_mask]
 %if UNIX64
     mov        update_context_stackd, r4d
 %endif
@@ -308,7 +310,6 @@ cglobal resample_linear_%1, 0, 15, 5, ctx, phase_mask, src, phase_shift, index,
     mov                 filter_bankq, [ctxq+ResampleContext.filter_bank]
     mov                    src_incrd, [ctxq+ResampleContext.src_incr]
     mov                   ctx_stackq, ctxq
-    mov            phase_mask_stackd, phase_maskd
     mov           min_filter_len_x4d, [ctxq+ResampleContext.filter_length]
 %ifidn %1, int16
     movd                          m4, [pd_0x4000]
@@ -322,17 +323,17 @@ cglobal resample_linear_%1, 0, 15, 5, ctx, phase_mask, src, phase_shift, index,
     lea                     dst_endq, [dstq+sizeq*%2]
 
 %if UNIX64
-    mov                          ecx, [ctxq+ResampleContext.phase_shift]
+    mov                          ecx, [ctxq+ResampleContext.phase_count]
     mov                          edi, [ctxq+ResampleContext.filter_alloc]
 
-    DEFINE_ARGS filter_alloc, dst, filter2, phase_shift, index, frac, filter1, \
+    DEFINE_ARGS filter_alloc, dst, filter2, phase_count, index, frac, filter1, \
                 dst_incr_mod, min_filter_count_x4, min_filter_len_x4, \
                 dst_incr_div, src_incr, src, dst_end, filter_bank
 %elif WIN64
     mov                          R9d, [ctxq+ResampleContext.filter_alloc]
-    mov                          ecx, [ctxq+ResampleContext.phase_shift]
+    mov                          ecx, [ctxq+ResampleContext.phase_count]
 
-    DEFINE_ARGS phase_shift, filter2, src, filter_alloc, index, frac, filter1, \
+    DEFINE_ARGS phase_count, filter2, src, filter_alloc, index, frac, filter1, \
                 dst_incr_mod, min_filter_count_x4, min_filter_len_x4, \
                 dst_incr_div, src_incr, dst, dst_end, filter_bank
 %endif
@@ -361,7 +362,7 @@ cglobal resample_linear_%1, 1, 7, 5, ctx, min_filter_length_x4, filter2, \
     shl                           r3, %3
     PUSH                              r3
     mov                           r3, dword [ctxq+ResampleContext.src_incr]
-    PUSH                              dword [ctxq+ResampleContext.phase_mask]
+    PUSH                              dword [ctxq+ResampleContext.phase_count]  ; unneeded replacement of phase_mask
     PUSH                              r3d
 %ifidn %1, int16
     movd                          m4, [pd_0x4000]
@@ -380,11 +381,11 @@ cglobal resample_linear_%1, 1, 7, 5, ctx, min_filter_length_x4, filter2, \
     sub                 filter_bankq, min_filter_length_x4q
     PUSH                              min_filter_length_x4q
     PUSH                              filter_bankq
-    PUSH                              dword [ctxq+ResampleContext.phase_shift]
+    PUSH                              dword [ctxq+ResampleContext.phase_count]
 
     DEFINE_ARGS filter1, min_filter_count_x4, filter2, frac, index, dst, src
 
-%define phase_shift_stackd    dword [rsp+0x0]
+%define phase_count_stackd    dword [rsp+0x0]
 %define filter_bankq          dword [rsp+0x4]
 %define min_filter_length_x4q dword [rsp+0x8]
 %define src_incrd             dword [rsp+0xc]
@@ -519,35 +520,39 @@ cglobal resample_linear_%1, 1, 7, 5, ctx, min_filter_length_x4, filter2, \
     inc                       indexd
 
 %if UNIX64
-    DEFINE_ARGS filter_alloc, dst, filter2, phase_shift, index, frac, index_incr, \
+    DEFINE_ARGS filter_alloc, dst, filter2, phase_count, index, frac, index_incr, \
                 dst_incr_mod, min_filter_count_x4, min_filter_len_x4, \
                 dst_incr_div, src_incr, src, dst_end, filter_bank
 %elif WIN64
-    DEFINE_ARGS phase_shift, filter2, src, filter_alloc, index, frac, index_incr, \
+    DEFINE_ARGS phase_count, filter2, src, filter_alloc, index, frac, index_incr, \
                 dst_incr_mod, min_filter_count_x4, min_filter_len_x4, \
                 dst_incr_div, src_incr, dst, dst_end, filter_bank
 %else ; x86-32
-    DEFINE_ARGS filter1, phase_shift, index_incr, frac, index, dst, src
+    DEFINE_ARGS filter1, phase_count, index_incr, frac, index, dst, src
 %endif
 
 .skip:
 %if ARCH_X86_32
-    mov                 phase_shiftd, phase_shift_stackd
+    mov                 phase_countd, phase_count_stackd
 %endif
-    mov                  index_incrd, indexd
     add                         dstq, %2
-    and                       indexd, phase_mask_stackd
-    sar                  index_incrd, phase_shiftb
-    lea                         srcq, [srcq+index_incrq*%2]
+    cmp                       indexd, phase_countd
+    jb .index_skip
+.index_while:
+    sub                       indexd, phase_countd
+    lea                         srcq, [srcq+%2]
+    cmp                       indexd, phase_countd
+    jnb .index_while
+.index_skip:
     cmp                         dstq, dst_endq
     jne .loop
 
 %if UNIX64
-    DEFINE_ARGS ctx, dst, filter2, phase_shift, index, frac, index_incr, \
+    DEFINE_ARGS ctx, dst, filter2, phase_count, index, frac, index_incr, \
                 dst_incr_mod, min_filter_count_x4, min_filter_len_x4, \
                 dst_incr_div, src_incr, src, dst_end, filter_bank
 %elif WIN64
-    DEFINE_ARGS ctx, filter2, src, phase_shift, index, frac, index_incr, \
+    DEFINE_ARGS ctx, filter2, src, phase_count, index, frac, index_incr, \
                 dst_incr_mod, min_filter_count_x4, min_filter_len_x4, \
                 dst_incr_div, src_incr, dst, dst_end, filter_bank
 %else ; x86-32