~ubuntu-branches/ubuntu/intrepid/x264/intrepid

« back to all changes in this revision

Viewing changes to common/i386/predict-a.asm

  • Committer: Bazaar Package Importer
  • Author(s): John Dong
  • Date: 2008-05-03 01:12:18 UTC
  • mfrom: (1.1.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20080503011218-3l7ra58egb7gezht
Tags: 1:0.svn20080408-0.0ubuntu1
* Merge from debian-multimedia. Remaining Ubuntu changes:
 - Maintainer field
 - Set epoch

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
;*****************************************************************************
2
 
;* predict-a.asm: h264 encoder library
3
 
;*****************************************************************************
4
 
;* Copyright (C) 2005 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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
21
 
;*****************************************************************************
22
 
 
23
 
BITS 32
24
 
 
25
 
;=============================================================================
26
 
; Macros and other preprocessor constants
27
 
;=============================================================================
28
 
 
29
 
%include "i386inc.asm"
30
 
 
31
 
%macro STORE8x8 2
32
 
    movq        [edx + 0*FDEC_STRIDE], %1
33
 
    movq        [edx + 1*FDEC_STRIDE], %1
34
 
    movq        [edx + 2*FDEC_STRIDE], %1
35
 
    movq        [edx + 3*FDEC_STRIDE], %1
36
 
    movq        [edx + 4*FDEC_STRIDE], %2
37
 
    movq        [edx + 5*FDEC_STRIDE], %2
38
 
    movq        [edx + 6*FDEC_STRIDE], %2
39
 
    movq        [edx + 7*FDEC_STRIDE], %2
40
 
%endmacro
41
 
 
42
 
%macro SAVE_0_1 1
43
 
    movq        [%1]         , mm0
44
 
    movq        [%1 + 8]     , mm1
45
 
%endmacro
46
 
 
47
 
%macro SAVE_0_0 1
48
 
    movq        [%1]         , mm0
49
 
    movq        [%1 + 8]     , mm0
50
 
%endmacro
51
 
 
52
 
 
53
 
SECTION_RODATA
54
 
 
55
 
ALIGN 8
56
 
pw_2: times 4 dw 2
57
 
pw_4: times 4 dw 4
58
 
pw_8: times 4 dw 8
59
 
pb_1: times 8 db 1
60
 
pw_3210:
61
 
    dw 0
62
 
    dw 1
63
 
    dw 2
64
 
    dw 3
65
 
 
66
 
;=============================================================================
67
 
; Code
68
 
;=============================================================================
69
 
 
70
 
SECTION .text
71
 
 
72
 
; dest, left, right, src, tmp
73
 
; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
74
 
%macro PRED8x8_LOWPASS 5
75
 
    movq        %5, %2
76
 
    pavgb       %2, %3
77
 
    pxor        %3, %5
78
 
    movq        %1, %4
79
 
    pand        %3, [pb_1 GOT_ebx]
80
 
    psubusb     %2, %3
81
 
    pavgb       %1, %2
82
 
%endmacro
83
 
 
84
 
 
85
 
;-----------------------------------------------------------------------------
86
 
; void predict_8x8_v_mmxext( uint8_t *src, uint8_t *edge )
87
 
;-----------------------------------------------------------------------------
88
 
cglobal predict_8x8_v_mmxext
89
 
    mov         eax, [esp+8]
90
 
    mov         edx, [esp+4]
91
 
    movq        mm0, [eax+16]
92
 
    STORE8x8    mm0, mm0
93
 
    ret
94
 
 
95
 
;-----------------------------------------------------------------------------
96
 
; void predict_8x8_dc_mmxext( uint8_t *src, uint8_t *edge )
97
 
;-----------------------------------------------------------------------------
98
 
cglobal predict_8x8_dc_mmxext
99
 
    picpush     ebx
100
 
    picgetgot   ebx
101
 
    mov         eax, [picesp + 8]
102
 
    mov         edx, [picesp + 4]
103
 
    pxor        mm0, mm0
104
 
    pxor        mm1, mm1
105
 
    psadbw      mm0, [eax+7]
106
 
    psadbw      mm1, [eax+16]
107
 
    paddw       mm0, [pw_8 GOT_ebx]
108
 
    paddw       mm0, mm1
109
 
    psrlw       mm0, 4
110
 
    pshufw      mm0, mm0, 0
111
 
    packuswb    mm0, mm0
112
 
    STORE8x8    mm0, mm0
113
 
    picpop      ebx
114
 
    ret
115
 
 
116
 
;-----------------------------------------------------------------------------
117
 
; void predict_8x8_top_mmxext( uint8_t *src, uint8_t *edge )
118
 
;-----------------------------------------------------------------------------
119
 
%macro PRED8x8_DC 2
120
 
cglobal %1
121
 
    picpush     ebx
122
 
    picgetgot   ebx
123
 
    mov         eax, [picesp + 8]
124
 
    mov         edx, [picesp + 4]
125
 
    pxor        mm0, mm0
126
 
    psadbw      mm0, [eax+%2]
127
 
    paddw       mm0, [pw_4 GOT_ebx]
128
 
    psrlw       mm0, 3
129
 
    pshufw      mm0, mm0, 0
130
 
    packuswb    mm0, mm0
131
 
    STORE8x8    mm0, mm0
132
 
    picpop      ebx
133
 
    ret
134
 
%endmacro
135
 
 
136
 
PRED8x8_DC predict_8x8_dc_top_mmxext, 16
137
 
PRED8x8_DC predict_8x8_dc_left_mmxext, 7
138
 
 
139
 
;-----------------------------------------------------------------------------
140
 
; void predict_8x8_ddl_mmxext( uint8_t *src, uint8_t *edge )
141
 
;-----------------------------------------------------------------------------
142
 
cglobal predict_8x8_ddl_mmxext
143
 
    picpush     ebx
144
 
    picgetgot   ebx
145
 
    mov         eax, [picesp + 8]
146
 
    mov         edx, [picesp + 4]
147
 
    movq        mm1, [eax + 15]
148
 
    movq        mm2, [eax + 17]
149
 
    movq        mm3, [eax + 23]
150
 
    movq        mm4, [eax + 25]
151
 
    PRED8x8_LOWPASS mm0, mm1, mm2, [eax + 16], mm7
152
 
    PRED8x8_LOWPASS mm1, mm3, mm4, [eax + 24], mm6
153
 
 
154
 
%assign Y 7
155
 
%rep 6
156
 
    movq        [edx + Y*FDEC_STRIDE], mm1
157
 
    movq        mm2, mm0
158
 
    psllq       mm1, 8
159
 
    psrlq       mm2, 56
160
 
    psllq       mm0, 8
161
 
    por         mm1, mm2
162
 
%assign Y (Y-1)
163
 
%endrep
164
 
    movq        [edx + Y*FDEC_STRIDE], mm1
165
 
    psllq       mm1, 8
166
 
    psrlq       mm0, 56
167
 
    por         mm1, mm0
168
 
%assign Y (Y-1)
169
 
    movq        [edx + Y*FDEC_STRIDE], mm1
170
 
 
171
 
    picpop      ebx
172
 
    ret
173
 
 
174
 
;-----------------------------------------------------------------------------
175
 
; void predict_8x8_ddr_mmxext( uint8_t *src, uint8_t *edge )
176
 
;-----------------------------------------------------------------------------
177
 
cglobal predict_8x8_ddr_mmxext
178
 
    picpush     ebx
179
 
    picgetgot   ebx
180
 
    mov         eax, [picesp + 8]
181
 
    mov         edx, [picesp + 4]
182
 
    movq        mm1, [eax + 7]
183
 
    movq        mm2, [eax + 9]
184
 
    movq        mm3, [eax + 15]
185
 
    movq        mm4, [eax + 17]
186
 
    PRED8x8_LOWPASS mm0, mm1, mm2, [eax + 8], mm7
187
 
    PRED8x8_LOWPASS mm1, mm3, mm4, [eax + 16], mm6
188
 
 
189
 
%assign Y 7
190
 
%rep 6
191
 
    movq        [edx + Y*FDEC_STRIDE], mm0
192
 
    movq        mm2, mm1
193
 
    psrlq       mm0, 8
194
 
    psllq       mm2, 56
195
 
    psrlq       mm1, 8
196
 
    por         mm0, mm2
197
 
%assign Y (Y-1)
198
 
%endrep
199
 
    movq        [edx + Y*FDEC_STRIDE], mm0
200
 
    psrlq       mm0, 8
201
 
    psllq       mm1, 56
202
 
    por         mm0, mm1
203
 
%assign Y (Y-1)
204
 
    movq        [edx + Y*FDEC_STRIDE], mm0
205
 
 
206
 
    picpop      ebx
207
 
    ret
208
 
 
209
 
;-----------------------------------------------------------------------------
210
 
; void predict_8x8_vr_core_mmxext( uint8_t *src, uint8_t *edge )
211
 
;-----------------------------------------------------------------------------
212
 
 
213
 
; fills only some pixels:
214
 
; f01234567
215
 
; 0........
216
 
; 1,,,,,,,,
217
 
; 2 .......
218
 
; 3 ,,,,,,,
219
 
; 4  ......
220
 
; 5  ,,,,,,
221
 
; 6   .....
222
 
; 7   ,,,,,
223
 
 
224
 
cglobal predict_8x8_vr_core_mmxext
225
 
    picpush     ebx
226
 
    picgetgot   ebx
227
 
    mov         eax, [picesp + 8]
228
 
    mov         edx, [picesp + 4]
229
 
    movq        mm2, [eax + 16]
230
 
    movq        mm3, [eax + 15]
231
 
    movq        mm1, [eax + 14]
232
 
    movq        mm4, mm3
233
 
    pavgb       mm3, mm2
234
 
    PRED8x8_LOWPASS mm0, mm1, mm2, mm4, mm7
235
 
 
236
 
%assign Y 0
237
 
%rep 3
238
 
    movq        [edx +  Y   *FDEC_STRIDE], mm3
239
 
    movq        [edx + (Y+1)*FDEC_STRIDE], mm0
240
 
    psllq       mm3, 8
241
 
    psllq       mm0, 8
242
 
%assign Y (Y+2)
243
 
%endrep
244
 
    movq        [edx +  Y   *FDEC_STRIDE], mm3
245
 
    movq        [edx + (Y+1)*FDEC_STRIDE], mm0
246
 
 
247
 
    picpop      ebx
248
 
    ret
249
 
 
250
 
;-----------------------------------------------------------------------------
251
 
; void predict_8x8c_v_mmx( uint8_t *src )
252
 
;-----------------------------------------------------------------------------
253
 
cglobal predict_8x8c_v_mmx 
254
 
    mov         edx, [esp + 4]
255
 
    movq        mm0, [edx - FDEC_STRIDE]
256
 
    STORE8x8    mm0, mm0
257
 
    ret
258
 
 
259
 
;-----------------------------------------------------------------------------
260
 
; void predict_8x8c_dc_core_mmxext( uint8_t *src, int s2, int s3 )
261
 
;-----------------------------------------------------------------------------
262
 
cglobal predict_8x8c_dc_core_mmxext
263
 
    picpush     ebx
264
 
    picgetgot   ebx
265
 
 
266
 
    mov         edx, [picesp + 4]
267
 
 
268
 
    movq        mm0, [edx - FDEC_STRIDE]
269
 
    pxor        mm1, mm1
270
 
    pxor        mm2, mm2
271
 
    punpckhbw   mm1, mm0
272
 
    punpcklbw   mm0, mm2
273
 
    psadbw      mm1, mm2        ; s1
274
 
    psadbw      mm0, mm2        ; s0
275
 
 
276
 
    paddw       mm0, [picesp +  8]
277
 
    pshufw      mm2, [picesp + 12], 0
278
 
    psrlw       mm0, 3
279
 
    paddw       mm1, [pw_2 GOT_ebx]
280
 
    movq        mm3, mm2
281
 
    pshufw      mm1, mm1, 0
282
 
    pshufw      mm0, mm0, 0     ; dc0 (w)
283
 
    paddw       mm3, mm1
284
 
    psrlw       mm3, 3          ; dc3 (w)
285
 
    psrlw       mm2, 2          ; dc2 (w)
286
 
    psrlw       mm1, 2          ; dc1 (w)
287
 
 
288
 
    packuswb    mm0, mm1        ; dc0,dc1 (b)
289
 
    packuswb    mm2, mm3        ; dc2,dc3 (b)
290
 
 
291
 
    STORE8x8    mm0, mm2
292
 
 
293
 
    picpop      ebx
294
 
    ret
295
 
 
296
 
;-----------------------------------------------------------------------------
297
 
; void predict_8x8c_p_core_mmxext( uint8_t *src, int i00, int b, int c )
298
 
;-----------------------------------------------------------------------------
299
 
cglobal predict_8x8c_p_core_mmxext
300
 
    picpush     ebx
301
 
    picgetgot   ebx
302
 
 
303
 
    mov         edx, [picesp + 4]
304
 
    mov         ecx, FDEC_STRIDE
305
 
    pshufw      mm0, [picesp + 8], 0
306
 
    pshufw      mm2, [picesp +12], 0
307
 
    pshufw      mm4, [picesp +16], 0
308
 
    movq        mm1, mm2
309
 
    pmullw      mm2, [pw_3210 GOT_ebx]
310
 
    psllw       mm1, 2
311
 
    paddsw      mm0, mm2        ; mm0 = {i+0*b, i+1*b, i+2*b, i+3*b}
312
 
    paddsw      mm1, mm0        ; mm1 = {i+4*b, i+5*b, i+6*b, i+7*b}
313
 
 
314
 
    mov         eax, 8
315
 
ALIGN 4
316
 
.loop:
317
 
    movq        mm5, mm0
318
 
    movq        mm6, mm1
319
 
    psraw       mm5, 5
320
 
    psraw       mm6, 5
321
 
    packuswb    mm5, mm6
322
 
    movq        [edx], mm5
323
 
 
324
 
    paddsw      mm0, mm4
325
 
    paddsw      mm1, mm4
326
 
    add         edx, ecx
327
 
    dec         eax
328
 
    jg          .loop
329
 
 
330
 
    nop
331
 
    picpop      ebx
332
 
    ret
333
 
 
334
 
;-----------------------------------------------------------------------------
335
 
; void predict_16x16_p_core_mmxext( uint8_t *src, int i00, int b, int c )
336
 
;-----------------------------------------------------------------------------
337
 
cglobal predict_16x16_p_core_mmxext
338
 
    picpush     ebx
339
 
    picgetgot   ebx
340
 
 
341
 
    mov         edx, [picesp + 4]
342
 
    mov         ecx, FDEC_STRIDE
343
 
    pshufw      mm0, [picesp + 8], 0
344
 
    pshufw      mm2, [picesp +12], 0
345
 
    pshufw      mm4, [picesp +16], 0
346
 
    movq        mm5, mm2
347
 
    movq        mm1, mm2
348
 
    pmullw      mm5, [pw_3210 GOT_ebx]
349
 
    psllw       mm2, 3
350
 
    psllw       mm1, 2
351
 
    movq        mm3, mm2
352
 
    paddsw      mm0, mm5        ; mm0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b}
