Есть ли что-то вроде "emms" на NEON? - PullRequest
2 голосов
/ 01 апреля 2012

Мы знаем, что в NEON SIMD-регистры q0 ~ q7 используются совместно с плавающими регистрами s0 ~ s31.Поэтому в приведенном ниже коде есть ошибка:

float_t fRatio = (float_t)srcWidth/dstWidth;

// NEON asm modified q0~q7
MyNeonFunctionPtr1(pData, Stride, (int32_t)(fHorRatio*m_iHorScale));

//  following sentence use wrong "fHorRatio", 
//  which is modified by "MyNeonFunctionPtr1"; 

int32_t vertStepLuma = (int32_t)(fHorRatio*m_iVertScale);

В x86 emms может ее решить.Но как мне это сделать на NEON?Мое временное решение - использовать volatile на vertStepLuma.Есть ли способ лучше?Спасибо!

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Вы используете встроенную сборку gcc? Тогда используйте список клоббера. Вы сообщаете GCC, что будете использовать определенные регистры, и gcc не будет хранить в них значения после встроенного блока asm. Читайте здесь: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3

В противном случае, если это внешняя функция, реализованная в другом месте, то ABI требует, чтобы вам разрешалось повреждать только регистры q4, q5, q6 и q7: Соглашение о вызовах ARM к C, регистры NEON для сохранения Исправление функции чтобы сохранить регистры (q0-q3) или сделать встроенную сборку вокруг него, где вы сами сохраните эти регистры.

0 голосов
/ 03 апреля 2012

Хорошо, вызываемый (функция) должен сохранить только Q4-Q7 до перезаписи и восстановить их, что означает, что вызывающий должен знать о том факте, что нет никаких гарантий, что другие регистры останутся нетронутыми.Поэтому вызывающий должен - если необходимо - сохранить Q0-Q3, Q8-Q15 до вызова функции и восстановить их по возвращении.(Компиляторы делают это автоматически)

...