続 vorbisencとbcc32
どうもalloca()前後のコードがおかしい感じです。
↓C++BuilderのCPUウィンドウからのコピペです。
mapping0.c.614: sortindex[i]=alloca(sizeof(**sortindex)*n/2); 00430A26 6A00 push $00 00430A28 8B55C8 mov edx,[ebp-$38] 00430A2B C1E202 shl edx,$02 00430A2E D1EA shr edx,1 00430A30 52 push edx 00430A31 E8CC240500 call $00482f02 00430A36 59 pop ecx 00430A37 8B8DE0FEFFFF mov ecx,[ebp-$00000120] 00430A3D 8B45C0 mov eax,[ebp-$40] 00430A40 890481 mov [ecx+eax*4],eax
「ebp-$40」はi、つまりループカウンタです。
最後のmovはalloca()の結果をsortindex[i]に代入しているつもりなんでしょうが、直前のmovでiの値に書き換えられています。これでは、
alloca(sizeof(**sortindex)*n/2); sortindex[i]=i;
という意味になってしまいます。駄目元で、
void* tmp = alloca(sizeof(**sortindex)*n/2); sortindex[i]=tmp;
と書き換えたところ、とりあえず(ここは)動きました。最適化の設定如何によっては動かないかもしれません。
というわけで、どうも原因はコンパイラのバグっぽいです。