~ubuntu-branches/ubuntu/vivid/ffmpeg/vivid

« back to all changes in this revision

Viewing changes to libavcodec/x86/h264_deblock_sse2.asm

  • Committer: Package Import Robot
  • Author(s): Andreas Cadhalpun
  • Date: 2014-11-05 01:18:23 UTC
  • mfrom: (0.2.17 sid)
  • Revision ID: package-import@ubuntu.com-20141105011823-xsbeceffs43wtkn7
Tags: 7:2.4.3-1
* Import new upstream bugfix release 2.4.3.
   - Refresh Change-symbol-versioning.patch.
   - Add new symbols to the libavdevice symbols file.
* Enable libbs2b on arm64, since it is now available.
* Disable frei0r and libx264 on x32, libsoxr and openal on sparc64
  and libopencv on m68k, sh4, sparc64 and x32, because they are not
  (yet) avialable there.
* Disable assembler optimizations on x32, as they wouldn't work there.
* Include config.log in the build-log, when compiling fails.
* Add fix-hppa-tests.patch to work around a gcc bug on hppa.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
;*****************************************************************************
2
 
;* MMX/SSE2-optimized H.264 deblocking code
3
 
;*****************************************************************************
4
 
;* Copyright (C) 2005-2008 x264 project
5
 
;*
6
 
;* Authors: Loren Merritt <lorenm@u.washington.edu>
7
 
;*
8
 
;* This program is free software; you can redistribute it and/or modify
9
 
;* it under the terms of the GNU General Public License as published by
10
 
;* the Free Software Foundation; either version 2 of the License, or
11
 
;* (at your option) any later version.
12
 
;*
13
 
;* This program is distributed in the hope that it will be useful,
14
 
;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 
;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 
;* GNU General Public License for more details.
17
 
;*
18
 
;* You should have received a copy of the GNU General Public License
19
 
;* along with this program; if not, write to the Free Software
20
 
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
21
 
;*****************************************************************************
22
 
 
23
 
%include "x86inc.asm"
24
 
 
25
 
SECTION_RODATA
26
 
pb_00: times 16 db 0x00
27
 
pb_01: times 16 db 0x01
28
 
pb_03: times 16 db 0x03
29
 
pb_a1: times 16 db 0xa1
30
 
 
31
 
SECTION .text
32
 
 
33
 
; expands to [base],...,[base+7*stride]
34
 
%define PASS8ROWS(base, base3, stride, stride3) \
35
 
    [base], [base+stride], [base+stride*2], [base3], \
36
 
    [base3+stride], [base3+stride*2], [base3+stride3], [base3+stride*4]
37
 
 
38
 
; in: 8 rows of 4 bytes in %1..%8
39
 
; out: 4 rows of 8 bytes in m0..m3
40
 
%macro TRANSPOSE4x8_LOAD 8
41
 
    movd       m0, %1
42
 
    movd       m2, %2
43
 
    movd       m1, %3
44
 
    movd       m3, %4
45
 
    punpcklbw  m0, m2
46
 
    punpcklbw  m1, m3
47
 
    movq       m2, m0
48
 
    punpcklwd  m0, m1
49
 
    punpckhwd  m2, m1
50
 
 
51
 
    movd       m4, %5
52
 
    movd       m6, %6
53
 
    movd       m5, %7
54
 
    movd       m7, %8
55
 
    punpcklbw  m4, m6
56
 
    punpcklbw  m5, m7
57
 
    movq       m6, m4
58
 
    punpcklwd  m4, m5
59
 
    punpckhwd  m6, m5
60
 
 
61
 
    movq       m1, m0
62
 
    movq       m3, m2
63
 
    punpckldq  m0, m4
64
 
    punpckhdq  m1, m4
65
 
    punpckldq  m2, m6
66
 
    punpckhdq  m3, m6
67
 
%endmacro
68
 
 
69
 
; in: 4 rows of 8 bytes in m0..m3
70
 
; out: 8 rows of 4 bytes in %1..%8
71
 
%macro TRANSPOSE8x4_STORE 8
72
 
    movq       m4, m0
73
 
    movq       m5, m1
74
 
    movq       m6, m2
75
 
    punpckhdq  m4, m4
76
 
    punpckhdq  m5, m5
77
 
    punpckhdq  m6, m6
78
 
 
79
 
    punpcklbw  m0, m1
80
 
    punpcklbw  m2, m3
81
 
    movq       m1, m0
82
 
    punpcklwd  m0, m2
83
 
    punpckhwd  m1, m2
84
 
    movd       %1, m0
85
 
    punpckhdq  m0, m0
