~ubuntu-branches/ubuntu/feisty/qimageblitz/feisty-backports

« back to all changes in this revision

Viewing changes to blitz/asm_scale.S

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2007-08-31 09:50:41 UTC
  • Revision ID: james.westby@ubuntu.com-20070831095041-rlguoifpqerdrs2o
Tags: upstream-0.0.706674
ImportĀ upstreamĀ versionĀ 0.0.706674

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#if defined(__EMX__)
 
3
/* Due to strange behaviour of as.exe we use this macros */
 
4
/* For all OS/2 coders - please use PGCC to compile this code */
 
5
#define PR_(foo) ___##foo
 
6
#define PT_(foo,func) ___##foo,##func
 
7
#define SIZE(sym)                              \
 
8
        .___end_##sym:;                        \
 
9
        .size ___##sym,.___end_##sym-___##sym; \
 
10
        .align 8;
 
11
#elif defined(__APPLE__)
 
12
#define PR_(foo) ___##foo
 
13
#define PT_(foo,func) ___##foo,##func
 
14
#define SIZE(sym)                           \
 
15
        .__end_##sym:;                      \
 
16
        .align 8;
 
17
#else
 
18
#define PR_(foo) __##foo
 
19
#define PT_(foo,func) __##foo,##func
 
20
#define SIZE(sym)                           \
 
21
        .__end_##sym:;                      \
 
22
        .size __##sym,.__end_##sym-__##sym; \
 
23
        .align 8;
 
24
#endif
 
25
 
 
26
#if defined(__i386__) && ( defined(__GNUC__) || defined(__INTEL_COMPILER) )
 
27
 
 
28
 
 
29
/*\ 
 
30
|*| MMX assembly scaling routine for Imlib2
 
31
|*| Written by Willem Monsuwe <willem@stack.nl>
 
32
\*/
 
33
 
 
34
.text
 
35
        .align 8
 
36
.globl PR_(qimageScale_mmx_AARGBA)
 
37
/*      .type PT_(qimageScale_mmx_AARGBA,@function) */ 
 
38
 
 
39
 
 
40
/*\ Prototype: __qimageScale_mmx_AARGBA(ImlibScaleInfo *isi, DATA32 *dest,
 
41
|*|     int dxx, int dyy, int dx, int dy, int dw, int dh, int dow, int sow)
 
42
\*/
 
43
 
 
44
#define isi     8(%ebp)
 
45
#define dest    12(%ebp)
 
46
#define dxx     16(%ebp)
 
47
#define dyy     20(%ebp)
 
48
#define dx      24(%ebp)
 
49
#define dy      28(%ebp)
 
50
#define dw      32(%ebp)
 
51
#define dh      36(%ebp)
 
52
#define dow     40(%ebp)
 
53
#define sow     44(%ebp)
 
54
 
 
55
/*\ Local variables that didn't fit in registers \*/
 
56
#define y       -4(%ebp)
 
57
#define yp      -8(%ebp)
 
58
#define yap     -12(%ebp)
 
59
#define xp      -16(%ebp)
 
60
#define xap     -20(%ebp)
 
61
#define Cx      -24(%ebp)
 
62
#define Mx      -28(%ebp)
 
63
#define Cy      -32(%ebp)
 
64
#define My      -36(%ebp)
 
65
#define sow_4   -40(%ebp)
 
66
 
 
67
/*\ When %edx points to ImlibScaleInfo, these are the members \*/
 
68
#define xpoints         (%edx)
 
69
#define ypoints         4(%edx)
 
70
#define xapoints        8(%edx)
 
71
#define yapoints        12(%edx)
 
72
#define xup_yup         16(%edx)
 
73
 
 
74
PR_(qimageScale_mmx_AARGBA):
 
75
        pushl %ebp
 
76
        movl %esp, %ebp
 
77
        subl $40, %esp
 
78
        pushl %ebx
 
79
        pushl %ecx
 
80
        pushl %edx
 
81
        pushl %edi
 
82
        pushl %esi
 
83
        movl isi, %edx
 
84
 
 
85
        /*\ Check (dw > 0) && (dh > 0) \*/
 
86
        cmpl $0, dw
 
87
        jle .scale_leave
 
88
        cmpl $0, dh
 
89
        jle .scale_leave
 
90
 
 
91
        /*\ X-based array pointers point to the end; we're looping up to 0 \*/
 
