📄 pixman-mmx.c
字号:
s = pix_add_mul (s, da, d, sia); *dest = store8888(s); ++dest; ++src; } _mm_empty();}static FASTCALL voidmmxCombineAtopReverseU (uint32_t *dest, const uint32_t *src, int width){ const uint32_t *end; end = dest + width; while (dest < end) { __m64 s, dia, d, sa; s = load8888(*src); d = load8888(*dest); sa = expand_alpha(s); dia = expand_alpha(d); dia = negate(dia); s = pix_add_mul (s, dia, d, sa); *dest = store8888(s); ++dest; ++src; } _mm_empty();}static FASTCALL voidmmxCombineXorU (uint32_t *dest, const uint32_t *src, int width){ const uint32_t *end = dest + width; while (dest < end) { __m64 s, dia, d, sia; s = load8888(*src); d = load8888(*dest); sia = expand_alpha(s); dia = expand_alpha(d); sia = negate(sia); dia = negate(dia); s = pix_add_mul (s, dia, d, sia); *dest = store8888(s); ++dest; ++src; } _mm_empty();}static FASTCALL voidmmxCombineAddU (uint32_t *dest, const uint32_t *src, int width){ const uint32_t *end = dest + width; while (dest < end) { __m64 s, d; s = load8888(*src); d = load8888(*dest); s = pix_add(s, d); *dest = store8888(s); ++dest; ++src; } _mm_empty();}static FASTCALL voidmmxCombineSaturateU (uint32_t *dest, const uint32_t *src, int width){ const uint32_t *end = dest + width; while (dest < end) { uint32_t s = *src; uint32_t d = *dest; __m64 ms = load8888(s); __m64 md = load8888(d); uint32_t sa = s >> 24; uint32_t da = ~d >> 24; if (sa > da) { __m64 msa = load8888(FbIntDiv(da, sa) << 24); msa = expand_alpha(msa); ms = pix_multiply(ms, msa); } md = pix_add(md, ms); *dest = store8888(md); ++src; ++dest; } _mm_empty();}static FASTCALL voidmmxCombineSrcC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); s = pix_multiply(s, a); *dest = store8888(s); ++src; ++mask; ++dest; } _mm_empty();}static FASTCALL voidmmxCombineOverC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 sa = expand_alpha(s); *dest = store8888(in_over (s, sa, a, d)); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineOverReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); *dest = store8888(over (d, da, in (s, a))); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineInC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); s = pix_multiply(s, a); s = pix_multiply(s, da); *dest = store8888(s); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineInReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 sa = expand_alpha(s); a = pix_multiply(a, sa); d = pix_multiply(d, a); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineOutC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); da = negate(da); s = pix_multiply(s, a); s = pix_multiply(s, da); *dest = store8888(s); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineOutReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 sa = expand_alpha(s); a = pix_multiply(a, sa); a = negate(a); d = pix_multiply(d, a); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineAtopC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); __m64 sa = expand_alpha(s); s = pix_multiply(s, a); a = pix_multiply(a, sa); a = negate(a); d = pix_add_mul (d, a, s, da); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineAtopReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); __m64 sa = expand_alpha(s); s = pix_multiply(s, a); a = pix_multiply(a, sa); da = negate(da); d = pix_add_mul (d, a, s, da); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineXorC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); __m64 sa = expand_alpha(s); s = pix_multiply(s, a); a = pix_multiply(a, sa); da = negate(da); a = negate(a); d = pix_add_mul (d, a, s, da); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineAddC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){ const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); s = pix_multiply(s, a); d = pix_add(s, d); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}voidfbComposeSetupMMX(void){ static pixman_bool_t initialized = FALSE; if (initialized) return; /* check if we have MMX support and initialize accordingly */ if (pixman_have_mmx()) { pixman_composeFunctions.combineU[PIXMAN_OP_OVER] = mmxCombineOverU; pixman_composeFunctions.combineU[PIXMAN_OP_OVER_REVERSE] = mmxCombineOverReverseU; pixman_composeFunctions.combineU[PIXMAN_OP_IN] = mmxCombineInU; pixman_composeFunctions.combineU[PIXMAN_OP_IN_REVERSE] = mmxCombineInReverseU; pixman_composeFunctions.combineU[PIXMAN_OP_OUT] = mmxCombineOutU; pixman_composeFunctions.combineU[PIXMAN_OP_OUT_REVERSE] = mmxCombineOutReverseU; pixman_composeFunctions.combineU[PIXMAN_OP_ATOP] = mmxCombineAtopU; pixman_composeFunctions.combineU[PIXMAN_OP_ATOP_REVERSE] = mmxCombineAtopReverseU; pixman_composeFunctions.combineU[PIXMAN_OP_XOR] = mmxCombineXorU; pixman_composeFunctions.combineU[PIXMAN_OP_ADD] = mmxCombineAddU; pixman_composeFunctions.combineU[PIXMAN_OP_SATURATE] = mmxCombineSaturateU; pixman_composeFunctions.combineC[PIXMAN_OP_SRC] = mmxCombineSrcC; pixman_composeFunctions.combineC[PIXMAN_OP_OVER] = mmxCombineOverC; pixman_composeFunctions.combineC[PIXMAN_OP_OVER_REVERSE] = mmxCombineOverReverseC; pixman_composeFunctions.combineC[PIXMAN_OP_IN] = mmxCombineInC; pixman_composeFunctions.combineC[PIXMAN_OP_IN_REVERSE] = mmxCombineInReverseC; pixman_composeFunctions.combineC[PIXMAN_OP_OUT] = mmxCombineOutC; pixman_composeFunctions.combineC[PIXMAN_OP_OUT_REVERSE] = mmxCombineOutReverseC; pixman_composeFunctions.combineC[PIXMAN_OP_ATOP] = mmxCombineAtopC; pixman_composeFunctions.combineC[PIXMAN_OP_ATOP_REVERSE] = mmxCombineAtopReverseC; pixman_composeFunctions.combineC[PIXMAN_OP_XOR] = mmxCombineXorC; pixman_composeFunctions.combineC[PIXMAN_OP_ADD] = mmxCombineAddC; pixman_composeFunctions.combineMaskU = mmxCombineMaskU; } initialized = TRUE;}/* ------------------ MMX code paths called from fbpict.c ----------------------- */voidfbCompositeSolid_nx8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height){ uint32_t src; uint32_t *dstLine, *dst; uint16_t w; int dstStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); if (src >> 24 == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); while (height--) { dst = dstLine; dstLine += dstStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { *dst = store8888(over(vsrc, vsrca, load8888(*dst))); w--; dst++; } while (w >= 2) { __m64 vdest; __m64 dest0, dest1; vdest = *(__m64 *)dst; dest0 = over(vsrc, vsrca, expand8888(vdest, 0)); dest1 = over(vsrc, vsrca, expand8888(vdest, 1)); *(__m64 *)dst = pack8888(dest0, dest1); dst += 2; w -= 2; } CHECKPOINT(); while (w) { *dst = store8888(over(vsrc, vsrca, load8888(*dst))); w--; dst++; } } _mm_empty();}voidfbCompositeSolid_nx0565mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height){ uint32_t src; uint16_t *dstLine, *dst; uint16_t w; int dstStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); if (src >> 24 == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint16_t, dstStride, dstLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); while (height--) { dst = dstLine; dstLine += dstStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { ullong d = *dst; __m64 vdest = expand565 (M64(d), 0); vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0); *dst = ULLONG(vdest); w--; dst++; } while (w >= 4) { __m64 vdest; vdest = *(__m64 *)dst; vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 0)), vdest, 0); vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 1)), vdest, 1); vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 2)), vdest, 2); vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 3)), vdest, 3); *(__m64 *)dst = vdest; dst += 4; w -= 4; } CHECKPOINT(); while (w) { ullong d = *dst; __m64 vdest = expand565 (M64(d), 0); vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0); *dst = ULLONG(vdest); w--; dst++; } } _mm_empty();}voidfbCompositeSolidMask_nx8888x8888Cmmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height){ uint32_t src, srca; uint32_t *dstLine; uint32_t *maskLine; int dstStride, maskStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); srca = src >> 24; if (srca == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint32_t, maskStride, maskLine, 1); vsrc = load8888(src); vsrca = expand_alpha(vsrc); while (height--) { int twidth = width; uint32_t *p = (uint32_t *)maskLine; uint32_t *q = (uint32_t *)dstLine; while (twidth && (unsigned long)q & 7) { uint32_t m = *(uint32_t *)p; if (m) { __m64 vdest = load8888(*q); vdest = in_over(vsrc, vsrca, load8888(m), vdest); *q = store8888(vdest); } twidth--; p++; q++; } while (twidth >= 2) { uint32_t m0, m1; m0 = *p; m1 = *(p + 1); if (m0 | m1) { __m64 dest0, dest1; __m64 vdest = *(__m64 *)q; dest0 = in_over(vsrc, vsrca, load8888(m0), expand8888 (vdest, 0)); dest1 = in_over(vsrc, vsrca, load8888(m1), expand8888 (vdest, 1)); *(__m64 *)q = pack8888(dest0, dest1); } p += 2; q += 2; twidth -= 2; } while (twidth) { uint32_t m = *(uint32_t *)p; if (m)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -