C++ ネイティブ コードの ARM アセンブリ コードを見ています。ターゲット プラットフォームは Windows Phone 8、ビルド環境は Visual Studio 2012 です。
ARM アセンブリ コードを調べて、コードを最大限に最適化できる可能性を探しています。
以下のように、ARM コードの命令の 1 つの要件について混乱しています。
C++ コード:
double lmean= kseedsl[n];
アームコード:
1: ldr r3,[sp,#0x4C]
2: ldr r3,[r3] // r3= kseedsl
3: add r2,r3,r6,lsl #3 // r2 = &kseedsl[n] (r6 has value of "n")
4: vldr d13,[r2] // d13 = *(r2)
kseedsl
(関数の入力引数)などの変数のアドレスがスタックに格納されていることは理解しています。しかしldr
、アドレスkseedsl
を r3 にロードするために 2 つ (line1, 2) が必要な理由がわかりません。[sp,#0x4C]
私の知る限り、関数の引数として渡される kseedsl のアドレスを直接保存することを期待していました。
ここで私が見逃していることを親切に指摘してください。私が知らない標準的な概念であることを期待しています。
編集:関数のスケルトンは次のとおりです。
void function_xyz(
vector<double>& kseedsl,
vector<double>& kseedsa,
vector<double>& kseedsb,
vector<int>& kseedsx,
vector<int>& kseedsy,
unsigned short* klabels,
const int& STEP,
const double& M,
int Iter,
int *oMaxSegsize);