92
        /*\ %edi = dest + dow * dy + dx + dw \*/
 
93
        movl dow, %eax
 
94
        imull dy, %eax
 
95
        addl dx, %eax
 
96
        addl dw, %eax
 
97
        movl dest, %edi
 
98
        leal (%edi, %eax, 4), %edi
 
99
        /*\ xp = xpoints + dxx + dw \*/
 
100
        movl dxx, %ebx
 
101
        addl dw, %ebx
 
102
        movl xpoints, %eax
 
103
        leal (%eax, %ebx, 4), %eax
 
104
        movl %eax, xp
 
105
        /*\ xap = xapoints + dxx + dw \*/
 
106
        movl xapoints, %eax
 
107
        leal (%eax, %ebx, 4), %eax
 
108
        movl %eax, xap
 
109
        /*\ y = dh \*/
 
110
        movl dh, %eax
 
111
        movl %eax, y
 
112
        /*\ yp = ypoints + dyy \*/
 
113
        movl dyy, %ebx
 
114
        movl ypoints, %eax
 
115
        leal (%eax, %ebx, 4), %eax
 
116
        movl %eax, yp
 
117
        /*\ yap = yapoints + dyy \*/
 
118
        movl yapoints, %eax
 
119
        leal (%eax, %ebx, 4), %eax
 
120
        movl %eax, yap
 
121
 
 
122
        pxor %mm7, %mm7
 
123
 
 
124
        /*\ Test xup bit \*/
 
125
        movl xup_yup, %eax
 
126
        sarl $1, %eax
 
127
        jnc .scale_x_down
 
128
 
 
129
.scale_x_up:
 
130
        /*\ Test yup bit \*/
 
131
        sarl $1, %eax
 
132
        jnc .scale_x_up_y_down
 
133
 
 
134
 
 
135
/*\ Scaling up both ways \*/
 
136
 
 
137
.scale_x_up_y_up:
 
138
        movl sow, %ebx
 
139
 
 
140
.up_up_loop_y:
 
141
 
 
142
        /*\ x = -dw \*/
 
143
        movl dw, %ecx
 
144
        negl %ecx
 
145
 
 
146
        /*\ %eax = *yap << 4 \*/
 
147
        movl yap, %eax
 
148
        movl (%eax), %eax
 
149
        sall $4, %eax
 
150
        jz .up_up_yap_0
 
151
        movd %eax, %mm1
 
152
        punpcklwd %mm1, %mm1
 
153
        punpckldq %mm1, %mm1
 
154
 
 
155
.up_up_loop1_x:
 
156
        /*\ %esi = *yp + xp[x] \*/
 
157
        movl yp, %eax
 
158
        movl (%eax), %esi
 
159
        movl xp, %eax
 
160
        movl (%eax, %ecx, 4), %eax
 
161
        leal (%esi, %eax, 4), %esi
 
162
 
 
163
        /*\ %eax = xap[x] << 4 \*/
 
164
        movl xap, %eax
 
165
        movl (%eax, %ecx, 4), %eax
 
166
        sall $4, %eax
 
167
        jz .up_up_xap_0
 
168
 
 
169
        /*\ %mm0 = xap[x] << 4 \*/
 
170
        movd %eax, %mm0
 
171
        punpcklwd %mm0, %mm0
 
172
        punpckldq %mm0, %mm0
 
173
 
 
174
        /*\ Load and unpack four pixels in parralel
 
175
        |*| %mm2 = ptr[0],   %mm3 = ptr[1]
 
176
        |*| %mm4 = ptr[sow], %mm5 = ptr[sow + 1]
 
177
        \*/
 
178
        movq (%esi), %mm2
 
179
        movq (%esi, %ebx, 4), %mm4
 
180
        movq %mm2, %mm3
 
181
        movq %mm4, %mm5
 
182
        punpcklbw %mm7, %mm2
 
183
        punpcklbw %mm7, %mm4
 
184
        punpckhbw %mm7, %mm3
 
185
        punpckhbw %mm7, %mm5
 
186
 
 
187
        /*\ X interpolation: r = l + (r - l) * xap \*/
 
188
        psubw %mm2, %mm3
 
189
        psubw %mm4, %mm5
 
190
        psllw $4, %mm3
 
191
        psllw $4, %mm5
 
