RISC-V 量子拡張 (2. カスタム拡張を考える)

RISC-V量子拡張は, 「RiscV.RV32IU」として @k_yamaz 蛙 が提案しています.
(詳しくは, 技術ブログ Qiita に投稿した RISC-Vの量子計算拡張 をご参照ください. )
思いつきなどをメモしていきます.

RISC-Vの 量子計算拡張を考えています.
RISC-Vには custom0 〜 custom3 までの 4つの拡張命令が予め定義されています.
opcode では, custom0 = 0xb, custom1 = 0x2b, custom2 = 0x5b, custom3 = 0x7b が割り当てられています.
量子拡張では, 「1量子ビットのユニタリ演算」「2量子ビットのユニタリ演算」「量子ビットの射影測定」「量子ビットの初期化」「レジスタ間の移動」を追加することを考慮したいです.

拡張命令の検討の前に, レジスタについて考える必要があります. 通常のRV32Iの仕様では 32bit レジスタの個数は32個の x0 から x31 と定義してあり,
それぞれの番号のなかには特殊な役割をもっているレジスタもあります. 例えば, x0 は zero を表すレジスタと決まっている等.
そこで, 同じく量子レジスタも q0 から q32 の32個ある仕様として進めます. また, q0 は qzero を表すレジスタとし, ほかにも今後必要に応じて, 量子レジスタの役割も決めていきます.
当面, 量子レジスタは, 命令が呼ばれる前後で量子状態が保持される “保存レジスタ” としておきます.

さてここで, 拡張命令セットに戻ると, 「量子ビットの初期化」「レジスタ間の移動」は古典命令セットを流用できそうです. (別で検討します. )
つまり, 「1量子ビットのユニタリ演算」「2量子ビットのユニタリ演算」「量子ビットの射影測定」を拡張命令セットの opcode に割り当てることを想定します.

custom1 := 1量子ビット・ユニタリ演算
custom2 := 2量子ビット・ユニタリ演算
custom3 := 量子ビットの射影測定

とおきます. (custom0 は今後の検討で必要になるかもしれません. 今は定義することを考えないで空けておきます. )
この custom1/2/3 の opecode の定義は, toolchain の riscv-binutils/include/opcode/riscv-opc.h にあります.
なお, 同一の情報が riscv-gdb/include/opcode/riscv-opc.h, riscv-qemu/include/disas/riscv-opc.h にもあります. 修正するときには留意しましょう.
この riscv-opc.h には, custom1/2/3 の引数のタイプに応じて, customX_rs1, customX_rs1_rs2, customX_rd, customX_rd_rs1, customX_rd_rs1_rs2 が利用可能となっています.

詳細の検討は更に重ねる必要がありますが, 1量子ビット・ユニタリ演算は custom1_rs1, 2量子ビット・ユニタリ演算は custom2_rs1_rs2, 量子ビット射影測定は custom3_rs1_rs2 (rs2は古典レジスタ)で表せると仮定します.