86
 
    movd       %2, m0
87
 
    movd       %3, m1
88
 
    punpckhdq  m1, m1
89
 
    movd       %4, m1
90
 
 
91
 
    punpckhdq  m3, m3
92
 
    punpcklbw  m4, m5
93
 
    punpcklbw  m6, m3
94
 
    movq       m5, m4
95
 
    punpcklwd  m4, m6
96
 
    punpckhwd  m5, m6
97
 
    movd       %5, m4
98
 
    punpckhdq  m4, m4
99
 
    movd       %6, m4
100
 
    movd       %7, m5
101
 
    punpckhdq  m5, m5
102
 
    movd       %8, m5
103
 
%endmacro
104
 
 
105
 
%macro SBUTTERFLY 4
106
 
    movq       %4, %2
107
 
    punpckl%1  %2, %3
108
 
    punpckh%1  %4, %3
109
 
%endmacro
110
 
 
111
 
; in: 8 rows of 8 (only the middle 6 pels are used) in %1..%8
112
 
; out: 6 rows of 8 in [%9+0*16] .. [%9+5*16]
113
 
%macro TRANSPOSE6x8_MEM 9
114
 
    movq  m0, %1
115
 
    movq  m1, %2
116
 
    movq  m2, %3
117
 
    movq  m3, %4
118
 
    movq  m4, %5
119
 
    movq  m5, %6
120
 
    movq  m6, %7
121
 
    SBUTTERFLY bw, m0, m1, m7
122
 
    SBUTTERFLY bw, m2, m3, m1
123
 
    SBUTTERFLY bw, m4, m5, m3
124
 
    movq  [%9+0x10], m1
125
 
    SBUTTERFLY bw, m6, %8, m5
126
 
    SBUTTERFLY wd, m0, m2, m1
127
 
    SBUTTERFLY wd, m4, m6, m2
128
 
    punpckhdq m0, m4
129
 
    movq  [%9+0x00], m0
130
 
    SBUTTERFLY wd, m7, [%9+0x10], m6
131
 
    SBUTTERFLY wd, m3, m5, m4
132
 
    SBUTTERFLY dq, m7, m3, m0
133
 
    SBUTTERFLY dq, m1, m2, m5
134
 
    punpckldq m6, m4
135
 
    movq  [%9+0x10], m1
136
 
    movq  [%9+0x20], m5
137
 
    movq  [%9+0x30], m7
138
 
    movq  [%9+0x40], m0
139
 
    movq  [%9+0x50], m6
140
 
%endmacro
141
 
 
142
 
; in: 8 rows of 8 in %1..%8
143
 
; out: 8 rows of 8 in %9..%16
144
 
%macro TRANSPOSE8x8_MEM 16
145
 
    movq  m0, %1
146
 
    movq  m1, %2
147
 
    movq  m2, %3
148
 
    movq  m3, %4
149
 
    movq  m4, %5
150
 
    movq  m5, %6
151
 
    movq  m6, %7
152
 
    SBUTTERFLY bw, m0, m1, m7
153
 
    SBUTTERFLY bw, m2, m3, m1
154
 
    SBUTTERFLY bw, m4, m5, m3
155
 
    SBUTTERFLY bw, m6, %8, m5
156
 
    movq  %9,  m3
157
 
    SBUTTERFLY wd, m0, m2, m3
158
 
    SBUTTERFLY wd, m4, m6, m2
159
 
    SBUTTERFLY wd, m7, m1, m6
160
 
    movq  %11, m2
161
 
    movq  m2,  %9
162
 
    SBUTTERFLY wd, m2, m5, m1
163
 
    SBUTTERFLY dq, m0, m4, m5
164
 
    SBUTTERFLY dq, m7, m2, m4
165
 
    movq  %9,  m0
166
 
    movq  %10, m5
167
 
    movq  %13, m7
168
 
    movq  %14, m4
169
 
    SBUTTERFLY dq, m3, %11, m0
170
 
    SBUTTERFLY dq, m6, m1, m5
171
 
    movq  %11, m3
172
 
    movq  %12, m0
173
 
    movq  %15, m6
174
 
    movq  %16, m5
175
 
%endmacro
176
 
 
177
 
; out: %4 = |%1-%2|>%3
178
 
; clobbers: %5
179
 
%macro DIFF_GT 5
180
 
    mova    %5, %2
181
 
    mova    %4, %1
182
 
    psubusb %5, %1
183
 
    psubusb %4, %2
184
 
    por     %4, %5
185
 
    psubusb %4, %3
186
 
%endmacro
187
 
 
188
 
; out: %4 = |%1-%2|>%3
189
 
