~ubuntu-branches/ubuntu/jaunty/gimp/jaunty-security

« back to all changes in this revision

Viewing changes to app/composite/gimp-composite-sse.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Holbach
  • Date: 2007-05-02 16:33:03 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20070502163303-bvzhjzbpw8qglc4y
Tags: 2.3.16-1ubuntu1
* Resynchronized with Debian, remaining Ubuntu changes:
  - debian/rules: i18n magic.
* debian/control.in:
  - Maintainer: Ubuntu Core Developers <ubuntu-devel@lists.ubuntu.com>
* debian/patches/02_help-message.patch,
  debian/patches/03_gimp.desktop.in.in.patch,
  debian/patches/10_dont_show_wizard.patch: updated.
* debian/patches/04_composite-signedness.patch,
  debian/patches/05_add-letter-spacing.patch: dropped, used upstream.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- mode: c tab-width: 2; c-basic-indent: 2; indent-tabs-mode: nil -*-
2
 
 *
3
 
 * The GIMP -- an image manipulation program
 
1
/* GIMP - The GNU Image Manipulation Program
4
2
 * Copyright (C) 1995 Spencer Kimball and Peter Mattis
5
3
 *
6
 
 *
7
4
 * This program is free software; you can redistribute it and/or modify
8
5
 * it under the terms of the GNU General Public License as published by
9
6
 * the Free Software Foundation; either version 2 of the License, or
84
81
                    "\t" pminub(mm3, mm2, mm4) "\n"
85
82
                    "\tpand    %%mm0, %%mm2\n"
86
83
                    "\tpor     %%mm2, %%mm1\n"
87
 
                    "\tmovq    %%mm1, %0\n"
 
84
                    "\tmovntq  %%mm1, %0\n"
88
85
                    : "=m" (*d)
89
86
                    : "m" (*a), "m" (*b)
90
87
                    : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
113
110
  asm("emms");
114
111
}
115
112
 
 
113
#if 0
 
114
void
 
115
gimp_composite_burn_rgba8_rgba8_rgba8_sse (GimpCompositeContext *_op)
 
116
{
 
117
  uint64 *d = (uint64 *) _op->D;
 
118
  uint64 *a = (uint64 *) _op->A;
 
119
  uint64 *b = (uint64 *) _op->B;
 
120
  gulong n_pixels = _op->n_pixels;
 
121
 
 
122
  for (; n_pixels >= 2; n_pixels -= 2)
 
123
    {
 
124
      asm volatile ("  movq         %1,%%mm0\n"
 
125
                    "\tmovq         %2,%%mm1\n"
 
126
 
 
127
                    "\tmovq         %3,%%mm2\n"
 
128
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
129
                    "\tpxor      %%mm4,%%mm4\n"
 
130
                    "\tpunpcklbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
131
 
 
132
                    "\tmovq      %%mm1,%%mm3\n"
 
133
                    "\tpxor      %%mm5,%%mm5\n"
 
134
                    "\tpunpcklbw %%mm5,%%mm3\n"
 
135
                    "\tmovq         %4,%%mm5\n"
 
136
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
137
 
 
138
                    "\t" pdivwqX(mm4,mm5,mm7) "\n"
 
139
 
 
140
                    "\tmovq         %3,%%mm2\n"
 
141
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
142
                    "\tpxor      %%mm4,%%mm4\n"
 
143
                    "\tpunpckhbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
144
 
 
145
                    "\tmovq      %%mm1,%%mm3\n"
 
146
                    "\tpxor      %%mm5,%%mm5\n"
 
147
                    "\tpunpckhbw %%mm5,%%mm3\n"
 
148
                    "\tmovq         %4,%%mm5\n"
 
149
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
150
                    "\t" pdivwqX(mm4,mm5,mm6) "\n"
 
151
 
 
152
                    "\tmovq         %5,%%mm4\n"
 
153
                    "\tmovq      %%mm4,%%mm5\n"
 
154
                    "\tpsubusw   %%mm6,%%mm4\n"
 
155
                    "\tpsubusw   %%mm7,%%mm5\n"
 
156
 
 
157
                    "\tpackuswb  %%mm4,%%mm5\n"
 
158
 
 
159
                    "\t" pminub(mm0,mm1,mm3) "\n" /* mm1 = min(mm0,mm1) clobber mm3 */
 