192
        pmulhw %mm0, %mm3
 
193
        pmulhw %mm0, %mm5
 
194
        paddw %mm2, %mm3
 
195
        paddw %mm4, %mm5
 
196
        /*\ Now %mm3 = I(ptr[0], ptr[1]), %mm5 = I(ptr[sow], ptr[sow + 1]) \*/
 
197
        jmp .up_up_common
 
198
.up_up_xap_0:
 
199
        /*\ Load and unpack two pixels
 
200
        |*| %mm3 = ptr[0], %mm5 = ptr[sow]
 
201
        \*/
 
202
        movd (%esi), %mm3
 
203
        movd (%esi, %ebx, 4), %mm5
 
204
        punpcklbw %mm7, %mm3
 
205
        punpcklbw %mm7, %mm5
 
206
.up_up_common:
 
207
        /*\ Y interpolation: d = u + (d - u) * yap \*/
 
208
        psubw %mm3, %mm5
 
209
        psllw $4, %mm5
 
210
        pmulhw %mm1, %mm5
 
211
        paddw %mm3, %mm5
 
212
        packuswb %mm5, %mm5
 
213
        movd %mm5, (%edi, %ecx, 4)
 
214
 
 
215
        /*\ while (++x) \*/
 
216
        incl %ecx
 
217
        jnz .up_up_loop1_x
 
218
        jmp .up_up_yap_end
 
219
.up_up_yap_0:
 
220
 
 
221
.up_up_loop2_x:
 
222
        /*\ %esi = *yp + xp[x] \*/
 
223
        movl yp, %eax
 
224
        movl (%eax), %esi
 
225
        movl xp, %eax
 
226
        movl (%eax, %ecx, 4), %eax
 
227
        leal (%esi, %eax, 4), %esi
 
228
 
 
229
        /*\ %eax = xap[x] << 4 \*/
 
230
        movl xap, %eax
 
231
        movl (%eax, %ecx, 4), %eax
 
232
        sall $4, %eax
 
233
        jz .up_up_0
 
234
 
 
235
        /*\ %mm0 = xap[x] << 4 \*/
 
236
        movd %eax, %mm0
 
237
        punpcklwd %mm0, %mm0
 
238
        punpckldq %mm0, %mm0
 
239
 
 
240
        /*\ Load and unpack two pixels in parralel
 
241
        |*| %mm2 = ptr[0], %mm3 = ptr[1]
 
242
        \*/
 
243
        movq (%esi), %mm2
 
244
        movq %mm2, %mm3
 
245
        punpcklbw %mm7, %mm2
 
246
        punpckhbw %mm7, %mm3
 
247
 
 
248
        /*\ X interpolation: r = l + (r - l) * xap \*/
 
249
        psubw %mm2, %mm3
 
250
        psllw $4, %mm3
 
251
        pmulhw %mm0, %mm3
 
252
        paddw %mm2, %mm3
 
253
        packuswb %mm3, %mm3
 
254
        movd %mm3, (%edi, %ecx, 4)
 
255
        jmp .up_up_1
 
256
.up_up_0:
 
257
        /*\ dptr[x] = *sptr \*/
 
258
        movl (%esi), %eax
 
259
        movl %eax, (%edi, %ecx, 4)
 
260
.up_up_1:
 
261
        incl %ecx
 
262
        jnz .up_up_loop2_x
 
263
 
 
264
.up_up_yap_end:
 
265
        /*\ dptr += dow \*/
 
266
        movl dow, %eax
 
267
        leal (%edi, %eax, 4), %edi
 
268
        /*\ yap++; yp++ \*/
 
269
        addl $4, yap
 
270
        addl $4, yp
 
271
        /*\ while (y--) \*/
 
272
        decl y
 
273
        jnz .up_up_loop_y
 
274
 
 
275
        jmp .scale_leave
 
276
 
 
277
 
 
278
/*\ Scaling down vertically \*/
 
279
 
 
280
.scale_x_up_y_down:
 
281
        /*\ sow_4 = sow * 4 \*/
 
282
        movl sow, %eax
 
283
        sall $2, %eax
 
284
        movl %eax, sow_4
 
285
 
 
286
.up_down_loop_y:
 
287
 
 
288
        /*\ Setup My and Cy \*/
 
289
        movl yap, %eax
 
290
        movzwl (%eax), %ebx
 
