*参照元 [#x7ba8097]
#backlinks

*説明 [#hd7dc067]
FIXME: なにをするもの?

-とぴっく
--解説

-RTL をダンプする関数
--[[gcc-8.3/gcc/print_rtl()]]
--[[gcc-8.3/gcc/rtx_writer/print_rtx()]]

-RTL のデータ構造
--[[gcc-8.3/gcc/rtx_def]]

-RTL の定義
--RTL に関連する変数や定義を行う際に、rtl.def と DEF_RTL_EXPR マクロを用いたお作法がある。
--[[gcc-8.3/gcc/DEF_RTL_EXPR()]]

-RTL の種類
--code メンバが保持している整数値でわかる。直接参照せず GET_CODE(rtx) を使う。
--[[gcc-8.3/gcc/GET_CODE()]]

-RTL のオペランド
--オペランドの中身は rtx_def.u.fld[] で参照できる。0番目の引数なら u.fld[0], 1番目の引数なら u.fld[1] となる。
しかし fld[] は union 型なので、整数として解釈するのか、RTX として解釈するのか、知る必要がある。
---[[gcc-8.3/gcc/rtunion]]
--いくつオペランドを持っているかは、RTL の定義の FORMAT を見ればわかる。
例えば insn なら format は "uuBeiie" なので、7個持っている。
--オペランドの型を知る方法は GET_RTX_FORMAT() にて解説している。オペランドの型の情報は rtx_format が保持している。
---[[gcc-8.3/gcc/GET_RTX_FORMAT()]]
---[[gcc-8.3/gcc/rtx_format(global)]]


** insn 関連 [#dcb1eff4]

-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() という関数
---[[gcc-8.3/gcc/extract_insn()]]
---[[gcc-8.3/gcc/recog()]]

-命令選択 recog_xxx() を生成する関数
--md ファイルの S 式から生成しているようだが、仕組みがわからん
--[[gcc-8.3/gcc/create_subroutine()]]


**参考 [#abc53b88]


**関連モジュール [#dc5284ee]


*コメント [#ye27b383]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS