This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Getting ERROR "unknown mnemonics for UQSUB8 instruction"

Hi community,

I have tried to compile the source code for openVG
I have given proper cross compiler which is required by the platform still I am getting the error of unknown mnemonics for the instruction UQSUB8

Environment:

- Linux platform

- CROSS COMPILE tool chain = aarch64-linux-gcc

- ARMv8-a architecture

Code snippet:

for (i = 0; i < 256; ++i) 
        { 
                c = lut[i]; 
                /* Extract alpha and clamp color components */ 
                inva = 0x01010101 * ((~c) & 0xFF); 
                c = _mali_osu_sataddu8(c, inva); 
                cpu_ptr[i] = _mali_osu_satsubu8(c, inva); 
        } 

MALI_STATIC_INLINE u32 _mali_osu_satsubu8(u32 x, u32 y) 
{ 
        u32 retval; 
        __asm__("UQSUB8 %0, %1, %2" 
                : "=r"(retval)      /* output */ 
                : "r"(x), "r"(y)    /* input */ 
               ); 
        return retval; 
}

Can you please suggest me how can I solve this issue?

Thanks,

DP

Parents Reply Children
  • Hi myy,

    I have changed the code as suggested by you to

    MALI_STATIC_INLINE u32 _mali_osu_satsubu8(u32 x, u32 y)

    {

            u32 retval;

            __asm__("UQSUB %V0.S[0], %V1.S[0], %V2.S[0]"

                    : "=r"(retval)    /* output */

                    : "r"(x), "r"(y)    /* input */

                   );

            return retval;

    }

    and I am getting below error:

    error: invalid 'asm': incompatible floating point / vector register operand for '%V'

    Can you please suggest me how can I solve this issue?

    Thanks,

    DP

  • As per my earlier answer, if you have access to the OpenVG source code you must be a licensee, so please raise any questions about building the user-space parts of the Mali driver source for your platform via support@arm.com. We cannot provide support for the proprietary parts of our products on a public forum.

    FWIW I doubt the OpenVG driver will work on ARMv8; it was only ever released officially with ARMv7-A support (at the time it was released ARMv8 didn't even exist).

    Thanks,
    Pete

  • GCC uses 'w' for SIMD registers placeholders.

    So the following asm inline :

    __asm__("UQSUB %0.8b, %1.8b, %2.8b"
            : "=w"(retval)    /* output */
            : "w"(x), "w"(y)    /* input */
           );
    

    Will compile to :

    uqsub    v0.8b, v0.8b, v1.8b

    You can adapt this to your needs.

    However, I do not guarantee that will output the same results as the UQSUB8 mnemonic, as I currently have no experience with NEON and no ARMv8 systems to test it on. I only have a cross-compilling GCC/AS toolset.

    You'll have to write some tests to ensure this, using an ARMv7 system to generate a correct output listing and an ARMv8 system that will run the code and check if the results are identical.

    That said, you should try GCC Godbolt, which is a website providing a quick look at the assembly output of sample C code.