291
        movl %ebx, My
 
292
        movzwl 2(%eax), %eax
 
293
        movl %eax, Cy
 
294
 
 
295
        /*\ mm4 = Cy \*/
 
296
        movd %eax, %mm4
 
297
        punpcklwd %mm4, %mm4
 
298
        punpckldq %mm4, %mm4
 
299
        /*\ mm5 = My \*/
 
300
        movd %ebx, %mm5
 
301
        punpcklwd %mm5, %mm5
 
302
        punpckldq %mm5, %mm5
 
303
 
 
304
        /*\ x = -dw \*/
 
305
        movl dw, %ecx
 
306
        negl %ecx
 
307
.up_down_loop_x:
 
308
        /*\ %esi = *yp + xp[x] \*/
 
309
        movl yp, %eax
 
310
        movl (%eax), %esi
 
311
        movl xp, %eax
 
312
        movl (%eax, %ecx, 4), %eax
 
313
        leal (%esi, %eax, 4), %esi
 
314
 
 
315
        movl %esi, %eax
 
316
        /*\ v = (*p * My) >> 10 \*/
 
317
        movd (%eax), %mm0
 
318
        punpcklbw %mm7, %mm0
 
319
        psllw $6, %mm0
 
320
        pmulhw %mm5, %mm0
 
321
        
 
322
        /*\ i = 0x4000 - My \*/
 
323
        movl $0x4000, %ebx
 
324
        subl My, %ebx
 
325
        jbe 5f
 
326
        jmp 2f
 
327
1:
 
328
        /*\ p += sow; v += (*p * Cy) >> 10 \*/
 
329
        addl sow_4, %eax
 
330
        movd (%eax), %mm1
 
331
        punpcklbw %mm7, %mm1
 
332
        psllw $6, %mm1
 
333
        pmulhw %mm4, %mm1
 
334
        paddw %mm1, %mm0
 
335
        
 
336
        /*\ i -= Cy; while (i > Cy) \*/
 
337
        subl Cy, %ebx
 
338
2:
 
339
        cmpl Cy, %ebx
 
340
        jg 1b
 
341
        
 
342
        /*\ mm6 = i \*/
 
343
        movd %ebx, %mm6
 
344
        punpcklwd %mm6, %mm6
 
345
        punpckldq %mm6, %mm6
 
346
        
 
347
        /*\ p += sow; v += (*p * i) >> 10 \*/
 
348
        addl sow_4, %eax
 
349
        movd (%eax), %mm1
 
350
        punpcklbw %mm7, %mm1
 
351
        psllw $6, %mm1
 
352
        pmulhw %mm6, %mm1
 
353
        paddw %mm1, %mm0
 
354
5:
 
355
        /*\ %eax = xap[x] << 5 \*/
 
356
        movl xap, %eax
 
357
        movl (%eax, %ecx, 4), %eax
 
358
        sall $5, %eax
 
359
        jz 6f
 
360
        /*\ mm3 = xap[x] << 5 \*/
 
361
        movd %eax, %mm3
 
362
        punpcklwd %mm3, %mm3
 
363
        punpckldq %mm3, %mm3
 
364
        
 
365
        /*\ p + 1 \*/
 
366
        movl %esi, %eax
 
367
        addl $4, %eax
 
368
        /*\ vv = (*p * My) >> 10 \*/
 
369
        movd (%eax), %mm2
 
370
        punpcklbw %mm7, %mm2
 
371
        psllw $6, %mm2
 
372
        pmulhw %mm5, %mm2
 
373
        
 
374
        /*\ i = 0x4000 - My \*/
 
375
        movl $0x4000, %ebx
 
376
        subl My, %ebx
 
377
        jbe 5f
 
378
        jmp 2f
 
379
1:
 
380
        /*\ p += sow; vv += (*p * Cy) >> 10 \*/
 
381
        addl sow_4, %eax
 
382
        movd (%eax), %mm1
 
383
        punpcklbw %mm7, %mm1
 
384
        psllw $6, %mm1
 
385
        pmulhw %mm4, %mm1
 
386
        paddw %mm1, %mm2
 
387
        
 
388
        /*\ i -= Cy; while (i > Cy) \*/
 
389
        subl Cy, %ebx
 
390
2:
 
391
        cmpl Cy, %ebx
 
392
        jg 1b
 
