~ubuntu-branches/ubuntu/saucy/x264/saucy-updates

« back to all changes in this revision

Viewing changes to common/amd64/pixel-sse2.asm

  • Committer: Bazaar Package Importer
  • Author(s): John Dong
  • Date: 2007-01-17 22:00:05 UTC
  • mto: (12.1.1 sid) (1.3.1)
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: james.westby@ubuntu.com-20070117220005-4cesfv31lq3inbdp
Tags: upstream-0.cvs20070117
ImportĀ upstreamĀ versionĀ 0.cvs20070117

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
;* Copyright (C) 2005 x264 project
5
5
;*
6
6
;* Authors: Alex Izvorski <aizvorksi@gmail.com>
 
7
;*          Loren Merritt <lorenm@u.washington.edu>
7
8
;*
8
9
;* This program is free software; you can redistribute it and/or modify
9
10
;* it under the terms of the GNU General Public License as published by
55
56
cglobal x264_pixel_ssim_4x4x2_core_sse2
56
57
cglobal x264_pixel_ssim_end4_sse2
57
58
 
 
59
 
58
60
%macro HADDD 2 ; sum junk
59
61
    movhlps %2, %1
60
62
    paddd   %1, %2
86
88
    paddw   xmm0,   xmm3
87
89
%endmacro
88
90
 
89
 
%macro SAD_START_SSE2 0
90
 
;   mov     rdi, rdi            ; pix1
91
 
    movsxd  rsi, esi            ; stride1
92
 
;   mov     rdx, rdx            ; pix2
93
 
    movsxd  rcx, ecx            ; stride2
94
 
%endmacro
95
 
 
96
91
%macro SAD_END_SSE2 0
97
92
    movdqa  xmm1, xmm0
98
93
    psrldq  xmm0,  8
106
101
;   int x264_pixel_sad_16x16_sse2 (uint8_t *, int, uint8_t *, int )
107
102
;-----------------------------------------------------------------------------
108
103
x264_pixel_sad_16x16_sse2:
109
 
    SAD_START_SSE2
110
104
    movdqu xmm0, [rdx]
111
105
    movdqu xmm1, [rdx+rcx]
112
106
    lea    rdx,  [rdx+2*rcx]
175
169
;   int x264_pixel_sad_16x8_sse2 (uint8_t *, int, uint8_t *, int )
176
170
;-----------------------------------------------------------------------------
177
171
x264_pixel_sad_16x8_sse2:
178
 
    SAD_START_SSE2
179
172
    pxor    xmm0,   xmm0
180
173
    SAD_INC_4x16P_SSE2
181
174
    SAD_INC_4x16P_SSE2
216
209
    paddd   xmm0,   xmm3
217
210
%endmacro
218
211
 
219
 
%macro SSD_INC_8x16P_SSE2 0
220
 
    SSD_INC_2x16P_SSE2
221
 
    SSD_INC_2x16P_SSE2
222
 
    SSD_INC_2x16P_SSE2
223
 
    SSD_INC_2x16P_SSE2
224
 
%endmacro
225
 
 
226
212
%macro SSD_START_SSE2 0
227
 
;   mov     rdi, rdi            ; pix1
228
 
    movsxd  rsi, esi            ; stride1
229
 
;   mov     rdx, rdx            ; pix2
230
 
    movsxd  rcx, ecx            ; stride2
231
 
 
232
213
    pxor    xmm7,   xmm7        ; zero
233
214
    pxor    xmm0,   xmm0        ; mm0 holds the sum
234
215
%endmacro
245
226
;-----------------------------------------------------------------------------
246
227
x264_pixel_ssd_16x16_sse2:
247
228
    SSD_START_SSE2
248
 
    SSD_INC_8x16P_SSE2
249
 
    SSD_INC_8x16P_SSE2
 
229
%rep 8
 
230
    SSD_INC_2x16P_SSE2
 
231
%endrep
250
232
    SSD_END_SSE2