353
 
    paddsw      mm1, mm0        ; mm1 = {i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
354
 
    paddsw      mm2, mm0        ; mm2 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b}
355
 
    paddsw      mm3, mm1        ; mm3 = {i+12*b, i+13*b, i+14*b, i+15*b}
356
 
 
357
 
    mov         eax, 16
358
 
ALIGN 4
359
 
.loop:
360
 
    movq        mm5, mm0
361
 
    movq        mm6, mm1
362
 
    psraw       mm5, 5
363
 
    psraw       mm6, 5
364
 
    packuswb    mm5, mm6
365
 
    movq        [edx], mm5
366
 
 
367
 
    movq        mm5, mm2
368
 
    movq        mm6, mm3
369
 
    psraw       mm5, 5
370
 
    psraw       mm6, 5
371
 
    packuswb    mm5, mm6
372
 
    movq        [edx+8], mm5
373
 
 
374
 
    paddsw      mm0, mm4
375
 
    paddsw      mm1, mm4
376
 
    paddsw      mm2, mm4
377
 
    paddsw      mm3, mm4
378
 
    add         edx, ecx
379
 
    dec         eax
380
 
    jg          .loop
381
 
 
382
 
    nop
383
 
    picpop      ebx
384
 
    ret
385
 
 
386
 
