Enable/fix MMX compilation under Win32 with Visual Studio
authorFrederic Plourde <frederic.plourde@polymtl.ca>
Thu, 13 Mar 2008 21:24:08 +0000 (14:24 -0700)
committerVladimir Vukicevic <vladimir@h-232.office.mozilla.org>
Thu, 13 Mar 2008 21:24:08 +0000 (14:24 -0700)
pixman/Makefile.win32
pixman/pixman-mmx.c

index e0a1828..68aba4b 100644 (file)
@@ -1,31 +1,86 @@
-LIBRARY = pixman-1
+LIBRARY     = pixman-1
 
-CC = cl
+CC   = cl
 LINK = link
 
-CFLAGS = -MD -Zi -nologo -O2 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -I../pixman/src -I. -DPACKAGE=$(LIBRARY) -DPACKAGE_VERSION="" -DPACKAGE_BUGREPORT=""
+ifeq ($(CFG),)
+CFG=release
+endif
+
+ifeq ($(MMX),)
+MMX=1
+endif
+
+CFLAGS     = -MD -nologo -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -I../pixman/src -I. -DPACKAGE=$(LIBRARY) -DPACKAGE_VERSION="" -DPACKAGE_BUGREPORT=""
+MMX_CFLAGS = -DUSE_MMX -w14710 -w14714
+
+# optimization flags
+ifeq ($(CFG),debug)
+CFLAGS += -Od -Zi
+else
+CFLAGS += -O2
+endif
 
 SOURCES = \
-       pixman-region.c         \
-       pixman-image.c          \
-       pixman-compose.c        \
+       pixman-region.c                         \
+       pixman-image.c                                  \
+       pixman-compose.c                                \
        pixman-compose-accessors.c      \
-       pixman-pict.c           \
-       pixman-utils.c          \
-       pixman-edge.c           \
+       pixman-pict.c                                   \
+       pixman-utils.c                                  \
+       pixman-edge.c                                   \
        pixman-edge-accessors.c         \
-       pixman-trap.c           \
-       pixman-compute-region.c \
-       pixman-timer.c          \
+       pixman-trap.c                                   \
+       pixman-compute-region.c         \
+       pixman-timer.c                                  \
        $(NULL)
 
-OBJECTS = $(subst .c,.obj,$(SOURCES))
+# MMX compilation flags
+ifeq ($(MMX),1)
+CFLAGS += $(MMX_CFLAGS)
+SOURCES += pixman-mmx.c
+endif
+
+OBJECTS     = $(patsubst %.c, $(CFG)/%.obj, $(SOURCES))
+
+# targets
+all: inform informMMX $(CFG)/$(LIBRARY).lib
+       @exit 0
+clean: inform clean_r 
+       @exit 0
+pixman: inform informMMX $(CFG)/$(LIBRARY).lib 
+       @exit 0
+
+inform:
+ifneq ($(CFG),release)
+ifneq ($(CFG),debug)
+       @echo "Invalid specified configuration option : "$(CFG)"."
+       @echo
+       @echo -n "Possible choices for configuration are "
+       @echo "'release' and 'debug'"
+       @echo ""
+       @exit 1
+endif
+endif
+
+informMMX:
+ifneq ($(MMX),0)
+ifneq ($(MMX),1)
+       @echo "Invalid specified MMX option : "$(MMX)"."
+       @echo
+       @echo -n "Possible choices for MMX are 0 or 1"
+       @echo ""
+       @exit 1
+endif
+endif
 
-%.obj: %.c
+# pixman compilation and linking
+$(CFG)/%.obj: %.c
+       @mkdir -p $(CFG)
        @$(CC) -c $(CFLAGS) -Fo"$@" $<
 
-$(LIBRARY).lib: $(OBJECTS)
-       lib -NOLOGO -OUT:$@ $(OBJECTS)
+$(CFG)/$(LIBRARY).lib: $(OBJECTS)
+       lib -NOLOGO -OUT:$@ $(OBJECTS) || exit 0
 
