~ubuntu-branches/ubuntu/trusty/libdv/trusty

« back to all changes in this revision

Viewing changes to libdv/dct_block_mmx_x86_64.S

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Kobras
  • Date: 2006-09-26 14:22:15 UTC
  • mfrom: (1.3.1 upstream) (3.1.4 edgy)
  • Revision ID: james.westby@ubuntu.com-20060926142215-q2arp4stpw6lrb5p
Tags: 1.0.0-1
* New upstream version.
* Removed patches:
  + [01_changelog_update_CVS]
  + [10_amd64_linkage_fix_CVS]
  + [10_inline_fixes_CVS]
  + [20_no_exec_stack_CVS]
  + [30_unload_memleak_fix_CVS]
  + [40_playdv_exit_fix_CVS]
  + [50_gcc41_asm_constraint_fixes_CVS]
    All of the above are part of the new upstream version.
* debian/control: In Build-Depends, remove alternative dependencies on
  obsolete SDL and X packages.
* debian/control: Complies with version 3.7.2 of Debian policy.
* debian/libdv4.README.Debian: Document lack of position-independent code
  in i386 version of libdv's shared library as mandated by recent versions
  of Debian policy.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* 
 
2
 *  dct_block_mmx_x86_64.S
 
3
 *
 
4
 *     Copyright (C) Peter Schlaile - February 2001
 
5
 *
 
6
 *  This file is part of libdv, a free DV (IEC 61834/SMPTE 314M)
 
7
 *  codec.
 
8
 *
 
9
 *  libdv is free software; you can redistribute it and/or modify it
 
10
 *  under the terms of the GNU Lesser Public License as published by
 
11
 *  the Free Software Foundation; either version 2.1, or (at your
 
12
 *  option) any later version.
 
13
 *   
 
14
 *  libdv is distributed in the hope that it will be useful, but
 
15
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
17
 *  Lesser Public License for more details.
 
18
 *   
 
19
 *  You should have received a copy of the GNU Lesser Public License
 
20
 *  along with libdv; see the file COPYING.  If not, write to
 
21
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 
22
 *
 
23
 *  The libdv homepage is http://libdv.sourceforge.net/.  
 
24
 */
 
25
 
 
26
# rdi - input and output data pointer
 
27
# the input data each 16 bit element in the 8x8 matrix is left aligned:
 
28
# the output data is tranposed and each 16 bit element in the 8x8 matrix is left aligned:
 
29
# e.g. in 11...1110000 format
 
30
# israelh. 11/11/97 removed emms. moved to stub
 
31
# MMX implementation. Using MMX transpose 
 
32
 
 
33
#define YUV_PRECISION  1
 
34
        
 
35
#define NSHIFT     15
 
36
#define PRESHIFT   1
 
37
#define WA4_SHIFT  (NSHIFT-1)
 
38
#define WA5_SHIFT  (NSHIFT+1)
 
39
 
 
40
 
 
41
.data
 
42
 
 
43
.align 8        
 
44
                        
 
45
WA1: .word 23171,23171,23171,23171  /* 0.70711 * 32768 */
 
46
WA2: .word 17734,17734,17734,17734  /* 0.54120 * 32768 */
 
47
WA3: .word 23171,23171,23171,23171  /* 0.70711 * 32768 */
 
48
WA4: .word 21407,21407,21407,21407  /* 1.30658 * 16384 */
 
49
WA5: .word 25079,25079,25079,25079  /* 0.38268 * 65536 */
 
50
 
 
51
scratch1:       .quad 0
 
52
scratch2:       .quad 0
 
53
scratch3:       .quad 0
 
54
scratch4:       .quad 0
 
55
 
 
56
.section .note.GNU-stack, "", @progbits
 
57
 
 
58
.text
 
59
 
 
60
.align 8        
 
61
.global _dv_dct_88_block_mmx_x86_64
 
62
.hidden _dv_dct_88_block_mmx_x86_64
 
63
.type   _dv_dct_88_block_mmx_x86_64,@function
 
64
_dv_dct_88_block_mmx_x86_64:
 
65
 
 
66
/* void _dv_dct_88_block_mmx_x86_64(int16_t* block); */
 
67
        
 
68
        /* argument is block=rdi */
 
69
 
 
70
        mov    %rdi, %r11              # block
 
71
 
 
72
# Column 0
 
73
        movq 16*0(%r11), %mm0          # v0
 
74
        movq 16*7(%r11), %mm1          # v7
 
75
        movq  %mm0, %mm2               # duplicate v0 
 
76
        paddw %mm1, %mm0               # v00: v0+v7  
 
77
        psubw %mm1, %mm2               # v07: v0-v7  
 
78
 
 
79
        movq 16*1(%r11), %mm1          # v1
 
80
        movq 16*6(%r11), %mm3          # v6
 
81
        movq  %mm1, %mm4               # duplicate v1 
 
82
        paddw %mm3, %mm1               # v01: v1+v6  
 
83
        psubw %mm3, %mm4               # v06: v1-v6  
 
84
 
 
85
        movq 16*2(%r11), %mm3          # v2
 
86
        movq 16*5(%r11), %mm5          # v5
 
87
        movq  %mm3, %mm6               # duplicate v2 
 
88
        paddw %mm5, %mm3               # v02: v2+v5  
 
89
        psubw %mm5, %mm6               # v05: v2-v5  
 
90
 
 
91
        movq 16*3(%r11), %mm5          # v3
 
92
        movq 16*4(%r11), %mm7          # v4
 
93
        movq  %mm7, scratch1(%rip)           # scratch1: v4   ; 
 
94
        movq  %mm5, %mm7               # duplicate v3 
 
95
        paddw scratch1(%rip), %mm5           # v03: v3+v4  
 
96
        psubw scratch1(%rip), %mm7           # v04: v3-v4  
 
97
        movq  %mm5, scratch2(%rip)           # scratch2: v03
 
98
        movq  %mm0, %mm5               # mm5: v00
 
99
 
 
100
        paddw scratch2(%rip), %mm0           # v10: v00+v03   
 
101
        psubw scratch2(%rip), %mm5           # v13: v00-v03   
 
102
        movq  %mm3, scratch3(%rip)     # scratch3: v02
 
103
        movq  %mm1, %mm3               # duplicate v01
 
104
 
 
105
        paddw scratch3(%rip), %mm1          # v11: v01+v02
 
106
        psubw scratch3(%rip), %mm3          # v12: v01-v02
 
107
 
 
108
        movq  %mm6, scratch4(%rip)           # scratch4: v05
 
109
        movq  %mm0, %mm6               # duplicate v10
 
110
 
 
111
        paddw %mm1, %mm0              # v10+v11
 
112
        psubw %mm1, %mm6              # v10-v11
 
113
 
 
114
        movq  %mm0, (%r11)             # out0: v10+v11 
 
115
        movq  %mm6, 16*4(%r11)         # out4: v10-v11 
 
116
 
 
117
        movq  %mm4, %mm0               # mm0: v06
 
118
        paddw scratch4(%rip), %mm4          # v15: v05+v06 
 
119
        paddw  %mm2, %mm0             # v16: v07+v06
 