393
        
 
394
        /*\ p += sow; v += (*p * i) >> 10 \*/
 
395
        addl sow_4, %eax
 
396
        movd (%eax), %mm1
 
397
        punpcklbw %mm7, %mm1
 
398
        psllw $6, %mm1
 
399
        pmulhw %mm6, %mm1
 
400
        paddw %mm1, %mm2
 
401
5:
 
402
        /*\ v = v + (vv - v) * xap \*/
 
403
        psubw %mm0, %mm2
 
404
        psllw $3, %mm2
 
405
        pmulhw %mm3, %mm2
 
406
        paddw %mm2, %mm0
 
407
6:
 
408
        /*\ dest[x] = v >> 4 \*/
 
409
        psrlw $4, %mm0
 
410
        packuswb %mm0, %mm0
 
411
        movd %mm0, (%edi, %ecx, 4)
 
412
 
 
413
        /*\ while (++x) \*/
 
414
        incl %ecx
 
415
        jnz .up_down_loop_x
 
416
 
 
417
        /*\ dptr += dow \*/
 
418
        movl dow, %eax
 
419
        leal (%edi, %eax, 4), %edi
 
420
        /*\ yap++; yp++ \*/
 
421
        addl $4, yap
 
422
        addl $4, yp
 
423
        /*\ while (y--) \*/
 
424
        decl y
 
425
        jnz .up_down_loop_y
 
426
 
 
427
        jmp .scale_leave
 
428
 
 
429
.scale_x_down:
 
430
        /*\ Test yup bit \*/
 
431
        sarl $1, %eax
 
432
        jnc .scale_x_down_y_down
 
433
 
 
434
 
 
435
/*\ Scaling down horizontally \*/
 
436
 
 
437
.scale_x_down_y_up:
 
438
        /*\ sow_4 = sow * 4 \*/
 
439
        movl sow, %eax
 
440
        sall $2, %eax
 
441
        movl %eax, sow_4
 
442
 
 
443
.down_up_loop_y:
 
444
 
 
445
        /*\ %eax = *yap << 5 \*/
 
446
        movl yap, %eax
 
447
        movl (%eax), %eax
 
448
        sall $5, %eax
 
449
        /*\ mm3 = *yap << 5 \*/
 
450
        movd %eax, %mm3
 
451
        punpcklwd %mm3, %mm3
 
452
        punpckldq %mm3, %mm3
 
453
        
 
454
        /*\ x = -dw \*/
 
455
        movl dw, %ecx
 
456
        negl %ecx
 
457
.down_up_loop_x:
 
458
        /*\ %esi = *yp + xp[x] \*/
 
459
        movl yp, %eax
 
460
        movl (%eax), %esi
 
461
        movl xp, %eax
 
462
        movl (%eax, %ecx, 4), %eax
 
463
        leal (%esi, %eax, 4), %esi
 
464
 
 
465
        /*\ Setup Mx and Cx \*/
 
466
        movl xap, %eax
 
467
        movzwl (%eax, %ecx, 4), %ebx
 
468
        movl %ebx, Mx
 
469
        movzwl 2(%eax, %ecx, 4), %eax
 
470
        movl %eax, Cx
 
471
 
 
472
        /*\ mm4 = Cx \*/
 
473
        movd %eax, %mm4
 
474
        punpcklwd %mm4, %mm4
 
475
        punpckldq %mm4, %mm4
 
476
        /*\ mm5 = Mx \*/
 
477
        movd %ebx, %mm5
 
478
        punpcklwd %mm5, %mm5
 
479
        punpckldq %mm5, %mm5
 
480
 
 
481
        movl %esi, %eax
 
482
        /*\ v = (*p * Mx) >> 10 \*/
 
483
        movd (%eax), %mm0
 
484
        punpcklbw %mm7, %mm0
 
485
        psllw $6, %mm0
 
486
        pmulhw %mm5, %mm0
 
487
        
 
488
        /*\ i = 0x4000 - Mx \*/
 
489
        movl $0x4000, %ebx
 
490
        subl Mx, %ebx
 
491
        jbe 5f
 
492
        jmp 2f
 
493
1:
 
494
        /*\ p += sow; v += (*p * Cx) >> 10 \*/
 
495
        addl $4, %eax
 
496
        movd (%eax), %mm1
 
497
        punpcklbw %mm7, %mm1
 
