#define VCOP_2SIMD_WIDTH (VCOP_SIMD_WIDTH*2) #define ELEMSZ sizeof(*inptr) #define VECTORSZ (VCOP_2SIMD_WIDTH*ELEMSZ) #define ELEMSZ_OUT sizeof(*outptr) #define VECTORSZ_OUT (VCOP_2SIMD_WIDTH * ELEMSZ_OUT) void vcop_deinterleave( __vptr_uint8 inptr, __vptr_uint8 outptr, int width, int height) { __vector magTopRowOdd, magTopRowEven; __vector magTopRowOddPlus2, magTopRowEvenPlus2; __vector magMidRowOdd, magMidRowEven; __vector magMidRowOddPlus2, magMidRowEvenPlus2; __vector magBotRowOdd, magBotRowEven; __vector magBotRowOddPlus2, magBotRowEvenPlus2; __vector VcenterPixelEven, VcenterPixelOdd; __vector VRightCenEvenFlag, VRightCenOddFlag, VTopCenEvenFlag, VTopCenOddFlag; __vector VBottomCenEvenFlag, VBottomCenOddFlag, VLeftCenEvenFlag, VLeftCenOddFlag; __vector VTopLeftEvenFlag, VTopLeftOddFlag, VBottomRightEvenFlag, VBottomRightOddFlag; __vector VBottomLeftEvenFlag, VBottomLeftOddFlag, VTopRightEvenFlag, VTopRightOddFlag; __vector VcenFlagEven, VcenFlagOdd; __vector VEdge, VPossibleEdge;//, VK; //__vector t1, t2, t3, t4; VEdge = 255; VPossibleEdge = 128; // VK=1; for (int row = 0; row < height; row++) { for (int col = 0; col < width/VCOP_2SIMD_WIDTH; col++) { __agen addrIn; addrIn = row * width * ELEMSZ + col * VECTORSZ ; (magTopRowOdd , magTopRowEven) = (inptr)[addrIn].deinterleave(); (magTopRowOddPlus2 , magTopRowEvenPlus2) = (inptr + ELEMSZ * 2)[addrIn].deinterleave(); (magMidRowOdd , magMidRowEven) = (inptr + width * ELEMSZ)[addrIn].deinterleave(); (magMidRowOddPlus2, magMidRowEvenPlus2) = (inptr + width * ELEMSZ + ELEMSZ * 2)[addrIn].deinterleave(); (magBotRowOdd , magBotRowEven) = (inptr + 2 * width * ELEMSZ* 1)[addrIn].deinterleave(); (magBotRowOddPlus2, magBotRowEvenPlus2) = (inptr + 2 * width * ELEMSZ + ELEMSZ * 2)[addrIn].deinterleave(); VcenterPixelEven = magMidRowEven; VcenterPixelOdd = magMidRowOddPlus2; //t3 = VcenterPixelEven; //t4 = VcenterPixelOdd; //center pixel VcenFlagEven = (VcenterPixelEven == VPossibleEdge); VcenFlagOdd = (VcenterPixelOdd == VPossibleEdge); //LC VLeftCenEvenFlag = (magMidRowEven == VEdge); VLeftCenOddFlag = (magMidRowOdd == VEdge); //TL VTopLeftEvenFlag = (magTopRowEven == VEdge); VTopLeftOddFlag = (magTopRowOdd == VEdge); //BL VBottomLeftEvenFlag = (magBotRowEven == VEdge); VBottomLeftOddFlag = (magBotRowOdd == VEdge); ////1st col VBottomLeftEvenFlag |= VLeftCenEvenFlag | VTopLeftEvenFlag ; /////// VBottomLeftOddFlag |= VLeftCenOddFlag | VTopLeftOddFlag; /////// //RC VRightCenEvenFlag = (magMidRowEvenPlus2 == VEdge); VRightCenOddFlag = (magMidRowOddPlus2 == VEdge); //BR VBottomRightEvenFlag = (magBotRowEvenPlus2 == VEdge); VBottomRightOddFlag = (magBotRowOddPlus2 == VEdge); //TR VTopRightEvenFlag = (magTopRowEvenPlus2 == VEdge); VTopRightOddFlag = (magTopRowOddPlus2 == VEdge); //3rd col VTopRightEvenFlag |= VRightCenEvenFlag | VBottomRightEvenFlag ;/////// VTopRightOddFlag |= VRightCenOddFlag | VBottomRightOddFlag ; /////// //BC VBottomCenEvenFlag = (magBotRowEven == VEdge); VBottomCenOddFlag = (magBotRowOddPlus2 == VEdge); //TC VTopCenEvenFlag = (magTopRowEven == VEdge); VTopCenOddFlag = (magTopRowOddPlus2 == VEdge); VTopCenEvenFlag = VBottomCenEvenFlag | VTopCenEvenFlag ; /////// VTopCenOddFlag = VBottomCenOddFlag | VTopCenOddFlag ; /////// VTopCenEvenFlag |= VBottomLeftEvenFlag | VTopRightEvenFlag ; VTopCenOddFlag |= VBottomLeftOddFlag | VTopRightOddFlag ; //Now check with center pixel VTopCenEvenFlag = VcenFlagEven & VTopCenEvenFlag ; VTopCenOddFlag = VcenFlagOdd & VTopCenOddFlag ; VcenterPixelEven = select(VTopCenEvenFlag, VEdge, VcenterPixelEven); VcenterPixelOdd = select(VTopCenOddFlag, VEdge, VcenterPixelOdd); (inptr + width * ELEMSZ + ELEMSZ * 1)[addrIn].interleave() = (VcenterPixelEven,VcenterPixelOdd); } } }