私はApressのModern x86 Assembly言語の本を読んでいます。 64ビットSSEの例をプログラミングするために、著者はを16のアラインメントをコードの特定のポイントに置きます。例えば説明のためにSSEアラインメントに16を使用する理由と場所は?
.code
ImageUint8ToFloat_ proc frame
_CreateFrame U2F_,0,64 ; helper macros to create prolog
_SaveXmmRegs xmm10,xmm11,xmm12,xmm13 ; helper macros to create prolog
_EndProlog ; helper macros to create prolog
...
shrd r8d,
pxor xmm5,xmm5
align 16 ; Why this is here ?
@@:
movdqa xmm0,xmmword ptr [rdx]
movdqa xmm10,xmmword ptr [rdx+16]
movdqa xmm2,xmm0
punpcklbw xmm0,xmm5
punpckhbw xmm2,xmm5
movdqa xmm1,xmm0
movdqa xmm3,xmm2
...
著者は指示自体が整列するように、私たちはSSEを使用しているので、ALIGN 16を置くことが必要である説明しています。それはいいです。私の質問は、著者がを16とその特定の場所に配置することを選択した理由です。プログラマとして、正しい場所をどのように決定する必要がありますかを整列させますか?なぜ、早くも遅くもないのですか?
実際にはあまり意味がありません.SSE *データ*は、通常、16バイト境界に合わせる必要がありますが、指示はありません。 –
おそらくあなたは正しいです。私は間違っているかもしれません。私はこのセクションを再度読んで、「パフォーマンスクリティカルなループ内のブランチターゲットを16バイトの境界に整列させます。\t境界です。」SSEではないというのは本当の理由だと思います。それはジャンプターゲットです。 –