参照元†
FIXME: なにをするもの?
- RTL に関連する変数や定義を行う際に、
rtl.def と DEF_RTL_EXPR マクロを用いたお作法がある。
関連モジュール†
- RTL のオペランド
- オペランドの中身は rtx_def.u.fld[] で参照できるが、union 型なので、整数として解釈するのか、RTX として解釈するのか、知る必要がある。
- いくつオペランドを持っているかは、RTL の定義の FORMAT を見ればわかる。
例えば insn なら format は "uuBeiie" なので、7個持っている。
- オペランドの型を知る方法は GET_RTX_FORMAT() にて解説している。オペランドの型の情報は rtx_format が保持している。
insn 関連†
- insn の UID と前後の命令
- insn は UID という通し番号を持っている。参照は INSN_UID() でできる。
デバッガで見るなら rtx->u2.insn_uid で参照すると早い。
- gcc-8.3/gcc/INSN_UID()
- insn の format は "uuBeiie" で、最初の uu は自身の前の命令、自身の後の命令を指しているようだ。
オペランド型 'u' は RTX として解釈すれば良いようなので、
デバッガなどで rtx->u.fld[0].rt_rtx.u2.insn_uid で参照すると 1つ前の命令の UID が見える。
- オペランドから命令を選択する仕組み
- パス vreg で行う、insn の 5番目のオペランド、つまり "uuBei'i'e" の部分を -1 から適切な値に書き換える
- 値はアーキテクチャによって違う、riscv32 なら 141 は movdf_hardfloat_rv32 になる。
- 命令を選択する関数は extract_insn() で、心臓部は recog() という関数
コメント†