160
 
 
161
                    "\tmovq         %6,%%mm7\n" /* mm6 = rgba8_alpha_mask_64 */
 
162
                    "\tpand      %%mm7,%%mm1\n" /* mm1 = mm7 & alpha_mask */
 
163
 
 
164
                    "\tpandn     %%mm5,%%mm7\n" /* mm7 = ~mm7 & mm5 */
 
165
                    "\tpor       %%mm1,%%mm7\n" /* mm7 = mm7 | mm1 */
 
166
 
 
167
                    "\tmovq      %%mm7,%0\n"
 
168
                    : "=m" (*d)
 
169
                    : "m" (*a), "m" (*b), "m" (*rgba8_b255_64), "m" (*rgba8_w1_64), "m" (*rgba8_w255_64), "m" (*rgba8_alpha_mask_64)
 
170
                    : pdivwqX_clobber, "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7");
 
171
      d++;
 
172
      b++;
 
173
      a++;
 
174
    }
 
175
 
 
176
  if (n_pixels > 0)
 
177
    {
 
178
      asm volatile ("  movd         %1,%%mm0\n"
 
179
                    "\tmovd         %2,%%mm1\n"
 
180
 
 
181
                    "\tmovq         %3,%%mm2\n"
 
182
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
183
                    "\tpxor      %%mm4,%%mm4\n"
 
184
                    "\tpunpcklbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
185
 
 
186
                    "\tmovq      %%mm1,%%mm3\n"
 
187
                    "\tpxor      %%mm5,%%mm5\n"
 
188
                    "\tpunpcklbw %%mm5,%%mm3\n"
 
189
                    "\tmovq         %4,%%mm5\n"
 
190
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
191
 
 
192
                    "\t" pdivwqX(mm4,mm5,mm7) "\n"
 
193
 
 
194
                    "\tmovq         %3,%%mm2\n"
 
195
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
196
                    "\tpxor      %%mm4,%%mm4\n"
 
197
                    "\tpunpckhbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
198
 
 
199
                    "\tmovq      %%mm1,%%mm3\n"
 
200
                    "\tpxor      %%mm5,%%mm5\n"
 
201
                    "\tpunpckhbw %%mm5,%%mm3\n"
 
202
                    "\tmovq         %4,%%mm5\n"
 
203
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
204
                    "\t" pdivwqX(mm4,mm5,mm6) "\n"
 
205
 
 
206
                    "\tmovq         %5,%%mm4\n"
 
207
                    "\tmovq      %%mm4,%%mm5\n"
 
208
                    "\tpsubusw   %%mm6,%%mm4\n"
 
209
                    "\tpsubusw   %%mm7,%%mm5\n"
 
210
 
 
211
                    "\tpackuswb  %%mm4,%%mm5\n"
 
212
 
 
213
                    "\t" pminub(mm0,mm1,mm3) "\n" /* mm1 = min(mm0,mm1) clobber mm3 */
 
214
 
 
215
                    "\tmovq         %6,%%mm7\n"
 
216
                    "\tpand      %%mm7,%%mm1\n" /* mm1 = mm7 & alpha_mask */
 
217
 
 
218
                    "\tpandn     %%mm5,%%mm7\n" /* mm7 = ~mm7 & mm5 */
 
219
                    "\tpor       %%mm1,%%mm7\n" /* mm7 = mm7 | mm1 */
 
220
 
 
221
                    "\tmovd      %%mm7,%0\n"
 
222
                    : "=m" (*d)
 
223
                    : "m" (*a), "m" (*b), "m" (*rgba8_b255_64), "m" (*rgba8_w1_64), "m" (*rgba8_w255_64), "m" (*rgba8_alpha_mask_64)
 
224
                    : pdivwqX_clobber, "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7");
 
225
    }
 
