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

« back to all changes in this revision

Viewing changes to app/composite/gimp-composite-sse2.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
 
 * -*- mode: c tab-width: 2; c-basic-indent: 2; indent-tabs-mode: nil -*-
7
 
 *
8
4
 * This program is free software; you can redistribute it and/or modify
9
5
 * it under the terms of the GNU General Public License as published by
10
6
 * the Free Software Foundation; either version 2 of the License, or
66
62
static const guint32 va8_w1_64[2] =           { 0x00010001, 0x00010001 };
67
63
static const guint32 va8_w255_64[2] =         { 0x00FF00FF, 0x00FF00FF };
68
64
 
 
65
#if 0
69
66
void
70
67
debug_display_sse (void)
71
68
{
83
80
  print128(xmm6); printf("  "); print128(xmm7); printf("\n");
84
81
  printf("--------------------------------------------\n");
85
82
}
 
83
#endif
86
84
 
87
85
void
88
86
gimp_composite_addition_rgba8_rgba8_rgba8_sse2 (GimpCompositeContext *_op)
107
105
                    "\tmovdqu      %2,%%xmm3\n"
108
106
                    "\tmovdqu  %%xmm2,%%xmm4\n"
109
107
                    "\tpaddusb %%xmm3,%%xmm4\n"
110
 
                    
 
108
 
111
109
                    "\tmovdqu  %%xmm0,%%xmm1\n"
112
110
                    "\tpandn   %%xmm4,%%xmm1\n"
113
111
                    "\tpminub  %%xmm3,%%xmm2\n"
185
183
                    "\tmovdqu      %%xmm2,%0\n"
186
184
                    : "=m" (*D)
187
185
                    : "m" (*A), "m" (*B)
188
 
                    : "%xmm1", "%xmm2", "%xmm3", "%xmm4");
 
186
                    : "%xmm2", "%xmm3");
189
187
      A++;
190
188
      B++;
191
189
      D++;
197
195
 
198
196
  for (; n_pixels >= 2; n_pixels -= 2)
