kdnakt blog

hello there.

Rust dojo第89回を開催した

第89回です。前回はこちら。

kdnakt.hatenablog.com

[第89回の様子]

2023/08/23に第89回を開催した。

内容としてはRust By Example 日本語版22. 安全でない操作の「22.1. Inline assembly」のOptionsの続きからはじめて、最後まで取り組んだ。これで、ようやくインラインアセンブリの章が終わった!
参加者は自分を入れて4人。夏休みの人が多かったのかいつもよりはちょっと少なめ。

[学んだこと]

use std::arch::asm;

let mut a: u64 = 4;
let b: u64 = 4;
unsafe {
    asm!(
        "add {0}, {1}",
        inlateout(reg) a, in(reg) b,
        options(pure, nomem, nostack),
    );
}
assert_eq!(a, 8);
  • コードの内容としては4に4を足すだけ
  • 使われているオプションの説明は以下の通り
    • pure:副作用がない。出力は入力にのみ依存する。場合によってはコンパイラオプティマイザがインラインアセンブリの呼び出しを完全に削除して最適化を可能にする。
    • nomem:asmコードがメモリの読み書きをしない。引数として渡されたポインタを介してのみメモリにアクセス可能。
    • nostack:asmコードがデータをスタックにプッシュしない。なので、コンパイラx86-64のレッドゾーン最適化を利用してスタックポインタの調整を回避できる。
  • こうしたオプションを利用することで、コンパイラがうまく最適化できる
    • 場合によっては出力のないasm!ブロックを完全に削除できる
  • 利用可能なオプションの一覧は以下のページにある(rust by exampleのページからのリンクは404になっていた)

doc.rust-lang.org

[まとめ]

モブプログラミングスタイルでRust dojoを開催した。
インラインアセンブリのパートが終わったので、ようやくRust dojoも終わりが見えてきた。

今週のプルリクエストはおやすみ。