226
 
 
227
  asm("emms");
 
228
}
 
229
#endif
 
230
 
116
231
void
117
232
gimp_composite_darken_rgba8_rgba8_rgba8_sse (GimpCompositeContext *_op)
118
233
{
123
238
 
124
239
  for (; n_pixels >= 2; n_pixels -= 2)
125
240
    {
126
 
      asm volatile ("  movq    %1, %%mm2\n"
127
 
                    "\tmovq    %2, %%mm3\n"
 
241
      asm volatile ("  movq   %1,%%mm2\n"
 
242
                    "\tmovq   %2,%%mm3\n"
128
243
                    "\t" pminub(mm3, mm2, mm4) "\n"
129
 
                    "\tmovq    %%mm2, %0\n"
 
244
                    "\tmovntq  %%mm2,%0\n"
130
245
                    : "=m" (*d)
131
246
                    : "m" (*a), "m" (*b)
132
247
                    : "%mm1", "%mm2", "%mm3", "%mm4");
173
288
                    "\tpminub  %%mm3, %%mm2\n"
174
289
                    "\tpand    %%mm0, %%mm2\n"
175
290
                    "\tpor     %%mm2, %%mm1\n"
176
 
                    "\tmovq    %%mm1, %0\n"
 
291
                    "\tmovntq  %%mm1, %0\n"
177
292
                    : "=m" (*d)
178
293
                    : "m" (*a), "m" (*b)
179
 
                    : "%mm1", "%mm2", "%mm3", "%mm4");
 
294
                    : "%mm1", "%mm2", "%mm3", "%mm4", "%mm5");
180
295
      a++;
181
296
      b++;
182
297
      d++;
199
314
                    "\tmovd    %%mm1, %0\n"
200
315
                    : "=m" (*d)
201
316
                    : "m" (*a), "m" (*b)
202
 
                    : "%mm1", "%mm2", "%mm3", "%mm4");
203
 
    }
204
 
 
205
 
  asm("emms");
206
 
}
207
 
 
208
 
#if 0
209
 
void
210
 
xxxgimp_composite_divide_rgba8_rgba8_rgba8_sse (GimpCompositeContext *_op)
211
 
