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

« back to all changes in this revision

Viewing changes to app/composite/gimp-composite-mmx.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
48
45
#define pmaxub(a,b,tmp)      "\tmovq %%" #a ", %%" #tmp ";" "psubusb %%" #b ", %%" #tmp ";" "paddb %%" #tmp ", %%" #b "\n"
49
46
 
50
47
 
51
 
void
 
48
#if 0
 
49
static void
52
50
debug_display_mmx(void)
53
51
{
54
52
#define mask32(x) ((x)& (unsigned long long) 0xFFFFFFFF)
60
58
  print64(mm6); printf("  "); print64(mm7); printf("\n");
61
59
  printf("--------------------------------------------\n");
62
60
}
 
61
#endif
63
62
 
64
63
const guint32 rgba8_alpha_mask_64[2] = { 0xFF000000, 0xFF000000 };
65
64
const guint32 rgba8_b1_64[2] =         { 0x01010101, 0x01010101 };
74
73
const guint32 va8_b255_64[2] =         { 0xFFFFFFFF, 0xFFFFFFFF };
75
74
const guint32 va8_w1_64[2] =           { 0x00010001, 0x00010001 };
76
75
const guint32 va8_w255_64[2] =         { 0x00FF00FF, 0x00FF00FF };
 
76
const guint32 va8_w128_64[2] =         { 0x00800080, 0x00800080 };
77
77
 
78
78
/*const static guint32 v8_alpha_mask[2] = { 0xFF00FF00, 0xFF00FF00};
79
79
  const static guint32 v8_mul_shift[2] = { 0x00800080, 0x00800080 };*/
135
135
  asm("emms");
136
136
}
137
137
 
 
138
#if 0
 
139
void
 
140
gimp_composite_burn_rgba8_rgba8_rgba8_mmx (GimpCompositeContext *_op)
 