251
233
 
252
234
ALIGN 16
255
237
;-----------------------------------------------------------------------------
256
238
x264_pixel_ssd_16x8_sse2:
257
239
    SSD_START_SSE2
258
 
    SSD_INC_8x16P_SSE2
 
240
%rep 4
 
241
    SSD_INC_2x16P_SSE2
 
242
%endrep
259
243
    SSD_END_SSE2
260
244
 
261
 
; %1=(row2, row0) %2=(row3, row1) %3=junk
262
 
; output in %1=(row3, row0) and %3=(row2, row1)
263
 
%macro HADAMARD4x4_SSE2 3
264
 
    movdqa     %3, %1
265
 
    paddw      %1, %2
266
 
    psubw      %3, %2
267
 
    movdqa     %2, %1
268
 
    punpcklqdq %1, %3
269
 
    punpckhqdq %2, %3
270
 
    movdqa     %3, %1
271
 
    paddw      %1, %2
272
 
    psubw      %3, %2
273
 
%endmacro
274
 
 
275
 
;;; two HADAMARD4x4_SSE2 running side-by-side
276
 
%macro HADAMARD4x4_TWO_SSE2 6    ; a02 a13 junk1 b02 b13 junk2 (1=4 2=5 3=6)
277
 
    movdqa     %3, %1
278
 
    movdqa     %6, %4
279
 
    paddw      %1, %2
280
 
    paddw      %4, %5
281
 
    psubw      %3, %2
282
 
    psubw      %6, %5
283
 
    movdqa     %2, %1
284
 
    movdqa     %5, %4
285
 
    punpcklqdq %1, %3
286
 
    punpcklqdq %4, %6
287
 
    punpckhqdq %2, %3
288
 
    punpckhqdq %5, %6
289
 
    movdqa     %3, %1
290
 
    movdqa     %6, %4
291
 
    paddw      %1, %2
292
 
    paddw      %4, %5
293
 
    psubw      %3, %2
294
 
    psubw      %6, %5
295
 
%endmacro
296
 
 
297
 
%macro TRANSPOSE4x4_TWIST_SSE2 3    ; %1=(row3, row0) %2=(row2, row1) %3=junk, output in %1 and %2
298
 
    movdqa     %3, %1
299
 
    punpcklwd  %1, %2
300
 
    punpckhwd  %2, %3             ; backwards because the high quadwords are already swapped
301
 
 
302
 
    movdqa     %3, %1
303
 
    punpckldq  %1, %2
304
 
    punpckhdq  %3, %2
305
 
 
306
 
    movdqa     %2, %1
307
 
    punpcklqdq %1, %3
308
 
    punpckhqdq %2, %3
309
 
%endmacro
310
 
 
311
 
;;; two TRANSPOSE4x4_TWIST_SSE2 running side-by-side
312
 
%macro TRANSPOSE4x4_TWIST_TWO_SSE2 6    ; a02 a13 junk1 b02 b13 junk2 (1=4 2=5 3=6)
313
 
    movdqa     %3, %1
314
 
    movdqa     %6, %4
315
 
    punpcklwd  %1, %2
316
 
    punpcklwd  %4, %5
317
 
    punpckhwd  %2, %3
318
 
    punpckhwd  %5, %6
319
 
    movdqa     %3, %1
320
 
    movdqa     %6, %4
321
 
    punpckldq  %1, %2
322
 
    punpckldq  %4, %5
323
 
    punpckhdq  %3, %2
324
 
    punpckhdq  %6, %5
325
 
    movdqa     %2, %1
326
 
    movdqa     %5, %4
327
 
    punpcklqdq %1, %3
328
 
    punpcklqdq %4, %6
329
 
    punpckhqdq %2, %3
330
 
    punpckhqdq %5, %6
331
 
%endmacro
332
 
 
333
 
;;; loads the difference of two 4x4 blocks into xmm0,xmm1 and xmm4,xmm5 in interleaved-row order
334
 