120
 
 
121
        pmulhw WA3(%rip), %mm4               # v35~: WA3*v15
 
122
        psllw  $1, %mm4                # v35: compensate the coeefient scale
 
123
 
 
124
        movq   %mm4, %mm6              # duplicate v35
 
125
        paddw  %mm2, %mm4             # v45: v07+v35
 
126
        psubw  %mm6, %mm2             # v47: v07-v35
 
127
 
 
128
        paddw  %mm5, %mm3             # v22: v12+v13
 
129
 
 
130
        pmulhw WA1(%rip), %mm3               # v32~: WA1*v22
 
131
        psllw  $16-NSHIFT, %mm3        # v32: compensate the coeefient scale
 
132
        movq   %mm5, %mm6              # duplicate v13
 
133
 
 
134
        paddw  %mm3, %mm5             # v13+v32
 
135
        psubw  %mm3, %mm6             # v13-v32
 
136
 
 
137
        movq  %mm5, 16*2(%r11)         # out2: v13+v32 
 
138
        movq  %mm6, 16*6(%r11)         # out6: v13-v32 
 
139
 
 
140
 
 
141
        paddw  scratch4(%rip), %mm7         # v14n: v04+v05
 
142
        movq   %mm0, %mm5              # duplicate v16
 
143
 
 
144
        psubw  %mm7, %mm0             # va1: v16-v14n
 
145
        pmulhw WA5(%rip), %mm0               # va0~:  va1*WA5
 
146
        pmulhw WA4(%rip), %mm5               # v36~~: v16*WA4
 
147
        pmulhw WA2(%rip), %mm7               # v34~~: v14n*WA2
 
148
        psllw  $16-WA4_SHIFT, %mm5     # v36: compensate the coeefient scale 
 
149
        psllw  $16-NSHIFT, %mm7        # v34: compensate the coeefient scale
 
150
 
 
151
        psubw  %mm0, %mm5              # v36~: v36~~-va0~
 
152
        psubw  %mm0, %mm7              # v34~: v34~~-va0~
 
153
 
 
154
        movq   %mm4, %mm0              # duplicate v45
 
155
        paddw  %mm5, %mm4              # v45+v36
 
156
        psubw  %mm5, %mm0              # v45-v36
 
157
 
 
158
        movq  %mm4, 16*1(%r11)         # out1: v45+v36 
 
159
        movq  %mm0, 16*7(%r11)         # out7: v45-v36 
 
160
 
 
161
        movq   %mm2, %mm5              # duplicate v47
 
162
        paddw  %mm7, %mm2              # v47+v34
 
163
        psubw  %mm7, %mm5              # v47-v34
 
164
 
 
165
        movq  %mm2, 16*5(%r11)         # out5: v47+v34 
 
166
        movq  %mm5, 16*3(%r11)         # out3: v47-v34 
 
167
 
 
168
 
 
169
# column 1
 
170
 
 
171
        add $8, %r11                  # point to the next 4 columns. 
 
172
                                       # it can be done by adding 8 to 
 
173
                                       # immediates but this is nicer
 
174
 
 
175
        movq (%r11), %mm0                  # v0
 
176
        movq 16*7(%r11), %mm1              # v7
 
177
        movq  %mm0, %mm2               # duplicate v0 
 
178
        paddw %mm1, %mm0               # v00: v0+v7  
 
179
        psubw %mm1, %mm2               # v07: v0-v7  
 
180
 
 
181
        movq 16(%r11), %mm1                # v1
 
182
        movq 16*6(%r11), %mm3              # v6
 
183
        movq  %mm1, %mm4               # duplicate v1 
 
184
        paddw %mm3, %mm1               # v01: v1+v6  
 
185
        psubw %mm3, %mm4               # v06: v1-v6  
 
186
 
 
187
        movq 16*2(%r11), %mm3         # v2
 
188
        movq 16*5(%r11), %mm5              # v5
 
189
        movq  %mm3, %mm6               # duplicate v2 
 
190
        paddw %mm5, %mm3               # v02: v2+v5  
 
191
        psubw %mm5, %mm6               # v05: v2-v5  
 
192
 
 
193
        movq 16*3(%r11), %mm5              # v3
 
194
        movq 16*4(%r11), %mm7              # v4
 
195
        movq  %mm7, scratch1(%rip)                    # scratch1: v4   ; 
 
196
        movq  %mm5, %mm7               # duplicate v3 
 
197
        paddw scratch1(%rip), %mm5           # v03: v3+v4  
 
198
        psubw scratch1(%rip), %mm7           # v04: v3-v4  
 
199
        movq  %mm5, scratch2(%rip)        # scratch2: v03
 
200
        movq  %mm0, %mm5               # mm5: v00
 
201
 
 
202
        paddw scratch2(%rip), %mm0           # v10: v00+v03   
 
203
        psubw scratch2(%rip), %mm5           # v13: v00-v03   
 
204
        movq  %mm3, scratch3(%rip)         # scratc3: v02
 
205
        movq  %mm1, %mm3               # duplicate v01
 
206
 
 
207
        paddw scratch3(%rip), %mm1           # v11: v01+v02
 
208
        psubw scratch3(%rip), %mm3           # v12: v01-v02
 
209
 
 
210
        movq  %mm6, scratch4(%rip)         # scratc4: v05
 
211
        movq  %mm0, %mm6               # duplicate v10
 
212
 
 
213
        paddw %mm1, %mm0                            # v10+v11
 
214
        psubw %mm1, %mm6                        # v10-v11
 
215
 
 
216
        movq  %mm0, (%r11)         # out0: v10+v11 
 
217
        movq  %mm6, 16*4(%r11)          # out4: v10-v11 
 
218
 
 
219
        movq  %mm4, %mm0             # mm0: v06
 
220
        paddw scratch4(%rip), %mm4         # v15: v05+v06 
 
221
        paddw  %mm2, %mm0                       # v16: v07+v06
 
222
 
 
223
        pmulhw WA3(%rip), %mm4           # v35~: WA3*v15
 
224
        psllw  $16-NSHIFT, %mm4       # v35: compensate the coeefient scale
 
225
 
 
226
        movq   %mm4, %mm6            # duplicate v35
 
227
        paddw  %mm2, %mm4            # v45: v07+v35
 
228
        psubw  %mm6, %mm2            # v47: v07-v35
 
229
 
 
230
        paddw  %mm5, %mm3            # v22: v12+v13
 
231
 
 
232
        pmulhw WA1(%rip), %mm3           # v32~: WA3*v15
 
233
        psllw  $16-NSHIFT, %mm3       # v32: compensate the coeefient scale
 
234
        movq   %mm5, %mm6            # duplicate v13
 
235
 
 
236
        paddw  %mm3, %mm5            # v13+v32
 
237
        psubw  %mm3, %mm6            # v13-v32
 
238
 
 
239
        movq  %mm5, 16*2(%r11)          # out2: v13+v32 
 
240
        movq  %mm6, 16*6(%r11)          # out6: v13-v32 
 
241
 
 
242
        paddw  scratch4(%rip), %mm7                           # v14n: v04+v05
 