;-----------------------------------------------------------------------------
387
 
; void predict_16x16_v_mmx( uint8_t *src )
388
 
;-----------------------------------------------------------------------------
389
 
cglobal predict_16x16_v_mmx 
390
 
    mov         edx, [esp + 4]
391
 
    mov         ecx, FDEC_STRIDE
392
 
    sub         edx, ecx                ; edx <-- line -1
393
 
 
394
 
    movq        mm0, [edx]
395
 
    movq        mm1, [edx + 8]
396
 
    lea         eax, [ecx + 2*ecx]      ; eax <-- 3* stride
397
 
 
398
 
    SAVE_0_1    (edx + ecx)             ; 0
399
 
    SAVE_0_1    (edx + 2 * ecx)         ; 1
400
 
    SAVE_0_1    (edx + eax)             ; 2
401
 
    SAVE_0_1    (edx + 4 * ecx)         ; 3
402
 
    SAVE_0_1    (edx + 2 * eax)         ; 5
403
 
    SAVE_0_1    (edx + 8 * ecx)         ; 7
404
 
    SAVE_0_1    (edx + 4 * eax)         ; 11
405
 
    add         edx, ecx                ; edx <-- line 0
406
 
    SAVE_0_1    (edx + 4 * ecx)         ; 4
407
 
    SAVE_0_1    (edx + 2 * eax)         ; 6