;;; destroys xmm2, 3
335
 
;;; the value in xmm7 doesn't matter: it's only subtracted from itself
336
 
%macro LOAD4x8_DIFF_SSE2 0
337
 
    movq      xmm0, [rdi]
338
 
    movq      xmm4, [rdx]
339
 
    punpcklbw xmm0, xmm7
340
 
    punpcklbw xmm4, xmm7
341
 
    psubw     xmm0, xmm4
342
 
 
343
 
    movq      xmm1, [rdi+rsi]
344
 
    movq      xmm5, [rdx+rcx]
345
 
    lea       rdi,  [rdi+2*rsi]
346
 
    lea       rdx,  [rdx+2*rcx]
347
 
    punpcklbw xmm1, xmm7
348
 
    punpcklbw xmm5, xmm7
349
 
    psubw     xmm1, xmm5
350
 
 
351
 
    movq       xmm2, [rdi]
352
 
    movq       xmm4, [rdx]
353
 
    punpcklbw  xmm2, xmm7
354
 
    punpcklbw  xmm4, xmm7
355
 
    psubw      xmm2, xmm4
356
 
    movdqa     xmm4, xmm0
357
 
    punpcklqdq xmm0, xmm2        ; rows 0 and 2
358
 
    punpckhqdq xmm4, xmm2        ; next 4x4 rows 0 and 2
359
 
 
360
 
    movq       xmm3, [rdi+rsi]
361
 
    movq       xmm5, [rdx+rcx]
362
 
    lea        rdi,  [rdi+2*rsi]
363
 
    lea        rdx,  [rdx+2*rcx]
364
 
    punpcklbw  xmm3, xmm7
365
 
    punpcklbw  xmm5, xmm7
366
 
    psubw      xmm3, xmm5
367
 
    movdqa     xmm5, xmm1
368
 
    punpcklqdq xmm1, xmm3        ; rows 1 and 3
369
 
    punpckhqdq xmm5, xmm3        ; next 4x4 rows 1 and 3
 
245
 
 
246
 
 
247
%macro SUMSUB_BADC 4
 
248
    paddw   %1, %2
 
249
    paddw   %3, %4
 
250
    paddw   %2, %2
 
251
    paddw   %4, %4
 
252
    psubw   %2, %1
 
253
    psubw   %4, %3
 
254
%endmacro
 
255
 
 
256
%macro HADAMARD1x4 4
 
257
    SUMSUB_BADC %1, %2, %3, %4
 
258
    SUMSUB_BADC %1, %3, %2, %4
 
259
%endmacro
 
260
 
 
261
%macro HADAMARD1x8 8
 
262
    SUMSUB_BADC %1, %5, %2, %6
 
263
    SUMSUB_BADC %3, %7, %4, %8
 
264
    SUMSUB_BADC %1, %3, %2, %4
 
265
    SUMSUB_BADC %5, %7, %6, %8
 
266
    SUMSUB_BADC %1, %2, %3, %4
 
267
    SUMSUB_BADC %5, %6, %7, %8
 
268
%endmacro
 
269
 
 
270
%macro SBUTTERFLY 5
 
271
    mov%1       %5, %3
 
272
    punpckl%2   %3, %4
 
273
    punpckh%2   %5, %4
 
274
%endmacro
 
275
 
 
276
%macro SBUTTERFLY2 5  ; not really needed, but allows transpose4x4 to not shuffle registers
 
277
    mov%1       %5, %3
 
278
    punpckh%2   %3, %4
 
279
    punpckl%2   %5, %4
 
280
%endmacro
 
281
 
 
282
%macro TRANSPOSE4x4D 5   ; ABCD-T -> ADTC
 
283
    SBUTTERFLY dqa, dq,  %1, %2, %5
 
284
    SBUTTERFLY dqa, dq,  %3, %4, %2
 
285
    SBUTTERFLY dqa, qdq, %1, %3, %4
 