; clobbers: %5
190
 
%macro DIFF_GT2 5
191
 
    mova    %5, %2
192
 
    mova    %4, %1
193
 
    psubusb %5, %1
194
 
    psubusb %4, %2
195
 
    psubusb %5, %3
196
 
    psubusb %4, %3
197
 
    pcmpeqb %4, %5
198
 
%endmacro
199
 
 
200
 
%macro SPLATW 1
201
 
%ifidn m0, xmm0
202
 
    pshuflw  %1, %1, 0
203
 
    punpcklqdq %1, %1
204
 
%else
205
 
    pshufw   %1, %1, 0
206
 
%endif
207
 
%endmacro
208
 
 
209
 
; in: m0=p1 m1=p0 m2=q0 m3=q1 %1=alpha-1 %2=beta-1
210
 
; out: m5=beta-1, m7=mask, %3=alpha-1
211
 
; clobbers: m4,m6
212
 
%macro LOAD_MASK 2-3
213
 
    movd     m4, %1
214
 
    movd     m5, %2
215
 
    SPLATW   m4
216
 
    SPLATW   m5
217
 
    packuswb m4, m4  ; 16x alpha-1
218
 
    packuswb m5, m5  ; 16x beta-1
219
 
%if %0>2
220
 
    mova     %3, m4
221
 
%endif
222
 
    DIFF_GT  m1, m2, m4, m7, m6 ; |p0-q0| > alpha-1
223
 
    DIFF_GT  m0, m1, m5, m4, m6 ; |p1-p0| > beta-1
224
 
    por      m7, m4
225
 
    DIFF_GT  m3, m2, m5, m4, m6 ; |q1-q0| > beta-1
226
 
    por      m7, m4
227
 
    pxor     m6, m6
228
 
    pcmpeqb  m7, m6
229
 
%endmacro
230
 
 
231
 
; in: m0=p1 m1=p0 m2=q0 m3=q1 m7=(tc&mask)
232
 
; out: m1=p0' m2=q0'
233
 
; clobbers: m0,3-6
234
 
%macro DEBLOCK_P0_Q0 0
235
 
    mova    m5, m1
236
 
    pxor    m5, m2           ; p0^q0
237
 
    pand    m5, [pb_01 GLOBAL] ; (p0^q0)&1
238
 
    pcmpeqb m4, m4
239
 
    pxor    m3, m4
240
 
    pavgb   m3, m0           ; (p1 - q1 + 256)>>1
241
 
    pavgb   m3, [pb_03 GLOBAL] ; (((p1 - q1 + 256)>>1)+4)>>1 = 64+2+(p1-q1)>>2
242
 
    pxor    m4, m1
243
 
    pavgb   m4, m2           ; (q0 - p0 + 256)>>1
244
 
    pavgb   m3, m5
245
 
    paddusb m3, m4           ; d+128+33
246
 
    mova    m6, [pb_a1 GLOBAL]
247
 
    psubusb m6, m3
248
 
    psubusb m3, [pb_a1 GLOBAL]
249
 
    pminub  m6, m7
250
 
    pminub  m3, m7
251
 
    psubusb m1, m6
252
 
    psubusb m2, m3
253
 
    paddusb m1, m3
254
 
    paddusb m2, m6
255
 
%endmacro
256
 
 
257
 
; in: m1=p0 m2=q0
258
 
;     %1=p1 %2=q2 %3=[q2] %4=[q1] %5=tc0 %6=tmp
259
 
; out: [q1] = clip( (q2+((p0+q0+1)>>1))>>1, q1-tc0, q1+tc0 )
260
 
; clobbers: q2, tmp, tc0
261
 
%macro LUMA_Q1 6
262
 
    mova    %6, m1
263
 
    pavgb   %6, m2
264
 
    pavgb   %2, %6             ; avg(p2,avg(p0,q0))
265
 
    pxor    %6, %3
266
 
    pand    %6, [pb_01 GLOBAL] ; (p2^avg(p0,q0))&1
267
 
    psubusb %2, %6             ; (p2+((p0+q0+1)>>1))>>1
268
 
    mova    %6, %1
269
 
    psubusb %6, %5
270
 
    paddusb %5, %1
271
 
    pmaxub  %2, %6
272
 
    pminub  %2, %5
273
 
    mova    %4, %2
274
 
%endmacro
275
 
 
276
 
%ifdef ARCH_X86_64
277
 
;-----------------------------------------------------------------------------
278
 