408
 
    SAVE_0_1    (edx + 8 * ecx)         ; 8
409
 
    SAVE_0_1    (edx + 4 * eax)         ; 12
410
 
    lea         edx, [edx + 8 * ecx]    ; edx <-- line 8
411
 
    SAVE_0_1    (edx + ecx)             ; 9
412
 
    SAVE_0_1    (edx + 2 * ecx)         ; 10
413
 
    lea         edx, [edx + 4 * ecx]    ; edx <-- line 12
414
 
    SAVE_0_1    (edx + ecx)             ; 13
415
 
    SAVE_0_1    (edx + 2 * ecx)         ; 14
416
 
    SAVE_0_1    (edx + eax)             ; 15
417
 
 
418
 
    ret
419
 
 
420
 
;-----------------------------------------------------------------------------
421
 
; void predict_16x16_dc_core_mmxext( uint8_t *src, int i_dc_left )
422
 
;-----------------------------------------------------------------------------
423
 
 
424
 
%macro PRED16x16_DC 3
425
 
    mov         edx, [%3 + 4]
426
 
    mov         ecx, FDEC_STRIDE
427
 
    sub         edx, ecx                ; edx <-- line -1
428
 
 
429
 
    pxor        mm0, mm0
430
 
    pxor        mm1, mm1
