第 4 章 既存のコンパイラをベースとするコンパイラフレームワークの構築 24
4.2 RTL
4.2.3 RTL 式
RTL式の基本
RTLにおける式(RTXと呼ぶ)は,RTLで表現されたプログラムを構成する単位とし て用いられるものと,他のRTXのオペランドとしてメモリ,レジスタ等のオブジェクト の参照や演算式の表現などを行なうために用いられるものの2種類がある.
RTXは式コード,フラグ,マシンモード,オペランドから成り,プログラム本体と最適 化のための情報が全て同じ書式で記述される.(図4.3)
(式コード[/フラグ1/フラグ2...][:マシンモード]
オペランド1オペランド2オペランド3...) 図 4.3: RTXの書式
式コード
式コードはRTXの振る舞いとオペランドの数と種類,そしてオペランドの順序を決定 する.オペランドは整数,文字列,ベクトル,RTXのいずれかをとる.RTLでは式コー ドからオペランドの型を決定できる.
式クラス
式コードはその種類によっていくつかのクラスに分類される.これらのクラスはRTL クラスと呼ばれ,アルファベット1文字で表現される.式クラスがRTLに記述されるこ とはない.(表4.4)
式クラス 意味
o レジスタやメモリなどの実際のオブジェクト
< 比較演算
1 単項演算
c 交換可能な2項演算 2 交換可能でない2項演算 b ビットフィールド演算
3 3項演算
i 命令全体
m 命令列にマッチするもの
x その他全て
表 4.4: 式クラス一覧
フラグ
フラグはRTXに対して情報を補足するために用いられる.フラグはアルファベット一 文字で表現され,同じフラグでも式コードによって異なる意味を持つ.
フラグの主な用途は以下のとおり.
• 参照するオブジェクトの種類を表わす.
• 使用するレジスタの用途
• RTXの属性
• ラベル参照の有無,参照の目的,参照の方法
RTXにフラグが設定されている場合には式コードの後に’/’に続けてフラグを表わすア ルフェベットを書く.1つのRTXに対して,複数のフラグがある場合にはこれを繰り返す.
マシンモード
データオブジェクトの大きさとその表現方法を表わす.同じ式コードでも異なるマシン モードを持つ場合があり,それは式の使用される文脈によって決まる.
マシンモードはフラグのあとに’:’に続けて記述される.式コードによってはマシンモー ドは固定であり,その場合にはマシンモードの記述は不要となる.マシンモードは通常
XXmodeと表記するが,RTLテキストダンプでは後のmodeを省略して表記する.(表4.5)
マシンモード 意味
QImode 1/4精度整数(1バイト)
HImode 1/2精度整数(2バイト)
PSImode 部分単精度整数(4バイト)
SImode 単精度整数(4バイト)
PDImode 部分倍精度整数(8バイト)
DImode 倍精度整数(8バイト)
TImode 4倍精度整数(16バイト)
SFmode 単精度浮動小数点数(4バイト)
DFmode 倍精度浮動小数点数(8バイト)
XFmode 拡張精度浮動小数点数(12バイト)
TFmode 4倍精度浮動小数点数(16バイト)
CCmode 比較演算の結果を表わす機種固有のビット群
BLKmode ブロックモード.他のどのモードも適用できない.
VOIDmode モードがない.もしくはモードを指定しない.
表 4.5: マシンモード
ここに挙げたマシンモードは最も一般的なものである.GCCのバージョンによっては,
文書化されていないフラグが多数定義されている場合もある.
フォーマット文字列
式コードによって決まる.RTXのオペランドの数と順序,種類を表わす文字列である.
オペランドの種類はフォーマット文字と呼ばれるアルファベット一文字で表記される.(表 4.6)
例)
subreg式のフォーマット文字列は"ei".つまりオペランドとして一つのRTL式とひと つの整数値をとる.
この他にフォーマット文字’u’が存在するが,これは’e’に等しい.INSNへのポイン タを表わすために特に用意されている.
フォーマット文字 意味
e RTX
i 整数
w 幅広整数
s 文字列
E RTL式のベクトル
表 4.6: フォーマット文字 式クラスとフォーマット文字列
式クラスによってはそのクラスに属する全ての式が全て同じフォーマット文字列を持 つ.(表4.7)
式クラス フォーマット文字列
1 "e"
<,c,2 "ee"
b,3 "eee"
i "iuueiee"
o,m,x フォーマットを仮定できない.
表 4.7: 式クラス対するフォーマット文字列