243
        movq   %mm0, %mm5                               # duplicate v16
 
244
 
 
245
        psubw  %mm7, %mm0                               # va1: v16-v14n
 
246
        pmulhw WA2(%rip), %mm7                # v34~~: v14n*WA2
 
247
        pmulhw WA5(%rip), %mm0                # va0~:  va1*WA5
 
248
        pmulhw WA4(%rip), %mm5                        # v36~~: v16*WA4
 
249
        psllw  $16-NSHIFT, %mm7
 
250
        psllw  $16-WA4_SHIFT, %mm5      # v36: compensate the coeffient 
 
251
                # scale note that WA4 is shifted 1 bit less than the others
 
252
        
 
253
        psubw  %mm0, %mm5   # v36~: v36~~-va0~
 
254
        psubw  %mm0, %mm7   # v34~: v34~~-va0~
 
255
 
 
256
        movq   %mm4, %mm0    # duplicate v45
 
257
        paddw  %mm5, %mm4    # v45+v36
 
258
        psubw  %mm5, %mm0    # v45-v36
 
259
 
 
260
        movq  %mm4, 16*1(%r11)          # out1: v45+v36 
 
261
        movq  %mm0, 16*7(%r11)          # out7: v45-v36 
 
262
 
 
263
        movq   %mm2, %mm5    # duplicate v47
 
264
        paddw  %mm7, %mm2    # v47+v34
 
265
        psubw  %mm7, %mm5    # v47-v34
 
266
 
 
267
        movq  %mm2, 16*5(%r11)          # out5: v47+v34 
 
268
        movq  %mm5, 16*3(%r11)          # out3: v47-v34 
 
269
 
 
270
        ret     $0
 
271
 
 
272
/* do mmx postscaling and reordering... */
 
273
                
 
274
.align 8        
 
275
.global _dv_dct_block_mmx_x86_64_postscale_88
 
276
.hidden _dv_dct_block_mmx_x86_64_postscale_88
 
277
.type   _dv_dct_block_mmx_x86_64_postscale_88,@function
 
278
_dv_dct_block_mmx_x86_64_postscale_88:
 
279
 
 
280
/* void _dv_dct_block_mmx_x86_64_postscale_88(int16_t* block, int16_t* postscale_matrix); */
 
281
        
 
282
        /* arguments are block=rdi, postscale=rsi */
 
283
 
 
284
        push     %rbx
 
285
        push     %r12
 
286
 
 
287
        mov      %rdi,%r11      # block matrix 
 
288
        mov      %rsi,%r12      # postscale matrix 
 
289
 
 
290
        sub     $128+2, %rsp    # reserve some stack space in the redzone, plus 2 bytes
 
291
        
 
292
        movq    0*8(%r11), %mm0
 
293
        movq    1*8(%r11), %mm1
 
294
        movq    2*8(%r11), %mm2
 
295
        movq    3*8(%r11), %mm3
 
296
 
 
297
        movq    %mm0, %mm4
 
298
        movq    %mm1, %mm5
 
299
        movq    %mm2, %mm6
 
300
        movq    %mm3, %mm7
 
301
        psraw   $0xf, %mm4
 
302
        psraw   $0xf, %mm5
 
303
        psraw   $0xf, %mm6
 
304
        psraw   $0xf, %mm7
 
305
 
 
306
        pxor    %mm4, %mm0
 
307
        pxor    %mm5, %mm1
 
308
        pxor    %mm6, %mm2
 
309
        pxor    %mm7, %mm3
 
310
 
 
311
        psubw   %mm4, %mm0
 
312
        psubw   %mm5, %mm1
 
313
        psubw   %mm6, %mm2
 
314
        psubw   %mm7, %mm3
 
315
                
 
316
        pmulhw  0*8(%r12), %mm0
 
317
        pmulhw  1*8(%r12), %mm1
 
318
        pmulhw  2*8(%r12), %mm2
 
319
        pmulhw  3*8(%r12), %mm3
 
320
        
 
321
        psraw   $YUV_PRECISION, %mm0
 
322
        psraw   $YUV_PRECISION, %mm1
 
323
        psraw   $YUV_PRECISION, %mm2
 
324
        psraw   $YUV_PRECISION, %mm3
 
325
 
 
326
        pxor    %mm4, %mm0
 
327
        pxor    %mm5, %mm1
 
328
        pxor    %mm6, %mm2
 
329
        pxor    %mm7, %mm3
 
330
 
 
331
        psubw   %mm4, %mm0
 
332
        psubw   %mm5, %mm1
 
333
        psubw   %mm6, %mm2
 
334
        psubw   %mm7, %mm3
 
335
        
 
336
        movq    %mm0, 0*8(%r11)
 
337
        movq    %mm1, 1*8(%r11)
 
338
        movq    %mm2, 2*8(%r11)
 
339
        movq    %mm3, 3*8(%r11)
 
340
 
 
341
        movq    4*8(%r11), %mm0
 
342
        movq    5*8(%r11), %mm1
 
343
        movq    6*8(%r11), %mm2
 
344
        movq    7*8(%r11), %mm3
 
345
 
 
346
        movq    %mm0, %mm4
 
347
        movq    %mm1, %mm5
 
348
 
 
349
        movl    0*2(%r11), %eax
 
350
        movw    2*2(%r11), %bx
 
351
 
 
352
        movq    %mm2, %mm6
 
353
        movq    %mm3, %mm7
 
354
 
 
355
        movl    %eax, 1*2(%rsp)
 
356
        movw    %bx, 6*2(%rsp)
 
357
 
 
358
        psraw   $0xf, %mm4
 
359
        psraw   $0xf, %mm5
 
360
 
 
361
        movw    3*2(%r11), %ax
 
362
        movw    4*2(%r11), %bx
 
363
        
 
364
        psraw   $0xf, %mm6
 
365
        psraw   $0xf, %mm7
 
366
 
 
367
        pxor    %mm4, %mm0
 
368
        pxor    %mm5, %mm1
 
369
 
 
370
        movw    %ax, 7*2(%rsp)
 
371
        movw    %bx, 15*2(%rsp)
 
372
 
 
373
        pxor    %mm6, %mm2
 
374
        pxor    %mm7, %mm3
 
375
 
 
376
        movw    5*2(%r11), %ax
 
377
        movw    6*2(%r11), %bx
 
378
        
 
379
        psubw   %mm4, %mm0
 
380
        psubw   %mm5, %mm1
 
381
 
 
382
        movw    %ax, 16*2(%rsp)
 
383
        movw    %bx, 28*2(%rsp)
 
384
        
 
385
        psubw   %mm6, %mm2
 
386
        psubw   %mm7, %mm3
 
387
 
 
388
        movw    7*2(%r11), %ax
 
389
        movw    8*2(%r11), %bx
 
390
        
 
391
        pmulhw  4*8(%r12), %mm0
 
392
        pmulhw  5*8(%r12), %mm1
 
393
 
 
394
        movw    %ax, 29*2(%rsp)
 
395
        movw    %bx, 3*2(%rsp)
 
396
        
 
397
        pmulhw  6*8(%r12), %mm2
 
