# Nyash MIR Instruction Set (Canonical 26 → migrating to Core-15 → Core-14)

Status: Canonical (Source of Truth) — transitioning
Last Updated: 2025-12-27

この文書はNyashのMIR命令セットの唯一の参照（現状は26命令）だよ。Core-15 への段階移行を進めており、さらに Phase 12 で Core-14 へ（PluginInvoke → BoxCall 統合）。安定次第この文書を14命令へ更新し、テスト固定数も切り替える（移行中は26を維持）。

注意: Debug/Nop/Safepointはビルドモードでの降格用メタ命令であり、コア命令数には数えない。
注意: KeepAlive/ReleaseStrong は lifecycle conformance のための命令（weak/hidden-root 対策）であり、Core-14/15 の最小コア数には数えない（ただし backend が実行する “実命令” である）。

Transition Note

- Builder/Rewrite/JIT は既に以下の統合を段階適用中
  - TypeCheck/Cast → TypeOp
  - WeakNew/WeakLoad → WeakRef
  - BarrierRead/BarrierWrite → Barrier
  - Print → ExternCall(env.console.log)（Deprecated）
  - PluginInvoke → BoxCall（Deprecated; 名前/スロット解決はBoxCall側で処理）
- Phase 12（ビルトインBox廃止）での追加統合
  - PluginInvoke → BoxCall 完全統合（ビルトインフォールバックがなくなるため区別不要）
  - VM層でC ABI/Nyash ABI/Scriptプラグインを自動判定
- VM/JIT の代表的な Core-15 カバー手順は `docs/reference/mir/MIR15_COVERAGE_CHECKLIST.md` を参照。
- Core-14 安定後に本ドキュメントの「Core Instructions」を14命令へ更新し、マッピング表を併記する。
- Phase 285–287: lifecycle conformance のため `KeepAlive` / `ReleaseStrong` を追加（語彙の明確化）。

## Core Instructions（26）
- Const
- Copy
- Load
- Store
- UnaryOp
- BinOp
- Compare
- Jump
- Branch
- Phi
- Return
- Call
- ExternCall
- BoxCall
  - Note: BoxCall carries optional `method_id` (numeric slot) when the builder can resolve the receiver type; otherwise falls back to name-only late bind. Universal methods use reserved slots: 0=toString, 1=type, 2=equals, 3=clone.
- NewBox
- ArrayGet
- ArraySet
- RefNew
- RefGet
- RefSet
- Await
- Print（Deprecated: ビルダーは発行しない。代わりに `ExternCall env.console.log` を使用）
- TypeOp（TypeCheck/Cast統合）
- WeakRef（WeakNew/WeakLoad統合）
- Barrier（Read/Write統合）

## Lifecycle (実命令; Core-14/15 のカウント外)

これらは “最適化のための寿命” ではなく、言語の binding scope / explicit drop と weak 観測（`weak_to_strong()`）の整合を保つための命令。

- KeepAlive（PURE）
  - Meaning: 指定された値を、そのスコープ終端まで “生存しているものとして扱う” ための指示（liveness/DCE対策）。
  - Backend: 実行時の処理は no-op でも良いが、解析上は used-values として扱う必要がある。
- ReleaseStrong（WRITE）
  - Meaning: 指定された値が保持している strong root を明示的に落とす（典型: 変数上書き）。
  - Backend: 同一 object を参照する alias（SSA copy 等）も含めて解放対象にできる（実装都合）。

## Core-15（Target; 移行中の最小コア）
- 基本演算(5): Const, UnaryOp, BinOp, Compare, TypeOp
- メモリ(2): Load, Store
- 制御(4): Branch, Jump, Return, Phi
- Box(3): NewBox, BoxCall, PluginInvoke
- 配列(2): ArrayGet, ArraySet
- 外部(1): ExternCall

## Core-14（Phase 12 Target; PluginInvoke統合後）
- 基本演算(5): Const, UnaryOp, BinOp, Compare, TypeOp
- メモリ(2): Load, Store
- 制御(4): Branch, Jump, Return, Phi
- Box(2): NewBox, BoxCall  ← PluginInvokeを吸収
- 配列(2): ArrayGet, ArraySet
- 外部(1): ExternCall

Notes
- Print/Debug/Safepointはメタ/Extern化（Print→ExternCall）。
- WeakRef/Barrier は統合済み（旧WeakNew/WeakLoad/BarrierRead/WriteはRewriteで互換）。
- Call は BoxCall へ集約（PluginInvokeはDeprecated → Phase 12で完全統合）。
- Phase 12: ビルトインBox廃止により、BoxCallとPluginInvokeの区別が不要に。VM層でABI判定。

## Meta (降格対象; カウント外)
- Debug
- Nop
- Safepoint

## 同期ルール
- 命令の追加/削除/統合は、まずこの文書を更新し、次に実装（列挙/Printer/Verifier/Optimizer/VM）を同期。最後に「総数=26」テストを更新する。
- 実装が26を外れた場合はCIを赤にする（設計の合意なく増減させないため）。