498
        psllw $6, %mm1
 
499
        pmulhw %mm4, %mm1
 
500
        paddw %mm1, %mm0
 
501
        
 
502
        /*\ i -= Cx; while (i > Cx) \*/
 
503
        subl Cx, %ebx
 
504
2:
 
505
        cmpl Cx, %ebx
 
506
        jg 1b
 
507
        
 
508
        /*\ mm6 = i \*/
 
509
        movd %ebx, %mm6
 
510
        punpcklwd %mm6, %mm6
 
511
        punpckldq %mm6, %mm6
 
512
        
 
513
        /*\ p += sow; v += (*p * i) >> 10 \*/
 
514
        addl $4, %eax
 
515
        movd (%eax), %mm1
 
516
        punpcklbw %mm7, %mm1
 
517
        psllw $6, %mm1
 
518
        pmulhw %mm6, %mm1
 
519
        paddw %mm1, %mm0
 
520
5:
 
521
        movd %mm3, %eax
 
522
        testl %eax, %eax
 
523
        jz 6f
 
524
        /*\ p + sow \*/
 
525
        movl %esi, %eax
 
526
        addl sow_4, %eax
 
527
        /*\ vv = (*p * Mx) >> 10 \*/
 
528
        movd (%eax), %mm2
 
529
        punpcklbw %mm7, %mm2
 
530
        psllw $6, %mm2
 
531
        pmulhw %mm5, %mm2
 
532
        
 
533
        /*\ i = 0x4000 - Mx \*/
 
534
        movl $0x4000, %ebx
 
535
        subl Mx, %ebx
 
536
        jbe 5f
 
537
        jmp 2f
 
538
1:
 
539
        /*\ p += sow; vv += (*p * Cx) >> 10 \*/
 
540
        addl $4, %eax
 
541
        movd (%eax), %mm1
 
542
        punpcklbw %mm7, %mm1
 
543
        psllw $6, %mm1
 
544
        pmulhw %mm4, %mm1
 
545
        paddw %mm1, %mm2
 
546
        
 
547
        /*\ i -= Cx; while (i > Cx) \*/
 
548
        subl Cx, %ebx
 
549
2:
 
550
        cmpl Cx, %ebx
 
551
        jg 1b
 
552
        
 
553
        /*\ p += sow; v += (*p * i) >> 10 \*/
 
554
        addl $4, %eax
 
555
        movd (%eax), %mm1
 
556
        punpcklbw %mm7, %mm1
 
557
        psllw $6, %mm1
 
558
        pmulhw %mm6, %mm1
 
559
        paddw %mm1, %mm2
 
560
5:
 
561
        /*\ v = v + (vv - v) * yap \*/
 
562
        psubw %mm0, %mm2
 
563
        psllw $3, %mm2
 
564
        pmulhw %mm3, %mm2
 
565
        paddw %mm2, %mm0
 
566
6:
 
567
        /*\ dest[x] = v >> 4 \*/
 
568
        psrlw $4, %mm0
 
569
        packuswb %mm0, %mm0
 
570
        movd %mm0, (%edi, %ecx, 4)
 
571
 
 
572
        /*\ while (++x) \*/
 
573
        incl %ecx
 
574
        jnz .down_up_loop_x
 
575
 
 
576
        /*\ dptr += dow \*/
 
577
        movl dow, %eax
 
578
        leal (%edi, %eax, 4), %edi
 
579
        /*\ yap++; yp++ \*/
 
580
        addl $4, yap
 
581
        addl $4, yp
 
582
        /*\ while (y--) \*/
 
583
        decl y
 
584
        jnz .down_up_loop_y
 
585
 
 
586
        jmp .scale_leave
 
587
 
 
588
 
 
589
/*\ Scaling down both ways \*/
 
590
 
 
591
.scale_x_down_y_down:
 
592
        /*\ sow_4 = sow * 4 \*/
 
593
        movl sow, %eax
 
594
        sall $2, %eax
 
595
        movl %eax, sow_4
 
596
 
 
597
.down_down_loop_y:
 
598
 
 
599
        /*\ Setup My and Cy \*/
 
600
        movl yap, %eax
 
601
        movzwl (%eax), %ebx
 
602
        movl %ebx, My
 
603
        movzwl 2(%eax), %eax
 
604
        movl %eax, Cy
 
