47→24サイクルに。48→25サイクルに。add16x16_idct_dc。27→19サイクルに。quant_4x4x4を高速化。intra_sad_x3_8x8c。30→22サイクルに。AVX2高ビット深度intra_sad_x3_8x8。43→23サイクルに。30→18サイクルに。高ビット深度intra_sad_x3_4x4を高速化。Bridge上で20→16サイクルに。mc_chroma由来のpmulhrswのトリックを使用し〜7%高速化。trellisを高速化。trellisが〜2%高速に。可能ならスタックを32-byteアラインするように。-mpreferred-stack-boundaryをサポートするコンパイラ上で、手動での配列の32byteアラインメントを不要にする。Windowsにおいてシャドウスペースを活用するように。XMM6とXMM7を頻繁に叩く関数で、それらをシャドウスペースに格納する。この方法によってスタックポインタを頻繁に調整する必要がなくなり、コードサイズと共に命令数を削減できる。CPUでSADの明示的なアラインのバージョンを使用しないようにした。現代的なCPUでは、アラインされたデータ上で使用された場合に、movdquはmovdqaより遅くはなく、両方のケースで同じコードを使うことはキャッシュの節約になる。これは高ビット深度AVX2実装では既に行われていたが、アラインバージョンはデッドコードとして存在してしまうため、それを削除した。前にUtVideoの作者さんがこの辺りに関してツイートしていたような。整数ロードストア命令のベンチマークの記事を教えて頂いたので興味ある方は是非どうぞ。高ビット深度sad_alignedに対して不足していた初期化を追加。JaguarのCPU検出を追加。.rodataの暫定対処を削除。0.8.0で修正されており、そのような古いバージョンを我々はサポートしない。a.outはまともなシステムでは数十年前にELFに取って代わられている。64-bitのサイクルカウンタを使用。いくつかのケースで起こりうるオーバーフローを抑止。スタックアラインメントのバグを修正。incorrect.sliced-threadsでの無効なmemcpyを修正。実際には壊れてはいなかったようだが、src==dstであるmemcpyは不正である。src領域とdst領域が重なる場合の仕様は規格上未定義動作のはず。threadslice.slice-min-mbsとslices-maxの2つのバグを修正。Slices-maxはslice-maxが使われていない場合のslice-max-sizeを壊していた。Slice-min-mbsはthreadsliceの終わり付近で稀に壊れていた。coeff_level_run。coeff_level_runを〜2倍高速化。全体で{superfast,medium,slower}に対しそれぞれ{1%,2%,7%}高速。LUTの(正統でない)トリックを使用。r2287と同じで、CAVLCではほぼ必ず通るパスのため、着実に高速化する。cabac_residual関数。benchasmでadsが〜55%高速化、実際のエンコーディングでは〜15-30%程度。"placebo"プリセットにおいて全体で〜4%高速化。pixel_ssd_nv12_core。AVX2高ビット深度pixel_ssd。pixel_sad_x3で使用されるxmmレジスタの数を削減。AVX2高ビット深度vsad。AVX2高ビット深度pixel_sad。性能に些細な影響があるもののコードサイズを〜10kB削減。AVX2高ビット深度pixel_avg2、get_ref、mc_copy_w16、mc_luma。Windows上でxmm6とxmm7の保存・復元を避けるために、mc_copy_*で使用されるxmmレジスタの数を削減した。レジスタの保存に関することは以前にも書いた気がするのだけれども。多くのCPUでは、普通はCPUメーカーが定める、ABIと呼ばれる決まり事があり、プログラミング言語の種類に関わらず、一般的に守るべきこととされている。そのうちでも例えば、「関数の戻り値はEAXで返すよ」などの関数呼び出しに関するものを、「呼出規約」と呼ぶ。CPUでは、ABIの一部を敢えて守らないことも不可能ではない。各種ライブラリのバイナリとの互換性がなくなるので、道は踏み外さないのが普通だ。歴史あるCISCのx86では、ABIを前提に作られている命令もあるので、実質的に守らざるを得なかったりもする。その呼出規約には、関数を呼ぶ側で、「呼んだら内容が上書きされる可能性がある」レジスタが定められている。上記「関数の戻り値はEAXで返すよ」の規則では、EAXは戻り値に使われるので、当然上書きされる。関数を呼ぶ側が、関数呼び出し前のEAXの内容を、関数呼び出し後も使いたいのなら、それは関数呼び出し前に、メモリ等に別途保存(退避)しておかねばならない。その逆に、関数を呼ぶ側では、退避しておかなくてもよいレジスタも定められている。すると、呼び出される関数は、もしそのレジスタを自関数内で使用したいのであれば、自分でレジスタ上書き前に退避し、レジスタ使用後に復元しなければない。これは当然無駄なメモリアクセスとなり、SIMD化できるようなものでもないので、避けられるなら避けるのが最も効率が良い。nal_escape。関数全体を書きなおし、もう有用ではないAVXバージョンをドロップした。Perl5.010001。