; void x264_deblock_v_luma_sse2( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
279
 
;-----------------------------------------------------------------------------
280
 
INIT_XMM
281
 
cglobal x264_deblock_v_luma_sse2, 5,5,10
282
 
    movd    m8, [r4] ; tc0
283
 
    lea     r4, [r1*3]
284
 
    dec     r2d        ; alpha-1
285
 
    neg     r4
286
 
    dec     r3d        ; beta-1
287
 
    add     r4, r0     ; pix-3*stride
288
 
 
289
 
    mova    m0, [r4+r1]   ; p1
290
 
    mova    m1, [r4+2*r1] ; p0
291
 
    mova    m2, [r0]      ; q0
292
 
    mova    m3, [r0+r1]   ; q1
293
 
    LOAD_MASK r2d, r3d
294
 
 
295
 
    punpcklbw m8, m8
296
 
    punpcklbw m8, m8 ; tc = 4x tc0[3], 4x tc0[2], 4x tc0[1], 4x tc0[0]
297
 
    pcmpeqb m9, m9
298
 
    pcmpeqb m9, m8
299
 
    pandn   m9, m7
300
 
    pand    m8, m9
301
 
 
302
 
    movdqa  m3, [r4] ; p2
303
 
    DIFF_GT2 m1, m3, m5, m6, m7 ; |p2-p0| > beta-1
304
 
    pand    m6, m9
305
 
    mova    m7, m8
306
 
    psubb   m7, m6
307
 
    pand    m6, m8
308
 
    LUMA_Q1 m0, m3, [r4], [r4+r1], m6, m4
309
 
 
310
 
    movdqa  m4, [r0+2*r1] ; q2
311
 
    DIFF_GT2 m2, m4, m5, m6, m3 ; |q2-q0| > beta-1
312
 
    pand    m6, m9
313
 
    pand    m8, m6
314
 
    psubb   m7, m6
315
 
    mova    m3, [r0+r1]
316
 
    LUMA_Q1 m3, m4, [r0+2*r1], [r0+r1], m8, m6
317
 
 
318
 
    DEBLOCK_P0_Q0
319
 
    mova    [r4+2*r1], m1
320
 
    mova    [r0], m2
321
 
    RET
322
 
 
323
 
;-----------------------------------------------------------------------------
324
 
; void x264_deblock_h_luma_sse2( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
325
 
;-----------------------------------------------------------------------------
326
 
INIT_MMX
327
 
cglobal x264_deblock_h_luma_sse2, 5,7
328
 
    movsxd r10, r1d
329
 
    lea    r11, [r10+r10*2]
330
 
    lea    r6,  [r0-4]
331
 
    lea    r5,  [r0-4+r11]
332
 
%ifdef WIN64
333
 
    sub    rsp, 0x98
334
 
    %define pix_tmp rsp+0x30
335
 
%else
336
 
    sub    rsp, 0x68
337
 
    %define pix_tmp rsp
338
 
%endif
339
 
 
340
 
    ; transpose 6x16 -> tmp space
341
 
    TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r10, r11), pix_tmp
342
 
    lea    r6, [r6+r10*8]
343
 
    lea    r5, [r5+r10*8]
344
 
    TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r10, r11), pix_tmp+8
345
 
 
346
 
    ; vertical filter
347
 
    ; alpha, beta, tc0 are still in r2d, r3d, r4
348
 
    ; don't backup r6, r5, r10, r11 because x264_deblock_v_luma_sse2 doesn't use them
349
 
    lea    r0, [pix_tmp+0x30]
350
 
    mov    r1d, 0x10
351
 
%ifdef WIN64
352
 
    mov    [rsp+0x20], r4
353
 
%endif
354
 
    call   x264_deblock_v_luma_sse2
355
 
 
356
 
    ; transpose 16x4 -> original space  (only the middle 4 rows were changed by the filter)
357
 
    add    r6, 2
358
 
    add    r5, 2
359
 
    movq   m0, [pix_tmp+0x18]
360
 
    movq   m1, [pix_tmp+0x28]
361
 
    movq   m2, [pix_tmp+0x38]
362
 
    movq   m3, [pix_tmp+0x48]
363
 
    TRANSPOSE8x4_STORE  PASS8ROWS(r6, r5, r10, r11)
364
 
 
365
 
    shl    r10, 3
366
 
    sub    r6,  r10
367
 
    sub    r5,  r10
368
 
    shr    r10, 3
369
 
    movq   m0, [pix_tmp+0x10]
370
 
    movq   m1, [pix_tmp+0x20]
371
 
    movq   m2, [pix_tmp+0x30]
372
 
    movq   m3, [pix_tmp+0x40]
373
 
    TRANSPOSE8x4_STORE  PASS8ROWS(r6, r5, r10, r11)