286
    SBUTTERFLY dqa, qdq, %5, %2, %3
 
287
%endmacro
 
288
 
 
289
%macro TRANSPOSE2x4x4W 5   ; ABCD-T -> ABCD
 
290
    SBUTTERFLY  dqa, wd,  %1, %2, %5
 
291
    SBUTTERFLY  dqa, wd,  %3, %4, %2
 
292
    SBUTTERFLY  dqa, dq,  %1, %3, %4
 
293
    SBUTTERFLY2 dqa, dq,  %5, %2, %3
 
294
    SBUTTERFLY  dqa, qdq, %1, %3, %2
 
295
    SBUTTERFLY2 dqa, qdq, %4, %5, %3
 
296
%endmacro
 
297
 
 
298
%macro TRANSPOSE8x8 9   ; ABCDEFGH-T -> AFHDTECB
 
299
    SBUTTERFLY dqa, wd, %1, %2, %9
 
300
    SBUTTERFLY dqa, wd, %3, %4, %2
 
301
    SBUTTERFLY dqa, wd, %5, %6, %4
 
302
    SBUTTERFLY dqa, wd, %7, %8, %6
 
303
    SBUTTERFLY dqa, dq, %1, %3, %8
 
304
    SBUTTERFLY dqa, dq, %9, %2, %3
 
305
    SBUTTERFLY dqa, dq, %5, %7, %2
 
306
    SBUTTERFLY dqa, dq, %4, %6, %7
 
307
    SBUTTERFLY dqa, qdq, %1, %5, %6
 
308
    SBUTTERFLY dqa, qdq, %9, %4, %5
 
309
    SBUTTERFLY dqa, qdq, %8, %2, %4
 
310
    SBUTTERFLY dqa, qdq, %3, %7, %2
 
311
%endmacro
 
312
 
 
313
%macro LOAD_DIFF_8P 4  ; MMP, MMT, [pix1], [pix2]
 
314
    movq        %1, %3
 
315
    movq        %2, %4
 
316
    punpcklbw   %1, %2
 
317
    punpcklbw   %2, %2
 
318
    psubw       %1, %2
370
319
%endmacro
371
320
 
372
321
%macro SUM1x8_SSE2 3    ; 01 junk sum
410
359
%endmacro
411
360
 
412
361
%macro SATD_TWO_SSE2 0
413
 
    LOAD4x8_DIFF_SSE2
414
 
    HADAMARD4x4_TWO_SSE2        xmm0, xmm1, xmm2, xmm4, xmm5, xmm3
415
 
    TRANSPOSE4x4_TWIST_TWO_SSE2 xmm0, xmm2, xmm1, xmm4, xmm3, xmm5
416
 
    HADAMARD4x4_TWO_SSE2        xmm0, xmm2, xmm1, xmm4, xmm3, xmm5
417
 
    SUM4x4_TWO_SSE2             xmm0, xmm1, xmm2, xmm4, xmm5, xmm3, xmm6
 
362
    LOAD_DIFF_8P xmm0, xmm4, [parm1q],          [parm3q]
 
363
    LOAD_DIFF_8P xmm1, xmm5, [parm1q+parm2q],   [parm3q+parm4q]
 
364
    LOAD_DIFF_8P xmm2, xmm4, [parm1q+2*parm2q], [parm3q+2*parm4q]
 
365
    LOAD_DIFF_8P xmm3, xmm5, [parm1q+r10],      [parm3q+r11]
 
366
    lea          parm1q, [parm1q+4*parm2q]
 
367
    lea          parm3q, [parm3q+4*parm4q]
 
368
 
 
369
    HADAMARD1x4       xmm0, xmm1, xmm2, xmm3
 
370
    TRANSPOSE2x4x4W   xmm0, xmm1, xmm2, xmm3, xmm4
 
371
    HADAMARD1x4       xmm0, xmm1, xmm2, xmm3
 