199
197
    {
200
 
      asm volatile ("  movq       %1, %%mm2\n"
201
 
                    "\tpminub     %2, %%mm2\n"
202
 
                    "\tmovntq  %%mm2, %0\n"
 
198
      asm volatile ("  movq   %1,%%mm2\n"
 
199
                    "\tmovq   %2,%%mm3\n"
 
200
                    "\tpminub %%mm3,%%mm2\n"
 
201
                    "\tmovntq %%mm2,%0\n"
203
202
                    : "=m" (*d)
204
203
                    : "m" (*a), "m" (*b)
205
 
                    : "%mm1", "%mm2", "%mm3", "%mm4");
 
204
                    : "%mm2", "%mm3");
206
205
      a++;
207
206
      b++;
208
207
      d++;
327
326
  asm volatile ("  movq       %0,%%mm0\n"
328
327
                "\tpxor    %%mm6,%%mm6\n"
329
328
                "\tmovq       %1,%%mm7\n"
330
 
                                                                "\tmovdqu     %2,%%xmm0\n"
 
329
                "\tmovdqu     %2,%%xmm0\n"
331
330
                "\tpxor   %%xmm6,%%xmm6\n"
332
331
                "\tmovdqu     %3,%%xmm7\n"
333
332
                : /* empty */
603
602
  GimpCompositeContext op = *_op;
604
603
 
605
604
  /*
606
 
   * Inhale one whole i686 cache line at once. 64 bytes, 16 rgba8
607
 
   * pixels, 4 128 bit xmm registers.
 
605
   * Inhale one whole i686 cache line at once. 128 bytes == 32 rgba8
 
606
   * pixels == 8 128 bit xmm registers.
608
607
   */
609
608
  for (; op.n_pixels >= 16; op.n_pixels -= 16)
610
609
    {
611
 
#ifdef __OPTIMIZE__
612
 
      asm volatile ("  movdqu      %0,%%xmm0\n"
613
 
                    "\tmovdqu      %1,%%xmm1\n"
614
 
                    "\tmovdqu      %2,%%xmm2\n"
615
 
                    "\tmovdqu      %3,%%xmm3\n"
616
 
                    "\tmovdqu      %4,%%xmm4\n"
617
 
                    "\tmovdqu      %5,%%xmm5\n"
618
 
                    "\tmovdqu      %6,%%xmm6\n"
619
 
                    "\tmovdqu      %7,%%xmm7\n"
620
 
 
621
 
                    "\tmovdqu      %%xmm0,%1\n"
622
 
                    "\tmovdqu      %%xmm1,%0\n"
623
 
                    "\tmovdqu      %%xmm2,%3\n"
624
 
                    "\tmovdqu      %%xmm3,%2\n"
625
 
                    "\tmovdqu      %%xmm4,%5\n"
626
 
                    "\tmovdqu      %%xmm5,%4\n"
627
 
                    "\tmovdqu      %%xmm6,%7\n"
628
 
                    "\tmovdqu      %%xmm7,%6\n"
629
 
                    : "+m" (op.A[0]), "+m" (op.B[0]),
630
 
                      "+m" (op.A[1]), "+m" (op.B[1]),
631
 
                      "+m" (op.A[2]), "+m" (op.B[2]),
632
 
                      "+m" (op.A[3]), "+m" (op.B[3])
633
 
                    : /* empty */
634
 
                    : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7"
635
 
                    );
636
 
#else
637
 
      asm volatile ("  movdqu      %0,%%xmm0\n"
638
 
                    "\tmovdqu      %1,%%xmm1\n"
639
 
                    "\tmovdqu      %2,%%xmm2\n"
640
 
                    "\tmovdqu      %3,%%xmm3\n"
641
 
                    : "+m" (op.A[0]), "+m" (op.B[0]),
642
 
                      "+m" (op.A[1]), "+m" (op.B[1])
643
 
                    : /* empty */
644
 
                    : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7"
645
 
                    );
646
 
 
647
 
      asm volatile ("\tmovdqu      %4,%%xmm4\n"
648
 
                    "\tmovdqu      %5,%%xmm5\n"
649
 
                    "\tmovdqu      %6,%%xmm6\n"
650
 
                    "\tmovdqu      %7,%%xmm7\n"
651
 
                    : "+m" (op.A[2]), "+m" (op.B[2]),
652
 
                      "+m" (op.A[3]), "+m" (op.B[3])
653
 
                    : /* empty */
654
 
                    : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7"
655
 
                    );
656
 
 
657
 
      asm volatile ("\tmovdqu      %%xmm0,%1\n"
658
 
                    "\tmovdqu      %%xmm1,%0\n"
659
 
                    "\tmovdqu      %%xmm2,%3\n"
660
 
                    "\tmovdqu      %%xmm3,%2\n"
661
 
                    : "+m" (op.A[0]), "+m" (op.B[0]),
662
 
                      "+m" (op.A[1]), "+m" (op.B[1])
663
 
                    : /* empty */
664
 
                    : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7"
665
 
                    );
666
 
 
667
 
      asm volatile ("\tmovdqu      %%xmm4,%5\n"
668
 
                    "\tmovdqu      %%xmm5,%4\n"
669
 
                    "\tmovdqu      %%xmm6,%7\n"
670
 
                    "\tmovdqu      %%xmm7,%6\n"
671
 
                    : "+m" (op.A[2]), "+m" (op.B[2]),
672
 
                      "+m" (op.A[3]), "+m" (op.B[3])
673
 
                    : /* empty */
674
 
                    : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7"
675
 
                    );
676
 
#endif
 
610
      asm volatile ("  movdqu      %0,%%xmm0\n" : :"m" (op.A[0]) : "%xmm0");
 
611
      asm volatile ("  movdqu      %0,%%xmm1\n" : :"m" (op.B[0]) : "%xmm1");
 
612
      asm volatile ("  movdqu      %0,%%xmm2\n" : :"m" (op.A[1]) : "%xmm2");
 
613
      asm volatile ("  movdqu      %0,%%xmm3\n" : :"m" (op.B[1]) : "%xmm3");
 
614
      asm volatile ("  movdqu      %0,%%xmm4\n" : :"m" (op.A[2]) : "%xmm4");
 
615
      asm volatile ("  movdqu      %0,%%xmm5\n" : :"m" (op.B[2]) : "%xmm5");
 
616
      asm volatile ("  movdqu      %0,%%xmm6\n" : :"m" (op.A[3]) : "%xmm6");
 
617
      asm volatile ("  movdqu      %0,%%xmm7\n" : :"m" (op.B[3]) : "%xmm7");
 
618
 
 
619
      asm volatile ("\tmovdqu      %%xmm0,%0\n" : "=m" (op.A[0]));
 
620
      asm volatile ("\tmovdqu      %%xmm1,%0\n" : "=m" (op.B[0]));
 
621
      asm volatile ("\tmovdqu      %%xmm2,%0\n" : "=m" (op.A[1]));
 
622
      asm volatile ("\tmovdqu      %%xmm3,%0\n" : "=m" (op.B[1]));
 
623
      asm volatile ("\tmovdqu      %%xmm4,%0\n" : "=m" (op.A[2]));
 
624
      asm volatile ("\tmovdqu      %%xmm5,%0\n" : "=m" (op.B[2]));
 
625
      asm volatile ("\tmovdqu      %%xmm6,%0\n" : "=m" (op.A[3]));
 
626
      asm volatile ("\tmovdqu      %%xmm7,%0\n" : "=m" (op.B[3]));
677
627
      op.A += 64;
678
628
      op.B += 64;
679
629
    }
680
630
 
681
 
 
682
631
  for (; op.n_pixels >= 4; op.n_pixels -= 4)
683
632
    {
684
633
      asm volatile ("  movdqu      %0,%%xmm2\n"
713
662
                    "\tmovd   %%mm2,%1\n"
714
663
                    : "+m" (*op.A), "+m" (*op.B)
715
664
                    : /* empty */
716
 
                    : "%mm1", "%mm2", "%mm3", "%mm4");
 
665
                    : "%mm3", "%mm4");
717
666
    }
718
667
 
719
668
  asm("emms");