398
        pmulhw  7*8(%r12), %mm3
 
399
 
 
400
        movw    9*2(%r11), %ax
 
401
        movw    10*2(%r11), %bx
 
402
        
 
403
        psraw   $YUV_PRECISION, %mm0
 
404
        psraw   $YUV_PRECISION, %mm1
 
405
 
 
406
        movw    %ax, 5*2(%rsp)
 
407
        movw    %bx, 8*2(%rsp)
 
408
        
 
409
        psraw   $YUV_PRECISION, %mm2
 
410
        psraw   $YUV_PRECISION, %mm3
 
411
 
 
412
        movw    11*2(%r11), %ax
 
413
        movw    12*2(%r11), %bx
 
414
        
 
415
        pxor    %mm4, %mm0
 
416
        pxor    %mm5, %mm1
 
417
 
 
418
        movw    %ax, 14*2(%rsp)
 
419
        movw    %bx, 17*2(%rsp)
 
420
                
 
421
        pxor    %mm6, %mm2
 
422
        pxor    %mm7, %mm3
 
423
 
 
424
        movw    13*2(%r11), %ax
 
425
        movw    14*2(%r11), %bx
 
426
                
 
427
        psubw   %mm4, %mm0
 
428
        psubw   %mm5, %mm1
 
429
 
 
430
        movw    %ax, 27*2(%rsp)
 
431
        movw    %bx, 30*2(%rsp)
 
432
 
 
433
        psubw   %mm6, %mm2
 
434
        psubw   %mm7, %mm3
 
435
 
 
436
        movq    %mm0, 4*8(%r11)
 
437
        movq    %mm1, 5*8(%r11)
 
438
        movq    %mm2, 6*8(%r11)
 
439
        movq    %mm3, 7*8(%r11)
 
440
        
 
441
        movq    8*8(%r11), %mm0
 
442
        movq    9*8(%r11), %mm1
 
443
 
 
444
        movw    15*2(%r11), %ax
 
445
        movw    16*2(%r11), %bx
 
446
        
 
447
        movq    10*8(%r11), %mm2
 
448
        movq    11*8(%r11), %mm3
 
449
 
 
450
        movw    %ax, 43*2(%rsp)
 
451
        movw    %bx, 4*2(%rsp)
 
452
        
 
453
        movq    %mm0, %mm4
 
454
        movq    %mm1, %mm5
 
455
 
 
456
        movw    17*2(%r11), %ax
 
457
        movw    18*2(%r11), %bx
 
458
        
 
459
        movq    %mm2, %mm6
 
460
        movq    %mm3, %mm7
 
461
 
 
462
        movw    %ax, 9*2(%rsp)
 
463
        movw    %bx, 13*2(%rsp)
 
464
        
 
465
        psraw   $0xf, %mm4
 
466
        psraw   $0xf, %mm5
 
467
 
 
468
        movw    19*2(%r11), %ax
 
469
        movw    20*2(%r11), %bx
 
470
                
 
471
        psraw   $0xf, %mm6
 
472
        psraw   $0xf, %mm7
 
473
 
 
474
        movw    %ax, 18*2(%rsp)
 
475
        movw    %bx, 26*2(%rsp)
 
476
                
 
477
        pxor    %mm4, %mm0
 
478
        pxor    %mm5, %mm1
 
479
 
 
480
        movw    21*2(%r11), %ax
 
481
        movw    22*2(%r11), %bx
 
482
        
 
483
        pxor    %mm6, %mm2
 
484
        pxor    %mm7, %mm3
 
485
 
 
486
        movw    %ax, 31*2(%rsp)
 
487
        movw    %bx, 42*2(%rsp)
 
488
 
 
489
        psubw   %mm4, %mm0
 
490
        psubw   %mm5, %mm1
 
491
 
 
492
        movw    23*2(%r11), %ax
 
493
        movw    24*2(%r11), %bx
 
494
        
 
495
        psubw   %mm6, %mm2
 
496
        psubw   %mm7, %mm3
 
497
 
 
498
        movw    %ax, 44*2(%rsp)
 
499
        movw    %bx, 10*2(%rsp)
 
500
        
 
501
        pmulhw  8*8(%r12), %mm0
 
502
        pmulhw  9*8(%r12), %mm1
 
503
 
 
504
        movw    25*2(%r11), %ax
 
505
        movw    26*2(%r11), %bx
 
506
        
 
507
        pmulhw  10*8(%r12), %mm2
 
508
        pmulhw  11*8(%r12), %mm3
 
509
 
 
510
        psraw   $YUV_PRECISION, %mm0
 
511
        psraw   $YUV_PRECISION, %mm1
 
512
 
 
513
        movw    %ax, 12*2(%rsp)
 
514
        movw    %bx, 19*2(%rsp)
 
515
        
 
516
        psraw   $YUV_PRECISION, %mm2
 
517
        psraw   $YUV_PRECISION, %mm3
 
518
 
 
519
        movw    27*2(%r11), %ax
 
520
        movw    28*2(%r11), %bx
 
521
        
 
522
        pxor    %mm4, %mm0
 
523
        pxor    %mm5, %mm1
 
524
 
 
525
        movw    %ax, 25*2(%rsp)
 
526
        movw    %bx, 32*2(%rsp)
 
527
        
 
528
        pxor    %mm6, %mm2
 
529
        pxor    %mm7, %mm3
 
530
 
 
531
        movw    29*2(%r11), %ax
 
532
        movw    30*2(%r11), %bx
 
533
        
 
534
        psubw   %mm4, %mm0
 
535
        psubw   %mm5, %mm1
 
536
 
 
537
        movw    %ax, 41*2(%rsp)
 
538
        movw    %bx, 45*2(%rsp)
 
539
        
 
540
        psubw   %mm6, %mm2
 
541
        psubw   %mm7, %mm3
 
542
 
 
543
        movq    %mm0, 8*8(%r11)
 
544
        movq    %mm1, 9*8(%r11)
 
545
        movq    %mm2, 10*8(%r11)
 
546
        movq    %mm3, 11*8(%r11)
 
547
 
 
548
        
 
549
        movq    12*8(%r11), %mm0
 
550
        movq    13*8(%r11), %mm1
 
551
        movq    14*8(%r11), %mm2
 
552
        movq    15*8(%r11), %mm3
 
553
 
 
554
        movq    %mm0, %mm4
 
555
        movq    %mm1, %mm5
 
556
 
 
557
        movw    31*2(%r11), %ax
 
558
        movw    32*2(%r11), %bx
 
559
        
 
560
        movq    %mm2, %mm6
 
561
        movq    %mm3, %mm7
 
562
 
 
563
        movw    %ax, 54*2(%rsp)
 
564
        movw    %bx, 11*2(%rsp)
 
565
        
 
566
        psraw   $0xf, %mm4
 
567
        psraw   $0xf, %mm5
 
568
 
 
569
        movw    33*2(%r11), %ax
 
570
        movw    34*2(%r11), %bx
 
571
        
 
572
        psraw   $0xf, %mm6
 
573
        psraw   $0xf, %mm7
 
574
 
 
575
        movw    %ax, 20*2(%rsp)
 
