| @@ -60,6 +60,16 @@ SECTION .rodata align=16 · 59 unmodified lines |
| 60 | ;*********************************************************************** | 60 | ;*********************************************************************** |
| 61 | | 61 | |
| 62 | ALIGN 16 | 62 | ALIGN 16 |
| | 63 | db80h_128: |
| | 64 | times 16 db 80h |
| | 65 | shufb_0000000088888888: |
| | 66 | times 8 db 0 |
| | 67 | times 8 db 8 |
| | 68 | shufb_000044448888CCCC: |
| | 69 | times 4 db 0 |
| | 70 | times 4 db 4 |
| | 71 | times 4 db 8 |
| | 72 | times 4 db 12 |
| 63 | shufb_mask_low: | 73 | shufb_mask_low: |
| 64 | db 00h, 80h, 02h, 80h, 04h, 80h, 06h, 80h, 08h, 80h, 0ah, 80h, 0ch, 80h, 0eh, 80h | 74 | db 00h, 80h, 02h, 80h, 04h, 80h, 06h, 80h, 08h, 80h, 0ah, 80h, 0ch, 80h, 0eh, 80h |
| 65 | shufb_mask_high: | 75 | shufb_mask_high: |
| @@ -2595,3 +2605,514 @@ WELS_EXTERN DyadicBilinearQuarterDownsampler_sse4 · 2529 unmodified lines |
| 2595 | %endif | 2605 | %endif |
| 2596 | ret | 2606 | ret |
| 2597 | | 2607 | |
| | 2608 | ; xpos_int=%1 xpos_frac=%2 inc_int+1=%3 inc_frac=%4 tmp=%5 |
| | 2609 | %macro SSE2_BilinearIncXposuw 5 |
| | 2610 | movdqa %5, %2 |
| | 2611 | paddw %2, %4 |
| | 2612 | paddusw %5, %4 |
| | 2613 | pcmpeqw %5, %2 |
| | 2614 | paddb %1, %3 |
| | 2615 | paddb %1, %5 ; subtract 1 if no carry |
| | 2616 | %endmacro |
| | 2617 | |
| | 2618 | ; outl=%1 outh=%2 in=%3 |
| | 2619 | %macro SSE2_UnpckXFracuw 3 |
| | 2620 | pcmpeqw %1, %1 |
| | 2621 | pxor %1, %3 |
| | 2622 | movdqa %2, %1 |
| | 2623 | punpcklwd %1, %3 |
| | 2624 | punpckhwd %2, %3 |
| | 2625 | %endmacro |
| | 2626 | |
| | 2627 | ; [in:xfrac out:xyfrac0]=%1 [out:xyfrac1]=%2 yfrac0=%3 yfrac1=%4 |
| | 2628 | %macro SSE2_BilinearFastCalcXYFrac 4 |
| | 2629 | movdqa %2, %1 |
| | 2630 | pmulhuw %1, %3 |
| | 2631 | pmulhuw %2, %4 |
| | 2632 | %endmacro |
| | 2633 | |
| | 2634 | ; [in:dwordsl out:bytes] dwordsh=%2 zero=%3 |
| | 2635 | %macro SSE2_BilinearFastPackDwordsToBytes 3 |
| | 2636 | psrld %1, 14 |
| | 2637 | psrld %2, 14 |
| | 2638 | packssdw %1, %2 |
| | 2639 | pavgw %1, %3 |
| | 2640 | packuswb %1, %1 |
| | 2641 | %endmacro |
| | 2642 | |
| | 2643 | %macro SSSE3_BilinearFastDownsample2xOrLess_8px 0 |
| | 2644 | movdqa xmm_tmp0, xmm_xpos_int |
| | 2645 | pshufb xmm_tmp0, xmm_0 |
| | 2646 | psubb xmm_xpos_int, xmm_tmp0 |
| | 2647 | SSE2_UnpckXFracuw xmm_tmp0, xmm_tmp1, xmm_xpos_frac |
| | 2648 | mov r_tmp0, i_xpos |
| | 2649 | lea i_xpos, [i_xpos + 8 * i_scalex] |
| | 2650 | shr r_tmp0, 16 |
| | 2651 | movdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| | 2652 | pshufb xmm_tmp4, xmm_xpos_int |
| | 2653 | movdqa xmm_tmp5, xmm_tmp4 |
| | 2654 | punpcklbw xmm_tmp4, xmm_0 |
| | 2655 | punpckhbw xmm_tmp5, xmm_0 |
| | 2656 | SSE2_BilinearFastCalcXYFrac xmm_tmp0, xmm_tmp2, xmm_yfrac0, xmm_yfrac1 |
| | 2657 | SSE2_BilinearFastCalcXYFrac xmm_tmp1, xmm_tmp3, xmm_yfrac0, xmm_yfrac1 |
| | 2658 | pmaddwd xmm_tmp0, xmm_tmp4 |
| | 2659 | pmaddwd xmm_tmp1, xmm_tmp5 |
| | 2660 | movdqu xmm_tmp4, [p_src_row1 + r_tmp0] |
| | 2661 | pshufb xmm_tmp4, xmm_xpos_int |
| | 2662 | movdqa xmm_tmp5, xmm_tmp4 |
| | 2663 | punpcklbw xmm_tmp4, xmm_0 |
| | 2664 | punpckhbw xmm_tmp5, xmm_0 |
| | 2665 | pmaddwd xmm_tmp2, xmm_tmp4 |
| | 2666 | pmaddwd xmm_tmp3, xmm_tmp5 |
| | 2667 | paddd xmm_tmp0, xmm_tmp2 |
| | 2668 | paddd xmm_tmp1, xmm_tmp3 |
| | 2669 | SSE2_BilinearFastPackDwordsToBytes xmm_tmp0, xmm_tmp1, xmm_0 |
| | 2670 | movlps [p_dst], xmm_tmp0 |
| | 2671 | add p_dst, 8 |
| | 2672 | SSE2_BilinearIncXposuw xmm_xpos_int, xmm_xpos_frac, xmm_xpos_int_inc, xmm_xpos_frac_inc, xmm_tmp0 |
| | 2673 | %endmacro |
| | 2674 | |
| | 2675 | %macro SSSE3_BilinearFastDownsample4xOrLess_8px 0 |
| | 2676 | movdqa xmm_tmp0, xmm_xpos_int |
| | 2677 | pshufb xmm_tmp0, [shufb_0000000088888888] |
| | 2678 | psubb xmm_xpos_int, xmm_tmp0 |
| | 2679 | SSE2_UnpckXFracuw xmm_tmp0, xmm_tmp1, xmm_xpos_frac |
| | 2680 | mov r_tmp0, i_xpos |
| | 2681 | shr r_tmp0, 16 |
| | 2682 | movdqu xmm_tmp3, [p_src_row0 + r_tmp0] |
| | 2683 | movdqu xmm_tmp4, [p_src_row1 + r_tmp0] |
| | 2684 | movdqa xmm_tmp2, xmm_xpos_int |
| | 2685 | punpcklbw xmm_tmp2, [db80h_128] |
| | 2686 | pshufb xmm_tmp3, xmm_tmp2 |
| | 2687 | pshufb xmm_tmp4, xmm_tmp2 |
| | 2688 | SSE2_BilinearFastCalcXYFrac xmm_tmp0, xmm_tmp2, xmm_yfrac0, xmm_yfrac1 |
| | 2689 | pmaddwd xmm_tmp0, xmm_tmp3 |
| | 2690 | pmaddwd xmm_tmp2, xmm_tmp4 |
| | 2691 | paddd xmm_tmp0, xmm_tmp2 |
| | 2692 | lea r_tmp0, [i_xpos + 4 * i_scalex] |
| | 2693 | lea i_xpos, [i_xpos + 8 * i_scalex] |
| | 2694 | shr r_tmp0, 16 |
| | 2695 | movdqu xmm_tmp3, [p_src_row0 + r_tmp0] |
| | 2696 | movdqu xmm_tmp4, [p_src_row1 + r_tmp0] |
| | 2697 | movdqa xmm_tmp2, xmm_xpos_int |
| | 2698 | punpckhbw xmm_tmp2, [db80h_128] |
| | 2699 | pshufb xmm_tmp3, xmm_tmp2 |
| | 2700 | pshufb xmm_tmp4, xmm_tmp2 |
| | 2701 | SSE2_BilinearFastCalcXYFrac xmm_tmp1, xmm_tmp2, xmm_yfrac0, xmm_yfrac1 |
| | 2702 | pmaddwd xmm_tmp1, xmm_tmp3 |
| | 2703 | pmaddwd xmm_tmp2, xmm_tmp4 |
| | 2704 | paddd xmm_tmp1, xmm_tmp2 |
| | 2705 | SSE2_BilinearFastPackDwordsToBytes xmm_tmp0, xmm_tmp1, xmm_0 |
| | 2706 | movlps [p_dst], xmm_tmp0 |
| | 2707 | add p_dst, 8 |
| | 2708 | SSE2_BilinearIncXposuw xmm_xpos_int, xmm_xpos_frac, xmm_xpos_int_inc, xmm_xpos_frac_inc, xmm_tmp0 |
| | 2709 | %endmacro |
| | 2710 | |
| | 2711 | %macro SSE2_GeneralBilinearFastDownsample_8px 0 |
| | 2712 | mov r_tmp0, i_xpos |
| | 2713 | shr r_tmp0, 16 |
| | 2714 | movd xmm_tmp3, [p_src_row0 + r_tmp0] |
| | 2715 | movd xmm_tmp4, [p_src_row1 + r_tmp0] |
| | 2716 | lea r_tmp0, [i_xpos + i_scalex] |
| | 2717 | shr r_tmp0, 16 |
| | 2718 | pinsrw xmm_tmp3, [p_src_row0 + r_tmp0], 1 |
| | 2719 | pinsrw xmm_tmp4, [p_src_row1 + r_tmp0], 1 |
| | 2720 | lea r_tmp0, [i_xpos + 2 * i_scalex] |
| | 2721 | lea i_xpos, [i_xpos + 4 * i_scalex] |
| | 2722 | shr r_tmp0, 16 |
| | 2723 | pinsrw xmm_tmp3, [p_src_row0 + r_tmp0], 2 |
| | 2724 | pinsrw xmm_tmp4, [p_src_row1 + r_tmp0], 2 |
| | 2725 | mov r_tmp0, i_xpos |
| | 2726 | sub r_tmp0, i_scalex |
| | 2727 | shr r_tmp0, 16 |
| | 2728 | pinsrw xmm_tmp3, [p_src_row0 + r_tmp0], 3 |
| | 2729 | pinsrw xmm_tmp4, [p_src_row1 + r_tmp0], 3 |
| | 2730 | punpcklbw xmm_tmp3, xmm_0 |
| | 2731 | punpcklbw xmm_tmp4, xmm_0 |
| | 2732 | movdqa xmm_tmp0, xmm_xfrac0 |
| | 2733 | SSE2_BilinearFastCalcXYFrac xmm_tmp0, xmm_tmp2, xmm_yfrac0, xmm_yfrac1 |
| | 2734 | pmaddwd xmm_tmp0, xmm_tmp3 |
| | 2735 | pmaddwd xmm_tmp2, xmm_tmp4 |
| | 2736 | paddd xmm_tmp0, xmm_tmp2 |
| | 2737 | mov r_tmp0, i_xpos |
| | 2738 | shr r_tmp0, 16 |
| | 2739 | movd xmm_tmp3, [p_src_row0 + r_tmp0] |
| | 2740 | movd xmm_tmp4, [p_src_row1 + r_tmp0] |
| | 2741 | lea r_tmp0, [i_xpos + i_scalex] |
| | 2742 | shr r_tmp0, 16 |
| | 2743 | pinsrw xmm_tmp3, [p_src_row0 + r_tmp0], 1 |
| | 2744 | pinsrw xmm_tmp4, [p_src_row1 + r_tmp0], 1 |
| | 2745 | lea r_tmp0, [i_xpos + 2 * i_scalex] |
| | 2746 | lea i_xpos, [i_xpos + 4 * i_scalex] |
| | 2747 | shr r_tmp0, 16 |
| | 2748 | pinsrw xmm_tmp3, [p_src_row0 + r_tmp0], 2 |
| | 2749 | pinsrw xmm_tmp4, [p_src_row1 + r_tmp0], 2 |
| | 2750 | mov r_tmp0, i_xpos |
| | 2751 | sub r_tmp0, i_scalex |
| | 2752 | shr r_tmp0, 16 |
| | 2753 | pinsrw xmm_tmp3, [p_src_row0 + r_tmp0], 3 |
| | 2754 | pinsrw xmm_tmp4, [p_src_row1 + r_tmp0], 3 |
| | 2755 | punpcklbw xmm_tmp3, xmm_0 |
| | 2756 | punpcklbw xmm_tmp4, xmm_0 |
| | 2757 | movdqa xmm_tmp1, xmm_xfrac1 |
| | 2758 | SSE2_BilinearFastCalcXYFrac xmm_tmp1, xmm_tmp2, xmm_yfrac0, xmm_yfrac1 |
| | 2759 | pmaddwd xmm_tmp1, xmm_tmp3 |
| | 2760 | pmaddwd xmm_tmp2, xmm_tmp4 |
| | 2761 | paddd xmm_tmp1, xmm_tmp2 |
| | 2762 | SSE2_BilinearFastPackDwordsToBytes xmm_tmp0, xmm_tmp1, xmm_0 |
| | 2763 | movlps [p_dst], xmm_tmp0 |
| | 2764 | add p_dst, 8 |
| | 2765 | paddw xmm_xfrac0, xmm_xfrac_inc |
| | 2766 | paddw xmm_xfrac1, xmm_xfrac_inc |
| | 2767 | %endmacro |
| | 2768 | |
| | 2769 | ; downsample_8px_macro=%1 b_fast=%2 |
| | 2770 | %macro SSE2_GeneralBilinearDownsampler_loop 2 |
| | 2771 | %%height: |
| | 2772 | mov p_src_row0, i_ypos |
| | 2773 | shr p_src_row0, 15 |
| | 2774 | imul p_src_row0, i_src_stride |
| | 2775 | add p_src_row0, p_src |
| | 2776 | mov p_src_row1, p_src_row0 |
| | 2777 | add p_src_row1, i_src_stride |
| | 2778 | movd xmm_tmp1, i_yposd |
| | 2779 | %if %2 |
| | 2780 | pshuflw xmm_tmp1, xmm_tmp1, 0 |
| | 2781 | psllw xmm_tmp1, 1 |
| | 2782 | psrlw xmm_tmp1, 1 |
| | 2783 | %else |
| | 2784 | pslld xmm_tmp1, 17 |
| | 2785 | psrld xmm_tmp1, 17 |
| | 2786 | %endif |
| | 2787 | %ifdef X86_32 |
| | 2788 | pshufd xmm_tmp1, xmm_tmp1, 0 |
| | 2789 | pcmpeqw xmm_tmp0, xmm_tmp0 |
| | 2790 | %if %2 |
| | 2791 | psrlw xmm_tmp0, 1 |
| | 2792 | %else |
| | 2793 | psrld xmm_tmp0, 17 |
| | 2794 | %endif |
| | 2795 | pxor xmm_tmp0, xmm_tmp1 |
| | 2796 | movdqa xmm_yfrac0, xmm_tmp0 |
| | 2797 | movdqa xmm_yfrac1, xmm_tmp1 |
| | 2798 | %else |
| | 2799 | pshufd xmm_yfrac1, xmm_tmp1, 0 |
| | 2800 | pcmpeqw xmm_yfrac0, xmm_yfrac0 |
| | 2801 | %if %2 |
| | 2802 | psrlw xmm_yfrac0, 1 |
| | 2803 | %else |
| | 2804 | psrld xmm_yfrac0, 17 |
| | 2805 | %endif |
| | 2806 | pxor xmm_yfrac0, xmm_yfrac1 |
| | 2807 | %endif |
| | 2808 | |
| | 2809 | mov i_xpos, 1 << 15 |
| | 2810 | mov i_width_cnt, i_dst_width |
| | 2811 | sub i_width_cnt, 1 |
| | 2812 | |
| | 2813 | %ifdef xmm_xpos_int |
| | 2814 | movdqa xmm_xpos_int, xmm_xpos_int_begin |
| | 2815 | movdqa xmm_xpos_frac, xmm_xpos_frac_begin |
| | 2816 | %else |
| | 2817 | movdqa xmm_xfrac0, xmm_xfrac0_begin |
| | 2818 | movdqa xmm_xfrac1, xmm_xfrac1_begin |
| | 2819 | %endif |
| | 2820 | |
| | 2821 | %%width: |
| | 2822 | %1 |
| | 2823 | sub i_width_cnt, 8 |
| | 2824 | jg %%width |
| | 2825 | |
| | 2826 | lea p_dst, [p_dst + i_width_cnt + 1] |
| | 2827 | imul i_width_cnt, i_scalex |
| | 2828 | add i_xpos, i_width_cnt |
| | 2829 | shr i_xpos, 16 |
| | 2830 | movzx r_tmp0, byte [p_src_row0 + i_xpos] |
| | 2831 | mov [p_dst - 1], r_tmp0b |
| | 2832 | %ifdef X86_32 |
| | 2833 | mov r_tmp0, i_scaleyd |
| | 2834 | add i_yposd, r_tmp0 |
| | 2835 | %else |
| | 2836 | add i_yposd, i_scaleyd |
| | 2837 | %endif |
| | 2838 | add p_dst, i_dst_stride_less_width |
| | 2839 | sub i_dst_height, 1 |
| | 2840 | jg %%height |
| | 2841 | %endmacro |
| | 2842 | |
| | 2843 | ;************************************************************************************************************** |
| | 2844 | ;void GeneralBilinearFastDownsampler_ssse3 (uint8_t* pDst, int32_t iDstStride, int32_t iDstWidth, |
| | 2845 | ; int32_t iDstHeight, uint8_t* pSrc, int32_t iSrcStride, uint32_t uiScaleX, |
| | 2846 | ; uint32_t uiScaleY); |
| | 2847 | ; |
| | 2848 | ;************************************************************************************************************** |
| | 2849 | |
| | 2850 | WELS_EXTERN GeneralBilinearFastDownsampler_ssse3 |
| | 2851 | %assign push_num 0 |
| | 2852 | %ifndef X86_32 |
| | 2853 | push r12 |
| | 2854 | push r13 |
| | 2855 | push rbx |
| | 2856 | push rbp |
| | 2857 | %assign push_num 4 |
| | 2858 | %ifdef WIN64 |
| | 2859 | push rdi |
| | 2860 | push rsi |
| | 2861 | %assign push_num push_num + 2 |
| | 2862 | %endif |
| | 2863 | %endif |
| | 2864 | LOAD_7_PARA |
| | 2865 | PUSH_XMM 16 |
| | 2866 | SIGN_EXTENSION r1, r1d |
| | 2867 | SIGN_EXTENSION r2, r2d |
| | 2868 | SIGN_EXTENSION r3, r3d |
| | 2869 | SIGN_EXTENSION r5, r5d |
| | 2870 | ZERO_EXTENSION r6d |
| | 2871 | sub r1, r2 ; dst_stride - dst_width |
| | 2872 | %ifdef X86_32 |
| | 2873 | movd xmm0, arg8 |
| | 2874 | movd xmm1, esp |
| | 2875 | and esp, -16 |
| | 2876 | sub esp, 8 * 4 + 7 * 16 |
| | 2877 | movd [esp], xmm1 |
| | 2878 | %define p_dst r0 |
| | 2879 | %define i_dst_stride_less_width [esp + 1 * 4] |
| | 2880 | %define i_dst_width [esp + 2 * 4] |
| | 2881 | %define i_dst_height dword [esp + 3 * 4] |
| | 2882 | %define p_src [esp + 4 * 4] |
| | 2883 | %define i_src_stride [esp + 5 * 4] |
| | 2884 | %define i_scalex r6 |
| | 2885 | %define i_scalexd r6d |
| | 2886 | %define i_scaleyd [esp + 6 * 4] |
| | 2887 | %define i_xpos r2 |
| | 2888 | %define i_ypos dword [esp + 7 * 4] |
| | 2889 | %define i_yposd dword [esp + 7 * 4] |
| | 2890 | %define p_src_row0 r3 |
| | 2891 | %define p_src_row1 r4 |
| | 2892 | %define i_width_cnt r5 |
| | 2893 | %define r_tmp0 r1 |
| | 2894 | %define r_tmp0b r1b |
| | 2895 | %define xmm_xpos_frac xmm1 |
| | 2896 | %define xmm_xpos_frac_inc [esp + 8 * 4] |
| | 2897 | %define xmm_xpos_int xmm3 |
| | 2898 | %define xmm_xpos_int_inc [esp + 8 * 4 + 1 * 16] |
| | 2899 | %define xmm_yfrac0 [esp + 8 * 4 + 2 * 16] |
| | 2900 | %define xmm_yfrac1 [esp + 8 * 4 + 3 * 16] |
| | 2901 | %define xmm_tmp0 xmm7 |
| | 2902 | %define xmm_tmp1 xmm0 |
| | 2903 | %define xmm_tmp2 xmm2 |
| | 2904 | %define xmm_tmp3 xmm4 |
| | 2905 | %define xmm_tmp4 xmm5 |
| | 2906 | %define xmm_tmp5 xmm6 |
| | 2907 | %define xmm_0 [esp + 8 * 4 + 4 * 16] |
| | 2908 | %define xmm_xpos_int_begin [esp + 8 * 4 + 5 * 16] |
| | 2909 | %define xmm_xpos_frac_begin [esp + 8 * 4 + 6 * 16] |
| | 2910 | mov i_dst_stride_less_width, r1 |
| | 2911 | mov i_dst_width, r2 |
| | 2912 | mov i_dst_height, r3 |
| | 2913 | mov p_src, r4 |
| | 2914 | mov i_src_stride, r5 |
| | 2915 | movd i_scaleyd, xmm0 |
| | 2916 | pxor xmm_tmp0, xmm_tmp0 |
| | 2917 | movdqa xmm_0, xmm_tmp0 |
| | 2918 | %else |
| | 2919 | %define p_dst r0 |
| | 2920 | %define i_dst_stride_less_width r1 |
| | 2921 | %define i_dst_width r2 |
| | 2922 | %define i_dst_height r3 |
| | 2923 | %define p_src r4 |
| | 2924 | %define i_src_stride r5 |
| | 2925 | %define i_scalex r6 |
| | 2926 | %define i_scalexd r6d |
| | 2927 | %define i_scaleyd dword arg8d |
| | 2928 | %define i_xpos r12 |
| | 2929 | %define i_ypos r13 |
| | 2930 | %define i_yposd r13d |
| | 2931 | %define p_src_row0 rbp |
| | 2932 | %ifdef WIN64 |
| | 2933 | %define p_src_row1 rsi |
| | 2934 | %define i_width_cnt rdi |
| | 2935 | %else |
| | 2936 | %define p_src_row1 r11 |
| | 2937 | %define i_width_cnt rax |
| | 2938 | %endif |
| | 2939 | %define r_tmp0 rbx |
| | 2940 | %define r_tmp0b bl |
| | 2941 | %define xmm_0 xmm0 |
| | 2942 | %define xmm_xpos_frac xmm1 |
| | 2943 | %define xmm_xpos_frac_inc xmm8 |
| | 2944 | %define xmm_xpos_int xmm3 |
| | 2945 | %define xmm_xpos_int_inc xmm10 |
| | 2946 | %define xmm_yfrac0 xmm11 |
| | 2947 | %define xmm_yfrac1 xmm12 |
| | 2948 | %define xmm_tmp0 xmm7 |
| | 2949 | %define xmm_tmp1 xmm2 |
| | 2950 | %define xmm_tmp2 xmm9 |
| | 2951 | %define xmm_tmp3 xmm4 |
| | 2952 | %define xmm_tmp4 xmm5 |
| | 2953 | %define xmm_tmp5 xmm6 |
| | 2954 | %define xmm_xpos_int_begin xmm14 |
| | 2955 | %define xmm_xpos_frac_begin xmm15 |
| | 2956 | pxor xmm_0, xmm_0 |
| | 2957 | %endif |
| | 2958 | |
| | 2959 | sub i_dst_height, 1 |
| | 2960 | je .final_row |
| | 2961 | jl .done |
| | 2962 | |
| | 2963 | mov i_ypos, 1 << 14 |
| | 2964 | movd xmm_xpos_frac, i_scalexd |
| | 2965 | pshufd xmm_xpos_frac, xmm_xpos_frac, 0 |
| | 2966 | movdqa xmm_tmp0, xmm_xpos_frac |
| | 2967 | pslld xmm_tmp0, 2 |
| | 2968 | pslldq xmm_xpos_frac, 4 |
| | 2969 | paddd xmm_tmp0, xmm_xpos_frac |
| | 2970 | movdqa xmm_tmp1, xmm_xpos_frac |
| | 2971 | pslldq xmm_tmp1, 4 |
| | 2972 | paddd xmm_xpos_frac, xmm_tmp1 |
| | 2973 | paddd xmm_tmp0, xmm_tmp1 |
| | 2974 | pslldq xmm_tmp1, 4 |
| | 2975 | paddd xmm_xpos_frac, xmm_tmp1 |
| | 2976 | paddd xmm_tmp0, xmm_tmp1 |
| | 2977 | pcmpeqw xmm_tmp1, xmm_tmp1 |
| | 2978 | psrld xmm_tmp1, 31 |
| | 2979 | pslld xmm_tmp1, 15 |
| | 2980 | paddd xmm_xpos_frac, xmm_tmp1 |
| | 2981 | paddd xmm_tmp0, xmm_tmp1 |
| | 2982 | movdqa xmm_xpos_int, xmm_xpos_frac |
| | 2983 | movdqa xmm_tmp1, xmm_tmp0 |
| | 2984 | psrld xmm_xpos_int, 16 |
| | 2985 | psrld xmm_tmp1, 16 |
| | 2986 | packssdw xmm_xpos_int, xmm_tmp1 |
| | 2987 | packuswb xmm_xpos_int, xmm_xpos_int |
| | 2988 | movdqa xmm_tmp1, xmm_xpos_int |
| | 2989 | pcmpeqw xmm_tmp2, xmm_tmp2 |
| | 2990 | psubb xmm_tmp1, xmm_tmp2 |
| | 2991 | punpcklbw xmm_xpos_int, xmm_tmp1 |
| | 2992 | pslld xmm_xpos_frac, 16 |
| | 2993 | pslld xmm_tmp0, 16 |
| | 2994 | psrad xmm_xpos_frac, 16 |
| | 2995 | psrad xmm_tmp0, 16 |
| | 2996 | packssdw xmm_xpos_frac, xmm_tmp0 |
| | 2997 | movd xmm_tmp0, i_scalexd |
| | 2998 | pslld xmm_tmp0, 3 |
| | 2999 | movdqa xmm_tmp1, xmm_tmp0 |
| | 3000 | punpcklwd xmm_tmp0, xmm_tmp0 |
| | 3001 | pshufd xmm_tmp0, xmm_tmp0, 0 |
| | 3002 | movdqa xmm_xpos_frac_inc, xmm_tmp0 |
| | 3003 | psrld xmm_tmp1, 16 |
| | 3004 | psubw xmm_tmp1, xmm_tmp2 |
| | 3005 | pxor xmm_tmp2, xmm_tmp2 |
| | 3006 | pshufb xmm_tmp1, xmm_tmp2 |
| | 3007 | movdqa xmm_xpos_int_inc, xmm_tmp1 |
| | 3008 | movdqa xmm_xpos_int_begin, xmm_xpos_int |
| | 3009 | movdqa xmm_xpos_frac_begin, xmm_xpos_frac |
| | 3010 | |
| | 3011 | cmp i_scalex, 4 << 16 |
| | 3012 | ja .scalex_above4 |
| | 3013 | cmp i_scalex, 2 << 16 |
| | 3014 | ja .scalex_above2_beloweq4 |
| | 3015 | SSE2_GeneralBilinearDownsampler_loop SSSE3_BilinearFastDownsample2xOrLess_8px, 1 |
| | 3016 | jmp .final_row |
| | 3017 | %ifdef X86_32 |
| | 3018 | %undef xmm_yfrac0 |
| | 3019 | %xdefine xmm_yfrac0 xmm_tmp5 |
| | 3020 | %undef xmm_tmp5 |
| | 3021 | %endif |
| | 3022 | .scalex_above2_beloweq4: |
| | 3023 | SSE2_GeneralBilinearDownsampler_loop SSSE3_BilinearFastDownsample4xOrLess_8px, 1 |
| | 3024 | jmp .final_row |
| | 3025 | .scalex_above4: |
| | 3026 | %xdefine xmm_xfrac0 xmm_xpos_frac |
| | 3027 | %xdefine xmm_xfrac1 xmm_xpos_int |
| | 3028 | %xdefine xmm_xfrac0_begin xmm_xpos_int_begin |
| | 3029 | %xdefine xmm_xfrac1_begin xmm_xpos_frac_begin |
| | 3030 | %xdefine xmm_xfrac_inc xmm_xpos_frac_inc |
| | 3031 | %undef xmm_xpos_int |
| | 3032 | %undef xmm_xpos_frac |
| | 3033 | %undef xmm_xpos_int_begin |
| | 3034 | %undef xmm_xpos_frac_begin |
| | 3035 | %undef xmm_xpos_int_inc |
| | 3036 | %undef xmm_xpos_frac_inc |
| | 3037 | SSE2_UnpckXFracuw xmm_tmp0, xmm_xfrac1, xmm_xfrac0 |
| | 3038 | movdqa xmm_xfrac0, xmm_tmp0 |
| | 3039 | movdqa xmm_xfrac0_begin, xmm_xfrac0 |
| | 3040 | movdqa xmm_xfrac1_begin, xmm_xfrac1 |
| | 3041 | pcmpeqw xmm_tmp0, xmm_tmp0 |
| | 3042 | pmullw xmm_tmp0, xmm_xfrac_inc |
| | 3043 | punpcklwd xmm_tmp0, xmm_xfrac_inc |
| | 3044 | movdqa xmm_xfrac_inc, xmm_tmp0 |
| | 3045 | SSE2_GeneralBilinearDownsampler_loop SSE2_GeneralBilinearFastDownsample_8px, 1 |
| | 3046 | |
| | 3047 | .final_row: |
| | 3048 | mov p_src_row0, i_ypos |
| | 3049 | shr p_src_row0, 15 |
| | 3050 | imul p_src_row0, i_src_stride |
| | 3051 | add p_src_row0, p_src |
| | 3052 | mov i_xpos, 1 << 15 |
| | 3053 | mov i_width_cnt, i_dst_width |
| | 3054 | |
| | 3055 | .final_row_width: |
| | 3056 | mov r_tmp0, i_xpos |
| | 3057 | shr r_tmp0, 16 |
| | 3058 | movzx r_tmp0, byte [p_src_row0 + r_tmp0] |
| | 3059 | mov [p_dst], r_tmp0b |
| | 3060 | add p_dst, 1 |
| | 3061 | add i_xpos, i_scalex |
| | 3062 | sub i_width_cnt, 1 |
| | 3063 | jg .final_row_width |
| | 3064 | |
| | 3065 | .done: |
| | 3066 | %ifdef X86_32 |
| | 3067 | mov esp, [esp] |
| | 3068 | %endif |
| | 3069 | POP_XMM |
| | 3070 | LOAD_7_PARA_POP |
| | 3071 | %ifndef X86_32 |
| | 3072 | %ifdef WIN64 |
| | 3073 | pop rsi |
| | 3074 | pop rdi |
| | 3075 | %endif |
| | 3076 | pop rbp |
| | 3077 | pop rbx |
| | 3078 | pop r13 |
| | 3079 | pop r12 |
| | 3080 | %endif |
| | 3081 | ret |
| | 3082 | %undef p_dst |
| | 3083 | %undef i_dst_stride_less_width |
| | 3084 | %undef i_dst_width |
| | 3085 | %undef i_dst_height |
| | 3086 | %undef p_src |
| | 3087 | %undef i_src_stride |
| | 3088 | %undef i_scalex |
| | 3089 | %undef i_scalexd |
| | 3090 | %undef i_scaleyd |
| | 3091 | %undef i_xpos |
| | 3092 | %undef i_ypos |
| | 3093 | %undef i_yposd |
| | 3094 | %undef p_src_row0 |
| | 3095 | %undef p_src_row1 |
| | 3096 | %undef i_width_cnt |
| | 3097 | %undef r_tmp0 |
| | 3098 | %undef r_tmp0b |
| | 3099 | %undef xmm_0 |
| | 3100 | %undef xmm_xpos_frac |
| | 3101 | %undef xmm_xpos_frac_inc |
| | 3102 | %undef xmm_xpos_int |
| | 3103 | %undef xmm_xpos_int_inc |
| | 3104 | %undef xmm_yfrac0 |
| | 3105 | %undef xmm_yfrac1 |
| | 3106 | %undef xmm_tmp0 |
| | 3107 | %undef xmm_tmp1 |
| | 3108 | %undef xmm_tmp2 |
| | 3109 | %undef xmm_tmp3 |
| | 3110 | %undef xmm_tmp4 |
| | 3111 | %undef xmm_tmp5 |
| | 3112 | %undef xmm_xpos_int_begin |
| | 3113 | %undef xmm_xpos_frac_begin |
| | 3114 | %undef xmm_xfrac0 |
| | 3115 | %undef xmm_xfrac1 |
| | 3116 | %undef xmm_xfrac0_begin |
| | 3117 | %undef xmm_xfrac1_begin |
| | 3118 | %undef xmm_xfrac_inc |