605
 
 
606
        /*\ x = -dw \*/
 
607
        movl dw, %ecx
 
608
        negl %ecx
 
609
.down_down_loop_x:
 
610
        /*\ %esi = *yp + xp[x] \*/
 
611
        movl yp, %eax
 
612
        movl (%eax), %esi
 
613
        movl xp, %eax
 
614
        movl (%eax, %ecx, 4), %eax
 
615
        leal (%esi, %eax, 4), %esi
 
616
 
 
617
        /*\ Setup Mx and Cx \*/
 
618
        movl xap, %eax
 
619
        movzwl (%eax, %ecx, 4), %ebx
 
620
        movl %ebx, Mx
 
621
        movzwl 2(%eax, %ecx, 4), %eax
 
622
        movl %eax, Cx
 
623
 
 
624
        /*\ mm3 = Cx \*/
 
625
        movd %eax, %mm3
 
626
        punpcklwd %mm3, %mm3
 
627
        punpckldq %mm3, %mm3
 
628
        /*\ mm5 = Mx \*/
 
629
        movd %ebx, %mm5
 
630
        punpcklwd %mm5, %mm5
 
631
        punpckldq %mm5, %mm5
 
632
        
 
633
        /*\ p = sptr; v = (*p * Mx) >> 9 \*/
 
634
        movl %esi, %eax
 
635
        movd (%eax), %mm0
 
636
        punpcklbw %mm7, %mm0
 
637
        psllw $7, %mm0
 
638
        pmulhw %mm5, %mm0
 
639
        
 
640
        /*\ i = 0x4000 - Mx \*/
 
641
        movl $0x4000, %ebx
 
642
        subl Mx, %ebx
 
643
        jbe 5f
 
644
        jmp 2f
 
645
1:
 
646
        /*\ v += (*++p * Cx) >> 9 \*/
 
647
        addl $4, %eax
 
648
        movd (%eax), %mm1
 
649
        punpcklbw %mm7, %mm1
 
650
        psllw $7, %mm1
 
651
        pmulhw %mm3, %mm1
 
652
        paddw %mm1, %mm0
 
653
        
 
654
        /*\ i -= Cx; while (i > Cx) \*/
 
655
        subl Cx, %ebx
 
656
2:
 
657
        cmpl Cx, %ebx
 
658
        jg 1b
 
659
        
 
660
        /*\ mm6 = i \*/
 
661
        movd %ebx, %mm6
 
662
        punpcklwd %mm6, %mm6
 
663
        punpckldq %mm6, %mm6
 
664
        
 
665
        /*\ v += (*++p * i) >> 9 \*/
 
666
        addl $4, %eax
 
667
        movd (%eax), %mm1
 
668
        punpcklbw %mm7, %mm1
 
669
        psllw $7, %mm1
 
670
        pmulhw %mm6, %mm1
 
671
        paddw %mm1, %mm0
 
672
5:
 
673
        /*\ v *= My \*/
 
674
        movd My, %mm4
 
675
        punpcklwd %mm4, %mm4
 
676
        punpckldq %mm4, %mm4
 
677
        psllw $2, %mm0
 
678
        pmulhw %mm4, %mm0
 
679
        
 
680
        /*\ j = 0x4000 - My \*/
 
681
        movl $0x4000, %edx
 
682
        subl My, %edx
 
683
        jbe 6f
 
684
        jmp 4f
 
685
3:
 
686
        /*\ sptr += sow; p = sptr \*/
 
687
        addl sow_4, %esi
 
688
        movl %esi, %eax
 
689
        /*\ vx = (*p * Mx) >> 9 \*/
 
690
        movd (%eax), %mm1
 
691
        punpcklbw %mm7, %mm1
 
692
        psllw $7, %mm1
 
693
        pmulhw %mm5, %mm1
 
694
        
 
695
        /*\ i = 0x4000 - Mx \*/
 
696
        movl $0x4000, %ebx
 
697
        subl Mx, %ebx
 
698
        jbe 5f
 
699
        jmp 2f
 
700
1:
 
701
        /*\ vx += (*++p * Cx) >> 9 \*/
 
702
        addl $4, %eax
 
703
        movd (%eax), %mm2
 
704
        punpcklbw %mm7, %mm2
 
705
        psllw $7, %mm2
 
706
        pmulhw %mm3, %mm2
 
707
        paddw %mm2, %mm1
 
