This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

EVE/Kernel C:- "VCOP register allocation failed" error while compiling



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