374
 
 
375
 
%ifdef WIN64
376
 
    add    rsp, 0x98
377
 
%else
378
 
    add    rsp, 0x68
379
 
%endif
380
 
    RET
381
 
 
382
 
%else
383
 
 
384
 
%macro DEBLOCK_LUMA 3
385
 
;-----------------------------------------------------------------------------
386
 
; void x264_deblock_v8_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
387
 
;-----------------------------------------------------------------------------
388
 
cglobal x264_deblock_%2_luma_%1, 5,5
389
 
    lea     r4, [r1*3]
390
 
    dec     r2     ; alpha-1
391
 
    neg     r4
392
 
    dec     r3     ; beta-1
393
 
    add     r4, r0 ; pix-3*stride
394
 
    %assign pad 2*%3+12-(stack_offset&15)
395
 
    SUB     esp, pad
396
 
 
397
 
    mova    m0, [r4+r1]   ; p1
398
 
    mova    m1, [r4+2*r1] ; p0
399
 
    mova    m2, [r0]      ; q0
400
 
    mova    m3, [r0+r1]   ; q1
401
 
    LOAD_MASK r2, r3
402
 
 
403
 
    mov     r3, r4mp
404
 
    movd    m4, [r3] ; tc0
405
 
    punpcklbw m4, m4
406
 
    punpcklbw m4, m4 ; tc = 4x tc0[3], 4x tc0[2], 4x tc0[1], 4x tc0[0]
407
 
    mova   [esp+%3], m4 ; tc
408
 
    pcmpeqb m3, m3
409
 
    pcmpgtb m4, m3
410
 
    pand    m4, m7
411
 
    mova   [esp], m4 ; mask
412
 
 
413
 
    mova    m3, [r4] ; p2
414
 
    DIFF_GT2 m1, m3, m5, m6, m7 ; |p2-p0| > beta-1
415
 
    pand    m6, m4
416
 
    pand    m4, [esp+%3] ; tc
417
 
    mova    m7, m4
418
 
    psubb   m7, m6
419
 
    pand    m6, m4
420
 
    LUMA_Q1 m0, m3, [r4], [r4+r1], m6, m4
421
 
 
422
 
    mova    m4, [r0+2*r1] ; q2
423
 
    DIFF_GT2 m2, m4, m5, m6, m3 ; |q2-q0| > beta-1
424
 
    mova    m5, [esp] ; mask
425
 
    pand    m6, m5
426
 
    mova    m5, [esp+%3] ; tc
427
 
    pand    m5, m6
428
 
    psubb   m7, m6
429
 
    mova    m3, [r0+r1]
430
 
    LUMA_Q1 m3, m4, [r0+2*r1], [r0+r1], m5, m6
431
 
 
432
 
    DEBLOCK_P0_Q0
433
 
    mova    [r4+2*r1], m1
434
 
    mova    [r0], m2
435
 
    ADD     esp, pad
436
 
    RET
437
 
 
438
 
;-----------------------------------------------------------------------------
439
 
; void x264_deblock_h_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
440
 
;-----------------------------------------------------------------------------
441
 
INIT_MMX
442
 
cglobal x264_deblock_h_luma_%1, 0,5
443
 
    mov    r0, r0mp
444
 
    mov    r3, r1m
445
 
    lea    r4, [r3*3]
446
 
    sub    r0, 4
447
 
    lea    r1, [r0+r4]
448
 
    %assign pad 0x78-(stack_offset&15)
449
 
    SUB    esp, pad
450
 
%define pix_tmp esp+12
451
 
 
452
 
    ; transpose 6x16 -> tmp space
453
 
    TRANSPOSE6x8_MEM  PASS8ROWS(r0, r1, r3, r4), pix_tmp
454
 
    lea    r0, [r0+r3*8]
455
 
    lea    r1, [r1+r3*8]
456
 
    TRANSPOSE6x8_MEM  PASS8ROWS(r0, r1, r3, r4), pix_tmp+8
457
 
 
458
 
    ; vertical filter
459
 
    lea    r0, [pix_tmp+0x30]
460
 
    PUSH   dword r4m
461
 
    PUSH   dword r3m
462
 
    PUSH   dword r2m
463
 
    PUSH   dword 16
464
 
    PUSH   dword r0
465
 
    call   x264_deblock_%2_luma_%1
466
 
%ifidn %2, v8
467
 
    add    dword [esp   ], 8 ; pix_tmp+0x38
468
 
    add    dword [esp+16], 2 ; tc0+2
469
 
    call   x264_deblock_%2_luma_%1
470
 
%endif
471
 
    ADD    esp, 20