141
{
 
142
  uint64 *d = (uint64 *) _op->D;
 
143
  uint64 *a = (uint64 *) _op->A;
 
144
  uint64 *b = (uint64 *) _op->B;
 
145
  gulong n_pixels = _op->n_pixels;
 
146
 
 
147
  for (; n_pixels >= 2; n_pixels -= 2)
 
148
    {
 
149
      asm volatile ("  movq         %1,%%mm0\n"
 
150
                    "\tmovq         %2,%%mm1\n"
 
151
 
 
152
                    "\tmovq         %3,%%mm2\n"
 
153
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
154
                    "\tpxor      %%mm4,%%mm4\n"
 
155
                    "\tpunpcklbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
156
 
 
157
                    "\tmovq      %%mm1,%%mm3\n"
 
158
                    "\tpxor      %%mm5,%%mm5\n"
 
159
                    "\tpunpcklbw %%mm5,%%mm3\n"
 
160
                    "\tmovq         %4,%%mm5\n"
 
161
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
162
 
 
163
                    "\t" pdivwqX(mm4,mm5,mm7) "\n"
 
164
 
 
165
                    "\tmovq         %3,%%mm2\n"
 
166
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
167
                    "\tpxor      %%mm4,%%mm4\n"
 
168
                    "\tpunpckhbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
169
 
 
170
                    "\tmovq      %%mm1,%%mm3\n"
 
171
                    "\tpxor      %%mm5,%%mm5\n"
 
172
                    "\tpunpckhbw %%mm5,%%mm3\n"
 
173
                    "\tmovq         %4,%%mm5\n"
 
174
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
175
                    "\t" pdivwqX(mm4,mm5,mm6) "\n"
 
176
 
 
177
                    "\tmovq         %5,%%mm4\n"
 
178
                    "\tmovq      %%mm4,%%mm5\n"
 
179
                    "\tpsubusw   %%mm6,%%mm4\n"
 
180
                    "\tpsubusw   %%mm7,%%mm5\n"
 
181
 
 
182
                    "\tpackuswb  %%mm4,%%mm5\n"
 
183
 
 
184
                    "\t" pminub(mm0,mm1,mm3) "\n" /* mm1 = min(mm0,mm1) clobber mm3 */
 
185
 
 
186
                    "\tmovq         %6,%%mm7\n" /* mm6 = rgba8_alpha_mask_64 */
 
187
                    "\tpand      %%mm7,%%mm1\n" /* mm1 = mm7 & alpha_mask */
 
188
 
 
189
                    "\tpandn     %%mm5,%%mm7\n" /* mm7 = ~mm7 & mm5 */
 
190
                    "\tpor       %%mm1,%%mm7\n" /* mm7 = mm7 | mm1 */
 
191
 
 
192
                    "\tmovq      %%mm7,%0\n"
 
193
                    : "=m" (*d)
 
194
                    : "m" (*a), "m" (*b), "m" (*rgba8_b255_64), "m" (*rgba8_w1_64), "m" (*rgba8_w255_64), "m" (*rgba8_alpha_mask_64)
 
195
                    : pdivwqX_clobber, "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7");
 
196
      d++;
 
197
      b++;
 
198
      a++;
 
199
    }
 
200
 
 
201
  if (n_pixels > 0)
 
202
    {
 
203
      asm volatile ("  movd         %1,%%mm0\n"
 
204
                    "\tmovd         %2,%%mm1\n"
 
205
 
 
206
                    "\tmovq         %3,%%mm2\n"
 
207
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
208
                    "\tpxor      %%mm4,%%mm4\n"
 
209
                    "\tpunpcklbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
210
 
 
211
                    "\tmovq      %%mm1,%%mm3\n"
 
212
                    "\tpxor      %%mm5,%%mm5\n"
 
213
                    "\tpunpcklbw %%mm5,%%mm3\n"
 
214
                    "\tmovq         %4,%%mm5\n"
 
215
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
216
 
 
217
                    "\t" pdivwqX(mm4,mm5,mm7) "\n"
 
218
 
 
219
                    "\tmovq         %3,%%mm2\n"
 
220
                    "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
221
                    "\tpxor      %%mm4,%%mm4\n"
 
222
                    "\tpunpckhbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
223
 
 
224
                    "\tmovq      %%mm1,%%mm3\n"
 
225
                    "\tpxor      %%mm5,%%mm5\n"
 
226
                    "\tpunpckhbw %%mm5,%%mm3\n"
 
227
                    "\tmovq         %4,%%mm5\n"
 
228
                    "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
229
                    "\t" pdivwqX(mm4,mm5,mm6) "\n"
 
230
 
 
231
                    "\tmovq         %5,%%mm4\n"
 
232
                    "\tmovq      %%mm4,%%mm5\n"
 
233
                    "\tpsubusw   %%mm6,%%mm4\n"
 
234
                    "\tpsubusw   %%mm7,%%mm5\n"
 
235
 
 
236
                    "\tpackuswb  %%mm4,%%mm5\n"
 
237
 
 
238
                    "\t" pminub(mm0,mm1,mm3) "\n" /* mm1 = min(mm0,mm1) clobber mm3 */
 
239
 
 
240
                    "\tmovq         %6,%%mm7\n"
 
241
                    "\tpand      %%mm7,%%mm1\n" /* mm1 = mm7 & alpha_mask */
 
242
 
 
243
                    "\tpandn     %%mm5,%%mm7\n" /* mm7 = ~mm7 & mm5 */
 
244
                    "\tpor       %%mm1,%%mm7\n" /* mm7 = mm7 | mm1 */
 
245
 
 
246
                    "\tmovd      %%mm7,%0\n"
 
247
                    : "=m" (*d)
 
248
                    : "m" (*a), "m" (*b), "m" (*rgba8_b255_64), "m" (*rgba8_w1_64), "m" (*rgba8_w255_64), "m" (*rgba8_alpha_mask_64)
 
249
                    : pdivwqX_clobber, "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7");
 
250
    }
 
251
 
 
252
  asm("emms");
 
253
}
 
254
#endif
 
255
 
138
256
void
139
257
gimp_composite_darken_rgba8_rgba8_rgba8_mmx (GimpCompositeContext *_op)
140
258
{
712
830
  asm("emms");
713
831
}
714
832
 
 
833
#if 0
715
834
static void
716
835
mmx_op_overlay(void)
717
836
{
761
880
                : "m" (*rgba8_w2_64), "m" (*rgba8_alpha_mask_64)
762
881
                );
763
882
}
 
883
#endif
764
884
 
765
885
#if 0
766
886
void
1067
1187
                    "\tpand      %%mm0,%%mm3\n"
