From: Frederic Plourde Date: Thu, 13 Mar 2008 21:24:08 +0000 (-0700) Subject: Enable/fix MMX compilation under Win32 with Visual Studio X-Git-Tag: pixman-0.10.0~25 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ddfb69ae8778ac4b3050ddebf499c137ad6eef7b;p=platform%2Fupstream%2Fpixman.git Enable/fix MMX compilation under Win32 with Visual Studio --- diff --git a/pixman/Makefile.win32 b/pixman/Makefile.win32 index e0a1828..68aba4b 100644 --- a/pixman/Makefile.win32 +++ b/pixman/Makefile.win32 @@ -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 diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c index 23835e4..b0e58bb 100644 --- a/pixman/pixman-mmx.c +++ b/pixman/pixman-mmx.c @@ -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);