472
 
 
473
 
    ; transpose 16x4 -> original space  (only the middle 4 rows were changed by the filter)
474
 
    mov    r0, r0mp
475
 
    sub    r0, 2
476
 
    lea    r1, [r0+r4]
477
 
 
478
 
    movq   m0, [pix_tmp+0x10]
479
 
    movq   m1, [pix_tmp+0x20]
480
 
    movq   m2, [pix_tmp+0x30]
481
 
    movq   m3, [pix_tmp+0x40]
482
 
    TRANSPOSE8x4_STORE  PASS8ROWS(r0, r1, r3, r4)
483
 
 
484
 
    lea    r0, [r0+r3*8]
485
 
    lea    r1, [r1+r3*8]
486
 
    movq   m0, [pix_tmp+0x18]
487
 
    movq   m1, [pix_tmp+0x28]
488
 
    movq   m2, [pix_tmp+0x38]
489
 
    movq   m3, [pix_tmp+0x48]
490
 
    TRANSPOSE8x4_STORE  PASS8ROWS(r0, r1, r3, r4)
491
 
 
492
 
    ADD    esp, pad
493
 
    RET
494
 
%endmacro ; DEBLOCK_LUMA
495
 
 
496
 
INIT_XMM
497
 
DEBLOCK_LUMA sse2, v, 16
498
 
 
499
 
%endif ; ARCH
500
 
 
501
 
 
502
 
 
503
 
%macro LUMA_INTRA_P012 4 ; p0..p3 in memory
504
 
    mova  t0, p2
505
 
    mova  t1, p0
506
 
    pavgb t0, p1
507
 
    pavgb t1, q0
508
 
    pavgb t0, t1 ; ((p2+p1+1)/2 + (p0+q0+1)/2 + 1)/2
509
 
    mova  t5, t1
510
 
    mova  t2, p2
511
 
    mova  t3, p0
512
 
    paddb t2, p1
513
 
    paddb t3, q0
514
 
    paddb t2, t3
515
 
    mova  t3, t2
516
 
    mova  t4, t2
517
 
    psrlw t2, 1
518
 
    pavgb t2, mpb_00
519
 
    pxor  t2, t0
520
 
    pand  t2, mpb_01
521
 
    psubb t0, t2 ; p1' = (p2+p1+p0+q0+2)/4;
522
 
 
523
 
    mova  t1, p2
524
 
    mova  t2, p2
525
 
    pavgb t1, q1
526
 
    psubb t2, q1
527
 
    paddb t3, t3
528
 
    psubb t3, t2 ; p2+2*p1+2*p0+2*q0+q1
529
 
    pand  t2, mpb_01
530
 
    psubb t1, t2
531
 
    pavgb t1, p1
532
 
    pavgb t1, t5 ; (((p2+q1)/2 + p1+1)/2 + (p0+q0+1)/2 + 1)/2
533
 
    psrlw t3, 2
534
 
    pavgb t3, mpb_00
535
 
    pxor  t3, t1
536
 
    pand  t3, mpb_01
537
 
    psubb t1, t3 ; p0'a = (p2+2*p1+2*p0+2*q0+q1+4)/8
538
 
 
539
 
    mova  t3, p0
540
 
    mova  t2, p0
541
 
    pxor  t3, q1
542
 
    pavgb t2, q1
543
 
    pand  t3, mpb_01
544
 
    psubb t2, t3
545
 
    pavgb t2, p1 ; p0'b = (2*p1+p0+q0+2)/4
546
 
 
547
 
    pxor  t1, t2
548
 
    pxor  t2, p0
549
 
    pand  t1, mask1p
550
 
    pand  t2, mask0
551
 
    pxor  t1, t2
552
 
    pxor  t1, p0
553
 
    mova  %1, t1 ; store p0
554
 
 
555
 
    mova  t1, %4 ; p3
556
 
    mova  t2, t1
557
 
    pavgb t1, p2
558
 
    paddb t2, p2
559
 
    pavgb t1, t0 ; (p3+p2+1)/2 + (p2+p1+p0+q0+2)/4
560
 
    paddb t2, t2
561
 
    paddb t2, t4 ; 2*p3+3*p2+p1+p0+q0
562
 
    psrlw t2, 2
563
 
    pavgb t2, mpb_00
564
 
    pxor  t2, t1
565
 
    pand  t2, mpb_01
566
 
    psubb t1, t2 ; p2' = (2*p3+3*p2+p1+p0+q0+4)/8
567
 
 
568
 
    pxor  t0, p1
569
 
    pxor  t1, p2
570
 
    pand  t0, mask1p
