Я не специалист по сборке, так что это может быть просто.
Если у меня есть инструкция, которая ожидает постоянного значения в качестве параметра, например, так:
VQSHRN.U32 d0,q0,#16
Как я могу заменить #16
со значением в регистре, например r0
? Эта инструкция может даже позволить вам сделать это, но я не нашел документов по этой возможности. Есть ли нормальный способ сделать это?
В случае, если это имеет значение, я пишу сборку ARMv7 и вставляю ее в код c ++. Благодарю.
Как @Michael указал, VQRSHL
это подходящая команда сдвига по регистру здесь — к счастью, право оказывается отрицательным слева. Я бы использовал VDUP
превратить r0
сначала в соответствующий вектор значений сдвига, и VQMOVN
потом для сужения. Все они доступны в качестве встроенных компонентов, чтобы помочь избежать неприятностей, связанных со встроенной сборкой, что-то вроде этого:
vshift = vdupq_n_s32(-shift);
result = vqmovn_u32(vqrshlq_u32(data, vshift));
Других решений пока нет …