連載1 高速なメモリーコピー その5
パターン | アライメントの状態 | 処理 |
パターン1 | コピー元とコピー先共にアライメントが揃っている。 例) コピー元:0x11111110 コピー先:0x22222220 | 前回のssememcpy1()を使う。 |
パターン2 | コピー元とコピー先共にアライメントが揃っていないが、ズレている量が同じ。 例) コピー元:0x11111115 コピー先:0x22222225 | ズレている量を端数としmemcpy()で処理、その後はパターン1と同じssememcpy1()を使う。 |
パターン3 | コピー元とコピー先のズレ量が異なる。 例) コピー元:0x11111115 コピー先:0x22222229 | 汎用レジスターを使ってズレ量を吸収する。 |
今回からアライメントの“ズレ“と言う表現がでてきます。このズレとはアライメントからどれだけズレているかを示しますが具体的にはアドレスの下位4bitで判断し、下位4bitが同じ場合はズレ量が同じと見なします。パターン1は前回紹介したので、今回はパターン2です。
例の様にコピー元とコピー先のアドレスのうち下位4bitが2進数で0101(16進で5)と同じ場合がパターン2となり、この場合は最初の11バイトだけをmemcpy()を使って処理することで、残りは0x11111120から0x22222230へコピーする処理となります。残った部分はアライメントが揃っているのでパターン1と同様にssememcpy1()が使えます
続く...
- 関連記事
trackback
コメントの投稿