571
 
    pand  t1, mask1p
572
 
    pxor  t0, p1
573
 
    pxor  t1, p2
574
 
    mova  %2, t0 ; store p1
575
 
    mova  %3, t1 ; store p2
576
 
%endmacro
577
 
 
578
 
%macro LUMA_INTRA_SWAP_PQ 0
579
 
    %define q1 m0
580
 
    %define q0 m1
581
 
    %define p0 m2
582
 
    %define p1 m3
583
 
    %define p2 q2
584
 
    %define mask1p mask1q
585
 
%endmacro
586
 
 
587
 
%macro DEBLOCK_LUMA_INTRA 2
588
 
    %define p1 m0
589
 
    %define p0 m1
590
 
    %define q0 m2
591
 
    %define q1 m3
592
 
    %define t0 m4
593
 
    %define t1 m5
594
 
    %define t2 m6
595
 
    %define t3 m7
596
 
%ifdef ARCH_X86_64
597
 
    %define p2 m8
598
 
    %define q2 m9
599
 
    %define t4 m10
600
 
    %define t5 m11
601
 
    %define mask0 m12
602
 
    %define mask1p m13
603
 
    %define mask1q [rsp-24]
604
 
    %define mpb_00 m14
605
 
    %define mpb_01 m15
606
 
%else
607
 
    %define spill(x) [esp+16*x+((stack_offset+4)&15)]
608
 
    %define p2 [r4+r1]
609
 
    %define q2 [r0+2*r1]
610
 
    %define t4 spill(0)
611
 
    %define t5 spill(1)
612
 
    %define mask0 spill(2)
613
 
    %define mask1p spill(3)
614
 
    %define mask1q spill(4)
615
 
    %define mpb_00 [pb_00 GLOBAL]
616
 
    %define mpb_01 [pb_01 GLOBAL]
617
 
%endif
618
 
 
619
 
;-----------------------------------------------------------------------------
620
 
; void x264_deblock_v_luma_intra_sse2( uint8_t *pix, int stride, int alpha, int beta )
621
 
;-----------------------------------------------------------------------------
622
 
cglobal x264_deblock_%2_luma_intra_%1, 4,6,16
623
 
%ifndef ARCH_X86_64
624
 
    sub     esp, 0x60
625
 
%endif
626
 
    lea     r4, [r1*4]
627
 
    lea     r5, [r1*3] ; 3*stride
628
 
    dec     r2d        ; alpha-1
629
 
    jl .end
630
 
    neg     r4
631
 
    dec     r3d        ; beta-1
632
 
    jl .end
633
 
    add     r4, r0     ; pix-4*stride
634
 
    mova    p1, [r4+2*r1]
635
 
    mova    p0, [r4+r5]
636
 
    mova    q0, [r0]
637
 
    mova    q1, [r0+r1]
638
 
%ifdef ARCH_X86_64
639
 
    pxor    mpb_00, mpb_00
640
 
    mova    mpb_01, [pb_01 GLOBAL]
641
 
    LOAD_MASK r2d, r3d, t5 ; m5=beta-1, t5=alpha-1, m7=mask0
642
 
    SWAP    7, 12 ; m12=mask0
643
 
    pavgb   t5, mpb_00
644
 
    pavgb   t5, mpb_01 ; alpha/4+1
645
 
    movdqa  p2, [r4+r1]
646
 
    movdqa  q2, [r0+2*r1]
647
 
    DIFF_GT2 p0, q0, t5, t0, t3 ; t0 = |p0-q0| > alpha/4+1
648
 
    DIFF_GT2 p0, p2, m5, t2, t5 ; mask1 = |p2-p0| > beta-1
649
 
    DIFF_GT2 q0, q2, m5, t4, t5 ; t4 = |q2-q0| > beta-1
650
 
    pand    t0, mask0
651
 
    pand    t4, t0
652
 
    pand    t2, t0
653
 
    mova    mask1q, t4
654
 
    mova    mask1p, t2
655
 
%else
656
 
    LOAD_MASK r2d, r3d, t5 ; m5=beta-1, t5=alpha-1, m7=mask0
657
 
    mova    m4, t5
658
 
    mova    mask0, m7
659
 
    pavgb   m4, [pb_00 GLOBAL]
660
 
    pavgb   m4, [pb_01 GLOBAL] ; alpha/4+1
661
 
    DIFF_GT2 p0, q0, m4, m6, m7 ; m6 = |p0-q0| > alpha/4+1
662
 
    pand    m6, mask0
663
 
    DIFF_GT2 p0, p2, m5, m4, m7 ; m4 = |p2-p0| > beta-1