372
    SUM4x4_TWO_SSE2   xmm0, xmm1, xmm4, xmm2, xmm3, xmm5, xmm6
418
373
%endmacro
419
374
 
420
375
%macro SATD_START 0
421
 
;   mov     rdi, rdi            ; pix1
422
 
    movsxd  rsi, esi            ; stride1
423
 
;   mov     rdx, rdx            ; pix2
424
 
    movsxd  rcx, ecx            ; stride2
425
376
    pxor    xmm6, xmm6
 
377
    lea     r10,  [3*parm2q]
 
378
    lea     r11,  [3*parm4q]
426
379
%endmacro
427
380
 
428
381
%macro SATD_END 0
514
467
    SATD_END
515
468
 
516
469
 
517
 
%macro LOAD_DIFF_8P 4  ; MMP, MMT, [pix1], [pix2]
518
 
    movq        %1, %3
519
 
    movq        %2, %4
520
 
    punpcklbw   %1, %2
521
 
    punpcklbw   %2, %2
522
 
    psubw       %1, %2
523
 
%endmacro
524
 
 
525
 
%macro SBUTTERFLY 5
526
 
    mov%1       %5, %3
527
 
    punpckl%2   %3, %4
528
 
    punpckh%2   %5, %4
529
 
%endmacro
530
 
 
531
 
%macro TRANSPOSE4x4D 5   ; abcd-t -> adtc
532
 
    SBUTTERFLY dqa, dq,  %1, %2, %5
533
 
    SBUTTERFLY dqa, dq,  %3, %4, %2
534
 
    SBUTTERFLY dqa, qdq, %1, %3, %4
535
 
    SBUTTERFLY dqa, qdq, %5, %2, %3
536
 
%endmacro
537
 
 
538
 
;-----------------------------------------------------------------------------
539
 
; input ABCDEFGH output AFHDTECB 
540
 
;-----------------------------------------------------------------------------
541
 
%macro TRANSPOSE8x8 9
542
 
    SBUTTERFLY dqa, wd, %1, %2, %9
543
 
    SBUTTERFLY dqa, wd, %3, %4, %2
544
 
    SBUTTERFLY dqa, wd, %5, %6, %4
545
 
    SBUTTERFLY dqa, wd, %7, %8, %6
546
 
    SBUTTERFLY dqa, dq, %1, %3, %8
547
 
    SBUTTERFLY dqa, dq, %9, %2, %3
548
 
    SBUTTERFLY dqa, dq, %5, %7, %2
549
 
    SBUTTERFLY dqa, dq, %4, %6, %7
550
 
    SBUTTERFLY dqa, qdq, %1, %5, %6
551
 
    SBUTTERFLY dqa, qdq, %9, %4, %5
552
 
    SBUTTERFLY dqa, qdq, %8, %2, %4
553
 
    SBUTTERFLY dqa, qdq, %3, %7, %2
554
 
%endmacro
555
 
 
556
 
%macro SUMSUB_BADC 4
557
 
    paddw   %1, %2
558
 
    paddw   %3, %4
559
 
    paddw   %2, %2
560
 
    paddw   %4, %4
561
 
    psubw   %2, %1
562
 
    psubw   %4, %3
563
 
%endmacro
564
 
 
565
 
%macro HADAMARD1x8 8
566
 
    SUMSUB_BADC %1, %5, %2, %6
567
 
    SUMSUB_BADC %3, %7, %4, %8
568
 
    SUMSUB_BADC %1, %3, %2, %4
569
 
    SUMSUB_BADC %5, %7, %6, %8
570
 
    SUMSUB_BADC %1, %2, %3, %4
571
 
    SUMSUB_BADC %5, %6, %7, %8
572
 
%endmacro
573
 
 
574
470
ALIGN 16
575
471
;-----------------------------------------------------------------------------
576
472
;   int x264_pixel_sa8d_8x8_sse2( uint8_t *, int, uint8_t *, int )