576
        movw    %bx, 24*2(%rsp)
 
577
                
 
578
        pxor    %mm4, %mm0
 
579
        pxor    %mm5, %mm1
 
580
        
 
581
        movw    35*2(%r11), %ax
 
582
        movw    36*2(%r11), %bx
 
583
                
 
584
        pxor    %mm6, %mm2
 
585
        pxor    %mm7, %mm3
 
586
        
 
587
        movw    %ax, 33*2(%rsp)
 
588
        movw    %bx, 40*2(%rsp)
 
589
        
 
590
        psubw   %mm4, %mm0
 
591
        psubw   %mm5, %mm1
 
592
 
 
593
        movw    37*2(%r11), %ax
 
594
        movw    38*2(%r11), %bx
 
595
        
 
596
        psubw   %mm6, %mm2
 
597
        psubw   %mm7, %mm3
 
598
 
 
599
        movw    %ax, 46*2(%rsp)
 
600
        movw    %bx, 53*2(%rsp)
 
601
                        
 
602
        pmulhw  12*8(%r12), %mm0
 
603
        pmulhw  13*8(%r12), %mm1
 
604
 
 
605
        movw    39*2(%r11), %ax
 
606
        movw    40*2(%r11), %bx
 
607
        
 
608
        pmulhw  14*8(%r12), %mm2
 
609
        pmulhw  15*8(%r12), %mm3
 
610
                
 
611
        movw    %ax, 55*2(%rsp)
 
612
        movw    %bx, 21*2(%rsp)
 
613
                
 
614
        psraw   $YUV_PRECISION, %mm0
 
615
        psraw   $YUV_PRECISION, %mm1
 
616
 
 
617
        movw    41*2(%r11), %ax
 
618
        movw    42*2(%r11), %bx
 
619
        
 
620
        psraw   $YUV_PRECISION, %mm2
 
621
        psraw   $YUV_PRECISION, %mm3
 
622
 
 
623
        movw    %ax, 23*2(%rsp)
 
624
        movw    %bx, 34*2(%rsp)
 
625
 
 
626
        pxor    %mm4, %mm0
 
627
        pxor    %mm5, %mm1
 
628
 
 
629
        movw    43*2(%r11), %ax
 
630
        movw    44*2(%r11), %bx
 
631
        
 
632
        pxor    %mm6, %mm2
 
633
        pxor    %mm7, %mm3
 
634
        
 
635
        movw    %ax, 39*2(%rsp)
 
636
        movw    %bx, 47*2(%rsp)
 
637
        
 
638
        psubw   %mm4, %mm0
 
639
        psubw   %mm5, %mm1
 
640
 
 
641
        movw    45*2(%r11), %ax
 
642
        movw    46*2(%r11), %bx
 
643
        
 
644
        psubw   %mm6, %mm2
 
645
        psubw   %mm7, %mm3
 
646
 
 
647
        movw    %ax, 52*2(%rsp)
 
648
        movw    %bx, 56*2(%rsp)
 
649
        
 
650
        movq    %mm0, 12*8(%r11)
 
651
        movq    %mm1, 13*8(%r11)
 
652
 
 
653
        movw    47*2(%r11), %ax
 
654
        movw    48*2(%r11), %bx
 
655
        
 
656
        movq    %mm2, 14*8(%r11)
 
657
        movq    %mm3, 15*8(%r11)
 
658
        
 
659
        movw    %ax, 61*2(%rsp)
 
660
        movw    %bx, 22*2(%rsp)
 
661
        
 
662
        movw    49*2(%r11), %ax
 
663
        movw    50*2(%r11), %bx
 
664
 
 
665
        
 
666
        movw    %ax, 35*2(%rsp)
 
667
        movw    %bx, 38*2(%rsp)
 
668
 
 
669
        
 
670
        movw    51*2(%r11), %ax
 
671
        movw    52*2(%r11), %bx
 
672
        
 
673
        movw    %ax, 48*2(%rsp)
 
674
        movw    %bx, 51*2(%rsp)
 
675
 
 
676
        
 
677
        movw    53*2(%r11), %ax
 
678
        movw    54*2(%r11), %bx
 
679
                
 
680
        movw    %ax, 57*2(%rsp)
 
681
        movw    %bx, 60*2(%rsp)
 
682
 
 
683
        movw    55*2(%r11), %ax
 
684
        movw    56*2(%r11), %bx
 
685
 
 
686
 
 
687
        movw    %ax, 62*2(%rsp)
 
688
        movw    %bx, 36*2(%rsp)
 
689
        
 
690
        movw    57*2(%r11), %ax
 
691
        movw    58*2(%r11), %bx
 
692
        
 
693
        movw    %ax, 37*2(%rsp)
 
694
        movw    %bx, 49*2(%rsp)
 
695
        
 
696
        movw    59*2(%r11), %ax
 
697
        movw    60*2(%r11), %bx
 
698
 
 
699
        movw    %ax, 50*2(%rsp)
 
700
        movw    %bx, 58*2(%rsp)
 
701
        
 
702
        movw    61*2(%r11), %ax
 
703
        movl    62*2(%r11), %ebx
 
704
        
 
705
        movw    %ax, 59*2(%rsp)
 
706
        movl    %ebx, 63*2(%rsp)
 
707
 
 
708
        add     $2, %rsp                 /* give back 2 bytes of stack space */
 
709
        
 
710
        movq    (%rsp)  , %mm0
 
711
        movq    8(%rsp) , %mm1
 
712
        movq    16(%rsp), %mm2
 
713
        movq    24(%rsp), %mm3
 
714
 
 
715
        movq    %mm0, (%r11)
 
716
        movq    %mm1, 8(%r11)
 
717
        movq    %mm2, 16(%r11)
 
718
        movq    %mm3, 24(%r11)
 
719
 
 
720
        movq    32(%rsp)   , %mm0
 
721
        movq    32+8(%rsp) , %mm1
 
722
        movq    32+16(%rsp), %mm2
 
723
        movq    32+24(%rsp), %mm3
 
724
 
 
725
        movq    %mm0, 32(%r11)
 
726
        movq    %mm1, 32+8(%r11)
 
727
        movq    %mm2, 32+16(%r11)
 
728
        movq    %mm3, 32+24(%r11)
 
729
 
 
730
        movq    64(%rsp)   , %mm0
 
731
        movq    64+8(%rsp) , %mm1
 
732
        movq    64+16(%rsp), %mm2
 
733
        movq    64+24(%rsp), %mm3
 
734
 
 
735
        movq    %mm0, 64(%r11)
 
736
        movq    %mm1, 64+8(%r11)
 
737
        movq    %mm2, 64+16(%r11)
 
738
        movq    %mm3, 64+24(%r11)
 
739
 
 
740
        movq    96(%rsp)   , %mm0
 
741
        movq    96+8(%rsp) , %mm1
 
742
        movq    96+16(%rsp), %mm2
 
743
        movq    96+24(%rsp), %mm3
 
744
        
 
745
        add     $128, %rsp             /* restore the stack pointer */
 
746
 
 
747
        pop     %r12
 
748
        pop     %rbx
 