664
 
    pand    m4, m6
665
 
    mova    mask1p, m4
666
 
    DIFF_GT2 q0, q2, m5, m4, m7 ; m4 = |q2-q0| > beta-1
667
 
    pand    m4, m6
668
 
    mova    mask1q, m4
669
 
%endif
670
 
    LUMA_INTRA_P012 [r4+r5], [r4+2*r1], [r4+r1], [r4]
671
 
    LUMA_INTRA_SWAP_PQ
672
 
    LUMA_INTRA_P012 [r0], [r0+r1], [r0+2*r1], [r0+r5]
673
 
.end:
674
 
%ifndef ARCH_X86_64
675
 
    add     esp, 0x60
676
 
%endif
677
 
    RET
678
 
 
679
 
INIT_MMX
680
 
%ifdef ARCH_X86_64
681
 
;-----------------------------------------------------------------------------
682
 
; void x264_deblock_h_luma_intra_sse2( uint8_t *pix, int stride, int alpha, int beta )
683
 
;-----------------------------------------------------------------------------
684
 
cglobal x264_deblock_h_luma_intra_%1, 4,7
685
 
    movsxd r10, r1d
686
 
    lea    r11, [r10*3]
687
 
    lea    r6,  [r0-4]
688
 
    lea    r5,  [r0-4+r11]
689
 
    sub    rsp, 0x88
690
 
    %define pix_tmp rsp
691
 
 
692
 
    ; transpose 8x16 -> tmp space
693
 
    TRANSPOSE8x8_MEM  PASS8ROWS(r6, r5, r10, r11), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30)
694
 
    lea    r6, [r6+r10*8]
695
 
    lea    r5, [r5+r10*8]
696
 
    TRANSPOSE8x8_MEM  PASS8ROWS(r6, r5, r10, r11), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30)
697
 
 
698
 
    lea    r0,  [pix_tmp+0x40]
699
 
    mov    r1,  0x10
700
 
    call   x264_deblock_v_luma_intra_%1
701
 
 
702
 
    ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8)
703
 
    lea    r5, [r6+r11]
704
 
    TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r6, r5, r10, r11)
705
 
    shl    r10, 3
706
 
    sub    r6,  r10
707
 
    sub    r5,  r10
708
 
    shr    r10, 3
709
 
    TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(r6, r5, r10, r11)
710
 
    add    rsp, 0x88
711
 
    RET
712
 
%else
713
 
cglobal x264_deblock_h_luma_intra_%1, 2,4
714
 
    lea    r3,  [r1*3]
715
 
    sub    r0,  4
716
 
    lea    r2,  [r0+r3]
717
 
%assign pad 0x8c-(stack_offset&15)
718
 
    SUB    rsp, pad
719
 
    %define pix_tmp rsp
720
 
 
721
 
    ; transpose 8x16 -> tmp space
722
 
    TRANSPOSE8x8_MEM  PASS8ROWS(r0, r2, r1, r3), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30)
723
 
    lea    r0,  [r0+r1*8]
724
 
    lea    r2,  [r2+r1*8]
725
 
    TRANSPOSE8x8_MEM  PASS8ROWS(r0, r2, r1, r3), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30)
726
 
 
727
 
    lea    r0,  [pix_tmp+0x40]
728
 
    PUSH   dword r3m
729
 
    PUSH   dword r2m
730
 
    PUSH   dword 16
731
 
    PUSH   r0
732
 
    call   x264_deblock_%2_luma_intra_%1
733
 
%ifidn %2, v8
734
 
    add    dword [rsp], 8 ; pix_tmp+8
735
 
    call   x264_deblock_%2_luma_intra_%1
736
 
%endif
737
 
    ADD    esp, 16
738
 
 
739
 
    mov    r1,  r1m
740
 
    mov    r0,  r0mp
741
 
    lea    r3,  [r1*3]
742
 
    sub    r0,  4
743
 
    lea    r2,  [r0+r3]
744
 
    ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8)
745
 
    TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(r0, r2, r1, r3)
746
 
    lea    r0,  [r0+r1*8]
747
 
    lea    r2,  [r2+r1*8]
748
 
    TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r0, r2, r1, r3)
749
 
    ADD    rsp, pad
750
 
    RET
751
 
%endif ; ARCH_X86_64
752
 
%endmacro ; DEBLOCK_LUMA_INTRA
753
 
 
754
 
INIT_XMM
755
 
DEBLOCK_LUMA_INTRA sse2, v
756
 
%ifndef ARCH_X86_64
757
 
INIT_MMX
758
 
DEBLOCK_LUMA_INTRA mmxext, v8
759
 
%endif