{
212
 
  GimpCompositeContext op = *_op;
213
 
 
214
 
  asm volatile ("  movq    %0, %%mm0\n"
215
 
                "\tmovq    %1, %%mm7\n"
216
 
                :
217
 
                : "m" (*rgba8_alpha_mask_64), "m" (*rgba8_w1_64)
218
 
                : "%mm0", "%mm7");
219
 
 
220
 
  for (; op.n_pixels >= 2; op.n_pixels -= 2)
221
 
    {
222
 
      asm volatile ("  movq         %1,%%mm0\n"
223
 
                    "\tmovq         %2,%%mm1\n"
224
 
                    "\tpxor      %%mm2,%%mm2\n"
225
 
                    "\tpunpcklbw %%mm0,%%mm2\n" /* mm2 = A*256 */
226
 
 
227
 
                    "\tmovq      %%mm1,%%mm3\n"
228
 
                    "\tpxor      %%mm5,%%mm5\n"
229
 
                    "\tpunpcklbw %%mm5,%%mm3\n"
230
 
                    "\tpaddw     %%mm7,%%mm3\n" /* mm3 = B+1 */
231
 
 
232
 
                    "\t" pdivwuqX(mm2,mm3,mm5) "\n" /* mm5 = (A*256)/(B+1) */
233
 
 
234
 
                    "\tpxor      %%mm2,%%mm2\n"
235
 
                    "\tpunpckhbw %%mm0,%%mm2\n" /* mm2 = A*256 */
236
 
 
237
 
                    "\tmovq      %%mm1,%%mm3\n"
238
 
                    "\tpxor      %%mm6,%%mm6\n"
239
 
                    "\tpunpckhbw %%mm6,%%mm3\n"
240
 
                    "\tpaddw     %%mm7,%%mm3\n" /* mm3 = B+1 */
241
 
 
242
 
                    "\t" pdivwuqX(mm2,mm3,mm4) "\n" /* mm4 = (A*256)/(B+1) */
243
 
 
244
 
                    "\tpackuswb  %%mm4,%%mm5\n" /* expects mm4 and mm5 to be signed values */
245
 
 
246
 
                    "\tpminub    %%mm0,%%mm1\n"
247
 
                    "\tmovq         %3,%%mm3\n"
248
 
                    "\tmovq      %%mm3,%%mm2\n"
249
 
 
250
 
                    "\tpandn     %%mm5,%%mm3\n"
251
 
 
252
 
                    "\tpand      %%mm2,%%mm1\n"
253
 
                    "\tpor       %%mm1,%%mm3\n"
254
 
 
255
 
                    "\tmovq      %%mm3,%0\n"
256
 
                    : "=m" (*op.D)
257
 
                    : "m" (*op.A), "m" (*op.B), "m" (*rgba8_alpha_mask_64)
258
 
                    : "%eax", "%ecx", "%edx", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5");
259
 
      op.A += 8;
260
 
      op.B += 8;
261
 
      op.D += 8;
262
 
    }
263
 
 
264
 
  if (op.n_pixels)
265
 
    {
266
 
      asm volatile ("  movd         %1,%%mm0\n"
267
 
                    "\tmovd         %2,%%mm1\n"
268
 
 
269
 
                    "\tpxor      %%mm2,%%mm2\n"
270
 
                    "\tpunpcklbw %%mm0,%%mm2\n" /* mm2 = A*256 */
271
 
 
272
 
                    "\tmovq      %%mm1,%%mm3\n"
273
 
                    "\tpxor      %%mm5,%%mm5\n"
274
 
                    "\tpunpcklbw %%mm5,%%mm3\n"
275
 
                    "\tpaddw     %%mm7,%%mm3\n" /* mm3 = B+1 */
276
 
 
277
 
                    "\t" pdivwuqX(mm2,mm3,mm5) "\n" /* mm5 = (A*256)/(B+1) */
278
 
 
279
 
                    "\tpxor      %%mm2,%%mm2\n"
280
 
                    "\tpunpckhbw %%mm0,%%mm2\n" /* mm2 = A*256 */
281
 
 
282
 
                    "\tmovq      %%mm1,%%mm3\n"
283
 
                    "\tpxor      %%mm6,%%mm6\n"
284
 
                    "\tpunpckhbw %%mm6,%%mm3\n"
285
 
                    "\tpaddw     %%mm7,%%mm3\n" /* mm3 = B+1 */
286
 
 
287
 
                    "\t" pdivwuqX(mm2,mm3,mm4) "\n" /* mm4 = (A*256)/(B+1) */
288
 
 
289
 
                    "\tpackuswb  %%mm4,%%mm5\n" /* expects mm4 and mm5 to be signed values */
290
 
 
291
 
                    "\tpminub    %%mm0,%%mm1\n"
292
 
                    "\tmovq         %3,%%mm3\n"
293
 
                    "\tmovq      %%mm3,%%mm2\n"
294
 
 
295
 
                    "\tpandn     %%mm5,%%mm3\n"
296
 
 
297
 
                    "\tpand      %%mm2,%%mm1\n"
298
 
                    "\tpor       %%mm1,%%mm3\n"
299
 
 
300
 
                    "\tmovd      %%mm3,%0\n"
301
 
                    : "=m" (*op.D)
302
 
                    : "m" (*op.A), "m" (*op.B), "m" (*rgba8_alpha_mask_64)
303
 
                    : "%eax", "%ecx", "%edx", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5");
304
 
    }
305
 
 
306
 
  asm("emms");
307
 
}
308
 
#endif
309
 
 
310
 
#if 0
311
 
void
312
 
xxxgimp_composite_dodge_rgba8_rgba8_rgba8_sse (GimpCompositeContext *_op)
313
 
{
314
 
  GimpCompositeContext op = *_op;
315
 
 
316
 
  for (; op.n_pixels >= 2; op.n_pixels -= 2)
317
 
    {
318
 
      asm volatile ("  movq         %1,%%mm0\n"
319
 
                    "\tmovq         %2,%%mm1\n"
320
 
                    "\tmovq      %%mm1,%%mm3\n"
321
 
                    "\tpxor      %%mm2,%%mm2\n"
322
 
                    "\tpunpcklbw %%mm2,%%mm3\n"
323
 
                    "\tpunpcklbw %%mm0,%%mm2\n"
324
 
 
325
 
                    "\tmovq         %3,%%mm4\n"
326
 
                    "\tpsubw     %%mm3,%%mm4\n"
327
 
 
328
 
                    "\t" pdivwuqX(mm2,mm4,mm5) "\n"
329
 
 
330
 
                    "\tmovq      %%mm1,%%mm3\n"
331
 
                    "\tpxor      %%mm2,%%mm2\n"
332
 
                    "\tpunpckhbw %%mm2,%%mm3\n"
333
 
                    "\tpunpckhbw %%mm0,%%mm2\n"
334
 
 
335
 
                    "\tmovq         %3,%%mm4\n"
336
 
                    "\tpsubw     %%mm3,%%mm4\n"
337
 
 
338
 
                    "\t" pdivwuqX(mm2,mm4,mm6) "\n"
339
 
 
340
 
                    "\tpackuswb  %%mm6,%%mm5\n"
341
 
 
342
 
                    "\tmovq         %4,%%mm6\n"
343
 
                    "\tmovq      %%mm1,%%mm7\n"
344
 
                    "\t" pminub(mm0,mm7,mm2) "\n"
345
 
                    "\tpand      %%mm6,%%mm7\n"
346
 
                    "\tpandn     %%mm5,%%mm6\n"
347
 
 
348
 
                    "\tpor       %%mm6,%%mm7\n"
349
 
 
350
 
                    "\tmovq      %%mm7,%0\n"
351
 
                    : "=m" (*op.D)
352
 
                    : "m" (*op.A), "m" (*op.B), "m" (*rgba8_w256_64), "m" (*rgba8_alpha_mask_64)
353
 
                    : "%eax", "%ecx", "%edx", "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7");
354
 
      op.A += 8;
355
 
      op.B += 8;
356
 
      op.D += 8;
357
 
    }
358
 
 
359
 
  if (op.n_pixels)
360
 
    {
361
 
      asm volatile ("  movd         %1,%%mm0\n"
362
 
                    "\tmovq         %2,%%mm1\n"
363
 
                    "\tmovq      %%mm1,%%mm3\n"
364
 
                    "\tpxor      %%mm2,%%mm2\n"
365
 
                    "\tpunpcklbw %%mm2,%%mm3\n"
366
 
                    "\tpunpcklbw %%mm0,%%mm2\n"
367
 
 
368
 
                    "\tmovq         %3,%%mm4\n"
369
 
                    "\tpsubw     %%mm3,%%mm4\n"
370
 
 
371
 
                    "\t" pdivwuqX(mm2,mm4,mm5) "\n"
372
 
 
373
 
                    "\tmovq      %%mm1,%%mm3\n"
374
 
                    "\tpxor      %%mm2,%%mm2\n"
375
 
                    "\tpunpckhbw %%mm2,%%mm3\n"
376
 
                    "\tpunpckhbw %%mm0,%%mm2\n"
377
 
 
378
 
                    "\tmovq         %3,%%mm4\n"
379
 
                    "\tpsubw     %%mm3,%%mm4\n"
380
 
 
381
 
                    "\t" pdivwuqX(mm2,mm4,mm6) "\n"
382
 
 
383
 
                    "\tpackuswb  %%mm6,%%mm5\n"
384
 
 
385
 
                    "\tmovq         %4,%%mm6\n"
386
 
                    "\tmovq      %%mm1,%%mm7\n"
387
 
                    "\tpminub    %%mm0,%%mm7\n"
388
 
                    "\tpand      %%mm6,%%mm7\n"
389
 
                    "\tpandn     %%mm5,%%mm6\n"
390
 
 
391
 
                    "\tpor       %%mm6,%%mm7\n"
392
 
 
393
 
                    "\tmovd      %%mm7,%2\n"
394
 
                    : "=m" (*op.D)
395
 
                    : "m" (*op.A), "m" (*op.B), "m" (*rgba8_w256_64), "m" (*rgba8_alpha_mask_64)
396
 
                    : "%eax", "%ecx", "%edx", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5");
397
 
    }
398
 
 
399
 
  asm("emms");
400
 
}
401
 
#endif
 
317
                    : "%mm1", "%mm2", "%mm3", "%mm4", "%mm5");
 
318
    }
 
319
 
 
320
  asm("emms");
 
321
}
 
