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
  • 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.

Reply
  • 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.

Children
No data