749
        ret
 
750
 
 
751
.align 8        
 
752
.global _dv_dct_248_block_mmx_x86_64
 
753
.hidden _dv_dct_248_block_mmx_x86_64
 
754
.type   _dv_dct_248_block_mmx_x86_64,@function
 
755
_dv_dct_248_block_mmx_x86_64:
 
756
 
 
757
/* void _dv_dct_248_block_mmx_x86_64(int16_t* block); */
 
758
        
 
759
        /* argument is block=rdi */
 
760
 
 
761
        mov    %rdi, %r11          # source
 
762
 
 
763
# column 0
 
764
 
 
765
        movq 16*0(%r11), %mm0          # v00
 
766
        movq 16*2(%r11), %mm1          # v01
 
767
        movq 16*4(%r11), %mm2          # v02
 
768
        movq 16*6(%r11), %mm3          # v03
 
769
 
 
770
        movq %mm0, %mm4                # v00
 
771
        movq %mm1, %mm5                # v01
 
772
        
 
773
        paddw %mm3, %mm0               # v10: v00+v03
 
774
        psubw %mm3, %mm4               # v13: v00-v03
 
775
        
 
776
        paddw %mm2, %mm1               # v11: v01+v02
 
777
        psubw %mm2, %mm5               # v12: v01-v02
 
778
        
 
779
        movq %mm0, %mm3                # v10
 
780
 
 
781
        paddw %mm4, %mm5               # v22: v12+v13   
 
782
        paddw %mm1, %mm0               # v20: v10+v11
 
783
        psubw %mm1, %mm3               # v21: v10-v11
 
784
 
 
785
        pmulhw WA1(%rip), %mm5               # v32~: WA1*v22
 
786
        movq  %mm4, %mm2        
 
787
        psllw  $16-NSHIFT, %mm5        # v32: compensate the coeffient scale
 
788
 
 
789
        movq  %mm0, 16*0(%r11)
 
790
        
 
791
        psubw %mm5, %mm2               # v43: v13-v32   
 
792
        paddw %mm4, %mm5               # v42: v32+v13
 
793
 
 
794
        movq  %mm2, 16*6(%r11)
 
795
        movq  %mm3, 16*4(%r11)
 
796
        movq  %mm5, 16*2(%r11)
 
797
 
 
798
# column 1
 
799
 
 
800
        add $8, %r11 # point to the next 4 columns. 
 
801
                      # it can be done by adding 8 to immediates 
 
802
                      # but this is nicer
 
803
 
 
804
        movq 16*0(%r11), %mm0          # v00
 
805
        movq 16*2(%r11), %mm1          # v01
 
806
        movq 16*4(%r11), %mm2          # v02
 
807
        movq 16*6(%r11), %mm3          # v03
 
808
 
 
809
        movq %mm0, %mm4
 
810
        movq %mm1, %mm5
 
811
        
 
812
        paddw %mm3, %mm0               # v10: v00+v03
 
813
        psubw %mm3, %mm4               # v13: v00-v03
 
814
        
 
815
        paddw %mm2, %mm1               # v11: v01+v02
 
816
        psubw %mm2, %mm5               # v12: v01-v02
 
817
        
 
818
        movq %mm0, %mm3
 
819
 
 
820
        paddw %mm4, %mm5               # v22: v12+v13   
 
821
        paddw %mm1, %mm0               # v20: v10+v11
 
822
        psubw %mm1, %mm3               # v21: v10-v11
 
823
 
 
824
        pmulhw WA1(%rip), %mm5               # v32~: WA1*v22
 
825
        movq  %mm4, %mm2        
 
826
        psllw  $16-NSHIFT, %mm5        # v32: compensate the coeffient scale
 
827
 
 
828
        movq  %mm0, 16*0(%r11)
 
829
        
 
830
        psubw %mm5, %mm2               # v43: v13-v32   
 
831
        paddw %mm4, %mm5               # v42: v32+v13
 
832
 
 
833
        movq  %mm2, 16*6(%r11)
 
834
        movq  %mm3, 16*4(%r11)
 
835
        movq  %mm5, 16*2(%r11)
 
836
 
 
837
# column 0 ... second line              
 
838
 
 
839
        add $8, %r11
 
840
 
 
841
        movq 16*0(%r11), %mm0          # v00
 
842
        movq 16*2(%r11), %mm1          # v01
 
843
        movq 16*4(%r11), %mm2          # v02
 
844
        movq 16*6(%r11), %mm3          # v03
 
845
 
 
846
        movq %mm0, %mm4
 
847
        movq %mm1, %mm5
 
848
        
 
849
        paddw %mm3, %mm0               # v10: v00+v03
 
850
        psubw %mm3, %mm4               # v13: v00-v03
 
851
        
 
852
        paddw %mm2, %mm1               # v11: v01+v02
 
853
        psubw %mm2, %mm5               # v12: v01-v02
 
854
        
 
855
        movq %mm0, %mm3
 
856
 
 
857
        paddw %mm4, %mm5               # v22: v12+v13   
 
858
        paddw %mm1, %mm0               # v20: v10+v11
 
859
        psubw %mm1, %mm3               # v21: v10-v11
 
860
 
 
861
        pmulhw WA1(%rip), %mm5               # v32~: WA1*v22
 
862
        movq  %mm4, %mm2        
 
863
        psllw  $16-NSHIFT, %mm5        # v32: compensate the coeffient scale
 
864
 
 
865
        movq  %mm0, 16*0(%r11)
 
866
        
 
867
        psubw %mm5, %mm2               # v43: v13-v32   
 
868
        paddw %mm4, %mm5               # v42: v32+v13
 
869
 
 
870
        movq  %mm2, 16*6(%r11)
 
871
        movq  %mm3, 16*4(%r11)
 
872
        movq  %mm5, 16*2(%r11)
 
873
 
 
874
# column 1 ... second line              
 
875
 
 
876
        add $8, %r11
 
877
        
 
878
        movq 16*0(%r11), %mm0          # v00
 
879
        movq 16*2(%r11), %mm1          # v01
 
880
        movq 16*4(%r11), %mm2          # v02
 
881
        movq 16*6(%r11), %mm3          # v03
 
882
 
 
883
        movq %mm0, %mm4
 
884
        movq %mm1, %mm5
 
885
        
 
886
        paddw %mm3, %mm0               # v10: v00+v03
 
887
        psubw %mm3, %mm4               # v13: v00-v03
 
888
        
 
889
        paddw %mm2, %mm1               # v11: v01+v02
 
890
        psubw %mm2, %mm5               # v12: v01-v02
 
891
        
 
892
        movq %mm0, %mm3
 
893
 
 
894
        paddw %mm4, %mm5               # v22: v12+v13   
 
895
        paddw %mm1, %mm0               # v20: v10+v11
 
896
        psubw %mm1, %mm3               # v21: v10-v11
 
897
 
 
898
        pmulhw WA1(%rip), %mm5               # v32~: WA1*v22
 
899
        movq  %mm4, %mm2        
 
900
        psllw  $16-NSHIFT, %mm5        # v32: compensate the coeffient scale
 