1068
1188
 
1069
1189
                    "\tpor       %%mm3,%%mm1\n"
1070
 
                    
 
1190
 
1071
1191
                    "\tmovd      %%mm1,%0\n"
1072
1192
                    : "=m" (*d)
1073
1193
                    : "m" (*a), "m" (*b)
1150
1270
                    "\tmovq    %%mm3,%0\n"
1151
1271
                    "\tmovq    %%mm2,%1\n"
1152
1272
                    : "+m" (*a), "+m" (*b)
1153
 
                    : 
1154
 
                    : "%mm1", "%mm2", "%mm3", "%mm4");
 
1273
                    :
 
1274
                    : "%mm2", "%mm3");
1155
1275
      a++;
1156
1276
      b++;
1157
1277
    }
1164
1284
                    "\tmovd    %%mm2,%1\n"
1165
1285
                    : "+m" (*a), "+m" (*b)
1166
1286
                    :
1167
 
                    : "%mm1", "%mm2", "%mm3", "%mm4");
 
1287
                    : "%mm2", "%mm3");
1168
1288
    }
1169
1289
 
1170
1290
  asm("emms");
1171
1291
}
1172
1292
 
1173
1293
 
 
1294
 
1174
1295
void
1175
1296
gimp_composite_addition_va8_va8_va8_mmx (GimpCompositeContext *_op)
1176
1297
{
1177
1298
  uint64 *d = (uint64 *) _op->D;
1178
1299
  uint64 *a = (uint64 *) _op->A;
1179
1300
  uint64 *b = (uint64 *) _op->B;
1180
 
  gulong n_pixels = _op->n_pixels;
1181
 
 
1182
 
  asm volatile ("movq    %0,%%mm0"
1183
 
                : 
1184
 
                : "m" (*va8_alpha_mask_64)
1185
 
                : "%mm0");
1186
 
 
1187
 
  for (; n_pixels >= 4; n_pixels -= 4)
1188
 
    {
1189
 
      asm volatile ("  movq       %1, %%mm2\n"
1190
 
                    "\tmovq       %2, %%mm3\n"
1191
 
                    "\tmovq    %%mm2, %%mm4\n"
1192
 
                    "\tpaddusb %%mm3, %%mm4\n"
1193
 
                    "\tmovq    %%mm0, %%mm1\n"
1194
 
                    "\tpandn   %%mm4, %%mm1\n"
1195
 
                    "\t" pminub(mm3, mm2, mm4) "\n"
1196
 
                    "\tpand    %%mm0, %%mm2\n"
1197
 
                    "\tpor     %%mm2, %%mm1\n"
1198
 
                    "\tmovq    %%mm1, %0\n"
1199
 
                    : "=m" (*d)
1200
 
                    : "m" (*a), "m" (*b)
1201
 
                    : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
1202
 
      a++;
1203
 
      b++;
1204
 
      d++;
1205
 
    }
1206
 
 
1207
 
  uint32 *a32 = (uint32 *) a;
1208
 
  uint32 *b32 = (uint32 *) b;
1209
 
  uint32 *d32 = (uint32 *) d;
1210
 
 
1211
 
  for (; n_pixels >= 2; n_pixels -= 2)
1212
 
    {
1213
 
      asm volatile ("  movd    %1, %%mm2\n"
1214
 
                    "\tmovd    %2, %%mm3\n"
1215
 
                    "\tmovq    %%mm2, %%mm4\n"
1216
 
                    "\tpaddusb %%mm3, %%mm4\n"
1217
 
                    "\tmovq    %%mm0, %%mm1\n"
1218
 
                    "\tpandn   %%mm4, %%mm1\n"
1219
 
                    "\t" pminub(mm3, mm2, mm4) "\n"
1220
 
                    "\tpand    %%mm0, %%mm2\n"
1221
 
                    "\tpor     %%mm2, %%mm1\n"
1222
 
                    "\tmovd    %%mm1, %0\n"
1223
 
                    : "=m" (*d32)
1224
 
                    : "m" (*a32), "m" (*b32)
1225
 
                    : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
1226
 
      a32++;
1227
 
      b32++;
1228
 
      d32++;
1229
 
    }
1230
 
  
1231
 
  uint16 *a16 = (uint16 *) a32;
1232
 
  uint16 *b16 = (uint16 *) b32;
1233
 
  uint16 *d16 = (uint16 *) d32;
1234
 
 
1235
 
  for (; n_pixels >= 1; n_pixels -= 1)
1236
 
    {
1237
 
      asm volatile ("  movw    %1, %%ax ; movd    %%eax, %%mm2\n"
1238
 
                    "\tmovw    %2, %%ax ; movd    %%eax, %%mm3\n"
1239
 
                    "\tmovq    %%mm2, %%mm4\n"
1240
 
                    "\tpaddusb %%mm3, %%mm4\n"
1241
 
                    "\tmovq    %%mm0, %%mm1\n"
1242
 
                    "\tpandn   %%mm4, %%mm1\n"
1243
 
                    "\t" pminub(mm3, mm2, mm4) "\n"
1244
 
                    "\tpand    %%mm0, %%mm2\n"
1245
 
                    "\tpor     %%mm2, %%mm1\n"
1246
 
                    "\tmovd    %%mm1, %%eax\n"
1247
 
                    "\tmovw    %%ax, %0\n"
1248
 
                    : "=m" (*d16)
1249
 
                    : "m" (*a16), "m" (*b16)
1250
 
                    : "%eax", "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
1251
 
 
1252
 
      a16++;
1253
 
      b16++;
1254
 
      d16++;
1255
 
    }
1256
 
  
1257
 
  asm("emms");
1258
 
}
1259
 
 
1260
 
#if 0
 
1301
  uint32 *a32;
 
1302
  uint32 *b32;
 
1303
  uint32 *d32;
 
1304
  uint16 *a16;
 
1305
  uint16 *b16;
 
1306
  uint16 *d16;
 
1307
  gulong n_pixels = _op->n_pixels;
 
1308
 
 
1309
  asm volatile ("movq    %0,%%mm0"
 
1310
                :
 
1311
                : "m" (*va8_alpha_mask_64)
 
1312
                : "%mm0");
 
1313
 
 
1314
  for (; n_pixels >= 4; n_pixels -= 4)
 
1315
    {
 
1316
      asm volatile ("  movq       %1, %%mm2\n"
 
1317
                    "\tmovq       %2, %%mm3\n"
 
1318
                    "\tmovq    %%mm2, %%mm4\n"
 
1319
                    "\tpaddusb %%mm3, %%mm4\n"
 
1320
                    "\tmovq    %%mm0, %%mm1\n"
 
1321
                    "\tpandn   %%mm4, %%mm1\n"
 
1322
                    "\t" pminub(mm3, mm2, mm4) "\n"
 
1323
                    "\tpand    %%mm0, %%mm2\n"
 
1324
                    "\tpor     %%mm2, %%mm1\n"
 
1325
                    "\tmovq    %%mm1, %0\n"
 
1326
                    : "=m" (*d)
 
1327
                    : "m" (*a), "m" (*b)
 
1328
                    : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
 
1329
      a++;
 
1330
      b++;
 
1331
      d++;
 
1332
    }
 
1333
 
 
1334
  a32 = (uint32 *) a;
 
1335
  b32 = (uint32 *) b;
 
1336
  d32 = (uint32 *) d;
 
1337
 
 
1338
  for (; n_pixels >= 2; n_pixels -= 2)
 
1339
    {
 
1340
      asm volatile ("  movd    %1, %%mm2\n"
 
1341
                    "\tmovd    %2, %%mm3\n"
 
1342
                    "\tmovq    %%mm2, %%mm4\n"
 
1343
                    "\tpaddusb %%mm3, %%mm4\n"
 
1344
                    "\tmovq    %%mm0, %%mm1\n"
 
1345
                    "\tpandn   %%mm4, %%mm1\n"
 
1346
                    "\t" pminub(mm3, mm2, mm4) "\n"
 
1347
                    "\tpand    %%mm0, %%mm2\n"
 
1348
                    "\tpor     %%mm2, %%mm1\n"
 
1349
                    "\tmovd    %%mm1, %0\n"
 
1350
                    : "=m" (*d32)
 
1351
                    : "m" (*a32), "m" (*b32)
 
1352
                    : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
 
1353
      a32++;
 
1354
      b32++;
 
1355
      d32++;
 
1356
    }
 
1357
 
 
1358
  a16 = (uint16 *) a32;
 
1359
  b16 = (uint16 *) b32;
 
1360
  d16 = (uint16 *) d32;
 
1361
 
 
1362
  for (; n_pixels >= 1; n_pixels -= 1)
 
1363
    {
 
1364
      asm volatile ("  movw    %1, %%ax ; movd    %%eax, %%mm2\n"
 
1365
                    "\tmovw    %2, %%ax ; movd    %%eax, %%mm3\n"
 
1366
                    "\tmovq    %%mm2, %%mm4\n"
 
1367
                    "\tpaddusb %%mm3, %%mm4\n"
 
1368
                    "\tmovq    %%mm0, %%mm1\n"
 
1369
                    "\tpandn   %%mm4, %%mm1\n"
 
1370
                    "\t" pminub(mm3, mm2, mm4) "\n"
 
1371
                    "\tpand    %%mm0, %%mm2\n"
 
1372
                    "\tpor     %%mm2, %%mm1\n"
 
1373
                    "\tmovd    %%mm1, %%eax\n"
 
1374
                    "\tmovw    %%ax, %0\n"
 
1375
                    : "=m" (*d16)
 
1376
                    : "m" (*a16), "m" (*b16)
 
1377
                    : "%eax", "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
 
1378
 
 
1379
      a16++;
 
1380
      b16++;
 
1381
      d16++;
 
1382
    }
 
1383
 
 
1384
  asm("emms");
 
1385
}
 
1386
 
 
1387
void
 
1388
gimp_composite_subtract_va8_va8_va8_mmx (GimpCompositeContext *_op)
 
1389
{
 
1390
  uint64 *d = (uint64 *) _op->D;
 
1391
  uint64 *a = (uint64 *) _op->A;
 
1392
  uint64 *b = (uint64 *) _op->B;
 
1393
  uint32 *a32;
 
1394
  uint32 *b32;
 
1395
  uint32 *d32;
 
1396
  uint16 *a16;
 
1397
  uint16 *b16;
 
1398
  uint16 *d16;
 
1399
  gulong n_pixels = _op->n_pixels;
 
1400
 
 
1401
  asm volatile ("movq    %0,%%mm0"
 
1402
                :
 
1403
                : "m" (*va8_alpha_mask_64)
 
1404
                : "%mm0");
 
1405
 
 
1406
  for (; n_pixels >= 4; n_pixels -= 4)
 
1407
    {
 
1408
      asm volatile ("  movq       %1, %%mm2\n"
 
1409
                    "\tmovq       %2, %%mm3\n"
 
1410
                    "\tmovq    %%mm2, %%mm4\n"
 
1411
                    "\tpsubusb %%mm3, %%mm4\n"
 
1412
                    "\tmovq    %%mm0, %%mm1\n"
 
1413
                    "\tpandn   %%mm4, %%mm1\n"
 
1414
                    "\t" pminub(mm3, mm2, mm4) "\n"
 
1415
                    "\tpand    %%mm0, %%mm2\n"
 
1416
                    "\tpor     %%mm2, %%mm1\n"
 
1417
                    "\tmovq    %%mm1, %0\n"
 
1418
                    : "=m" (*d)
 
1419
                    : "m" (*a), "m" (*b)
 
1420
                    : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
 
1421
      a++;
 
1422
      b++;
 
1423
      d++;
 
1424
    }
 
1425
 
 
1426
  a32 = (uint32 *) a;
 
1427
  b32 = (uint32 *) b;
 
1428
  d32 = (uint32 *) d;
 
1429
 
 
1430
  for (; n_pixels >= 2; n_pixels -= 2)
 
1431
    {
 
1432
      asm volatile ("  movd    %1, %%mm2\n"
 
1433
                    "\tmovd    %2, %%mm3\n"
 
1434
                    "\tmovq    %%mm2, %%mm4\n"
 
1435
                    "\tpsubusb %%mm3, %%mm4\n"
 
1436
                    "\tmovq    %%mm0, %%mm1\n"
 
1437
                    "\tpandn   %%mm4, %%mm1\n"
 
1438
                    "\t" pminub(mm3, mm2, mm4) "\n"
 
1439
                    "\tpand    %%mm0, %%mm2\n"
 
1440
                    "\tpor     %%mm2, %%mm1\n"
 
1441
                    "\tmovd    %%mm1, %0\n"
 
1442
                    : "=m" (*d32)
 
1443
                    : "m" (*a32), "m" (*b32)
 
1444
                    : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
 
1445
      a32++;
 
1446
      b32++;
 
1447
      d32++;
 
1448
    }
 
1449
 
 
1450
  a16 = (uint16 *) a32;
 
1451
  b16 = (uint16 *) b32;
 
1452
  d16 = (uint16 *) d32;
 
1453
 
 
1454
  for (; n_pixels >= 1; n_pixels -= 1)
 
1455
    {
 
1456
      asm volatile ("  movw    %1, %%ax ; movd    %%eax, %%mm2\n"
 
1457
                    "\tmovw    %2, %%ax ; movd    %%eax, %%mm3\n"
 
1458
                    "\tmovq    %%mm2, %%mm4\n"
 
1459
                    "\tpsubusb %%mm3, %%mm4\n"
 
1460
                    "\tmovq    %%mm0, %%mm1\n"
 
1461
                    "\tpandn   %%mm4, %%mm1\n"
 
1462
                    "\t" pminub(mm3, mm2, mm4) "\n"
 
1463
                    "\tpand    %%mm0, %%mm2\n"
 
1464
                    "\tpor     %%mm2, %%mm1\n"
 
1465
                    "\tmovd    %%mm1, %%eax\n"
 
1466
                    "\tmovw    %%ax, %0\n"
 
1467
                    : "=m" (*d16)
 
1468
                    : "m" (*a16), "m" (*b16)
 
1469
                    : "%eax", "%mm0", "%mm1", "%mm2", "%mm3", "%mm4");
 
1470
 
 
1471
      a16++;
 
1472
      b16++;
 
1473
      d16++;
 
1474
    }
 
1475
 
 
1476
  asm("emms");
 
1477
}
 
1478
 
 
1479
#if 0
 
1480
void
 
1481
gimp_composite_multiply_va8_va8_va8_mmx (GimpCompositeContext *_op)
 
1482
{
 
1483
  uint64 *d = (uint64 *) _op->D;
 
1484
  uint64 *a = (uint64 *) _op->A;
 
1485
  uint64 *b = (uint64 *) _op->B;
 
1486
  gulong n_pixels = _op->n_pixels;
 
1487
 
 
1488
  asm volatile (
 
1489
                "movq    %0,%%mm0\n"
 
1490
                "movq    %1,%%mm7\n"
 
1491
                "pxor    %%mm6,%%mm6\n"
 
1492
                : /* empty */
 
1493
                : "m" (*va8_alpha_mask_64), "m" (*va8_w128_64)
 
1494
                : "%mm6", "%mm7", "%mm0");
 
1495
 
 
1496
  for (; n_pixels >= 2; n_pixels -= 2)
 
1497
    {
 
1498
      asm volatile ("  movq        %1, %%mm2\n"
 
1499
                    "\tmovq        %2, %%mm3\n"
 
1500
 
 
1501
                    mmx_low_bytes_to_words(mm2,mm1,mm6)
 
1502
                    mmx_low_bytes_to_words(mm3,mm5,mm6)
 
1503
                    mmx_int_mult(mm5,mm1,mm7)
 
1504
 
 
1505
                    mmx_high_bytes_to_words(mm2,mm4,mm6)
 
1506
                    mmx_high_bytes_to_words(mm3,mm5,mm6)
 
1507
                    mmx_int_mult(mm5,mm4,mm7)
 
1508
 
 
1509
                    "\tpackuswb  %%mm4, %%mm1\n"
 
1510
 
 
1511
                    "\tmovq      %%mm0, %%mm4\n"
 
1512
                    "\tpandn     %%mm1, %%mm4\n"
 
1513
                    "\tmovq      %%mm4, %%mm1\n"
 
1514
                    "\t" pminub(mm3,mm2,mm4) "\n"
 
1515
                    "\tpand      %%mm0, %%mm2\n"
 
1516
                    "\tpor       %%mm2, %%mm1\n"
 
1517
 
 
1518
                    "\tmovq      %%mm1, %0\n"
 
1519
                    : "=m" (*d)
 
1520
                    : "m" (*a), "m" (*b)
 
1521
                    : "%mm1", "%mm2", "%mm3", "%mm4", "%mm5");
 
1522
      a++;
 
1523
      b++;
 
1524
      d++;
 
1525
  }
 
1526
 
 
1527
  if (n_pixels > 0)
 
1528
    {
 
1529
      asm volatile ("  movd     %1, %%mm2\n"
 
1530
                    "\tmovd     %2, %%mm3\n"
 
1531
 
 
1532
                    mmx_low_bytes_to_words(mm2,mm1,mm6)
 
1533
                    mmx_low_bytes_to_words(mm3,mm5,mm6)
 
1534
                    pmulwX(mm5,mm1,mm7)
 
1535
 
 
1536
                    "\tpackuswb  %%mm6, %%mm1\n"
 
1537
 
 
1538
                    "\tmovq      %%mm0, %%mm4\n"
 
1539
                    "\tpandn     %%mm1, %%mm4\n"
 
1540
                    "\tmovq      %%mm4, %%mm1\n"
 
1541
                    "\t" pminub(mm3,mm2,mm4) "\n"
 
1542
                    "\tpand      %%mm0, %%mm2\n"
 
1543
                    "\tpor       %%mm2, %%mm1\n"
 
1544
 
 
1545
                    "\tmovd    %%mm1, %0\n"
 
1546
                    : "=m" (*d)
 
1547
                    : "m" (*a), "m" (*b)
 
1548
                    : "%mm1", "%mm2", "%mm3", "%mm4", "%mm5");
 
1549
  }
 
1550
 
 
1551
  asm("emms");
 
1552
}
 
1553
#endif
 
1554
 
 
1555
#if 0
 
1556
void
 
1557
gimp_composite_burn_va8_va8_va8_mmx (GimpCompositeContext *_op)
 
1558
{
 
1559
  GimpCompositeContext op = *_op;
 
1560
 
 
1561
  asm("movq   %0,%%mm1"
 
1562
      :
 
1563
      : "m" (*va8_alpha_mask)
 
1564
      : "%mm1");
 
1565
 
 
1566
  for (; op.n_pixels >= 4; op.n_pixels -= 4)
 
1567
    {
 
1568
    asm volatile ("  movq         %0,%%mm0\n"
 
1569
                  "\tmovq         %1,%%mm1\n"
 
1570
 
 
1571
                  "\tmovq         %3,%%mm2\n"
 
1572
                  "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
1573
                  "\tpxor      %%mm4,%%mm4\n"
 
1574
                  "\tpunpcklbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
1575
 
 
1576
                  "\tmovq      %%mm1,%%mm3\n"
 
1577
                  "\tpxor      %%mm5,%%mm5\n"
 
1578
                  "\tpunpcklbw %%mm5,%%mm3\n"
 
1579
                  "\tmovq         %4,%%mm5\n"
 
1580
                  "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
1581
 
 
1582
                  "\t" pdivwqX(mm4,mm5,mm7) "\n"
 
1583
 
 
1584
                  "\tmovq         %3,%%mm2\n"
 
1585
                  "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
1586
                  "\tpxor      %%mm4,%%mm4\n"
 
1587
                  "\tpunpckhbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
1588
 
 
1589
                  "\tmovq      %%mm1,%%mm3\n"
 
1590
                  "\tpxor      %%mm5,%%mm5\n"
 
1591
                  "\tpunpckhbw %%mm5,%%mm3\n"
 
1592
                  "\tmovq         %4,%%mm5\n"
 
1593
                  "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
1594
                  "\t" pdivwqX(mm4,mm5,mm6) "\n"
 
1595
 
 
1596
                  "\tmovq         %5,%%mm4\n"
 
1597
                  "\tmovq      %%mm4,%%mm5\n"
 
1598
                  "\tpsubusw   %%mm6,%%mm4\n"
 
1599
                  "\tpsubusw   %%mm7,%%mm5\n"
 
1600
 
 
1601
                  "\tpackuswb  %%mm4,%%mm5\n"
 
1602
 
 
1603
                  "\t" pminub(mm0,mm1,mm3) "\n" /* mm1 = min(mm0,mm1) clobber mm3 */
 
1604
 
 
1605
                  "\tmovq         %6,%%mm7\n"
 
1606
                  "\tpand      %%mm7,%%mm1\n" /* mm1 = mm7 & alpha_mask */
 
1607
 
 
1608
                  "\tpandn     %%mm5,%%mm7\n" /* mm7 = ~mm7 & mm5 */
 
1609
                  "\tpor       %%mm1,%%mm7\n" /* mm7 = mm7 | mm1 */
 
1610
 
 
1611
                  "\tmovq      %%mm7,%2\n"
 
1612
                  : /* empty */
 
1613
                  : "+m" (*op.A), "+m" (*op.B), "+m" (*op.D), "m" (*va8_b255), "m" (*va8_w1), "m" (*va8_w255_64), "m" (*va8_alpha_mask)
 
1614
                  : "%mm1", "%mm2", "%mm3", "%mm4");
 
1615
      op.A += 8;
 
1616
      op.B += 8;
 
1617
      op.D += 8;
 
1618
  }
 
1619
 
 
1620
  if (op.n_pixels)
 
1621
    {
 
1622
    asm volatile ("  movd         %0,%%mm0\n"
 
1623
                  "\tmovd         %1,%%mm1\n"
 
1624
                  "\tmovq         %3,%%mm2\n"
 
1625
                  "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
1626
                  "\tpxor      %%mm4,%%mm4\n"
 
1627
                  "\tpunpcklbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
1628
 
 
1629
                  "\tmovq      %%mm1,%%mm3\n"
 
1630
                  "\tpxor      %%mm5,%%mm5\n"
 
1631
                  "\tpunpcklbw %%mm5,%%mm3\n"
 
1632
                  "\tmovq         %4,%%mm5\n"
 
1633
                  "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
1634
 
 
1635
                  "\t" pdivwqX(mm4,mm5,mm7) "\n"
 
1636
 
 
1637
                  "\tmovq         %3,%%mm2\n"
 
1638
                  "\tpsubb     %%mm0,%%mm2\n" /* mm2 = 255 - A */
 
1639
                  "\tpxor      %%mm4,%%mm4\n"
 
1640
                  "\tpunpckhbw %%mm2,%%mm4\n" /* mm4 = (255- A) * 256  */
 
1641
 
 
1642
                  "\tmovq      %%mm1,%%mm3\n"
 
1643
                  "\tpxor      %%mm5,%%mm5\n"
 
1644
                  "\tpunpckhbw %%mm5,%%mm3\n"
 
1645
                  "\tmovq         %4,%%mm5\n"
 
1646
                  "\tpaddusw   %%mm3,%%mm5\n" /* mm5 = B + 1 */
 
1647
                  "\t" pdivwqX(mm4,mm5,mm6) "\n"
 
1648
 
 
1649
                  "\tmovq         %5,%%mm4\n"
 
1650
                  "\tmovq      %%mm4,%%mm5\n"
 
1651
                  "\tpsubusw   %%mm6,%%mm4\n"
 
1652
                  "\tpsubusw   %%mm7,%%mm5\n"
 
1653
 
 
1654
                  "\tpackuswb  %%mm4,%%mm5\n"
 
1655
 
 
1656
                  "\t" pminub(mm0,mm1,mm3) "\n" /* mm1 = min(mm0,mm1) clobber mm3 */
 
1657
 
 
1658
                  "\tmovq         %6,%%mm7\n"
 
1659
                  "\tpand      %%mm7,%%mm1\n" /* mm1 = mm7 & alpha_mask */
 
1660
 
 
1661
                  "\tpandn     %%mm5,%%mm7\n" /* mm7 = ~mm7 & mm5 */
 
1662
                  "\tpor       %%mm1,%%mm7\n" /* mm7 = mm7 | mm1 */
 
1663
 
 
1664
                  "\tmovd      %%mm7,%2\n"
 
1665
                  : /* empty */
 
1666
                  : "m" (*op.A), "m" (*op.B), "m" (*op.D), "m" (*va8_b255), "m" (*va8_w1), "m" (*va8_w255_64), "m" (*va8_alpha_mask)
 
1667
                  : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7");
 
1668
  }
 
1669
 
 
1670
  asm("emms");
 
1671
}
 
1672
 
1261
1673
void
1262
1674
xxxgimp_composite_coloronly_va8_va8_va8_mmx (GimpCompositeContext *_op)
1263
1675
{