Question

I'm starting to learn arm asm. Now I wonder what the last "l" in the instruction vmull.u8 q7, d0, d4 mean? I found the instruction explained here VMUL{cond} and the Condition codes explaining the different conditionals available but as the last "l" in vmull is not in the list I don't understand what it mean.

Was it helpful?

Solution

"Long"

A multiply by two fixed point numbers gives a "long" result of double the length, and therefore requires double the register width to store the results.

So s8 x s8 => s16 result.

This is technically required for any fixed point multiply to store the results with perfect precision, since multiplying two "n" bit numbers requires (2 * n) - 1 bits with the VMULL for signed numbers (2 * n) for unsigned. But sometimes in arithmetic you only operate on smaller integers and you don't care about the upper bits, so you can use VMUL which is faster and requires less registers. Sometimes in signal processing, if you are representing some decimal format (sometimes called "Q" numbers), for example Q15 using 16 bit signed numbers (s16), then you actually don't need the lower bits, and NEON provides this too with VQDMLH. No matter what you need, NEON can do it.

OTHER TIPS

The optional condition code mostly applies to Thumb mode. In ARM mode, the only conditionally executable NEON instructions are those shared with VFP. (VLDM for example)

Apparently you are reading the latest version of ARM's NEON guide (5.03)

For some unknown reasons, it's missing all those long, wide, and narrow variants which is very important IMO. Grab an eariler version wherer all variants are listed.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top