322
 
402
323
 
403
324
void
404
325
gimp_composite_grain_extract_rgba8_rgba8_rgba8_sse (GimpCompositeContext *_op)
443
364
                    "\tpand      %%mm0,%%mm2\n"
444
365
 
445
366
                    "\tpor       %%mm2,%%mm1\n"
446
 
                    "\tmovq      %%mm1,%0\n"
 
367
                    "\tmovntq    %%mm1,%0\n"
447
368
                    : "=m" (*d)
448
369
                    : "m" (*a), "m" (*b)
449
370
                    : "%mm1", "%mm2", "%mm3", "%mm4");
522
443
                    "\tmovq      %%mm0, %%mm1\n"
523
444
                    "\tpandn     %%mm4, %%mm1\n"
524
445
                    "\tpor       %%mm2, %%mm1\n"
525
 
                    "\tmovq      %%mm1, %0\n"
 
446
                    "\tmovntq    %%mm1, %0\n"
526
447
                    : "=m" (*d)
527
448
                    : "m" (*a), "m" (*b)
528
449
                    : "%mm1", "%mm2", "%mm3", "%mm4");
583
504
                    "\tpminub  %%mm2, %%mm3\n"
584
505
                    "\tpand    %%mm0, %%mm3\n"
585
506
                    "\tpor     %%mm3, %%mm1\n"
