Hello,
I have written a code in kernel c, while compiling I'm getting below error,
>> Compilation failure
subdir_rules.mk:7: recipe for target 'deinterleave.obj' failed
error:
VCOP register allocation failed.
Please restructure and/or hand-allocate the kernel function.
Please find attched file is having kernelC code.
#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);
}
}
}
Kindly suggest to solve this issue.
Regards,
Kajal