-clean:
-       @rm -f *.obj *.lib *.pdb *.ilk || exit 0
+clean_r:
+       @rm -f $(CFG)/*.obj $(CFG)/*.lib $(CFG)/*.pdb $(CFG)/*.ilk || exit 0
index 23835e4..b0e58bb 100644 (file)
@@ -156,6 +156,36 @@ static const MMXData c =
 #endif
 
 static inline __m64
+M64 (ullong x)
+{
+#ifdef __GNUC__
+    return (__m64)x;
+#endif
+
+#ifdef _MSC_VER
+    __m64 res;
+    
+    res.m64_u64 = x;
+    return res;
+#endif
+}
+
+static inline ullong
+ULLONG (__m64 x)
+{
+#ifdef __GNUC__
+    return (ullong)x;
+#endif
+
+#ifdef _MSC_VER
+    ullong res;
+
+    res = x.m64_u64;
+    return res;
+#endif
+}
+
+static inline __m64
 shift (__m64 v, int s)
 {
     if (s > 0)
@@ -1040,9 +1070,9 @@ fbCompositeSolid_nx0565mmx (pixman_op_t op,
        while (w && (unsigned long)dst & 7)
        {
            ullong d = *dst;
-           __m64 vdest = expand565 ((__m64)d, 0);
+           __m64 vdest = expand565 (M64(d), 0);
            vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0);
-           *dst = (ullong)vdest;
+           *dst = ULLONG(vdest);
 
            w--;
            dst++;
@@ -1070,9 +1100,9 @@ fbCompositeSolid_nx0565mmx (pixman_op_t op,
        while (w)
        {
            ullong d = *dst;
-           __m64 vdest = expand565 ((__m64)d, 0);
+           __m64 vdest = expand565 (M64(d), 0);
            vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0);
-           *dst = (ullong)vdest;
+           *dst = ULLONG(vdest);
 
            w--;
            dst++;
@@ -1498,11 +1528,11 @@ fbCompositeSrc_8888x0565mmx (pixman_op_t op,
        {
            __m64 vsrc = load8888 (*src);
            ullong d = *dst;
-           __m64 vdest = expand565 ((__m64)d, 0);
+           __m64 vdest = expand565 (M64(d), 0);
 
            vdest = pack565(over(vsrc, expand_alpha(vsrc), vdest), vdest, 0);
 
-           *dst = (ullong)vdest;
+           *dst = ULLONG(vdest);
 
            w--;
            dst++;
@@ -1541,11 +1571,11 @@ fbCompositeSrc_8888x0565mmx (pixman_op_t op,
        {
            __m64 vsrc = load8888 (*src);
            ullong d = *dst;
-           __m64 vdest = expand565 ((__m64)d, 0);
+           __m64 vdest = expand565 (M64(d), 0);
 
            vdest = pack565(over(vsrc, expand_alpha(vsrc), vdest), vdest, 0);
 
-           *dst = (ullong)vdest;
+           *dst = ULLONG(vdest);
 
            w--;
            dst++;
@@ -1610,7 +1640,7 @@ fbCompositeSolidMask_nx8x8888mmx (pixman_op_t op,
 
            if (m)
            {
-               __m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), load8888(*dst));
+               __m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev (M64(m)), load8888(*dst));
                *dst = store8888(vdest);
            }
 
@@ -1638,8 +1668,8 @@ fbCompositeSolidMask_nx8x8888mmx (pixman_op_t op,
 
                vdest = *(__m64 *)dst;
 
-               dest0 = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m0), expand8888(vdest, 0));
-               dest1 = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m1), expand8888(vdest, 1));
+               dest0 = in_over(vsrc, vsrca, expand_alpha_rev (M64(m0)), expand8888(vdest, 0));
+               dest1 = in_over(vsrc, vsrca, expand_alpha_rev (M64(m1)), expand8888(vdest, 1));
 
                *(__m64 *)dst = pack8888(dest0, dest1);
            }
@@ -1658,7 +1688,7 @@ fbCompositeSolidMask_nx8x8888mmx (pixman_op_t op,
            if (m)
            {
                __m64 vdest = load8888(*dst);
-               vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), vdest);
+               vdest = in_over(vsrc, vsrca, expand_alpha_rev (M64(m)), vdest);
                *dst = store8888(vdest);
            }
 
@@ -1711,7 +1741,7 @@ pixman_fill_mmx (uint32_t *bits,
     }
 
     fill = ((ullong)xor << 32) | xor;
-    vfill = (__m64)fill;
+    vfill = M64(fill);
 
 #ifdef __GNUC__
     __asm__ (
@@ -1857,7 +1887,7 @@ fbCompositeSolidMaskSrc_nx8x8888mmx (pixman_op_t op,
 
            if (m)
            {
-               __m64 vdest = in(vsrc, expand_alpha_rev ((__m64)m));
+               __m64 vdest = in(vsrc, expand_alpha_rev (M64(m)));
                *dst = store8888(vdest);
            }
            else
@@ -1889,8 +1919,8 @@ fbCompositeSolidMaskSrc_nx8x8888mmx (pixman_op_t op,
 
                vdest = *(__m64 *)dst;
 
-               dest0 = in(vsrc, expand_alpha_rev ((__m64)m0));
-               dest1 = in(vsrc, expand_alpha_rev ((__m64)m1));
+               dest0 = in(vsrc, expand_alpha_rev (M64(m0)));
+               dest1 = in(vsrc, expand_alpha_rev (M64(m1)));
 
                *(__m64 *)dst = pack8888(dest0, dest1);
            }
@@ -1913,7 +1943,7 @@ fbCompositeSolidMaskSrc_nx8x8888mmx (pixman_op_t op,
            if (m)
            {
                __m64 vdest = load8888(*dst);
-               vdest = in(vsrc, expand_alpha_rev ((__m64)m));
+               vdest = in(vsrc, expand_alpha_rev (M64(m)));
                *dst = store8888(vdest);
            }
            else
@@ -1949,7 +1979,7 @@ fbCompositeSolidMask_nx8x0565mmx (pixman_op_t op,
     uint8_t    *maskLine, *mask;
     int        dstStride, maskStride;
     uint16_t   w;
-    __m64      vsrc, vsrca;
+    __m64      vsrc, vsrca, tmp;
     unsigned long long srcsrcsrcsrc, src16;
 
     CHECKPOINT();
@@ -1966,7 +1996,8 @@ fbCompositeSolidMask_nx8x0565mmx (pixman_op_t op,
     vsrc = load8888 (src);
     vsrca = expand_alpha (vsrc);
 
-    src16 = (ullong)pack565(vsrc, _mm_setzero_si64(), 0);
+    tmp = pack565(vsrc, _mm_setzero_si64(), 0);
+    src16 = ULLONG(tmp);
 
     srcsrcsrcsrc = (ullong)src16 << 48 | (ullong)src16 << 32 |
        (ullong)src16 << 16 | (ullong)src16;
@@ -1988,9 +2019,10 @@ fbCompositeSolidMask_nx8x0565mmx (pixman_op_t op,
            if (m)
            {
                ullong d = *dst;
-               __m64 vd = (__m64)d;
-               __m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), expand565(vd, 0));
-               *dst = (ullong)pack565(vdest, _mm_setzero_si64(), 0);
+               __m64 vd = M64(d);
+               __m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev (M64 (m)), expand565(vd, 0));
+               vd = pack565(vdest, _mm_setzero_si64(), 0);
+               *dst = ULLONG(vd);
            }
 
            w--;
@@ -2019,13 +2051,13 @@ fbCompositeSolidMask_nx8x0565mmx (pixman_op_t op,
 
                vdest = *(__m64 *)dst;
 
-               vm0 = (__m64)m0;
+               vm0 = M64(m0);
                vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm0), expand565(vdest, 0)), vdest, 0);
-               vm1 = (__m64)m1;
+               vm1 = M64(m1);
                vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm1), expand565(vdest, 1)), vdest, 1);
-               vm2 = (__m64)m2;
+               vm2 = M64(m2);
                vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm2), expand565(vdest, 2)), vdest, 2);
-               vm3 = (__m64)m3;
+               vm3 = M64(m3);
                vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm3), expand565(vdest, 3)), vdest, 3);
 
                *(__m64 *)dst = vdest;
@@ -2045,9 +2077,10 @@ fbCompositeSolidMask_nx8x0565mmx (pixman_op_t op,
            if (m)
            {
                ullong d = *dst;
-               __m64 vd = (__m64)d;
-               __m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), expand565(vd, 0));
-               *dst = (ullong)pack565(vdest, _mm_setzero_si64(), 0);
+               __m64 vd = M64(d);
+               __m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev (M64(m)), expand565(vd, 0));
+               vd = pack565(vdest, _mm_setzero_si64(), 0);
+               *dst = ULLONG(vd);
            }
 
            w--;
@@ -2102,11 +2135,11 @@ fbCompositeSrc_8888RevNPx0565mmx (pixman_op_t op,
        {
            __m64 vsrc = load8888 (*src);
            ullong d = *dst;
-           __m64 vdest = expand565 ((__m64)d, 0);
+           __m64 vdest = expand565 (M64(d), 0);
 
            vdest = pack565(over_rev_non_pre(vsrc, vdest), vdest, 0);
 
-           *dst = (ullong)vdest;
+           *dst = ULLONG(vdest);
 
            w--;
            dst++;
@@ -2163,11 +2196,11 @@ fbCompositeSrc_8888RevNPx0565mmx (pixman_op_t op,
        {
            __m64 vsrc = load8888 (*src);
            ullong d = *dst;
-           __m64 vdest = expand565 ((__m64)d, 0);
+           __m64 vdest = expand565 (M64(d), 0);
 
            vdest = pack565(over_rev_non_pre(vsrc, vdest), vdest, 0);
 
-           *dst = (ullong)vdest;
+           *dst = ULLONG(vdest);
 
            w--;
            dst++;
@@ -2326,9 +2359,9 @@ fbCompositeSolidMask_nx8888x0565Cmmx (pixman_op_t op,
            if (m)
            {
                ullong d = *q;
-               __m64 vdest = expand565 ((__m64)d, 0);
+               __m64 vdest = expand565 (M64(d), 0);
                vdest = pack565 (in_over (vsrc, vsrca, load8888 (m), vdest), vdest, 0);
-               *q = (ullong)vdest;
+               *q = ULLONG(vdest);
            }
 
            twidth--;
@@ -2369,9 +2402,9 @@ fbCompositeSolidMask_nx8888x0565Cmmx (pixman_op_t op,
            if (m)
            {
                ullong d = *q;
-               __m64 vdest = expand565((__m64)d, 0);
+               __m64 vdest = expand565(M64(d), 0);
                vdest = pack565 (in_over(vsrc, vsrca, load8888(m), vdest), vdest, 0);
-               *q = (ullong)vdest;
+               *q = ULLONG(vdest);
            }
 
            twidth--;
@@ -2698,6 +2731,7 @@ fbCompositeSrcAdd_8888x8888mmx (pixman_op_t       op,
                                uint16_t     width,
                                uint16_t     height)
 {
+    __m64 dst64;
     uint32_t   *dstLine, *dst;
     uint32_t   *srcLine, *src;
     int        dstStride, srcStride;
@@ -2727,7 +2761,8 @@ fbCompositeSrcAdd_8888x8888mmx (pixman_op_t       op,
 
        while (w >= 2)
        {
-           *(ullong*)dst = (ullong) _mm_adds_pu8(*(__m64*)src, *(__m64*)dst);
+           dst64 = _mm_adds_pu8(*(__m64*)src, *(__m64*)dst);
+           *(ullong*)dst = ULLONG(dst64);
            dst += 2;
            src += 2;
            w -= 2;
@@ -2953,7 +2988,7 @@ fbCompositeOver_x888x8x8888mmx (pixman_op_t      op,
                else
                {
                    __m64 sa = expand_alpha (s);
-                   __m64 vm = expand_alpha_rev ((__m64)m);
+                   __m64 vm = expand_alpha_rev (M64(m));
                    __m64 vdest = in_over(s, sa, vm, load8888 (*dst));
 
                    *dst = store8888 (vdest);