Question

I'm not an expert with assembly so this may be simple.

If I have an instruction that expects a constant value as a parameter like so:

VQSHRN.U32 d0,q0,#16

How can I replace #16 with a value in a register, eg r0? This instruction may even allow you to do so, but I haven't found docs on that capability. Is there a normal method of doing this?

In case this matters, I'm writing ARMv7 assembly and putting it inline with c++ code. Thanks.

Was it helpful?

Solution

As @Michael pointed out, VQRSHL is the appropriate shift-by-register instruction here - fortunately, right happens to be negative left. I'd use a VDUP to turn r0 into an appropriate vector of shift values first, and a VQMOVN afterwards for the narrowing. All of these are available as intrinsics to help keep the nastiness of inline assembly at bay, something like this:

vshift = vdupq_n_s32(-shift);
result = vqmovn_u32(vqrshlq_u32(data, vshift));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top