901
 
 
902
        movq  %mm0, 16*0(%r11)
 
903
        
 
904
        psubw %mm5, %mm2               # v43: v13-v32   
 
905
        paddw %mm4, %mm5               # v42: v32+v13
 
906
 
 
907
        movq  %mm2, 16*6(%r11)
 
908
        movq  %mm3, 16*4(%r11)
 
909
        movq  %mm5, 16*2(%r11)
 
910
        
 
911
        ret
 
912
 
 
913
.align 8        
 
914
.global _dv_dct_248_block_mmx_x86_64_post_sum
 
915
.hidden _dv_dct_248_block_mmx_x86_64_post_sum
 
916
.type   _dv_dct_248_block_mmx_x86_64_post_sum,@function
 
917
_dv_dct_248_block_mmx_x86_64_post_sum:
 
918
 
 
919
/* void _dv_dct_248_block_mmx_x86_64_post_sum(int16_t* out_block); */
 
920
        
 
921
        /* argument is block=rdi */
 
922
 
 
923
        mov    %rdi, %r11          # source
 
924
 
 
925
        movq    16*0(%r11), %mm0
 
926
        movq    16*1(%r11), %mm1        
 
927
        movq    16*2(%r11), %mm2
 
928
        movq    16*3(%r11), %mm3        
 
929
        movq    16*4(%r11), %mm4
 
930
        movq    16*5(%r11), %mm5        
 
931
        movq    16*6(%r11), %mm6        
 
932
        movq    16*7(%r11), %mm7
 
933
        
 
934
        psubw   %mm1, %mm0
 
935
        paddw   16*0(%r11), %mm1 
 
936
        movq    %mm0, 16*4(%r11)
 
937
        movq    %mm1, 16*0(%r11)
 
938
 
 
939
        movq    %mm4, %mm1
 
940
        movq    %mm2, %mm0
 
941
        paddw   %mm5, %mm1
 
942
        psubw   %mm5, %mm4              
 
943
        paddw   %mm3, %mm0
 
944
        psubw   %mm3, %mm2
 
945
 
 
946
        movq    %mm0, 16*1(%r11)
 
947
        movq    %mm2, 16*5(%r11)                        
 
948
        movq    %mm1, 16*2(%r11)
 
949
        movq    %mm4, 16*6(%r11)                        
 
950
                
 
951
        paddw   %mm6, %mm7
 
952
        psubw   16*7(%r11), %mm6
 
953
 
 
954
        movq    %mm7, 16*3(%r11)
 
955
        movq    %mm6, 16*7(%r11)                
 
956
                                
 
957
        add     $8, %r11
 
958
 
 
959
        movq    16*0(%r11), %mm0
 
960
        movq    16*1(%r11), %mm1        
 
961
        movq    16*2(%r11), %mm2
 
962
        movq    16*3(%r11), %mm3        
 
963
        movq    16*4(%r11), %mm4
 
964
        movq    16*5(%r11), %mm5        
 
965
        movq    16*6(%r11), %mm6        
 
966
        movq    16*7(%r11), %mm7
 
967
        
 
968
        psubw   %mm1, %mm0
 
969
        paddw   16*0(%r11), %mm1
 
970
        movq    %mm0, 16*4(%r11)
 
971
        movq    %mm1, 16*0(%r11)
 
972
 
 
973
        movq    %mm4, %mm1
 
974
        movq    %mm2, %mm0
 
975
        paddw   %mm5, %mm1
 
976
        psubw   %mm5, %mm4              
 
977
        paddw   %mm3, %mm0
 
978
        psubw   %mm3, %mm2
 
979
 
 
980
        movq    %mm0, 16*1(%r11)
 
981
        movq    %mm2, 16*5(%r11)                        
 
982
        movq    %mm1, 16*2(%r11)
 
983
        movq    %mm4, 16*6(%r11)                        
 
984
                
 
985
        paddw   %mm6, %mm7
 
986
        psubw   16*7(%r11), %mm6
 
987
 
 
988
        movq    %mm7, 16*3(%r11)
 
989
        movq    %mm6, 16*7(%r11)                
 
990
        
 
991
        ret             
 
992
 
 
993
.align 8        
 
994
.global _dv_dct_block_mmx_x86_64_postscale_248
 
995
.hidden _dv_dct_block_mmx_x86_64_postscale_248
 
996
.type   _dv_dct_block_mmx_x86_64_postscale_248,@function
 
997
_dv_dct_block_mmx_x86_64_postscale_248:
 
998
 
 
999
/* void _dv_dct_block_mmx_x86_64_postscale_248(int16_t* block, int16_t* postscale_matrix); */
 
1000
        
 
1001
        /* arguments are block=rdi, postscale=rsi */
 
1002
 
 
1003
        push    %r12
 
1004
 
 
1005
        mov     %rdi,%r11       # block matrix 
 
1006
        mov     %rsi, %r12      # postscale matrix 
 
1007
 
 
1008
        movq    0*8(%r11), %mm0
 
1009
        movq    1*8(%r11), %mm1
 
1010
        movq    2*8(%r11), %mm2
 
1011
        movq    3*8(%r11), %mm3
 
1012
 
 
1013
        movq    %mm0, %mm4
 
1014
        movq    %mm1, %mm5
 
1015
        movq    %mm2, %mm6
 
1016
        movq    %mm3, %mm7
 
1017
        psraw   $0xf, %mm4
 
1018
        psraw   $0xf, %mm5
 
1019
        psraw   $0xf, %mm6
 
1020
        psraw   $0xf, %mm7
 
1021
 
 
1022
        pxor    %mm4, %mm0
 
1023
        pxor    %mm5, %mm1
 
1024
        pxor    %mm6, %mm2
 
1025
        pxor    %mm7, %mm3
 
1026
 
 
1027
        psubw   %mm4, %mm0
 
1028
        psubw   %mm5, %mm1
 
1029
        psubw   %mm6, %mm2
 
1030
        psubw   %mm7, %mm3
 
1031
                
 
1032
        pmulhw  0*8(%r12), %mm0
 
1033
        pmulhw  1*8(%r12), %mm1
 
1034
        pmulhw  2*8(%r12), %mm2
 
1035
        pmulhw  3*8(%r12), %mm3
 
1036
        
 
1037
        psraw   $YUV_PRECISION, %mm0
 
1038
        psraw   $YUV_PRECISION, %mm1
 
1039
        psraw   $YUV_PRECISION, %mm2
 
1040
        psraw   $YUV_PRECISION, %mm3
 
1041
 
 
1042
        pxor    %mm4, %mm0
 
1043
        pxor    %mm5, %mm1
 
1044
        pxor    %mm6, %mm2
 
1045
        pxor    %mm7, %mm3
 
1046
 
 
1047
        psubw   %mm4, %mm0
 
1048
        psubw   %mm5, %mm1
 
1049
        psubw   %mm6, %mm2
 
1050
        psubw   %mm7, %mm3
 
1051
        
 
1052
        movq    %mm0, 0*8(%r11)
 
1053
        movq    %mm1, 1*8(%r11)
 
1054
        movq    %mm2, 2*8(%r11)
 