431
 
    psadbw      mm0, [edx]
432
 
    psadbw      mm1, [edx + 8]
433
 
    paddusw     mm0, mm1
434
 
    paddusw     mm0, %1                 ; FIXME is stack alignment guaranteed?
435
 
    psrlw       mm0, %2                 ; dc
436
 
    push        edi
437
 
    pshufw      mm0, mm0, 0
438
 
    lea         eax, [ecx + 2*ecx]      ; eax <-- 3* stride
439
 
    packuswb    mm0, mm0                ; dc in bytes
440
 
 
441
 
    mov         edi, 4
442
 
ALIGN 4
443
 
.loop:
444
 
    SAVE_0_0    (edx + ecx)             ; 0
445
 
    SAVE_0_0    (edx + 2 * ecx)         ; 1
446
 
    SAVE_0_0    (edx + eax)             ; 2
447
 
    SAVE_0_0    (edx + 4 * ecx)         ; 3
448
 
    dec         edi
449
 
    lea         edx, [edx + 4 * ecx]
450
 
    jg          .loop
451
 
 
452
 
    pop         edi
453
 
%endmacro
454
 
 
455
 
cglobal predict_16x16_dc_core_mmxext
456
 
    PRED16x16_DC [esp+8], 5, esp
457
 
    ret
458
 
 
459
 
cglobal predict_16x16_dc_top_mmxext
460
 
    picpush ebx
461
 
    picgetgot ebx
462
 
    PRED16x16_DC [pw_8 GOT_ebx], 4, picesp
463
 
    picpop ebx
464
 
    ret
465