annotate libmpcodecs/vf_fspp.c @ 30146:cc26cc1865ee

Enable all FFmpeg protocols by default, they seem to build without issue on Linux and MinGW, lets see if it works for everything else as well.
author reimar
date Sun, 03 Jan 2010 16:46:31 +0000
parents c35891e664af
children 915be5c7a30c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1 /*
26727
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
2 * Copyright (C) 2003 Michael Niedermayer <michaelni@gmx.at>
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
3 * Copyright (C) 2005 Nikolaj Poroshin <porosh3@psu.ru>
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
4 *
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
5 * This file is part of MPlayer.
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
6 *
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
7 * MPlayer is free software; you can redistribute it and/or modify
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
8 * it under the terms of the GNU General Public License as published by
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
10 * (at your option) any later version.
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
11 *
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
12 * MPlayer is distributed in the hope that it will be useful,
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
15 * GNU General Public License for more details.
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
16 *
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
17 * You should have received a copy of the GNU General Public License along
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
18 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
82601a38e2a7 Use standard license headers.
diego
parents: 26052
diff changeset
20 */
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
21
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
22 /*
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
23 * This implementation is based on an algorithm described in
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
24 * "Aria Nosratinia Embedded Post-Processing for
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
25 * Enhancement of Compressed Images (1999)"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
26 * (http://citeseer.nj.nec.com/nosratinia99embedded.html)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
27 * Futher, with splitting (i)dct into hor/ver passes, one of them can be
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
28 * performed once per block, not pixel. This allows for much better speed.
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
29 */
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
30
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
31 /*
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
32 Heavily optimized version of SPP filter by Nikolaj
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
33 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
34
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
35 #include <stdio.h>
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
36 #include <stdlib.h>
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
37 #include <string.h>
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
38 #include <inttypes.h>
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
39 #include <math.h>
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
40
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16018
diff changeset
41 #include "config.h"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
42
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16018
diff changeset
43 #include "mp_msg.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16018
diff changeset
44 #include "cpudetect.h"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
45 #include "img_format.h"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
46 #include "mp_image.h"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
47 #include "vf.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16018
diff changeset
48 #include "libvo/fastmemcpy.h"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
49
28588
7f03a6d3c941 Move FFmpeg #includes below all others so that they do not override
diego
parents: 28327
diff changeset
50 #include "libavutil/internal.h"
7f03a6d3c941 Move FFmpeg #includes below all others so that they do not override
diego
parents: 28327
diff changeset
51 #include "libavutil/intreadwrite.h"
7f03a6d3c941 Move FFmpeg #includes below all others so that they do not override
diego
parents: 28327
diff changeset
52 #include "libavutil/mem.h"
7f03a6d3c941 Move FFmpeg #includes below all others so that they do not override
diego
parents: 28327
diff changeset
53 #include "libavcodec/avcodec.h"
7f03a6d3c941 Move FFmpeg #includes below all others so that they do not override
diego
parents: 28327
diff changeset
54 #include "libavcodec/dsputil.h"
7f03a6d3c941 Move FFmpeg #includes below all others so that they do not override
diego
parents: 28327
diff changeset
55
28327
c39a1fd7d45c Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents: 28290
diff changeset
56 #undef free
c39a1fd7d45c Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents: 28290
diff changeset
57 #undef malloc
c39a1fd7d45c Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents: 28290
diff changeset
58
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
59 //===========================================================================//
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
60 #define BLOCKSZ 12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
61
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
62 static const short custom_threshold[64]=
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
63 // values (296) can't be too high
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
64 // -it causes too big quant dependence
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
65 // or maybe overflow(check), which results in some flashing
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
66 { 71, 296, 295, 237, 71, 40, 38, 19,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
67 245, 193, 185, 121, 102, 73, 53, 27,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
68 158, 129, 141, 107, 97, 73, 50, 26,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
69 102, 116, 109, 98, 82, 66, 45, 23,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
70 71, 94, 95, 81, 70, 56, 38, 20,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
71 56, 77, 74, 66, 56, 44, 30, 15,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
72 38, 53, 50, 45, 38, 30, 21, 11,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
73 20, 27, 26, 23, 20, 15, 11, 5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
74 };
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
75
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
76 static const uint8_t __attribute__((aligned(32))) dither[8][8]={
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
77 { 0, 48, 12, 60, 3, 51, 15, 63, },
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
78 { 32, 16, 44, 28, 35, 19, 47, 31, },
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
79 { 8, 56, 4, 52, 11, 59, 7, 55, },
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
80 { 40, 24, 36, 20, 43, 27, 39, 23, },
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
81 { 2, 50, 14, 62, 1, 49, 13, 61, },
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
82 { 34, 18, 46, 30, 33, 17, 45, 29, },
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
83 { 10, 58, 6, 54, 9, 57, 5, 53, },
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
84 { 42, 26, 38, 22, 41, 25, 37, 21, },
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
85 };
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
86
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
87 struct vf_priv_s { //align 16 !
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
88 uint64_t threshold_mtx_noq[8*2];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
89 uint64_t threshold_mtx[8*2];//used in both C & MMX (& later SSE2) versions
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
90
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
91 int log2_count;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
92 int temp_stride;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
93 int qp;
17225
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
94 int mpeg2;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
95 int prev_q;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
96 uint8_t *src;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
97 int16_t *temp;
17225
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
98 int bframes;
17133
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
99 char *non_b_qp;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
100 };
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
101
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
102
28290
25337a2147e7 Lots and lots of #ifdef ARCH_... -> #if ARCH_...
reimar
parents: 27754
diff changeset
103 #if !HAVE_MMX
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
104
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
105 //This func reads from 1 slice, 1 and clears 0 & 1
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
106 static void store_slice_c(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
107 {int y, x;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
108 #define STORE(pos) \
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
109 temp= (src[x + pos] + (d[pos]>>log2_scale))>>(6-log2_scale); \
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
110 src[x + pos]=src[x + pos - 8*src_stride]=0; \
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
111 if(temp & 0x100) temp= ~(temp>>31); \
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
112 dst[x + pos]= temp;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
113
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
114 for(y=0; y<height; y++){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
115 const uint8_t *d= dither[y];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
116 for(x=0; x<width; x+=8){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
117 int temp;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
118 STORE(0);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
119 STORE(1);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
120 STORE(2);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
121 STORE(3);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
122 STORE(4);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
123 STORE(5);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
124 STORE(6);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
125 STORE(7);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
126 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
127 src+=src_stride;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
128 dst+=dst_stride;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
129 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
130 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
131
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
132 //This func reads from 2 slices, 0 & 2 and clears 2-nd
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
133 static void store_slice2_c(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
134 {int y, x;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
135 #define STORE2(pos) \
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
136 temp= (src[x + pos] + src[x + pos + 16*src_stride] + (d[pos]>>log2_scale))>>(6-log2_scale); \
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
137 src[x + pos + 16*src_stride]=0; \
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
138 if(temp & 0x100) temp= ~(temp>>31); \
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
139 dst[x + pos]= temp;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
140
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
141 for(y=0; y<height; y++){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
142 const uint8_t *d= dither[y];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
143 for(x=0; x<width; x+=8){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
144 int temp;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
145 STORE2(0);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
146 STORE2(1);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
147 STORE2(2);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
148 STORE2(3);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
149 STORE2(4);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
150 STORE2(5);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
151 STORE2(6);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
152 STORE2(7);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
153 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
154 src+=src_stride;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
155 dst+=dst_stride;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
156 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
157 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
158
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
159 static void mul_thrmat_c(struct vf_priv_s *p,int q)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
160 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
161 int a;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
162 for(a=0;a<64;a++)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
163 ((short*)p->threshold_mtx)[a]=q * ((short*)p->threshold_mtx_noq)[a];//ints faster in C
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
164 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
165
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
166 static void column_fidct_c(int16_t* thr_adr, DCTELEM *data, DCTELEM *output, int cnt);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
167 static void row_idct_c(DCTELEM* workspace,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
168 int16_t* output_adr, int output_stride, int cnt);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
169 static void row_fdct_c(DCTELEM *data, const uint8_t *pixels, int line_size, int cnt);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
170
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
171 //this is rather ugly, but there is no need for function pointers
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
172 #define store_slice_s store_slice_c
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
173 #define store_slice2_s store_slice2_c
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
174 #define mul_thrmat_s mul_thrmat_c
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
175 #define column_fidct_s column_fidct_c
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
176 #define row_idct_s row_idct_c
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
177 #define row_fdct_s row_fdct_c
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
178
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
179 #else /* HAVE_MMX */
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
180
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
181 //This func reads from 1 slice, 1 and clears 0 & 1
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
182 static void store_slice_mmx(uint8_t *dst, int16_t *src, long dst_stride, long src_stride, long width, long height, long log2_scale)
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
183 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
184 const uint8_t *od=&dither[0][0];
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
185 const uint8_t *end=&dither[height][0];
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
186 width = (width+7)&~7;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
187 dst_stride-=width;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
188 //src_stride=(src_stride-width)*2;
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 26727
diff changeset
189 __asm__ volatile(
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
190 "mov %5, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
191 "mov %6, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
192 "mov %7, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
193 "mov %1, %%"REG_a" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
194 "movd %%"REG_d", %%mm5 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
195 "xor $-1, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
196 "mov %%"REG_a", %%"REG_c" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
197 "add $7, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
198 "neg %%"REG_a" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
199 "sub %0, %%"REG_c" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
200 "add %%"REG_c", %%"REG_c" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
201 "movd %%"REG_d", %%mm2 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
202 "mov %%"REG_c", %1 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
203 "mov %2, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
204 "shl $4, %%"REG_a" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
205
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
206 "2: \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
207 "movq (%%"REG_d"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
208 "movq %%mm3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
209 "pxor %%mm7, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
210 "punpcklbw %%mm7, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
211 "punpckhbw %%mm7, %%mm4 \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
212 "mov %0, %%"REG_c" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
213 "psraw %%mm5, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
214 "psraw %%mm5, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
215 "1: \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
216 "movq %%mm7, (%%"REG_S",%%"REG_a",) \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
217 "movq (%%"REG_S"), %%mm0 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
218 "movq 8(%%"REG_S"), %%mm1 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
219
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
220 "movq %%mm7, 8(%%"REG_S",%%"REG_a",) \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
221 "paddw %%mm3, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
222 "paddw %%mm4, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
223
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
224 "movq %%mm7, (%%"REG_S") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
225 "psraw %%mm2, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
226 "psraw %%mm2, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
227
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
228 "movq %%mm7, 8(%%"REG_S") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
229 "packuswb %%mm1, %%mm0 \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
230 "add $16, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
231
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
232 "movq %%mm0, (%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
233 "add $8, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
234 "sub $8, %%"REG_c" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
235 "jg 1b \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
236 "add %1, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
237 "add $8, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
238 "add %3, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
239 "cmp %4, %%"REG_d" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
240 "jl 2b \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
241
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
242 :
29310
c35891e664af replace "g" asm constraint by "erm" since "g" allows 64bit immediates while
gpoirier
parents: 29263
diff changeset
243 : "m" (width), "m" (src_stride), "erm" (od), "m" (dst_stride), "erm" (end),
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
244 "m" (log2_scale), "m" (src), "m" (dst) //input
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
245 : "%"REG_a, "%"REG_c, "%"REG_d, "%"REG_S, "%"REG_D
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
246 );
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
247 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
248
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
249 //This func reads from 2 slices, 0 & 2 and clears 2-nd
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
250 static void store_slice2_mmx(uint8_t *dst, int16_t *src, long dst_stride, long src_stride, long width, long height, long log2_scale)
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
251 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
252 const uint8_t *od=&dither[0][0];
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
253 const uint8_t *end=&dither[height][0];
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
254 width = (width+7)&~7;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
255 dst_stride-=width;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
256 //src_stride=(src_stride-width)*2;
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 26727
diff changeset
257 __asm__ volatile(
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
258 "mov %5, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
259 "mov %6, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
260 "mov %7, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
261 "mov %1, %%"REG_a" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
262 "movd %%"REG_d", %%mm5 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
263 "xor $-1, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
264 "mov %%"REG_a", %%"REG_c" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
265 "add $7, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
266 "sub %0, %%"REG_c" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
267 "add %%"REG_c", %%"REG_c" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
268 "movd %%"REG_d", %%mm2 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
269 "mov %%"REG_c", %1 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
270 "mov %2, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
271 "shl $5, %%"REG_a" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
272
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
273 "2: \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
274 "movq (%%"REG_d"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
275 "movq %%mm3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
276 "pxor %%mm7, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
277 "punpcklbw %%mm7, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
278 "punpckhbw %%mm7, %%mm4 \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
279 "mov %0, %%"REG_c" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
280 "psraw %%mm5, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
281 "psraw %%mm5, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
282 "1: \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
283 "movq (%%"REG_S"), %%mm0 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
284 "movq 8(%%"REG_S"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
285 "paddw %%mm3, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
286
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
287 "paddw (%%"REG_S",%%"REG_a",), %%mm0 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
288 "paddw %%mm4, %%mm1 \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
289 "movq 8(%%"REG_S",%%"REG_a",), %%mm6 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
290
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
291 "movq %%mm7, (%%"REG_S",%%"REG_a",) \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
292 "psraw %%mm2, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
293 "paddw %%mm6, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
294
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
295 "movq %%mm7, 8(%%"REG_S",%%"REG_a",) \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
296 "psraw %%mm2, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
297 "packuswb %%mm1, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
298
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
299 "movq %%mm0, (%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
300 "add $16, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
301 "add $8, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
302 "sub $8, %%"REG_c" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
303 "jg 1b \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
304 "add %1, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
305 "add $8, %%"REG_d" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
306 "add %3, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
307 "cmp %4, %%"REG_d" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
308 "jl 2b \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
309
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
310 :
29310
c35891e664af replace "g" asm constraint by "erm" since "g" allows 64bit immediates while
gpoirier
parents: 29263
diff changeset
311 : "m" (width), "m" (src_stride), "erm" (od), "m" (dst_stride), "erm" (end),
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
312 "m" (log2_scale), "m" (src), "m" (dst) //input
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
313 : "%"REG_a, "%"REG_c, "%"REG_d, "%"REG_D, "%"REG_S
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
314 );
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
315 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
316
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
317 static void mul_thrmat_mmx(struct vf_priv_s *p, int q)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
318 {
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
319 uint64_t *adr=&p->threshold_mtx_noq[0];
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 26727
diff changeset
320 __asm__ volatile(
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
321 "movd %0, %%mm7 \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
322 "add $8*8*2, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
323 "movq 0*8(%%"REG_S"), %%mm0 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
324 "punpcklwd %%mm7, %%mm7 \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
325 "movq 1*8(%%"REG_S"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
326 "punpckldq %%mm7, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
327 "pmullw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
328
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
329 "movq 2*8(%%"REG_S"), %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
330 "pmullw %%mm7, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
331
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
332 "movq 3*8(%%"REG_S"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
333 "pmullw %%mm7, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
334
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
335 "movq %%mm0, 0*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
336 "movq 4*8(%%"REG_S"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
337 "pmullw %%mm7, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
338
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
339 "movq %%mm1, 1*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
340 "movq 5*8(%%"REG_S"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
341 "pmullw %%mm7, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
342
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
343 "movq %%mm2, 2*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
344 "movq 6*8(%%"REG_S"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
345 "pmullw %%mm7, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
346
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
347 "movq %%mm3, 3*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
348 "movq 7*8+0*8(%%"REG_S"), %%mm0 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
349 "pmullw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
350
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
351 "movq %%mm4, 4*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
352 "movq 7*8+1*8(%%"REG_S"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
353 "pmullw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
354
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
355 "movq %%mm5, 5*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
356 "movq 7*8+2*8(%%"REG_S"), %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
357 "pmullw %%mm7, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
358
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
359 "movq %%mm6, 6*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
360 "movq 7*8+3*8(%%"REG_S"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
361 "pmullw %%mm7, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
362
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
363 "movq %%mm0, 7*8+0*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
364 "movq 7*8+4*8(%%"REG_S"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
365 "pmullw %%mm7, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
366
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
367 "movq %%mm1, 7*8+1*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
368 "movq 7*8+5*8(%%"REG_S"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
369 "pmullw %%mm7, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
370
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
371 "movq %%mm2, 7*8+2*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
372 "movq 7*8+6*8(%%"REG_S"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
373 "pmullw %%mm7, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
374
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
375 "movq %%mm3, 7*8+3*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
376 "movq 14*8+0*8(%%"REG_S"), %%mm0 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
377 "pmullw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
378
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
379 "movq %%mm4, 7*8+4*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
380 "movq 14*8+1*8(%%"REG_S"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
381 "pmullw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
382
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
383 "movq %%mm5, 7*8+5*8(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
384 "pmullw %%mm7, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
385
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
386 "movq %%mm6, 7*8+6*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
387 "movq %%mm0, 14*8+0*8(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
388 "movq %%mm1, 14*8+1*8(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
389
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
390 : "+g" (q), "+S" (adr), "+D" (adr)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
391 :
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
392 );
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
393 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
394
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
395 static void column_fidct_mmx(int16_t* thr_adr, DCTELEM *data, DCTELEM *output, int cnt);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
396 static void row_idct_mmx(DCTELEM* workspace,
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
397 int16_t* output_adr, int output_stride, int cnt);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
398 static void row_fdct_mmx(DCTELEM *data, const uint8_t *pixels, int line_size, int cnt);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
399
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
400 #define store_slice_s store_slice_mmx
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
401 #define store_slice2_s store_slice2_mmx
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
402 #define mul_thrmat_s mul_thrmat_mmx
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
403 #define column_fidct_s column_fidct_mmx
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
404 #define row_idct_s row_idct_mmx
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
405 #define row_fdct_s row_fdct_mmx
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
406 #endif // HAVE_MMX
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
407
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
408 static void filter(struct vf_priv_s *p, uint8_t *dst, uint8_t *src,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
409 int dst_stride, int src_stride,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
410 int width, int height,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
411 uint8_t *qp_store, int qp_stride, int is_luma)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
412 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
413 int x, x0, y, es, qy, t;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
414 const int stride= is_luma ? p->temp_stride : (width+16);//((width+16+15)&(~15))
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
415 const int step=6-p->log2_count;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
416 const int qps= 3 + is_luma;
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
417 int32_t __attribute__((aligned(32))) block_align[4*8*BLOCKSZ+ 4*8*BLOCKSZ];
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
418 DCTELEM *block= (DCTELEM *)block_align;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
419 DCTELEM *block3=(DCTELEM *)(block_align+4*8*BLOCKSZ);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
420
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
421 memset(block3, 0, 4*8*BLOCKSZ);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
422
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
423 //p->src=src-src_stride*8-8;//!
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
424 if (!src || !dst) return; // HACK avoid crash for Y8 colourspace
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
425 for(y=0; y<height; y++){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
426 int index= 8 + 8*stride + y*stride;
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21578
diff changeset
427 fast_memcpy(p->src + index, src + y*src_stride, width);//this line can be avoided by using DR & user fr.buffers
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
428 for(x=0; x<8; x++){
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
429 p->src[index - x - 1]= p->src[index + x ];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
430 p->src[index + width + x ]= p->src[index + width - x - 1];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
431 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
432 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
433 for(y=0; y<8; y++){
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21578
diff changeset
434 fast_memcpy(p->src + ( 7-y)*stride, p->src + ( y+8)*stride, stride);
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21578
diff changeset
435 fast_memcpy(p->src + (height+8+y)*stride, p->src + (height-y+7)*stride, stride);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
436 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
437 //FIXME (try edge emu)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
438
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
439 for(y=8; y<24; y++)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
440 memset(p->temp+ 8 +y*stride, 0,width*sizeof(int16_t));
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
441
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
442 for(y=step; y<height+8; y+=step){ //step= 1,2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
443 qy=y-4;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
444 if (qy>height-1) qy=height-1;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
445 if (qy<0) qy=0;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
446 qy=(qy>>qps)*qp_stride;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
447 row_fdct_s(block, p->src + y*stride +2-(y&1), stride, 2);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
448 for(x0=0; x0<width+8-8*(BLOCKSZ-1); x0+=8*(BLOCKSZ-1)){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
449 row_fdct_s(block+8*8, p->src + y*stride+8+x0 +2-(y&1), stride, 2*(BLOCKSZ-1));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
450 if(p->qp)
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
451 column_fidct_s((int16_t*)(&p->threshold_mtx[0]), block+0*8, block3+0*8, 8*(BLOCKSZ-1)); //yes, this is a HOTSPOT
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
452 else
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
453 for (x=0; x<8*(BLOCKSZ-1); x+=8) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
454 t=x+x0-2; //correct t=x+x0-2-(y&1), but its the same
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
455 if (t<0) t=0;//t always < width-2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
456 t=qp_store[qy+(t>>qps)];
17225
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
457 if(p->mpeg2) t>>=1; //copy p->mpeg2,prev_q to locals?
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
458 if (t!=p->prev_q) p->prev_q=t, mul_thrmat_s(p, t);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
459 column_fidct_s((int16_t*)(&p->threshold_mtx[0]), block+x*8, block3+x*8, 8); //yes, this is a HOTSPOT
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
460 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
461 row_idct_s(block3+0*8, p->temp + (y&15)*stride+x0+2-(y&1), stride, 2*(BLOCKSZ-1));
25568
707b810a2558 fix artifacts in -vf fspp. regression in r23476.
lorenm
parents: 25221
diff changeset
462 memmove(block, block+(BLOCKSZ-1)*64, 8*8*sizeof(DCTELEM)); //cycling
707b810a2558 fix artifacts in -vf fspp. regression in r23476.
lorenm
parents: 25221
diff changeset
463 memmove(block3, block3+(BLOCKSZ-1)*64, 6*8*sizeof(DCTELEM));
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
464 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
465 //
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
466 es=width+8-x0; // 8, ...
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
467 if (es>8)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
468 row_fdct_s(block+8*8, p->src + y*stride+8+x0 +2-(y&1), stride, (es-4)>>2);
21578
9345eb2d8c8f count needs to be even
henry
parents: 20585
diff changeset
469 column_fidct_s((int16_t*)(&p->threshold_mtx[0]), block, block3, es&(~1));
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
470 row_idct_s(block3+0*8, p->temp + (y&15)*stride+x0+2-(y&1), stride, es>>2);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
471 {const int y1=y-8+step;//l5-7 l4-6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
472 if (!(y1&7) && y1) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
473 if (y1&8) store_slice_s(dst + (y1-8)*dst_stride, p->temp+ 8 +8*stride,
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
474 dst_stride, stride, width, 8, 5-p->log2_count);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
475 else store_slice2_s(dst + (y1-8)*dst_stride, p->temp+ 8 +0*stride,
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
476 dst_stride, stride, width, 8, 5-p->log2_count);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
477 } }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
478 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
479
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
480 if (y&7) { // == height & 7
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
481 if (y&8) store_slice_s(dst + ((y-8)&~7)*dst_stride, p->temp+ 8 +8*stride,
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
482 dst_stride, stride, width, y&7, 5-p->log2_count);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
483 else store_slice2_s(dst + ((y-8)&~7)*dst_stride, p->temp+ 8 +0*stride,
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
484 dst_stride, stride, width, y&7, 5-p->log2_count);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
485 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
486 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
487
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
488 static int config(struct vf_instance_s* vf,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
489 int width, int height, int d_width, int d_height,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
490 unsigned int flags, unsigned int outfmt)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
491 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
492 int h= (height+16+15)&(~15);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
493
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
494 vf->priv->temp_stride= (width+16+15)&(~15);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
495 vf->priv->temp= (int16_t*)av_mallocz(vf->priv->temp_stride*3*8*sizeof(int16_t));
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
496 //this can also be avoided, see above
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
497 vf->priv->src = (uint8_t*)av_malloc(vf->priv->temp_stride*h*sizeof(uint8_t));
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
498
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
499 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
500 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
501
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
502 static void get_image(struct vf_instance_s* vf, mp_image_t *mpi)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
503 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
504 if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
505 // ok, we can do pp in-place (or pp disabled):
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
506 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
16018
bdf1b4ecb906 use stored dimensions instead of visible one when (vf_)get_image is called
iive
parents: 15651
diff changeset
507 mpi->type, mpi->flags, mpi->width, mpi->height);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
508 mpi->planes[0]=vf->dmpi->planes[0];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
509 mpi->stride[0]=vf->dmpi->stride[0];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
510 mpi->width=vf->dmpi->width;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
511 if(mpi->flags&MP_IMGFLAG_PLANAR){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
512 mpi->planes[1]=vf->dmpi->planes[1];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
513 mpi->planes[2]=vf->dmpi->planes[2];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
514 mpi->stride[1]=vf->dmpi->stride[1];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
515 mpi->stride[2]=vf->dmpi->stride[2];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
516 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
517 mpi->flags|=MP_IMGFLAG_DIRECT;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
518 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
519
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17523
diff changeset
520 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts)
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
521 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
522 mp_image_t *dmpi;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
523 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
524 // no DR, so get a new image! hope we'll get DR buffer:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
525 dmpi=vf_get_image(vf->next,mpi->imgfmt,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
526 MP_IMGTYPE_TEMP,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
527 MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
16018
bdf1b4ecb906 use stored dimensions instead of visible one when (vf_)get_image is called
iive
parents: 15651
diff changeset
528 mpi->width,mpi->height);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
529 vf_clone_mpi_attributes(dmpi, mpi);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
530 }else{
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
531 dmpi=vf->dmpi;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
532 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
533
17225
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
534 vf->priv->mpeg2= mpi->qscale_type;
17133
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
535 if(mpi->pict_type != 3 && mpi->qscale && !vf->priv->qp){
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
536 if(!vf->priv->non_b_qp)
20585
68b55a823fd4 qp height should be in macroblocks, not pixels
henry
parents: 19372
diff changeset
537 vf->priv->non_b_qp= malloc(mpi->qstride * ((mpi->h + 15) >> 4));
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 21578
diff changeset
538 fast_memcpy(vf->priv->non_b_qp, mpi->qscale, mpi->qstride * ((mpi->h + 15) >> 4));
17133
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
539 }
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
540 if(vf->priv->log2_count || !(mpi->flags&MP_IMGFLAG_DIRECT)){
17133
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
541 char *qp_tab= vf->priv->non_b_qp;
17225
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
542 if(vf->priv->bframes || !qp_tab)
17133
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
543 qp_tab= mpi->qscale;
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
544
17225
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
545 if(qp_tab || vf->priv->qp){
17133
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
546 filter(vf->priv, dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0],
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
547 mpi->w, mpi->h, qp_tab, mpi->qstride, 1);
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
548 filter(vf->priv, dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1],
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
549 mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, qp_tab, mpi->qstride, 0);
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
550 filter(vf->priv, dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2],
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
551 mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, qp_tab, mpi->qstride, 0);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
552 }else{
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
553 memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, dmpi->stride[0], mpi->stride[0]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
554 memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[1], mpi->stride[1]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
555 memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[2], mpi->stride[2]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
556 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
557 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
558
28290
25337a2147e7 Lots and lots of #ifdef ARCH_... -> #if ARCH_...
reimar
parents: 27754
diff changeset
559 #if HAVE_MMX
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 26727
diff changeset
560 if(gCpuCaps.hasMMX) __asm__ volatile ("emms\n\t");
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
561 #endif
28290
25337a2147e7 Lots and lots of #ifdef ARCH_... -> #if ARCH_...
reimar
parents: 27754
diff changeset
562 #if HAVE_MMX2
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 26727
diff changeset
563 if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t");
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
564 #endif
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17523
diff changeset
565 return vf_next_put_image(vf,dmpi, pts);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
566 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
567
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
568 static void uninit(struct vf_instance_s* vf)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
569 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
570 if(!vf->priv) return;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
571
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
572 if(vf->priv->temp) av_free(vf->priv->temp);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
573 vf->priv->temp= NULL;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
574 if(vf->priv->src) av_free(vf->priv->src);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
575 vf->priv->src= NULL;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
576 //if(vf->priv->avctx) free(vf->priv->avctx);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
577 //vf->priv->avctx= NULL;
17133
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
578 if(vf->priv->non_b_qp) free(vf->priv->non_b_qp);
a2b24e0d7772 prevent flicker on b-frames, trivial port from vf_spp
henry
parents: 17012
diff changeset
579 vf->priv->non_b_qp= NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
580
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
581 av_free(vf->priv);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
582 vf->priv=NULL;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
583 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
584
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
585 //===========================================================================//
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
586
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
587 static int query_format(struct vf_instance_s* vf, unsigned int fmt)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
588 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
589 switch(fmt){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
590 case IMGFMT_YVU9:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
591 case IMGFMT_IF09:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
592 case IMGFMT_YV12:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
593 case IMGFMT_I420:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
594 case IMGFMT_IYUV:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
595 case IMGFMT_CLPL:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
596 case IMGFMT_Y800:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
597 case IMGFMT_Y8:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
598 case IMGFMT_444P:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
599 case IMGFMT_422P:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
600 case IMGFMT_411P:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
601 return vf_next_query_format(vf,fmt);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
602 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
603 return 0;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
604 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
605
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
606 static int control(struct vf_instance_s* vf, int request, void* data)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
607 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
608 switch(request){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
609 case VFCTRL_QUERY_MAX_PP_LEVEL:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
610 return 5;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
611 case VFCTRL_SET_PP_LEVEL:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
612 vf->priv->log2_count= *((unsigned int*)data);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
613 if (vf->priv->log2_count < 4) vf->priv->log2_count=4;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
614 return CONTROL_TRUE;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
615 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
616 return vf_next_control(vf,request,data);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
617 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
618
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
619 static int open(vf_instance_t *vf, char* args)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
620 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
621 int i=0, bias;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
622 int custom_threshold_m[64];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
623 int log2c=-1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
624
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
625 vf->config=config;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
626 vf->put_image=put_image;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
627 vf->get_image=get_image;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
628 vf->query_format=query_format;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
629 vf->uninit=uninit;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
630 vf->control= control;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
631 vf->priv=av_mallocz(sizeof(struct vf_priv_s));//assumes align 16 !
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
632
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
633 avcodec_init();
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
634
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
635 //vf->priv->avctx= avcodec_alloc_context();
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
636 //dsputil_init(&vf->priv->dsp, vf->priv->avctx);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
637
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
638 vf->priv->log2_count= 4;
17225
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
639 vf->priv->bframes = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
640
17225
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
641 if (args) sscanf(args, "%d:%d:%d:%d", &log2c, &vf->priv->qp, &i, &vf->priv->bframes);
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
642
ec9888363742 reverse the H264 hack
henry
parents: 17223
diff changeset
643 if( log2c >=4 && log2c <=5 )
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
644 vf->priv->log2_count = log2c;
15651
6a0494e09435 sanity checks for options; treat quality > 5 as 5, not 4
henry
parents: 15634
diff changeset
645 else if( log2c >= 6 )
6a0494e09435 sanity checks for options; treat quality > 5 as 5, not 4
henry
parents: 15634
diff changeset
646 vf->priv->log2_count = 5;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
647
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
648 if(vf->priv->qp < 0)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
649 vf->priv->qp = 0;
15651
6a0494e09435 sanity checks for options; treat quality > 5 as 5, not 4
henry
parents: 15634
diff changeset
650
6a0494e09435 sanity checks for options; treat quality > 5 as 5, not 4
henry
parents: 15634
diff changeset
651 if (i < -15) i = -15;
6a0494e09435 sanity checks for options; treat quality > 5 as 5, not 4
henry
parents: 15634
diff changeset
652 if (i > 32) i = 32;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
653
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
654 bias= (1<<4)+i; //regulable
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
655 vf->priv->prev_q=0;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
656 //
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
657 for(i=0;i<64;i++) //FIXME: tune custom_threshold[] and remove this !
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
658 custom_threshold_m[i]=(int)(custom_threshold[i]*(bias/71.)+ 0.5);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
659 for(i=0;i<8;i++){
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
660 vf->priv->threshold_mtx_noq[2*i]=(uint64_t)custom_threshold_m[i*8+2]
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
661 |(((uint64_t)custom_threshold_m[i*8+6])<<16)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
662 |(((uint64_t)custom_threshold_m[i*8+0])<<32)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
663 |(((uint64_t)custom_threshold_m[i*8+4])<<48);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
664 vf->priv->threshold_mtx_noq[2*i+1]=(uint64_t)custom_threshold_m[i*8+5]
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
665 |(((uint64_t)custom_threshold_m[i*8+3])<<16)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
666 |(((uint64_t)custom_threshold_m[i*8+1])<<32)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
667 |(((uint64_t)custom_threshold_m[i*8+7])<<48);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
668 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
669
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
670 if (vf->priv->qp) vf->priv->prev_q=vf->priv->qp, mul_thrmat_s(vf->priv, vf->priv->qp);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
671
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
672 return 1;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
673 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
674
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 24976
diff changeset
675 const vf_info_t vf_info_fspp = {
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
676 "fast simple postprocess",
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
677 "fspp",
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
678 "Michael Niedermayer, Nikolaj Poroshin",
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
679 "",
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
680 open,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
681 NULL
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
682 };
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
683
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
684 //====================================================================
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
685 //Specific spp's dct, idct and threshold functions
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
686 //I'd prefer to have them in the separate file.
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
687
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
688 //#define MANGLE(a) #a
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
689
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
690 //typedef int16_t DCTELEM; //! only int16_t
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
691
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
692 #define DCTSIZE 8
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
693 #define DCTSIZE_S "8"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
694
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
695 #define FIX(x,s) ((int) ((x) * (1<<s) + 0.5)&0xffff)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
696 #define C64(x) ((uint64_t)((x)|(x)<<16))<<32 | (uint64_t)(x) | (uint64_t)(x)<<16
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
697 #define FIX64(x,s) C64(FIX(x,s))
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
698
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
699 #define MULTIPLY16H(x,k) (((x)*(k))>>16)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
700 #define THRESHOLD(r,x,t) if(((unsigned)((x)+t))>t*2) r=(x);else r=0;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
701 #define DESCALE(x,n) (((x) + (1 << ((n)-1))) >> n)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
702
28290
25337a2147e7 Lots and lots of #ifdef ARCH_... -> #if ARCH_...
reimar
parents: 27754
diff changeset
703 #if HAVE_MMX
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
704
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
705 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_382683433)=FIX64(0.382683433, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
706 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_541196100)=FIX64(0.541196100, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
707 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_707106781)=FIX64(0.707106781, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
708 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_306562965)=FIX64(1.306562965, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
709
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
710 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_414213562_A)=FIX64(1.414213562, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
711
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
712 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_847759065)=FIX64(1.847759065, 13);
25901
c2210e68a2a9 Simplify: use DECLARE_ASM_CONST
reimar
parents: 25568
diff changeset
713 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_2_613125930)=FIX64(-2.613125930, 13); //-
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
714 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_414213562)=FIX64(1.414213562, 13);
25901
c2210e68a2a9 Simplify: use DECLARE_ASM_CONST
reimar
parents: 25568
diff changeset
715 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_082392200)=FIX64(1.082392200, 13);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
716 //for t3,t5,t7 == 0 shortcut
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
717 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_847759065)=FIX64(0.847759065, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
718 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_566454497)=FIX64(0.566454497, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
719 DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_198912367)=FIX64(0.198912367, 14);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
720
25901
c2210e68a2a9 Simplify: use DECLARE_ASM_CONST
reimar
parents: 25568
diff changeset
721 DECLARE_ASM_CONST(8, uint64_t, MM_DESCALE_RND)=C64(4);
c2210e68a2a9 Simplify: use DECLARE_ASM_CONST
reimar
parents: 25568
diff changeset
722 DECLARE_ASM_CONST(8, uint64_t, MM_2)=C64(2);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
723
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
724 #else /* !HAVE_MMX */
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
725
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
726 typedef int32_t int_simd16_t;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
727 static const int16_t FIX_0_382683433=FIX(0.382683433, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
728 static const int16_t FIX_0_541196100=FIX(0.541196100, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
729 static const int16_t FIX_0_707106781=FIX(0.707106781, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
730 static const int16_t FIX_1_306562965=FIX(1.306562965, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
731 static const int16_t FIX_1_414213562_A=FIX(1.414213562, 14);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
732 static const int16_t FIX_1_847759065=FIX(1.847759065, 13);
25902
15ab840747e2 mark constants as such
reimar
parents: 25901
diff changeset
733 static const int16_t FIX_2_613125930=FIX(-2.613125930, 13); //-
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
734 static const int16_t FIX_1_414213562=FIX(1.414213562, 13);
25902
15ab840747e2 mark constants as such
reimar
parents: 25901
diff changeset
735 static const int16_t FIX_1_082392200=FIX(1.082392200, 13);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
736
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
737 #endif
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
738
28290
25337a2147e7 Lots and lots of #ifdef ARCH_... -> #if ARCH_...
reimar
parents: 27754
diff changeset
739 #if !HAVE_MMX
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
740
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
741 static void column_fidct_c(int16_t* thr_adr, DCTELEM *data, DCTELEM *output, int cnt)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
742 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
743 int_simd16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
744 int_simd16_t tmp10, tmp11, tmp12, tmp13;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
745 int_simd16_t z1,z2,z3,z4,z5, z10, z11, z12, z13;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
746 int_simd16_t d0, d1, d2, d3, d4, d5, d6, d7;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
747
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
748 DCTELEM* dataptr;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
749 DCTELEM* wsptr;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
750 int16_t *threshold;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
751 int ctr;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
752
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
753 dataptr = data;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
754 wsptr = output;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
755
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
756 for (; cnt > 0; cnt-=2) { //start positions
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
757 threshold=(int16_t*)thr_adr;//threshold_mtx
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
758 for (ctr = DCTSIZE; ctr > 0; ctr--) {
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
759 // Process columns from input, add to output.
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
760 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
761 tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
762
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
763 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
764 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
765
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
766 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
767 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
768
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
769 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
770 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
771
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
772 // Even part of FDCT
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
773
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
774 tmp10 = tmp0 + tmp3;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
775 tmp13 = tmp0 - tmp3;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
776 tmp11 = tmp1 + tmp2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
777 tmp12 = tmp1 - tmp2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
778
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
779 d0 = tmp10 + tmp11;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
780 d4 = tmp10 - tmp11;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
781
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
782 z1 = MULTIPLY16H((tmp12 + tmp13) <<2, FIX_0_707106781);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
783 d2 = tmp13 + z1;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
784 d6 = tmp13 - z1;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
785
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
786 // Even part of IDCT
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
787
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
788 THRESHOLD(tmp0, d0, threshold[0*8]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
789 THRESHOLD(tmp1, d2, threshold[2*8]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
790 THRESHOLD(tmp2, d4, threshold[4*8]);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
791 THRESHOLD(tmp3, d6, threshold[6*8]);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
792 tmp0+=2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
793 tmp10 = (tmp0 + tmp2)>>2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
794 tmp11 = (tmp0 - tmp2)>>2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
795
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
796 tmp13 = (tmp1 + tmp3)>>2; //+2 ! (psnr decides)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
797 tmp12 = MULTIPLY16H((tmp1 - tmp3), FIX_1_414213562_A) - tmp13; //<<2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
798
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
799 tmp0 = tmp10 + tmp13; //->temps
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
800 tmp3 = tmp10 - tmp13; //->temps
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
801 tmp1 = tmp11 + tmp12; //->temps
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
802 tmp2 = tmp11 - tmp12; //->temps
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
803
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
804 // Odd part of FDCT
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
805
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
806 tmp10 = tmp4 + tmp5;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
807 tmp11 = tmp5 + tmp6;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
808 tmp12 = tmp6 + tmp7;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
809
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
810 z5 = MULTIPLY16H((tmp10 - tmp12)<<2, FIX_0_382683433);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
811 z2 = MULTIPLY16H(tmp10 <<2, FIX_0_541196100) + z5;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
812 z4 = MULTIPLY16H(tmp12 <<2, FIX_1_306562965) + z5;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
813 z3 = MULTIPLY16H(tmp11 <<2, FIX_0_707106781);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
814
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
815 z11 = tmp7 + z3;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
816 z13 = tmp7 - z3;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
817
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
818 d5 = z13 + z2;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
819 d3 = z13 - z2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
820 d1 = z11 + z4;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
821 d7 = z11 - z4;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
822
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
823 // Odd part of IDCT
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
824
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
825 THRESHOLD(tmp4, d1, threshold[1*8]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
826 THRESHOLD(tmp5, d3, threshold[3*8]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
827 THRESHOLD(tmp6, d5, threshold[5*8]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
828 THRESHOLD(tmp7, d7, threshold[7*8]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
829
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
830 //Simd version uses here a shortcut for the tmp5,tmp6,tmp7 == 0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
831 z13 = tmp6 + tmp5;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
832 z10 = (tmp6 - tmp5)<<1;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
833 z11 = tmp4 + tmp7;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
834 z12 = (tmp4 - tmp7)<<1;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
835
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
836 tmp7 = (z11 + z13)>>2; //+2 !
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
837 tmp11 = MULTIPLY16H((z11 - z13)<<1, FIX_1_414213562);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
838 z5 = MULTIPLY16H(z10 + z12, FIX_1_847759065);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
839 tmp10 = MULTIPLY16H(z12, FIX_1_082392200) - z5;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
840 tmp12 = MULTIPLY16H(z10, FIX_2_613125930) + z5; // - !!
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
841
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
842 tmp6 = tmp12 - tmp7;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
843 tmp5 = tmp11 - tmp6;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
844 tmp4 = tmp10 + tmp5;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
845
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
846 wsptr[DCTSIZE*0]+= (tmp0 + tmp7);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
847 wsptr[DCTSIZE*1]+= (tmp1 + tmp6);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
848 wsptr[DCTSIZE*2]+= (tmp2 + tmp5);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
849 wsptr[DCTSIZE*3]+= (tmp3 - tmp4);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
850 wsptr[DCTSIZE*4]+= (tmp3 + tmp4);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
851 wsptr[DCTSIZE*5]+= (tmp2 - tmp5);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
852 wsptr[DCTSIZE*6]= (tmp1 - tmp6);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
853 wsptr[DCTSIZE*7]= (tmp0 - tmp7);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
854 //
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
855 dataptr++; //next column
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
856 wsptr++;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
857 threshold++;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
858 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
859 dataptr+=8; //skip each second start pos
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
860 wsptr +=8;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
861 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
862 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
863
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
864 #else /* HAVE_MMX */
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
865
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
866 static void column_fidct_mmx(int16_t* thr_adr, DCTELEM *data, DCTELEM *output, int cnt)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
867 {
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
868 uint64_t __attribute__((aligned(8))) temps[4];
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 26727
diff changeset
869 __asm__ volatile(
19372
6334c14b38eb Replace asmalign.h hack by ASMALIGN cpp macros from config.h.
diego
parents: 18131
diff changeset
870 ASMALIGN(4)
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
871 "1: \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
872 "movq "DCTSIZE_S"*0*2(%%"REG_S"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
873 //
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
874 "movq "DCTSIZE_S"*3*2(%%"REG_S"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
875 "movq %%mm1, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
876
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
877 "paddw "DCTSIZE_S"*7*2(%%"REG_S"), %%mm1 \n\t" //t0
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
878 "movq %%mm7, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
879
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
880 "paddw "DCTSIZE_S"*4*2(%%"REG_S"), %%mm7 \n\t" //t3
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
881 "movq %%mm1, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
882
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
883 "movq "DCTSIZE_S"*1*2(%%"REG_S"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
884 "psubw %%mm7, %%mm1 \n\t" //t13
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
885
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
886 "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
887 "movq %%mm6, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
888
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
889 "paddw "DCTSIZE_S"*6*2(%%"REG_S"), %%mm6 \n\t" //t1
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
890 "paddw %%mm7, %%mm5 \n\t" //t10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
891
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
892 "paddw "DCTSIZE_S"*5*2(%%"REG_S"), %%mm2 \n\t" //t2
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
893 "movq %%mm6, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
894
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
895 "paddw %%mm2, %%mm6 \n\t" //t11
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
896 "psubw %%mm2, %%mm7 \n\t" //t12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
897
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
898 "movq %%mm5, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
899 "paddw %%mm6, %%mm5 \n\t" //d0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
900 // i0 t13 t12 i3 i1 d0 - d4
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
901 "psubw %%mm6, %%mm2 \n\t" //d4
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
902 "paddw %%mm1, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
903
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
904 "movq 4*16(%%"REG_d"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
905 "psllw $2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
906
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
907 "psubw 0*16(%%"REG_d"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
908 "psubw %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
909
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
910 "paddusw 0*16(%%"REG_d"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
911 "paddusw %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
912
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
913 "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
914 //
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
915 "paddw 0*16(%%"REG_d"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
916 "paddw %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
917
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
918 "psubusw 0*16(%%"REG_d"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
919 "psubusw %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
920
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
921 //This func is totally compute-bound, operates at huge speed. So, DC shortcut
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
922 // at this place isn't worthwhile due to BTB miss penalty (checked on Pent. 3).
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
923 //However, typical numbers: nondc - 29%%, dc - 46%%, zero - 25%%. All <> 0 case is very rare.
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
924 "paddw "MANGLE(MM_2)", %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
925 "movq %%mm2, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
926
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
927 "paddw %%mm5, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
928 "psubw %%mm6, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
929
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
930 "movq %%mm1, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
931 "paddw %%mm7, %%mm1 \n\t" //d2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
932
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
933 "psubw 2*16(%%"REG_d"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
934 "psubw %%mm7, %%mm6 \n\t" //d6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
935
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
936 "movq 6*16(%%"REG_d"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
937 "psraw $2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
938
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
939 "paddusw 2*16(%%"REG_d"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
940 "psubw %%mm7, %%mm6 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
941 // t7 d2 /t11 t4 t6 - d6 /t10
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
942
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
943 "paddw 2*16(%%"REG_d"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
944 "paddusw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
945
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
946 "psubusw 2*16(%%"REG_d"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
947 "paddw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
948
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
949 "psubw "DCTSIZE_S"*4*2(%%"REG_S"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
950 "psubusw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
951
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
952 //movq [edi+"DCTSIZE_S"*2*2], mm1
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
953 //movq [edi+"DCTSIZE_S"*6*2], mm6
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
954 "movq %%mm1, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
955 "psraw $2, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
956
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
957 "psubw "DCTSIZE_S"*6*2(%%"REG_S"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
958 "psubw %%mm6, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
959
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
960 "psubw "DCTSIZE_S"*7*2(%%"REG_S"), %%mm0 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
961 "paddw %%mm7, %%mm6 \n\t" //'t13
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
962
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
963 "psraw $2, %%mm6 \n\t" //paddw mm6, MM_2 !! ---
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
964 "movq %%mm2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
965
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
966 "pmulhw "MANGLE(MM_FIX_1_414213562_A)", %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
967 "paddw %%mm6, %%mm2 \n\t" //'t0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
968
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
969 "movq %%mm2, 0*8+%3 \n\t" //!
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
970 "psubw %%mm6, %%mm7 \n\t" //'t3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
971
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
972 "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
973 "psubw %%mm6, %%mm1 \n\t" //'t12
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
974
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
975 "psubw "DCTSIZE_S"*5*2(%%"REG_S"), %%mm2 \n\t" //t5
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
976 "movq %%mm5, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
977
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
978 "movq %%mm7, 3*8+%3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
979 "paddw %%mm2, %%mm3 \n\t" //t10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
980
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
981 "paddw %%mm4, %%mm2 \n\t" //t11
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
982 "paddw %%mm0, %%mm4 \n\t" //t12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
983
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
984 "movq %%mm3, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
985 "psubw %%mm4, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
986
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
987 "psllw $2, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
988 "psllw $2, %%mm7 \n\t" //opt for P6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
989
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
990 "pmulhw "MANGLE(MM_FIX_0_382683433)", %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
991 "psllw $2, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
992
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
993 "pmulhw "MANGLE(MM_FIX_0_541196100)", %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
994 "psllw $2, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
995
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
996 "pmulhw "MANGLE(MM_FIX_1_306562965)", %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
997 "paddw %%mm1, %%mm5 \n\t" //'t1
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
998
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
999 "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1000 "psubw %%mm1, %%mm6 \n\t" //'t2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1001 // t7 't12 't11 t4 t6 - 't13 't10 ---
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1002
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1003 "paddw %%mm3, %%mm7 \n\t" //z2
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1004
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1005 "movq %%mm5, 1*8+%3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1006 "paddw %%mm3, %%mm4 \n\t" //z4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1007
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1008 "movq 3*16(%%"REG_d"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1009 "movq %%mm0, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1010
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1011 "movq %%mm6, 2*8+%3 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1012 "psubw %%mm2, %%mm1 \n\t" //z13
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1013
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1014 //===
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1015 "paddw %%mm2, %%mm0 \n\t" //z11
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1016 "movq %%mm1, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1017
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1018 "movq 5*16(%%"REG_d"), %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1019 "psubw %%mm7, %%mm1 \n\t" //d3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1020
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1021 "paddw %%mm7, %%mm5 \n\t" //d5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1022 "psubw %%mm3, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1023
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1024 "movq 1*16(%%"REG_d"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1025 "psubw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1026
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1027 "movq %%mm0, %%mm6 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1028 "paddw %%mm4, %%mm0 \n\t" //d1
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1029
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1030 "paddusw %%mm3, %%mm1 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1031 "psubw %%mm4, %%mm6 \n\t" //d7
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1032
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1033 // d1 d3 - - - d5 d7 -
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1034 "movq 7*16(%%"REG_d"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1035 "psubw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1036
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1037 "psubw %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1038 "paddusw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1039
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1040 "paddusw %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1041 "paddw %%mm3, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1042
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1043 "paddw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1044 "paddw %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1045
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1046 "psubusw %%mm3, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1047 "psubusw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1048
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1049 "psubusw %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1050 "movq %%mm1, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1051
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1052 "por %%mm5, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1053 "paddusw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1054
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1055 "por %%mm6, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1056 "paddw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1057
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1058 "packssdw %%mm4, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1059 "psubusw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1060
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1061 "movd %%mm4, %%"REG_a" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1062 "or %%"REG_a", %%"REG_a" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1063 "jnz 2f \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1064 //movq [edi+"DCTSIZE_S"*3*2], mm1
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1065 //movq [edi+"DCTSIZE_S"*5*2], mm5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1066 //movq [edi+"DCTSIZE_S"*1*2], mm0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1067 //movq [edi+"DCTSIZE_S"*7*2], mm6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1068 // t4 t5 - - - t6 t7 -
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1069 //--- t4 (mm0) may be <>0; mm1, mm5, mm6 == 0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1070 //Typical numbers: nondc - 19%%, dc - 26%%, zero - 55%%. zero case alone isn't worthwhile
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1071 "movq 0*8+%3, %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1072 "movq %%mm0, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1073
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1074 "pmulhw "MANGLE(MM_FIX_0_847759065)", %%mm0 \n\t" //tmp6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1075 "movq %%mm1, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1076
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1077 "movq "DCTSIZE_S"*0*2(%%"REG_D"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1078 "movq %%mm2, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1079
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1080 "pmulhw "MANGLE(MM_FIX_0_566454497)", %%mm1 \n\t" //tmp5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1081 "paddw %%mm4, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1082
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1083 "movq 1*8+%3, %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1084 //paddw mm3, MM_2
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1085 "psraw $2, %%mm3 \n\t" //tmp7
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1086
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1087 "pmulhw "MANGLE(MM_FIX_0_198912367)", %%mm2 \n\t" //-tmp4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1088 "psubw %%mm3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1089
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1090 "movq "DCTSIZE_S"*1*2(%%"REG_D"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1091 "paddw %%mm3, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1092
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1093 "movq %%mm4, "DCTSIZE_S"*7*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1094 "paddw %%mm6, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1095
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1096 "movq 2*8+%3, %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1097 "psubw %%mm0, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1098
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1099 "movq "DCTSIZE_S"*2*2(%%"REG_D"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1100 "paddw %%mm0, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1101
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1102 "movq %%mm5, "DCTSIZE_S"*0*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1103 "paddw %%mm3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1104
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1105 "movq %%mm6, "DCTSIZE_S"*6*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1106 "psubw %%mm1, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1107
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1108 "movq "DCTSIZE_S"*5*2(%%"REG_D"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1109 "paddw %%mm1, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1110
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1111 "movq "DCTSIZE_S"*3*2(%%"REG_D"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1112 "paddw %%mm3, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1113
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1114 "movq 3*8+%3, %%mm0 \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1115 "add $8, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1116
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1117 "movq %%mm7, "DCTSIZE_S"*1*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1118 "paddw %%mm0, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1119
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1120 "movq %%mm4, "DCTSIZE_S"*2*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1121 "psubw %%mm2, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1122
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1123 "movq "DCTSIZE_S"*4*2(%%"REG_D"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1124 "paddw %%mm2, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1125
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1126 "movq %%mm5, "DCTSIZE_S"*5*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1127 "paddw %%mm0, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1128
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1129 "movq %%mm6, "DCTSIZE_S"*3*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1130
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1131 "movq %%mm7, "DCTSIZE_S"*4*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1132 "add $8, %%"REG_D" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1133 "jmp 4f \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1134
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1135 "2: \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1136 //--- non DC2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1137 //psraw mm1, 2 w/o it -> offset. thr1, thr1, thr1 (actually thr1, thr1, thr1-1)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1138 //psraw mm5, 2
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1139 //psraw mm0, 2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1140 //psraw mm6, 2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1141 "movq %%mm5, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1142 "psubw %%mm1, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1143
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1144 "psllw $1, %%mm5 \n\t" //'z10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1145 "paddw %%mm1, %%mm3 \n\t" //'z13
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1146
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1147 "movq %%mm0, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1148 "psubw %%mm6, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1149
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1150 "movq %%mm5, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1151 "psllw $1, %%mm0 \n\t" //'z12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1152
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1153 "pmulhw "MANGLE(MM_FIX_2_613125930)", %%mm1 \n\t" //-
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1154 "paddw %%mm0, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1155
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1156 "pmulhw "MANGLE(MM_FIX_1_847759065)", %%mm5 \n\t" //'z5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1157 "paddw %%mm6, %%mm2 \n\t" //'z11
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1158
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1159 "pmulhw "MANGLE(MM_FIX_1_082392200)", %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1160 "movq %%mm2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1161
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1162 //---
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1163 "movq 0*8+%3, %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1164 "psubw %%mm3, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1165
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1166 "psllw $1, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1167 "paddw %%mm3, %%mm7 \n\t" //'t7
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1168
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1169 "pmulhw "MANGLE(MM_FIX_1_414213562)", %%mm2 \n\t" //'t11
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1170 "movq %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1171 //paddw mm7, MM_2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1172 "psraw $2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1173
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1174 "paddw "DCTSIZE_S"*0*2(%%"REG_D"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1175 "psubw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1176
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1177 "movq 1*8+%3, %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1178 "paddw %%mm7, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1179
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1180 "movq %%mm6, "DCTSIZE_S"*7*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1181 "paddw %%mm5, %%mm1 \n\t" //'t12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1182
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1183 "movq %%mm4, "DCTSIZE_S"*0*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1184 "psubw %%mm7, %%mm1 \n\t" //'t6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1185
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1186 "movq 2*8+%3, %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1187 "psubw %%mm5, %%mm0 \n\t" //'t10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1188
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1189 "movq 3*8+%3, %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1190 "movq %%mm3, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1191
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1192 "paddw "DCTSIZE_S"*1*2(%%"REG_D"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1193 "psubw %%mm1, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1194
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1195 "psubw %%mm1, %%mm2 \n\t" //'t5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1196 "paddw %%mm1, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1197
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1198 "movq %%mm5, "DCTSIZE_S"*6*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1199 "movq %%mm7, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1200
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1201 "paddw "DCTSIZE_S"*2*2(%%"REG_D"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1202 "psubw %%mm2, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1203
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1204 "paddw "DCTSIZE_S"*5*2(%%"REG_D"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1205 "paddw %%mm2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1206
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1207 "movq %%mm3, "DCTSIZE_S"*1*2(%%"REG_D") \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1208 "paddw %%mm2, %%mm0 \n\t" //'t4
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1209
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1210 // 't4 't6 't5 - - - - 't7
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1211 "movq %%mm7, "DCTSIZE_S"*2*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1212 "movq %%mm6, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1213
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1214 "paddw "DCTSIZE_S"*4*2(%%"REG_D"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1215 "psubw %%mm0, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1216
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1217 "paddw "DCTSIZE_S"*3*2(%%"REG_D"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1218 "paddw %%mm0, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1219
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1220 "movq %%mm4, "DCTSIZE_S"*5*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1221 "add $8, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1222
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1223 "movq %%mm6, "DCTSIZE_S"*4*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1224
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1225 "movq %%mm1, "DCTSIZE_S"*3*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1226 "add $8, %%"REG_D" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1227
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1228 "4: \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1229 //=part 2 (the same)===========================================================
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1230 "movq "DCTSIZE_S"*0*2(%%"REG_S"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1231 //
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1232 "movq "DCTSIZE_S"*3*2(%%"REG_S"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1233 "movq %%mm1, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1234
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1235 "paddw "DCTSIZE_S"*7*2(%%"REG_S"), %%mm1 \n\t" //t0
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1236 "movq %%mm7, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1237
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1238 "paddw "DCTSIZE_S"*4*2(%%"REG_S"), %%mm7 \n\t" //t3
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1239 "movq %%mm1, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1240
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1241 "movq "DCTSIZE_S"*1*2(%%"REG_S"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1242 "psubw %%mm7, %%mm1 \n\t" //t13
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1243
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1244 "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1245 "movq %%mm6, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1246
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1247 "paddw "DCTSIZE_S"*6*2(%%"REG_S"), %%mm6 \n\t" //t1
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1248 "paddw %%mm7, %%mm5 \n\t" //t10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1249
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1250 "paddw "DCTSIZE_S"*5*2(%%"REG_S"), %%mm2 \n\t" //t2
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1251 "movq %%mm6, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1252
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1253 "paddw %%mm2, %%mm6 \n\t" //t11
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1254 "psubw %%mm2, %%mm7 \n\t" //t12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1255
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1256 "movq %%mm5, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1257 "paddw %%mm6, %%mm5 \n\t" //d0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1258 // i0 t13 t12 i3 i1 d0 - d4
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1259 "psubw %%mm6, %%mm2 \n\t" //d4
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1260 "paddw %%mm1, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1261
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1262 "movq 1*8+4*16(%%"REG_d"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1263 "psllw $2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1264
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1265 "psubw 1*8+0*16(%%"REG_d"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1266 "psubw %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1267
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1268 "paddusw 1*8+0*16(%%"REG_d"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1269 "paddusw %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1270
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1271 "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1272 //
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1273 "paddw 1*8+0*16(%%"REG_d"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1274 "paddw %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1275
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1276 "psubusw 1*8+0*16(%%"REG_d"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1277 "psubusw %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1278
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1279 //This func is totally compute-bound, operates at huge speed. So, DC shortcut
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1280 // at this place isn't worthwhile due to BTB miss penalty (checked on Pent. 3).
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1281 //However, typical numbers: nondc - 29%%, dc - 46%%, zero - 25%%. All <> 0 case is very rare.
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1282 "paddw "MANGLE(MM_2)", %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1283 "movq %%mm2, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1284
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1285 "paddw %%mm5, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1286 "psubw %%mm6, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1287
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1288 "movq %%mm1, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1289 "paddw %%mm7, %%mm1 \n\t" //d2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1290
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1291 "psubw 1*8+2*16(%%"REG_d"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1292 "psubw %%mm7, %%mm6 \n\t" //d6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1293
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1294 "movq 1*8+6*16(%%"REG_d"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1295 "psraw $2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1296
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1297 "paddusw 1*8+2*16(%%"REG_d"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1298 "psubw %%mm7, %%mm6 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1299 // t7 d2 /t11 t4 t6 - d6 /t10
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1300
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1301 "paddw 1*8+2*16(%%"REG_d"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1302 "paddusw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1303
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1304 "psubusw 1*8+2*16(%%"REG_d"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1305 "paddw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1306
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1307 "psubw "DCTSIZE_S"*4*2(%%"REG_S"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1308 "psubusw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1309
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1310 //movq [edi+"DCTSIZE_S"*2*2], mm1
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1311 //movq [edi+"DCTSIZE_S"*6*2], mm6
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1312 "movq %%mm1, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1313 "psraw $2, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1314
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1315 "psubw "DCTSIZE_S"*6*2(%%"REG_S"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1316 "psubw %%mm6, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1317
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1318 "psubw "DCTSIZE_S"*7*2(%%"REG_S"), %%mm0 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1319 "paddw %%mm7, %%mm6 \n\t" //'t13
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1320
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1321 "psraw $2, %%mm6 \n\t" //paddw mm6, MM_2 !! ---
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1322 "movq %%mm2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1323
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1324 "pmulhw "MANGLE(MM_FIX_1_414213562_A)", %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1325 "paddw %%mm6, %%mm2 \n\t" //'t0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1326
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1327 "movq %%mm2, 0*8+%3 \n\t" //!
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1328 "psubw %%mm6, %%mm7 \n\t" //'t3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1329
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1330 "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1331 "psubw %%mm6, %%mm1 \n\t" //'t12
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1332
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1333 "psubw "DCTSIZE_S"*5*2(%%"REG_S"), %%mm2 \n\t" //t5
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1334 "movq %%mm5, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1335
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1336 "movq %%mm7, 3*8+%3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1337 "paddw %%mm2, %%mm3 \n\t" //t10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1338
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1339 "paddw %%mm4, %%mm2 \n\t" //t11
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1340 "paddw %%mm0, %%mm4 \n\t" //t12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1341
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1342 "movq %%mm3, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1343 "psubw %%mm4, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1344
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1345 "psllw $2, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1346 "psllw $2, %%mm7 \n\t" //opt for P6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1347
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1348 "pmulhw "MANGLE(MM_FIX_0_382683433)", %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1349 "psllw $2, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1350
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1351 "pmulhw "MANGLE(MM_FIX_0_541196100)", %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1352 "psllw $2, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1353
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1354 "pmulhw "MANGLE(MM_FIX_1_306562965)", %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1355 "paddw %%mm1, %%mm5 \n\t" //'t1
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1356
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1357 "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1358 "psubw %%mm1, %%mm6 \n\t" //'t2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1359 // t7 't12 't11 t4 t6 - 't13 't10 ---
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1360
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1361 "paddw %%mm3, %%mm7 \n\t" //z2
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1362
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1363 "movq %%mm5, 1*8+%3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1364 "paddw %%mm3, %%mm4 \n\t" //z4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1365
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1366 "movq 1*8+3*16(%%"REG_d"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1367 "movq %%mm0, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1368
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1369 "movq %%mm6, 2*8+%3 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1370 "psubw %%mm2, %%mm1 \n\t" //z13
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1371
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1372 //===
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1373 "paddw %%mm2, %%mm0 \n\t" //z11
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1374 "movq %%mm1, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1375
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1376 "movq 1*8+5*16(%%"REG_d"), %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1377 "psubw %%mm7, %%mm1 \n\t" //d3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1378
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1379 "paddw %%mm7, %%mm5 \n\t" //d5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1380 "psubw %%mm3, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1381
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1382 "movq 1*8+1*16(%%"REG_d"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1383 "psubw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1384
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1385 "movq %%mm0, %%mm6 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1386 "paddw %%mm4, %%mm0 \n\t" //d1
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1387
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1388 "paddusw %%mm3, %%mm1 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1389 "psubw %%mm4, %%mm6 \n\t" //d7
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1390
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1391 // d1 d3 - - - d5 d7 -
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1392 "movq 1*8+7*16(%%"REG_d"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1393 "psubw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1394
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1395 "psubw %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1396 "paddusw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1397
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1398 "paddusw %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1399 "paddw %%mm3, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1400
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1401 "paddw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1402 "paddw %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1403
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1404 "psubusw %%mm3, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1405 "psubusw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1406
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1407 "psubusw %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1408 "movq %%mm1, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1409
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1410 "por %%mm5, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1411 "paddusw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1412
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1413 "por %%mm6, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1414 "paddw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1415
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1416 "packssdw %%mm4, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1417 "psubusw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1418
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1419 "movd %%mm4, %%"REG_a" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1420 "or %%"REG_a", %%"REG_a" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1421 "jnz 3f \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1422 //movq [edi+"DCTSIZE_S"*3*2], mm1
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1423 //movq [edi+"DCTSIZE_S"*5*2], mm5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1424 //movq [edi+"DCTSIZE_S"*1*2], mm0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1425 //movq [edi+"DCTSIZE_S"*7*2], mm6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1426 // t4 t5 - - - t6 t7 -
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1427 //--- t4 (mm0) may be <>0; mm1, mm5, mm6 == 0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1428 //Typical numbers: nondc - 19%%, dc - 26%%, zero - 55%%. zero case alone isn't worthwhile
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1429 "movq 0*8+%3, %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1430 "movq %%mm0, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1431
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1432 "pmulhw "MANGLE(MM_FIX_0_847759065)", %%mm0 \n\t" //tmp6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1433 "movq %%mm1, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1434
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1435 "movq "DCTSIZE_S"*0*2(%%"REG_D"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1436 "movq %%mm2, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1437
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1438 "pmulhw "MANGLE(MM_FIX_0_566454497)", %%mm1 \n\t" //tmp5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1439 "paddw %%mm4, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1440
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1441 "movq 1*8+%3, %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1442 //paddw mm3, MM_2
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1443 "psraw $2, %%mm3 \n\t" //tmp7
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1444
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1445 "pmulhw "MANGLE(MM_FIX_0_198912367)", %%mm2 \n\t" //-tmp4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1446 "psubw %%mm3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1447
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1448 "movq "DCTSIZE_S"*1*2(%%"REG_D"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1449 "paddw %%mm3, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1450
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1451 "movq %%mm4, "DCTSIZE_S"*7*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1452 "paddw %%mm6, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1453
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1454 "movq 2*8+%3, %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1455 "psubw %%mm0, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1456
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1457 "movq "DCTSIZE_S"*2*2(%%"REG_D"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1458 "paddw %%mm0, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1459
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1460 "movq %%mm5, "DCTSIZE_S"*0*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1461 "paddw %%mm3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1462
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1463 "movq %%mm6, "DCTSIZE_S"*6*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1464 "psubw %%mm1, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1465
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1466 "movq "DCTSIZE_S"*5*2(%%"REG_D"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1467 "paddw %%mm1, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1468
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1469 "movq "DCTSIZE_S"*3*2(%%"REG_D"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1470 "paddw %%mm3, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1471
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1472 "movq 3*8+%3, %%mm0 \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1473 "add $24, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1474
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1475 "movq %%mm7, "DCTSIZE_S"*1*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1476 "paddw %%mm0, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1477
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1478 "movq %%mm4, "DCTSIZE_S"*2*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1479 "psubw %%mm2, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1480
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1481 "movq "DCTSIZE_S"*4*2(%%"REG_D"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1482 "paddw %%mm2, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1483
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1484 "movq %%mm5, "DCTSIZE_S"*5*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1485 "paddw %%mm0, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1486
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1487 "movq %%mm6, "DCTSIZE_S"*3*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1488
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1489 "movq %%mm7, "DCTSIZE_S"*4*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1490 "add $24, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1491 "sub $2, %%"REG_c" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1492 "jnz 1b \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1493 "jmp 5f \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1494
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1495 "3: \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1496 //--- non DC2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1497 //psraw mm1, 2 w/o it -> offset. thr1, thr1, thr1 (actually thr1, thr1, thr1-1)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1498 //psraw mm5, 2
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1499 //psraw mm0, 2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1500 //psraw mm6, 2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1501 "movq %%mm5, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1502 "psubw %%mm1, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1503
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1504 "psllw $1, %%mm5 \n\t" //'z10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1505 "paddw %%mm1, %%mm3 \n\t" //'z13
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1506
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1507 "movq %%mm0, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1508 "psubw %%mm6, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1509
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1510 "movq %%mm5, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1511 "psllw $1, %%mm0 \n\t" //'z12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1512
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1513 "pmulhw "MANGLE(MM_FIX_2_613125930)", %%mm1 \n\t" //-
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1514 "paddw %%mm0, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1515
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1516 "pmulhw "MANGLE(MM_FIX_1_847759065)", %%mm5 \n\t" //'z5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1517 "paddw %%mm6, %%mm2 \n\t" //'z11
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1518
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1519 "pmulhw "MANGLE(MM_FIX_1_082392200)", %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1520 "movq %%mm2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1521
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1522 //---
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1523 "movq 0*8+%3, %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1524 "psubw %%mm3, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1525
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1526 "psllw $1, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1527 "paddw %%mm3, %%mm7 \n\t" //'t7
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1528
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1529 "pmulhw "MANGLE(MM_FIX_1_414213562)", %%mm2 \n\t" //'t11
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1530 "movq %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1531 //paddw mm7, MM_2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1532 "psraw $2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1533
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1534 "paddw "DCTSIZE_S"*0*2(%%"REG_D"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1535 "psubw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1536
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1537 "movq 1*8+%3, %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1538 "paddw %%mm7, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1539
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1540 "movq %%mm6, "DCTSIZE_S"*7*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1541 "paddw %%mm5, %%mm1 \n\t" //'t12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1542
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1543 "movq %%mm4, "DCTSIZE_S"*0*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1544 "psubw %%mm7, %%mm1 \n\t" //'t6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1545
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1546 "movq 2*8+%3, %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1547 "psubw %%mm5, %%mm0 \n\t" //'t10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1548
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1549 "movq 3*8+%3, %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1550 "movq %%mm3, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1551
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1552 "paddw "DCTSIZE_S"*1*2(%%"REG_D"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1553 "psubw %%mm1, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1554
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1555 "psubw %%mm1, %%mm2 \n\t" //'t5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1556 "paddw %%mm1, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1557
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1558 "movq %%mm5, "DCTSIZE_S"*6*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1559 "movq %%mm7, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1560
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1561 "paddw "DCTSIZE_S"*2*2(%%"REG_D"), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1562 "psubw %%mm2, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1563
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1564 "paddw "DCTSIZE_S"*5*2(%%"REG_D"), %%mm4 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1565 "paddw %%mm2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1566
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1567 "movq %%mm3, "DCTSIZE_S"*1*2(%%"REG_D") \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1568 "paddw %%mm2, %%mm0 \n\t" //'t4
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1569
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1570 // 't4 't6 't5 - - - - 't7
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1571 "movq %%mm7, "DCTSIZE_S"*2*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1572 "movq %%mm6, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1573
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1574 "paddw "DCTSIZE_S"*4*2(%%"REG_D"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1575 "psubw %%mm0, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1576
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1577 "paddw "DCTSIZE_S"*3*2(%%"REG_D"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1578 "paddw %%mm0, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1579
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1580 "movq %%mm4, "DCTSIZE_S"*5*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1581 "add $24, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1582
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1583 "movq %%mm6, "DCTSIZE_S"*4*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1584
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1585 "movq %%mm1, "DCTSIZE_S"*3*2(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1586 "add $24, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1587 "sub $2, %%"REG_c" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1588 "jnz 1b \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1589 "5: \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1590
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1591 : "+S"(data), "+D"(output), "+c"(cnt), "=o"(temps)
15632
e813a3e431a8 move unchanged registers back to input spec
henry
parents: 15631
diff changeset
1592 : "d"(thr_adr)
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1593 : "%"REG_a
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1594 );
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1595 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1596
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1597 #endif // HAVE_MMX
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1598
28290
25337a2147e7 Lots and lots of #ifdef ARCH_... -> #if ARCH_...
reimar
parents: 27754
diff changeset
1599 #if !HAVE_MMX
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1600
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1601 static void row_idct_c(DCTELEM* workspace,
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1602 int16_t* output_adr, int output_stride, int cnt)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1603 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1604 int_simd16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1605 int_simd16_t tmp10, tmp11, tmp12, tmp13;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1606 int_simd16_t z5, z10, z11, z12, z13;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1607 int16_t* outptr;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1608 DCTELEM* wsptr;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1609
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1610 cnt*=4;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1611 wsptr = workspace;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1612 outptr = output_adr;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1613 for (; cnt > 0; cnt--) {
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1614 // Even part
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1615 //Simd version reads 4x4 block and transposes it
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1616 tmp10 = ( wsptr[2] + wsptr[3]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1617 tmp11 = ( wsptr[2] - wsptr[3]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1618
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1619 tmp13 = ( wsptr[0] + wsptr[1]);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1620 tmp12 = (MULTIPLY16H( wsptr[0] - wsptr[1], FIX_1_414213562_A)<<2) - tmp13;//this shift order to avoid overflow
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1621
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1622 tmp0 = tmp10 + tmp13; //->temps
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1623 tmp3 = tmp10 - tmp13; //->temps
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1624 tmp1 = tmp11 + tmp12;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1625 tmp2 = tmp11 - tmp12;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1626
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1627 // Odd part
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1628 //Also transpose, with previous:
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1629 // ---- ---- ||||
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1630 // ---- ---- idct ||||
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1631 // ---- ---- ---> ||||
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1632 // ---- ---- ||||
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1633 z13 = wsptr[4] + wsptr[5];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1634 z10 = wsptr[4] - wsptr[5];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1635 z11 = wsptr[6] + wsptr[7];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1636 z12 = wsptr[6] - wsptr[7];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1637
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1638 tmp7 = z11 + z13;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1639 tmp11 = MULTIPLY16H(z11 - z13, FIX_1_414213562);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1640
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1641 z5 = MULTIPLY16H(z10 + z12, FIX_1_847759065);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1642 tmp10 = MULTIPLY16H(z12, FIX_1_082392200) - z5;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1643 tmp12 = MULTIPLY16H(z10, FIX_2_613125930) + z5; // - FIX_
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1644
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1645 tmp6 = (tmp12<<3) - tmp7;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1646 tmp5 = (tmp11<<3) - tmp6;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1647 tmp4 = (tmp10<<3) + tmp5;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1648
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1649 // Final output stage: descale and write column
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1650 outptr[0*output_stride]+= DESCALE(tmp0 + tmp7, 3);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1651 outptr[1*output_stride]+= DESCALE(tmp1 + tmp6, 3);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1652 outptr[2*output_stride]+= DESCALE(tmp2 + tmp5, 3);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1653 outptr[3*output_stride]+= DESCALE(tmp3 - tmp4, 3);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1654 outptr[4*output_stride]+= DESCALE(tmp3 + tmp4, 3);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1655 outptr[5*output_stride]+= DESCALE(tmp2 - tmp5, 3);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1656 outptr[6*output_stride]+= DESCALE(tmp1 - tmp6, 3); //no += ?
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1657 outptr[7*output_stride]+= DESCALE(tmp0 - tmp7, 3); //no += ?
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1658 outptr++;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1659
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1660 wsptr += DCTSIZE; // advance pointer to next row
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1661 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1662 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1663
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1664 #else /* HAVE_MMX */
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1665
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1666 static void row_idct_mmx (DCTELEM* workspace,
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1667 int16_t* output_adr, int output_stride, int cnt)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1668 {
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1669 uint64_t __attribute__((aligned(8))) temps[4];
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 26727
diff changeset
1670 __asm__ volatile(
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1671 "lea (%%"REG_a",%%"REG_a",2), %%"REG_d" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1672 "1: \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1673 "movq "DCTSIZE_S"*0*2(%%"REG_S"), %%mm0 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1674 //
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1675
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1676 "movq "DCTSIZE_S"*1*2(%%"REG_S"), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1677 "movq %%mm0, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1678
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1679 "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1680 "punpcklwd %%mm1, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1681
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1682 "movq "DCTSIZE_S"*3*2(%%"REG_S"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1683 "punpckhwd %%mm1, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1684
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1685 //transpose 4x4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1686 "movq %%mm2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1687 "punpcklwd %%mm3, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1688
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1689 "movq %%mm0, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1690 "punpckldq %%mm2, %%mm0 \n\t" //0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1691
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1692 "punpckhdq %%mm2, %%mm6 \n\t" //1
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1693 "movq %%mm0, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1694
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1695 "punpckhwd %%mm3, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1696 "psubw %%mm6, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1697
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1698 "pmulhw "MANGLE(MM_FIX_1_414213562_A)", %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1699 "movq %%mm4, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1700
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1701 "punpckldq %%mm7, %%mm4 \n\t" //2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1702 "paddw %%mm6, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1703
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1704 "punpckhdq %%mm7, %%mm2 \n\t" //3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1705 "movq %%mm4, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1706
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1707 "psllw $2, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1708 "paddw %%mm2, %%mm4 \n\t" //t10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1709
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1710 "movq "DCTSIZE_S"*0*2+"DCTSIZE_S"(%%"REG_S"), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1711 "psubw %%mm2, %%mm1 \n\t" //t11
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1712
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1713 "movq "DCTSIZE_S"*1*2+"DCTSIZE_S"(%%"REG_S"), %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1714 "psubw %%mm5, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1715
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1716 "movq %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1717 "paddw %%mm5, %%mm4 \n\t" //t0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1718
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1719 "psubw %%mm5, %%mm6 \n\t" //t3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1720 "movq %%mm1, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1721
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1722 "movq "DCTSIZE_S"*2*2+"DCTSIZE_S"(%%"REG_S"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1723 "paddw %%mm0, %%mm1 \n\t" //t1
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1724
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1725 "movq %%mm4, 0*8+%3 \n\t" //t0
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1726 "movq %%mm3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1727
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1728 "movq %%mm6, 1*8+%3 \n\t" //t3
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1729 "punpcklwd %%mm2, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1730
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1731 //transpose 4x4
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1732 "movq "DCTSIZE_S"*3*2+"DCTSIZE_S"(%%"REG_S"), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1733 "punpckhwd %%mm2, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1734
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1735 "movq %%mm5, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1736 "punpcklwd %%mm6, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1737
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1738 "psubw %%mm0, %%mm7 \n\t" //t2
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1739 "punpckhwd %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1740
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1741 "movq %%mm3, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1742 "punpckldq %%mm5, %%mm3 \n\t" //4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1743
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1744 "punpckhdq %%mm5, %%mm0 \n\t" //5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1745 "movq %%mm4, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1746
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1747 //
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1748 "movq %%mm3, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1749 "punpckldq %%mm2, %%mm4 \n\t" //6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1750
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1751 "psubw %%mm0, %%mm3 \n\t" //z10
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1752 "punpckhdq %%mm2, %%mm5 \n\t" //7
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1753
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1754 "paddw %%mm0, %%mm6 \n\t" //z13
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1755 "movq %%mm4, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1756
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1757 "movq %%mm3, %%mm0 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1758 "psubw %%mm5, %%mm4 \n\t" //z12
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1759
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1760 "pmulhw "MANGLE(MM_FIX_2_613125930)", %%mm0 \n\t" //-
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1761 "paddw %%mm4, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1762
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1763 "pmulhw "MANGLE(MM_FIX_1_847759065)", %%mm3 \n\t" //z5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1764 "paddw %%mm5, %%mm2 \n\t" //z11 >
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1765
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1766 "pmulhw "MANGLE(MM_FIX_1_082392200)", %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1767 "movq %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1768
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1769 "psubw %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1770 "paddw %%mm6, %%mm5 \n\t" //t7
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1771
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1772 "pmulhw "MANGLE(MM_FIX_1_414213562)", %%mm2 \n\t" //t11
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1773 "paddw %%mm3, %%mm0 \n\t" //t12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1774
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1775 "psllw $3, %%mm0 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1776 "psubw %%mm3, %%mm4 \n\t" //t10
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1777
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1778 "movq 0*8+%3, %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1779 "movq %%mm1, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1780
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1781 "psllw $3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1782 "psubw %%mm5, %%mm0 \n\t" //t6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1783
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1784 "psllw $3, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1785 "paddw %%mm0, %%mm1 \n\t" //d1
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1786
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1787 "psubw %%mm0, %%mm2 \n\t" //t5
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1788 "psubw %%mm0, %%mm3 \n\t" //d6
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1789
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1790 "paddw %%mm2, %%mm4 \n\t" //t4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1791 "movq %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1792
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1793 "paddw %%mm2, %%mm7 \n\t" //d2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1794 "psubw %%mm2, %%mm0 \n\t" //d5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1795
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1796 "movq "MANGLE(MM_DESCALE_RND)", %%mm2 \n\t" //4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1797 "psubw %%mm5, %%mm6 \n\t" //d7
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1798
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1799 "paddw 0*8+%3, %%mm5 \n\t" //d0
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1800 "paddw %%mm2, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1801
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1802 "paddw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1803 "psraw $3, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1804
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1805 "paddw %%mm2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1806 "psraw $3, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1807
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1808 "paddw (%%"REG_D"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1809 "psraw $3, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1810
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1811 "paddw (%%"REG_D",%%"REG_a",), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1812 "paddw %%mm2, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1813
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1814 "paddw (%%"REG_D",%%"REG_a",2), %%mm7 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1815 "paddw %%mm2, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1816
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1817 "movq %%mm5, (%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1818 "paddw %%mm2, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1819
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1820 "movq %%mm1, (%%"REG_D",%%"REG_a",) \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1821 "psraw $3, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1822
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1823 "movq %%mm7, (%%"REG_D",%%"REG_a",2) \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1824 "add %%"REG_d", %%"REG_D" \n\t" //3*ls
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1825
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1826 "movq 1*8+%3, %%mm5 \n\t" //t3
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1827 "psraw $3, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1828
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1829 "paddw (%%"REG_D",%%"REG_a",2), %%mm0 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1830 "psubw %%mm4, %%mm5 \n\t" //d3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1831
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1832 "paddw (%%"REG_D",%%"REG_d",), %%mm3 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1833 "psraw $3, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1834
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1835 "paddw 1*8+%3, %%mm4 \n\t" //d4
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1836 "paddw %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1837
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1838 "paddw (%%"REG_D",%%"REG_a",4), %%mm6 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1839 "paddw %%mm2, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1840
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1841 "movq %%mm0, (%%"REG_D",%%"REG_a",2) \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1842 "psraw $3, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1843
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1844 "paddw (%%"REG_D"), %%mm5 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1845 "psraw $3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1846
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1847 "paddw (%%"REG_D",%%"REG_a",), %%mm4 \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1848 "add $"DCTSIZE_S"*2*4, %%"REG_S" \n\t" //4 rows
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1849
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1850 "movq %%mm3, (%%"REG_D",%%"REG_d",) \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1851 "movq %%mm6, (%%"REG_D",%%"REG_a",4) \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1852 "movq %%mm5, (%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1853 "movq %%mm4, (%%"REG_D",%%"REG_a",) \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1854
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1855 "sub %%"REG_d", %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1856 "add $8, %%"REG_D" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1857 "dec %%"REG_c" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1858 "jnz 1b \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1859
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1860 : "+S"(workspace), "+D"(output_adr), "+c"(cnt), "=o"(temps)
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1861 : "a"(output_stride*sizeof(short))
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1862 : "%"REG_d
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1863 );
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1864 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1865
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1866 #endif // HAVE_MMX
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1867
28290
25337a2147e7 Lots and lots of #ifdef ARCH_... -> #if ARCH_...
reimar
parents: 27754
diff changeset
1868 #if !HAVE_MMX
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1869
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1870 static void row_fdct_c(DCTELEM *data, const uint8_t *pixels, int line_size, int cnt)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1871 {
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1872 int_simd16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1873 int_simd16_t tmp10, tmp11, tmp12, tmp13;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1874 int_simd16_t z1, z2, z3, z4, z5, z11, z13;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1875 DCTELEM *dataptr;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1876
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1877 cnt*=4;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1878 // Pass 1: process rows.
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1879
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1880 dataptr = data;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1881 for (; cnt > 0; cnt--) {
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1882 tmp0 = pixels[line_size*0] + pixels[line_size*7];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1883 tmp7 = pixels[line_size*0] - pixels[line_size*7];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1884 tmp1 = pixels[line_size*1] + pixels[line_size*6];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1885 tmp6 = pixels[line_size*1] - pixels[line_size*6];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1886 tmp2 = pixels[line_size*2] + pixels[line_size*5];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1887 tmp5 = pixels[line_size*2] - pixels[line_size*5];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1888 tmp3 = pixels[line_size*3] + pixels[line_size*4];
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1889 tmp4 = pixels[line_size*3] - pixels[line_size*4];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1890
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1891 // Even part
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1892
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1893 tmp10 = tmp0 + tmp3;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1894 tmp13 = tmp0 - tmp3;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1895 tmp11 = tmp1 + tmp2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1896 tmp12 = tmp1 - tmp2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1897 //Even columns are written first, this leads to different order of columns
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1898 //in column_fidct(), but they are processed independently, so all ok.
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1899 //Later in the row_idct() columns readed at the same order.
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1900 dataptr[2] = tmp10 + tmp11;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1901 dataptr[3] = tmp10 - tmp11;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1902
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1903 z1 = MULTIPLY16H((tmp12 + tmp13)<<2, FIX_0_707106781);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1904 dataptr[0] = tmp13 + z1;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1905 dataptr[1] = tmp13 - z1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1906
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1907 // Odd part
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1908
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1909 tmp10 = (tmp4 + tmp5) <<2;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1910 tmp11 = (tmp5 + tmp6) <<2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1911 tmp12 = (tmp6 + tmp7) <<2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1912
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1913 z5 = MULTIPLY16H(tmp10 - tmp12, FIX_0_382683433);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1914 z2 = MULTIPLY16H(tmp10, FIX_0_541196100) + z5;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1915 z4 = MULTIPLY16H(tmp12, FIX_1_306562965) + z5;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1916 z3 = MULTIPLY16H(tmp11, FIX_0_707106781);
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1917
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1918 z11 = tmp7 + z3;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1919 z13 = tmp7 - z3;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1920
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1921 dataptr[4] = z13 + z2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1922 dataptr[5] = z13 - z2;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1923 dataptr[6] = z11 + z4;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1924 dataptr[7] = z11 - z4;
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1925
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1926 pixels++; // advance pointer to next column
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1927 dataptr += DCTSIZE;
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1928 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1929 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1930
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1931 #else /* HAVE_MMX */
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1932
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1933 static void row_fdct_mmx(DCTELEM *data, const uint8_t *pixels, int line_size, int cnt)
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1934 {
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1935 uint64_t __attribute__((aligned(8))) temps[4];
27754
08d18fe9da52 Change all occurrences of asm and __asm to __asm__, same as was done for FFmpeg.
diego
parents: 26727
diff changeset
1936 __asm__ volatile(
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1937 "lea (%%"REG_a",%%"REG_a",2), %%"REG_d" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1938 "6: \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1939 "movd (%%"REG_S"), %%mm0 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1940 "pxor %%mm7, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1941
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1942 "movd (%%"REG_S",%%"REG_a",), %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1943 "punpcklbw %%mm7, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1944
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1945 "movd (%%"REG_S",%%"REG_a",2), %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1946 "punpcklbw %%mm7, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1947
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1948 "punpcklbw %%mm7, %%mm2 \n\t"
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1949 "add %%"REG_d", %%"REG_S" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1950
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1951 "movq %%mm0, %%mm5 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1952 //
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1953
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1954 "movd (%%"REG_S",%%"REG_a",4), %%mm3 \n\t" //7 ;prefetch!
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1955 "movq %%mm1, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1956
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1957 "movd (%%"REG_S",%%"REG_d",), %%mm4 \n\t" //6
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1958 "punpcklbw %%mm7, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1959
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1960 "psubw %%mm3, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1961 "punpcklbw %%mm7, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1962
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1963 "paddw %%mm3, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1964 "psubw %%mm4, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1965
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1966 "movd (%%"REG_S",%%"REG_a",2), %%mm3 \n\t" //5
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1967 "paddw %%mm4, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1968
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1969 "movq %%mm5, 0*8+%3 \n\t" //t7
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1970 "punpcklbw %%mm7, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1971
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
1972 "movq %%mm6, 1*8+%3 \n\t" //t6
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1973 "movq %%mm2, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1974
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1975 "movd (%%"REG_S"), %%mm5 \n\t" //3
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1976 "paddw %%mm3, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1977
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
1978 "movd (%%"REG_S",%%"REG_a",), %%mm6 \n\t" //4
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1979 "punpcklbw %%mm7, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1980
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1981 "psubw %%mm3, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1982 "punpcklbw %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1983
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1984 "movq %%mm5, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1985 "paddw %%mm6, %%mm5 \n\t" //t3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1986
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1987 "psubw %%mm6, %%mm3 \n\t" //t4 ; t0 t1 t2 t4 t5 t3 - -
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1988 "movq %%mm0, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1989
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1990 "movq %%mm1, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1991 "psubw %%mm5, %%mm0 \n\t" //t13
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1992
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1993 "psubw %%mm2, %%mm1 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
1994 "paddw %%mm2, %%mm7 \n\t" //t11
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1995
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1996 "paddw %%mm0, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1997 "movq %%mm7, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1998
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
1999 "psllw $2, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2000 "paddw %%mm5, %%mm6 \n\t" //t10
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2001
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2002 "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2003 "paddw %%mm6, %%mm7 \n\t" //d2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2004
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2005 "psubw %%mm2, %%mm6 \n\t" //d3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2006 "movq %%mm0, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2007
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2008 //transpose 4x4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2009 "movq %%mm7, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2010 "punpcklwd %%mm6, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2011
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2012 "paddw %%mm1, %%mm0 \n\t" //d0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2013 "punpckhwd %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2014
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
2015 "psubw %%mm1, %%mm5 \n\t" //d1
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2016 "movq %%mm0, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2017
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
2018 "movq 1*8+%3, %%mm1 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2019 "punpcklwd %%mm5, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2020
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2021 "punpckhwd %%mm5, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2022 "movq %%mm0, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2023
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2024 "punpckldq %%mm7, %%mm0 \n\t" //0
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2025 "paddw %%mm4, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2026
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2027 "punpckhdq %%mm7, %%mm5 \n\t" //1
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2028 "movq %%mm6, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2029
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2030 "movq %%mm0, "DCTSIZE_S"*0*2(%%"REG_D") \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
2031 "punpckldq %%mm2, %%mm6 \n\t" //2
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2032
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2033 "movq %%mm5, "DCTSIZE_S"*1*2(%%"REG_D") \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
2034 "punpckhdq %%mm2, %%mm7 \n\t" //3
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2035
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2036 "movq %%mm6, "DCTSIZE_S"*2*2(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2037 "paddw %%mm1, %%mm4 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2038
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2039 "movq %%mm7, "DCTSIZE_S"*3*2(%%"REG_D") \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
2040 "psllw $2, %%mm3 \n\t" //t10
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2041
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
2042 "movq 0*8+%3, %%mm2 \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2043 "psllw $2, %%mm4 \n\t" //t11
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2044
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2045 "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm4 \n\t" //z3
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2046 "paddw %%mm2, %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2047
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2048 "psllw $2, %%mm1 \n\t" //t12
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2049 "movq %%mm3, %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2050
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2051 "pmulhw "MANGLE(MM_FIX_0_541196100)", %%mm0 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2052 "psubw %%mm1, %%mm3 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2053
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2054 "pmulhw "MANGLE(MM_FIX_0_382683433)", %%mm3 \n\t" //z5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2055 "movq %%mm2, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2056
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2057 "pmulhw "MANGLE(MM_FIX_1_306562965)", %%mm1 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2058 "psubw %%mm4, %%mm2 \n\t" //z13
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2059
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2060 "paddw %%mm4, %%mm5 \n\t" //z11
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2061 "movq %%mm2, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2062
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2063 "paddw %%mm3, %%mm0 \n\t" //z2
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2064 "movq %%mm5, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2065
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2066 "paddw %%mm0, %%mm2 \n\t" //d4
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
2067 "psubw %%mm0, %%mm6 \n\t" //d5
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2068
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2069 "movq %%mm2, %%mm4 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
2070 "paddw %%mm3, %%mm1 \n\t" //z4
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2071
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2072 //transpose 4x4
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2073 "punpcklwd %%mm6, %%mm2 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2074 "paddw %%mm1, %%mm5 \n\t" //d6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2075
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2076 "punpckhwd %%mm6, %%mm4 \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
2077 "psubw %%mm1, %%mm7 \n\t" //d7
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2078
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2079 "movq %%mm5, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2080 "punpcklwd %%mm7, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2081
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2082 "punpckhwd %%mm7, %%mm6 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2083 "movq %%mm2, %%mm7 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2084
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2085 "punpckldq %%mm5, %%mm2 \n\t" //4
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2086 "sub %%"REG_d", %%"REG_S" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2087
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2088 "punpckhdq %%mm5, %%mm7 \n\t" //5
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2089 "movq %%mm4, %%mm5 \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2090
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2091 "movq %%mm2, "DCTSIZE_S"*0*2+"DCTSIZE_S"(%%"REG_D") \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2092 "punpckldq %%mm6, %%mm4 \n\t" //6
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2093
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2094 "movq %%mm7, "DCTSIZE_S"*1*2+"DCTSIZE_S"(%%"REG_D") \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
2095 "punpckhdq %%mm6, %%mm5 \n\t" //7
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2096
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2097 "movq %%mm4, "DCTSIZE_S"*2*2+"DCTSIZE_S"(%%"REG_D") \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2098 "add $4, %%"REG_S" \n\t"
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2099
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2100 "movq %%mm5, "DCTSIZE_S"*3*2+"DCTSIZE_S"(%%"REG_D") \n\t"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
2101 "add $"DCTSIZE_S"*2*4, %%"REG_D" \n\t" //4 rows
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2102 "dec %%"REG_c" \n\t"
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2103 "jnz 6b \n\t"
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2104
26052
ce480034f391 Do not use a global temps variable, this is ugly and does not compile with ICC.
reimar
parents: 26050
diff changeset
2105 : "+S"(pixels), "+D"(data), "+c"(cnt), "=o"(temps)
15632
e813a3e431a8 move unchanged registers back to input spec
henry
parents: 15631
diff changeset
2106 : "a"(line_size)
15634
7eddcf69a5fd x86-64 fixes by Reimar
henry
parents: 15633
diff changeset
2107 : "%"REG_d);
15631
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2108 }
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2109
d5a95e6f5f07 faster spp filter by Nikolaj Poroshin <porosh3 at psu ru>
henry
parents:
diff changeset
2110 #endif // HAVE_MMX