[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.3 オペランドへのアクセス

式中のオペランドは、XEXPXINTXWINT、それに XSTR というマクロを使って参照することができる。これらのマクロは それぞれ引数を二つ取る。RTL式のポインタ(RTX) とオペランドの番号である。 オペランドの番号は 0 からはじまる。例えば、

 
XEXP (x, 2)

とあれば、式 x の二番目のオペランドを式として参照する。

 
XINT (x, 2)

こちらは、同じオペランドを整数として参照する。同様に、XSTR を 使うと文字列として参照する。

どんなオペランドも整数として、あるいは式として、また文字列として 参照できる。ユーザは、オペランドに実際貯えられている値の種類に 応じて、正しい参照方法を選ばなければならない。これは、 オペランドを含んでいる式の式コードを見て判断するのが良い。 また、オペランド数を調べるのも式コードで調べることができる。

例えば、xsubreg 式なら、オペランドは二つあり、 それぞれ XEXP (x, 0)XINT (x, 0) として 正しく参照できる。XINT (x, 0) とすると、 オペランド 0 の式のアドレスを整数にキャストしたものが得られる。 こういう参照の仕方が有効な場合は滅多にないと思うが、もし書くなら (int) XEXP (x, 0) としたほうがきれいである。 また XEXP (x, 1) という書き方もエラー無しでコンパイル できて、二番目の整数オペランドを式のポインタにキャストした結果を 返す。しかし、それを参照したときに恐らくプログラムが落ちてしまう。 さらには、XEXP (x, 28) のように書くこともできるが、 式の終りを越えたメモリをアクセスし、予期できない結果に終わるだろう。

オペランドがベクトルの場合の参照方法はもっと複雑である。 マクロ XVEC を使うとベクトルへのポインタそのものが得られ、 XVECEXPXVECLEN を使うとそれぞれ、ベクトルの要素と 長さを得ることができる。

XVEC (exp, idx)

expidx 番目のオペランドを ベクトルへのポインタとして参照する。

XVECLEN (exp, idx)

expidx 番目のオペランドであるベクトルの長さを返す。 この値は int 型である。

XVECEXP (exp, idx, eltnum)

expidx 番目のオペランドであるベクトルの eltnum 番目の要素を参照する。この値は RTX である。

eltnum が負でないことおよび XVECLEN (exp, idx) より小さいことを保証するのはユーザの責任である。

このセクションで定義したマクロは全て左辺値として展開されるので、 単に参照するだけでなく、オペランドや長さやベクトルの要素を代入する ことができる。


This document was generated using texi2html 1.78.