2

q0NEON では、SIMD レジスタ~は float レジスタ~q7と共有されることがわかっています。したがって、以下のコードにはバグがあります。s0s31

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でどうやってそれを行うのですか? 私の一時的な解決策はvolatileonを使用することvertStepLumaです。より良い方法はありますか?ありがとう!

4

2 に答える 2

2

gccインラインアセンブリを使用していますか?次に、clobberlistを使用します。特定のレジスタを使用し、インラインasmブロックの後にgccがそれらのレジスタに値を格納しないことをGCCに通知します。ここを読んでください:http ://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3

それ以外の場合、外部関数が他の場所に実装されている場合、ABIは、q4、q5、q6、およびq7レジスタのみを破損できるように指示します。ARMからCの呼び出し規約、保存するNEONレジスタレジスタを保存する関数を修正します(q0-q3)、または、これらのレジスタを自分で保存する場所でインラインアセンブリを作成します。

于 2012-04-01T05:30:02.987 に答える
0

呼び出し先 (関数) は、上書きする前に Q4 ~ Q7 のみを保存して復元します。つまり、呼び出し元は、他のレジスタが変更されないという保証がないという事実を認識する必要があります。したがって、呼び出し元は、必要に応じて、関数呼び出しの前に Q0 ~ Q3、Q8 ~ Q15 を保持し、戻ったときにそれらを復元する必要があります。(コンパイラはこれを自動的に行います)

于 2012-04-03T02:32:32.313 に答える