586
 
                    "\tmovq    %%mm1, %0\n"
 
507
                    "\tmovntq  %%mm1, %0\n"
587
508
                    : "=m" (*d)
588
509
                    : "m" (*a), "m" (*b)
589
510
                    : "%mm1", "%mm2", "%mm3", "%mm4", "%mm5");
598
519
                    "\tmovd       %2, %%mm3\n"
599
520
                    "\tmovq    %%mm2, %%mm4\n"
600
521
                    "\tpmaxub  %%mm3, %%mm4\n"
601
 
 
602
522
                    "\tmovq    %%mm0, %%mm1\n"
603
523
                    "\tpandn   %%mm4, %%mm1\n"
604
 
 
605
 
                    "\tpminub  %%mm2,%%mm3\n"
606
 
 
 
524
                    "\tpminub  %%mm2, %%mm3\n"
607
525
                    "\tpand    %%mm0, %%mm3\n"
608
526
                    "\tpor     %%mm3, %%mm1\n"
609
527
                    "\tmovd    %%mm1, %0\n"
649
567
                    "\tpand      %%mm0, %%mm2\n"
650
568
                    "\tpor       %%mm2, %%mm1\n"
651
569
 
652
 
                    "\tmovq      %%mm1, %0\n"
 
570
                    "\tmovntq    %%mm1, %0\n"
653
571
                    : "=m" (*d)
654
572
                    : "m" (*a), "m" (*b)
655
573
                    : "%mm1", "%mm2", "%mm3", "%mm4", "%mm5");
893
811
 
894
812
                    "\tpackuswb  %%mm4,%%mm1\n"