1055
        movq    %mm3, 3*8(%r11)
 
1056
 
 
1057
        
 
1058
        movq    4*8(%r11), %mm0
 
1059
        movq    5*8(%r11), %mm1
 
1060
        movq    6*8(%r11), %mm2
 
1061
        movq    7*8(%r11), %mm3
 
1062
 
 
1063
        movq    %mm0, %mm4
 
1064
        movq    %mm1, %mm5
 
1065
        movq    %mm2, %mm6
 
1066
        movq    %mm3, %mm7
 
1067
        psraw   $0xf, %mm4
 
1068
        psraw   $0xf, %mm5
 
1069
        psraw   $0xf, %mm6
 
1070
        psraw   $0xf, %mm7
 
1071
 
 
1072
        pxor    %mm4, %mm0
 
1073
        pxor    %mm5, %mm1
 
1074
        pxor    %mm6, %mm2
 
1075
        pxor    %mm7, %mm3
 
1076
 
 
1077
        psubw   %mm4, %mm0
 
1078
        psubw   %mm5, %mm1
 
1079
        psubw   %mm6, %mm2
 
1080
        psubw   %mm7, %mm3
 
1081
                
 
1082
        pmulhw  4*8(%r12), %mm0
 
1083
        pmulhw  5*8(%r12), %mm1
 
1084
        pmulhw  6*8(%r12), %mm2
 
1085
        pmulhw  7*8(%r12), %mm3
 
1086
        
 
1087
        psraw   $YUV_PRECISION, %mm0
 
1088
        psraw   $YUV_PRECISION, %mm1
 
1089
        psraw   $YUV_PRECISION, %mm2
 
1090
        psraw   $YUV_PRECISION, %mm3
 
1091
 
 
1092
        pxor    %mm4, %mm0
 
1093
        pxor    %mm5, %mm1
 
1094
        pxor    %mm6, %mm2
 
1095
        pxor    %mm7, %mm3
 
1096
 
 
1097
        psubw   %mm4, %mm0
 
1098
        psubw   %mm5, %mm1
 
1099
        psubw   %mm6, %mm2
 
1100
        psubw   %mm7, %mm3
 
1101
        
 
1102
        movq    %mm0, 4*8(%r11)
 
1103
        movq    %mm1, 5*8(%r11)
 
1104
        movq    %mm2, 6*8(%r11)
 
1105
        movq    %mm3, 7*8(%r11)
 
1106
        
 
1107
 
 
1108
        movq    8*8(%r11), %mm0
 
1109
        movq    9*8(%r11), %mm1
 
1110
        movq    10*8(%r11), %mm2
 
1111
        movq    11*8(%r11), %mm3
 
1112
 
 
1113
        movq    %mm0, %mm4
 
1114
        movq    %mm1, %mm5
 
1115
        movq    %mm2, %mm6
 
1116
        movq    %mm3, %mm7
 
1117
        psraw   $0xf, %mm4
 
1118
        psraw   $0xf, %mm5
 
1119
        psraw   $0xf, %mm6
 
1120
        psraw   $0xf, %mm7
 
1121
 
 
1122
        pxor    %mm4, %mm0
 
1123
        pxor    %mm5, %mm1
 
1124
        pxor    %mm6, %mm2
 
1125
        pxor    %mm7, %mm3
 
1126
 
 
1127
        psubw   %mm4, %mm0
 
1128
        psubw   %mm5, %mm1
 
1129
        psubw   %mm6, %mm2
 
1130
        psubw   %mm7, %mm3
 
1131
                
 
1132
        pmulhw  8*8(%r12), %mm0
 
1133
        pmulhw  9*8(%r12), %mm1
 
1134
        pmulhw  10*8(%r12), %mm2
 
1135
        pmulhw  11*8(%r12), %mm3
 
1136
        
 
1137
        psraw   $YUV_PRECISION, %mm0
 
1138
        psraw   $YUV_PRECISION, %mm1
 
1139
        psraw   $YUV_PRECISION, %mm2
 
1140
        psraw   $YUV_PRECISION, %mm3
 
1141
 
 
1142
        pxor    %mm4, %mm0
 
1143
        pxor    %mm5, %mm1
 
1144
        pxor    %mm6, %mm2
 
1145
        pxor    %mm7, %mm3
 
1146
 
 
1147
        psubw   %mm4, %mm0
 
1148
        psubw   %mm5, %mm1
 
1149
        psubw   %mm6, %mm2
 
1150
        psubw   %mm7, %mm3
 
1151
        
 
1152
        movq    %mm0, 8*8(%r11)
 
1153
        movq    %mm1, 9*8(%r11)
 
1154
        movq    %mm2, 10*8(%r11)
 
1155
        movq    %mm3, 11*8(%r11)
 
1156
 
 
1157
                
 
1158
        movq    12*8(%r11), %mm0
 
1159
        movq    13*8(%r11), %mm1
 
1160
        movq    14*8(%r11), %mm2
 
1161
        movq    15*8(%r11), %mm3
 
1162
 
 
1163
        movq    %mm0, %mm4
 
1164
        movq    %mm1, %mm5
 
1165
        movq    %mm2, %mm6
 
1166
        movq    %mm3, %mm7
 
1167
        psraw   $0xf, %mm4
 
1168
        psraw   $0xf, %mm5
 
1169
        psraw   $0xf, %mm6
 
1170
        psraw   $0xf, %mm7
 
1171
 
 
1172
        pxor    %mm4, %mm0
 
1173
        pxor    %mm5, %mm1
 
1174
        pxor    %mm6, %mm2
 
1175
        pxor    %mm7, %mm3
 
1176
 
 
1177
        psubw   %mm4, %mm0
 
1178
        psubw   %mm5, %mm1
 
1179
        psubw   %mm6, %mm2
 
1180
        psubw   %mm7, %mm3
 
1181
                
 
1182
        pmulhw  12*8(%r12), %mm0
 
1183
        pmulhw  13*8(%r12), %mm1
 
1184
        pmulhw  14*8(%r12), %mm2
 
1185
        pmulhw  15*8(%r12), %mm3
 
1186
        
 
1187
        psraw   $YUV_PRECISION, %mm0
 
1188
        psraw   $YUV_PRECISION, %mm1
 
1189
        psraw   $YUV_PRECISION, %mm2
 
1190
        psraw   $YUV_PRECISION, %mm3
 
1191
 
 
1192
        pxor    %mm4, %mm0
 
1193
        pxor    %mm5, %mm1
 
1194
        pxor    %mm6, %mm2
 
1195
        pxor    %mm7, %mm3
 
1196
 
 
1197
        psubw   %mm4, %mm0
 
1198
        psubw   %mm5, %mm1
 
1199
        psubw   %mm6, %mm2
 
1200
        psubw   %mm7, %mm3
 
1201
        
 
1202
        movq    %mm0, 12*8(%r11)
 
1203
        movq    %mm1, 13*8(%r11)
 
1204
        movq    %mm2, 14*8(%r11)
 
1205
        movq    %mm3, 15*8(%r11)
 
1206
                        
 
1207
        pop      %r12
 
1208
        
 
1209
        ret