708
        
 
709
        /*\ i -= Cx; while (i > Cx) \*/
 
710
        subl Cx, %ebx
 
711
2:
 
712
        cmpl Cx, %ebx
 
713
        jg 1b
 
714
        
 
715
        /*\ vx += (*++p * i) >> 9 \*/
 
716
        addl $4, %eax
 
717
        movd (%eax), %mm2
 
718
        punpcklbw %mm7, %mm2
 
719
        psllw $7, %mm2
 
720
        pmulhw %mm6, %mm2
 
721
        paddw %mm2, %mm1
 
722
5:
 
723
        /*\ v += (vx * Cy) >> 14 \*/
 
724
        movd Cy, %mm4
 
725
        punpcklwd %mm4, %mm4
 
726
        punpckldq %mm4, %mm4
 
727
        psllw $2, %mm1
 
728
        pmulhw %mm4, %mm1
 
729
        paddw %mm1, %mm0
 
730
        
 
731
        /*\ j -= Cy; while (j > Cy) \*/
 
732
        subl Cy, %edx
 
733
4:
 
734
        cmpl Cy, %edx
 
735
        jg 3b
 
736
        
 
737
        /*\ sptr += sow; p = sptr \*/
 
738
        addl sow_4, %esi
 
739
        movl %esi, %eax
 
740
        /*\ vx = (*p * Mx) >> 9 \*/
 
741
        movd (%eax), %mm1
 
742
        punpcklbw %mm7, %mm1
 
743
        psllw $7, %mm1
 
744
        pmulhw %mm5, %mm1
 
745
        
 
746
        /*\ i = 0x4000 - Mx \*/
 
747
        movl $0x4000, %ebx
 
748
        subl Mx, %ebx
 
749
        jbe 5f
 
750
        jmp 2f
 
751
1:
 
752
        /*\ vx += (*++p * Cx) >> 9 \*/
 
753
        addl $4, %eax
 
754
        movd (%eax), %mm2
 
755
        punpcklbw %mm7, %mm2
 
756
        psllw $7, %mm2
 
757
        pmulhw %mm3, %mm2
 
758
        paddw %mm2, %mm1
 
759
        
 
760
        /*\ i -= Cx; while (i > Cx) \*/
 
761
        subl Cx, %ebx
 
762
2:
 
763
        cmpl Cx, %ebx
 
764
        jg 1b
 
765
        
 
766
        /*\ vx += (*++p * i) >> 9 \*/
 
767
        addl $4, %eax
 
768
        movd (%eax), %mm2
 
769
        punpcklbw %mm7, %mm2
 
770
        psllw $7, %mm2
 
771
        pmulhw %mm6, %mm2
 
772
        paddw %mm2, %mm1
 
773
5:
 
774
        /*\ v += (vx * j) >> 14 \*/
 
775
        movd %edx, %mm4
 
776
        punpcklwd %mm4, %mm4
 
777
        punpckldq %mm4, %mm4
 
778
        psllw $2, %mm1
 
779
        pmulhw %mm4, %mm1
 
780
        paddw %mm1, %mm0
 
781
6:
 
782
        /*\ dptr[x] = mm0 >> 5 \*/
 
783
        psrlw $5, %mm0
 
784
        packuswb %mm0, %mm0
 
785
        movd %mm0, (%edi, %ecx, 4)
 
786
 
 
787
        /*\ while (++x) \*/
 
788
        incl %ecx
 
789
        jnz .down_down_loop_x
 
790
 
 
791
        /*\ dptr += dow \*/
 
792
        movl dow, %eax
 
793
        leal (%edi, %eax, 4), %edi
 
794
        /*\ yap++; yp++ \*/
 
795
        addl $4, yap
 
796
        addl $4, yp
 
797
        /*\ while (y--) \*/
 
798
        decl y
 
799
        jnz .down_down_loop_y
 
800
 
 
801
        jmp .scale_leave
 
802
 
 
803
.scale_leave:
 
804
        emms
 
805
        popl %esi
 
806
        popl %edi
 
807
        popl %edx
 
808
        popl %ecx
 
809
        popl %ebx
 
810
        movl %ebp, %esp
 
811
        popl %ebp
 
812
        ret
 
813
 
 
814
SIZE(qimageScale_mmx_AARGBA)
 
815
 
 
816
#endif