895
813
 
896
 
                    "\tmovq      %%mm1,%0\n"
 
814
                    "\tmovntq    %%mm1,%0\n"
897
815
                    : "=m" (*d)
898
816
                    : "m" (*a)
899
817
                    : "%mm1", "%mm2", "%mm4", "%mm5", "%mm7");
928
846
  uint64 *b = (uint64 *) _op->B;
929
847
  gulong n_pixels = _op->n_pixels;
930
848
 
931
 
  asm volatile ("movq    %0,%%mm0"     :  : "m" (*rgba8_alpha_mask_64) : "%mm0");
932
 
  asm volatile ("movq    %0,%%mm7"     :  : "m" (*rgba8_w128_64)  : "%mm7");
933
 
  asm volatile ("pxor    %mm6, %mm6");
 
849
  asm volatile ("pxor    %%mm6,%%mm6\n"
 
850
                "movq       %0,%%mm0\n"
 
851
                "movq       %1,%%mm7\n"
 
852
                : /* empty */
 
853
                : "m" (*rgba8_alpha_mask_64), "m" (*rgba8_w128_64)
 
854
                : "%mm0", "%mm6", "%mm7");
 
855
 
934
856
 
935
857
  for (; n_pixels >= 2; n_pixels -= 2)
936
858
    {
1214
1136
}
1215
1137
 
1216
1138
void
 
1139
xxxgimp_composite_burn_va8_va8_va8_sse (GimpCompositeContext *_op)
 
