assembly

[1/1]

  1. x86 アーキテクチャと Rust-embedded ランタイム: ベアメタル環境でのスタック初期化
    スタックは、関数呼び出しやローカル変数の保存に使用されるメモリ領域です。関数を実行するたびに、スタックに新しいフレームが作成されます。このフレームには、関数の引数、ローカル変数、および呼び出し元のスタック ポインタが含まれます。スタック ポインタは、スタック内の現在アクティブなフレームを指すレジスタです。新しいフレームを作成すると、スタック ポインタは新しいフレームのアドレスを指すように更新されます。関数から返ると、スタック ポインタは前のフレームを指すように更新されます。
  2. C++、アセンブリ、および最適化における SIMD を使用したセパレータ位置より上のバイトをマスクする最も速い方法
    セパレータ位置より上のバイトをマスクする必要がある状況は多数あります。 例えば、文字列処理において、文字列の長さを特定するためにnull文字を探す必要がある場合があります。 この場合、SIMD 命令を使用して、効率的にバイトをマスクし、処理速度を向上させることができます。
  3. C++で32ビットループカウンタを64ビットに置き換えると、Intel CPUで_mm_popcnt_u64のパフォーマンスが異常になる問題
    この現象は、Sandy Bridge、Ivy Bridge、Haswell世代のIntel CPUで顕著にみられます。具体的には、ループカウンタを unsigned int 型から std::uint64_t 型に変更すると、パフォーマンスが半分近くになるケースがあります。
  4. 浮動小数点数の乗算における最適化:GCCはなぜa*a*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのか?
    GCCコンパイラは、多くの場合、コードを高速化するために様々な最適化を実行します。しかし、a*a*a*a*a*a のような浮動小数点数の乗算式に対しては、(a*a*a)*(a*a*a) のように最適化しないことがあります。その理由は、浮動小数点数の演算における精度誤差の可能性です。