1140
{
 
1141
  GimpCompositeContext op = *_op;
 
1142
 
 
1143
  asm("movq   %0,%%mm1"
 
1144
      :
 
1145
      : "m" (*va8_alpha_mask)
 
1146
      : "%mm1");
 
1147
 
 
1148
  for (; op.n_pixels >= 4; op.n_pixels -= 4)
 
1149
    {
 
1150
      asm volatile ("  movq      (%0),%%mm0; addl $8,%0\n"
 
1151
                    "\tmovq      (%1),%%mm1; addl $8,%1\n"
 
1152
 
 
1153
                    "\tmovq      %3,%%mm2\n"
 
1154
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
1155
                    "\tpxor      %%mm4,%%mm4\n"
 
1156
                    "\tpunpcklbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
1157
 
 
1158
                    "\tmovq      %%mm1,%%mm3\n"
 
1159
                    "\tpxor      %%mm5,%%mm5\n"
 
1160
                    "\tpunpcklbw %%mm5,%%mm3\n"
 
1161
                    "\tmovq      %4,%%mm5\n"
 
1162
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
1163
 
 
1164
                    "\t" pdivwqX(mm4,mm5,mm7) "\n"
 
1165
 
 
1166
                    "\tmovq      %3,%%mm2\n"
 
1167
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
1168
                    "\tpxor      %%mm4,%%mm4\n"
 
1169
                    "\tpunpckhbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
1170
 
 
1171
                    "\tmovq      %%mm1,%%mm3\n"
 
1172
                    "\tpxor      %%mm5,%%mm5\n"
 
1173
                    "\tpunpckhbw %%mm5,%%mm3\n"
 
1174
                    "\tmovq      %4,%%mm5\n"
 
1175
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
1176
                    "\t" pdivwqX(mm4,mm5,mm6) "\n"
 
1177
 
 
1178
                    "\tmovq      %5,%%mm4\n"
 
1179
                    "\tmovq      %%mm4,%%mm5\n"
 
1180
                    "\tpsubusw     %%mm6,%%mm4\n"
 
1181
                    "\tpsubusw     %%mm7,%%mm5\n"
 
1182
 
 
1183
                    "\tpackuswb  %%mm4,%%mm5\n"
 
1184
 
 
1185
                    "\t" pminub(mm0,mm1,mm3) "\n" /* mm1 = min(mm0,mm1) clobber mm3 */
 
1186
 
 
1187
                    "\tmovq      %6,%%mm7\n"
 
1188
                    "\tpand      %%mm7,%%mm1\n" /* mm1 = mm7 & alpha_mask */
 
1189
 
 
1190
                    "\tpandn     %%mm5,%%mm7\n" /* mm7 = ~mm7 & mm5 */
 
1191
                    "\tpor       %%mm1,%%mm7\n" /* mm7 = mm7 | mm1 */
 
1192
 
 
1193
                    "\tmovq      %%mm7,(%2); addl $8,%2\n"
 
1194
                    : "+r" (op.A), "+r" (op.B), "+r" (op.D)
 
1195
                    : "m" (*va8_b255), "m" (*va8_w1), "m" (*va8_w255), "m" (*va8_alpha_mask)
 
1196
                    : "%mm1", "%mm2", "%mm3", "%mm4");
 
1197
    }
 
1198
 
 
1199
  if (op.n_pixels)
 
1200
    {
 
1201
      asm volatile ("  movd      (%0),%%mm0\n"
 
1202
                    "\tmovd      (%1),%%mm1\n"
 
1203
 
 
1204
                    "\tmovq      %3,%%mm2\n"
 
1205
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
1206
                    "\tpxor      %%mm4,%%mm4\n"
 
1207
                    "\tpunpcklbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
1208
 
 
1209
                    "\tmovq      %%mm1,%%mm3\n"
 
1210
                    "\tpxor      %%mm5,%%mm5\n"
 
1211
                    "\tpunpcklbw %%mm5,%%mm3\n"
 
1212
                    "\tmovq      %4,%%mm5\n"
 
1213
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
1214
 
 
1215
                    "\t" pdivwqX(mm4,mm5,mm7) "\n"
 
1216
 
 
1217
                    "\tmovq      %3,%%mm2\n"
 
1218
                    "\tpsubb   %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
1219
                    "\tpxor      %%mm4,%%mm4\n"
 
1220
                    "\tpunpckhbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
1221
 
 
1222
                    "\tmovq      %%mm1,%%mm3\n"
 
1223
                    "\tpxor      %%mm5,%%mm5\n"
 
1224
                    "\tpunpckhbw %%mm5,%%mm3\n"
 
1225
                    "\tmovq      %4,%%mm5\n"
 
1226
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
1227
                    "\t" pdivwqX(mm4,mm5,mm6) "\n"
 
1228
 
 
1229
                    "\tmovq      %5,%%mm4\n"
 
1230
                    "\tmovq      %%mm4,%%mm5\n"
 
1231
                    "\tpsubusw     %%mm6,%%mm4\n"
 
1232
                    "\tpsubusw     %%mm7,%%mm5\n"
 
1233
 
 
1234
                    "\tpackuswb  %%mm4,%%mm5\n"
 
1235
 
 
1236
                    "\t" pminub(mm0,mm1,mm3) "\n" /* mm1 = min(mm0,mm1) clobber mm3 */
 
1237
 
 
1238
                    "\tmovq      %6,%%mm7\n"
 
1239
                    "\tpand      %%mm7,%%mm1\n" /* mm1 = mm7 & alpha_mask */
 
1240
 
 
1241
                    "\tpandn     %%mm5,%%mm7\n" /* mm7 = ~mm7 & mm5 */
 
1242
                    "\tpor       %%mm1,%%mm7\n" /* mm7 = mm7 | mm1 */
 
1243
 
 
1244
                    "\tmovd      %%mm7,(%2)\n"
 
1245
                    : /* empty */
 
1246
                    : "r" (op.A), "r" (op.B), "r" (op.D), "m" (*va8_b255), "m" (*va8_w1), "m" (*va8_w255), "m" (*va8_alpha_mask)
 
1247
                    : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7");
 
1248
    }
 
1249
 
 
1250
  asm("emms");
 
1251
}
 
1252
 
 
1253
void
1217
1254
xxxgimp_composite_coloronly_va8_va8_va8_sse (GimpCompositeContext *_op)
1218
1255
{
1219
1256
  GimpCompositeContext op = *_op;