汎用オペコード¶
注意
このドキュメントはまだベクターを完全に考慮していません。多くのスカラ/整数/浮動小数点演算はベクターも扱うことができます。
定数¶
G_IMPLICIT_DEF¶
未定義の値。
%0:_(s32) = G_IMPLICIT_DEF
G_CONSTANT¶
整数定数。
%0:_(s32) = G_CONSTANT i32 1
G_FCONSTANT¶
浮動小数点定数。
%0:_(s32) = G_FCONSTANT float 1.0
G_FRAME_INDEX¶
スタックフレーム内のオブジェクトのアドレス。
%1:_(p0) = G_FRAME_INDEX %stack.0.ptr0
G_GLOBAL_VALUE¶
グローバル値のアドレス。
%0(p0) = G_GLOBAL_VALUE @var_local
G_PTRAUTH_GLOBAL_VALUE¶
グローバル値の符号付きアドレス。オペランド: 符号化されるアドレス (ポインタ)、キー (32 ビット imm)、アドレス識別用アドレス (不要な場合はゼロ)、および追加の識別子 (64 ビット imm)。
%0:_(p0) = G_PTRAUTH_GLOBAL_VALUE %1:_(p0), s32, %2:_(p0), s64
G_BLOCK_ADDR¶
基本ブロックのアドレス。
%0:_(p0) = G_BLOCK_ADDR blockaddress(@test_blockaddress, %ir-block.block)
G_CONSTANT_POOL¶
定数プール内のオブジェクトのアドレス。
%0:_(p0) = G_CONSTANT_POOL %const.0
整数拡張と切り捨て¶
G_ANYEXT¶
演算の基になるスカラ型を拡張し、上位ビットは未指定のままにします。
%1:_(s32) = G_ANYEXT %0:_(s16)
G_SEXT¶
演算の基になるスカラ型を符号拡張し、符号ビットを新しく作成されたスペースにコピーします。
%1:_(s32) = G_SEXT %0:_(s16)
G_SEXT_INREG¶
任意の位置からの値を符号拡張し、符号ビットをその上のすべてのビットにコピーします。これは、適切なシフト量を伴う shl + ashr ペアと同等です。 $sz は、ターゲットが一部のビット幅を合法とし、その他を低くすることを可能にする即値 (MachineOperand::isImm() は true を返す) です。このオペコードは、ターゲットが構成シフトよりも安価な符号拡張命令を持っている場合に特に役立ちます。オプティマイザは、G_SEXT_INREG を保持するか、それを低くして個々のシフトを最適化する方が良いかどうかを判断できます。
%1:_(s32) = G_SEXT_INREG %0:_(s32), 16
G_ZEXT¶
演算の基になるスカラ型をゼロ拡張し、新しく作成されたスペースにゼロビットを入れます。
%1:_(s32) = G_ZEXT %0:_(s16)
G_TRUNC¶
演算の基になるスカラ型を切り捨てます。これはスカラ型の場合は G_EXTRACT と同等ですが、ベクターでは要素ごとに作用します。
%1:_(s16) = G_TRUNC %0:_(s32)
型変換¶
G_INTTOPTR¶
整数をポインタに変換します。
%1:_(p0) = G_INTTOPTR %0:_(s32)
G_PTRTOINT¶
ポインタを整数に変換します。
%1:_(s32) = G_PTRTOINT %0:_(p0)
G_BITCAST¶
値を新しい型として再解釈します。これは通常、ビットを変更せずに実行されますが、LLVM-IR Bitcast 命令の定義の微妙さのために、常にそうであるとは限りません。同じサイズだが異なるアドレス空間を持つポインタ間でビットキャストを行うことは許可されています。
%1:_(s64) = G_BITCAST %0:_(<2 x s32>)
G_ADDRSPACE_CAST¶
あるアドレス空間へのポインタを別のアドレス空間へのポインタに変換します。
%1:_(p1) = G_ADDRSPACE_CAST %0:_(p0)
注意
‘addrspacecast .. to’ 命令は、キャストが単に無効な場合 (つまり、アドレス空間が互いに素な場合) に何が起こるかを言及していません。
スカラ演算¶
G_EXTRACT¶
指定されたサイズのレジスタを、インデックスで指定されたブロックから抽出します。これは、レジスタバンクが選択された後、ほとんど確実にサブレジスタ COPY にマップされます。
%3:_(s32) = G_EXTRACT %2:_(s64), 32
G_INSERT¶
指定されたビットインデックスで、小さいレジスタを大きいレジスタに挿入します。
%2:_(s64) = G_INSERT %0:(_s64), %1:_(s32), 0
G_MERGE_VALUES¶
同じサイズの複数のレジスタを連結して、より幅の広いレジスタにします。入力オペランドは常に最下位ビットから最上位ビットの順に並べられます。
%0:(s32) = G_MERGE_VALUES %bits_0_7:(s8), %bits_8_15:(s8),
%bits_16_23:(s8), %bits_24_31:(s8)
G_UNMERGE_VALUES¶
指定されたサイズの複数のレジスタを、インデックスで指定されたブロックから抽出します。これは、レジスタバンクが選択された後、ほとんど確実にサブレジスタ COPY にマップされます。出力オペランドは常に最下位ビットから最上位ビットの順に並べられます。
%bits_0_7:(s8), %bits_8_15:(s8),
%bits_16_23:(s8), %bits_24_31:(s8) = G_UNMERGE_VALUES %0:(s32)
G_BSWAP¶
スカラのバイトの順序を反転します。
%1:_(s32) = G_BSWAP %0:_(s32)
G_BITREVERSE¶
スカラのビットの順序を反転します。
%1:_(s32) = G_BITREVERSE %0:_(s32)
G_SBFX, G_UBFX¶
レジスタからビット範囲を抽出します。
ソースオペランドは次のようなレジスタです
ソース
抽出の最下位ビット
抽出の幅
最下位ビット (lsb) および幅オペランドは次の範囲内です
0 <= lsb < lsb + width <= source bitwidth, where all values are unsigned
G_SBFX は結果を符号拡張しますが、G_UBFX は結果をゼロ拡張します。
; Extract 5 bits starting at bit 1 from %x and store them in %a.
; Sign-extend the result.
;
; Example:
; %x = 0...0000[10110]1 ---> %a = 1...111111[10110]
%lsb_one = G_CONSTANT i32 1
%width_five = G_CONSTANT i32 5
%a:_(s32) = G_SBFX %x, %lsb_one, %width_five
; Extract 3 bits starting at bit 2 from %x and store them in %b. Zero-extend
; the result.
;
; Example:
; %x = 1...11111[100]11 ---> %b = 0...00000[100]
%lsb_two = G_CONSTANT i32 2
%width_three = G_CONSTANT i32 3
%b:_(s32) = G_UBFX %x, %lsb_two, %width_three
整数演算¶
G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR, G_SDIV, G_UDIV, G_SREM, G_UREM¶
これらはそれぞれ、スカラに対してそれぞれの整数演算を実行します。
%dst:_(s32) = G_ADD %src0:_(s32), %src1:_(s32)
上記の例では、%src1 を %src0 に加算し、結果を %dst に格納します。
G_SDIVREM, G_UDIVREM¶
整数除算と剰余を実行して、2 つの結果を生成します。
%div:_(s32), %rem:_(s32) = G_SDIVREM %0:_(s32), %1:_(s32)
G_SADDSAT, G_UADDSAT, G_SSUBSAT, G_USUBSAT, G_SSHLSAT, G_USHLSAT¶
符号付きおよび符号なしの加算、減算、および飽和付きの左シフト。
%2:_(s32) = G_SADDSAT %0:_(s32), %1:_(s32)
G_SHL、G_LSHR、G_ASHR¶
スカラーのビットを左または右にシフトし、ゼロを挿入します(G_ASHRの場合は符号ビット)。
G_ROTR、G_ROTL¶
ビットを右(G_ROTR)または左(G_ROTL)にローテートします。
G_ICMP¶
整数比較を実行し、非ゼロ(真)またはゼロ(偽)を生成します。真の値が1、~0U、またはその他の非ゼロ値であるかはターゲット固有です。
G_SCMP¶
符号付き3ウェイ整数比較を実行し、-1(小さい)、0(等しい)、または1(大きい)を生成します。
%5:_(s32) = G_SCMP %6, %2
G_UCMP¶
符号なし3ウェイ整数比較を実行し、-1(小さい)、0(等しい)、または1(大きい)を生成します。
%7:_(s32) = G_UCMP %2, %6
G_SELECT¶
ゼロ/非ゼロの値に応じて2つの値を選択します。
%5:_(s32) = G_SELECT %4(s1), %6, %2
G_PTR_ADD¶
アドレス可能な単位でスカラーオフセットをポインタに追加します。アドレス可能な単位は通常バイトですが、ターゲットによって異なる場合があります。
%1:_(p0) = G_PTR_ADD %0:_(p0), %1:_(s32)
注意
現在、アドレス可能な単位が8ビットではない状態でこれを使用するインツリーターゲットはありません。
G_PTRMASK¶
ポインタのビットの任意マスクをゼロにします。マスクタイプは整数でなければならず、ベクター要素の数はすべてのオペランドで一致する必要があります。これは、i_intr_llvm_ptrmaskに対応します。
%2:_(p0) = G_PTRMASK %0, %1
G_SMIN、G_SMAX、G_UMIN、G_UMAX¶
2つの値の最小値/最大値を取得します。
%5:_(s32) = G_SMIN %6, %2
G_ABS¶
符号付き整数の絶対値を取得します。最小の負の値(例えば、8ビット値0x80)の絶対値は、それ自体として定義されます。
%1:_(s32) = G_ABS %0
G_UADDO、G_SADDO、G_USUBO、G_SSUBO、G_SMULO、G_UMULO¶
要求された算術演算を実行し、通常の結果に加えてキャリー出力を生成します。
%3:_(s32), %4:_(s1) = G_UADDO %0, %1
G_UADDE、G_SADDE、G_USUBE、G_SSUBE¶
要求された算術演算を実行し、通常の入力に加えてキャリー入力を消費します。また、通常の結果に加えてキャリー出力を生成します。
%4:_(s32), %5:_(s1) = G_UADDE %0, %1, %3:_(s1)
G_UMULH、G_SMULH¶
2つの数値を入力ビット幅の2倍(符号なしまたは符号付き)で乗算し、結果の上位半分を返します。
%3:_(s32) = G_UMULH %0, %1
G_CTLZ、G_CTTZ、G_CTPOP¶
先頭のゼロ、末尾のゼロ、またはセットされたビットの数をカウントします。
%2:_(s33) = G_CTLZ_ZERO_UNDEF %1
%2:_(s33) = G_CTTZ_ZERO_UNDEF %1
%2:_(s33) = G_CTPOP %1
G_CTLZ_ZERO_UNDEF、G_CTTZ_ZERO_UNDEF¶
先頭のゼロまたは末尾のゼロをカウントします。値がゼロの場合、結果は未定義です。
%2:_(s33) = G_CTLZ_ZERO_UNDEF %1
%2:_(s33) = G_CTTZ_ZERO_UNDEF %1
浮動小数点演算¶
G_FCMP¶
浮動小数点比較を実行し、非ゼロ(真)またはゼロ(偽)を生成します。真の値が1、~0U、またはその他の非ゼロ値であるかはターゲット固有です。
G_FNEG¶
浮動小数点数の否定。
G_FPEXT¶
浮動小数点値をより大きな型に変換します。
G_FPTRUNC¶
浮動小数点値をより狭い型に変換します。
G_FPTOSI、G_FPTOUI、G_SITOFP、G_UITOFP¶
整数と浮動小数点の間で変換します。
G_FABS¶
浮動小数点値の絶対値を取得します。
G_FCOPYSIGN¶
最初のオペランドの値を取得し、符号ビットを2番目のオペランドの符号ビットに置き換えます。
G_FCANONICALIZE¶
‘llvm.canonicalize.*’組み込みを参照してください。
G_IS_FPCLASS¶
最初のオペランド(浮動小数点スカラーまたはベクターである必要があります)が2番目のオペランドで指定された浮動小数点クラスを持っているかどうかをテストします。非ゼロ(真)またはゼロ(偽)を返します。真の値が1、~0U、またはその他の非ゼロ値であるかはターゲット固有です。最初のオペランドがベクターの場合、返される値は同じ長さのベクターです。
G_FMINNUM¶
2つの値で浮動小数点数の最小値を実行します。
単一の入力がNaN(シグナリングまたはクワイエット)の場合、非NaN入力が返されます。
(FMINNUM 0.0, -0.0)の戻り値は、0.0または-0.0のいずれかになります。
G_FMAXNUM¶
2つの値で浮動小数点数の最大値を実行します。
単一の入力がNaN(シグナリングまたはクワイエット)の場合、非NaN入力が返されます。
(FMAXNUM 0.0, -0.0)の戻り値は、0.0または-0.0のいずれかになります。
G_FMINNUM_IEEE¶
IEEE-754定義に従って、2つの値で浮動小数点数の最小値を実行します。これは、シグナリングNaNの処理においてFMINNUMと異なります。
入力の1つがシグナリングNaNの場合、クワイエットNaNを返します。これは、シグナリングNaNに対するIEEE-754 2008のminnum/maxnum(2019とは異なります)に一致します。
これらは、IEEE-754 2019のminimumNumber/maximumNumber(2008では未指定)の動作に合わせて、-0を+0より小さい順序として扱います。
G_FMAXNUM_IEEE¶
IEEE-754定義に従って、2つの値で浮動小数点数の最大値を実行します。これは、シグナリングNaNの処理においてFMAXNUMと異なります。
入力の1つがシグナリングNaNの場合、クワイエットNaNを返します。これは、シグナリングNaNに対するIEEE-754 2008のminnum/maxnum(2019とは異なります)に一致します。
これらは、IEEE-754 2019のminimumNumber/maximumNumber(2008では未指定)の動作に合わせて、-0を+0より小さい順序として扱います。
G_FMINIMUM¶
NaNを伝播する最小値で、-0.0を0.0より小さいものとして扱います。FMINNUM_IEEEはIEEE 754-2008セマンティクスに従いますが、FMINIMUMはIEEE 754-2019セマンティクスに従います。
G_FMAXIMUM¶
NaNを伝播する最大値で、-0.0を0.0より小さいものとして扱います。FMAXNUM_IEEEはIEEE 754-2008セマンティクスに従いますが、FMAXIMUMはIEEE 754-2019セマンティクスに従います。
G_FADD、G_FSUB、G_FMUL、G_FDIV、G_FREM¶
指定された浮動小数点演算を実行します。
G_FMA¶
融合した乗算加算を実行します(つまり、中間丸めステップなし)。
G_FMAD¶
非融合の乗算加算を実行します(つまり、中間丸めステップあり)。
G_FPOW¶
最初のオペランドを2番目のオペランドの累乗にします。
G_FEXP、G_FEXP2¶
値の底eまたは底2の指数を計算します。
G_FLOG、G_FLOG2、G_FLOG10¶
それぞれ、底e、底2、または底10を計算します。
G_FCEIL、G_FSQRT、G_FFLOOR、G_FRINT、G_FNEARBYINT¶
これらは、同じ名前の標準C関数に対応します。
G_FCOS、G_FSIN、G_FTAN、G_FACOS、G_FASIN、G_FATAN、G_FCOSH、G_FSINH、G_FTANH¶
これらは、同じ名前の標準C三角関数に対応します。
G_INTRINSIC_TRUNC¶
オペランドを、オペランドよりも絶対値が大きくない最も近い整数に丸めて返します。
G_INTRINSIC_ROUND¶
オペランドを最も近い整数に丸めて返します。
G_LROUND、G_LLROUND¶
ソースオペランドを、ゼロから離れるように丸めた最も近い整数を返します。
動作の詳細については、'llvm.lround.*'
のLLVM LangRefエントリを参照してください。
%rounded_32:_(s32) = G_LROUND %round_me:_(s64)
%rounded_64:_(s64) = G_LLROUND %round_me:_(s64)
ベクター固有の演算¶
G_VSCALE¶
ランタイムvscale
の値にソースオペランドの値を乗算した値を、宛先レジスタに入力します。これは、ベクター内の実際のランタイム要素数を決定するのに役立ちます。
%0:_(s32) = G_VSCALE 4
G_INSERT_SUBVECTOR¶
2番目のソースベクターを最初のソースベクターに挿入します。インデックスオペランドは、2番目のソースベクターを挿入する必要がある最初のソースベクターの開始インデックスを表します。
インデックスは、2番目のソースベクターの最小ベクター長の定数倍でなければなりません。ベクターがスケーラブルな場合、インデックスは最初にランタイムスケーリングファクターでスケーリングされます。ソースベクターに挿入されたインデックスは、そのベクターの有効なインデックスでなければなりません。この条件を静的に判断できないが、実行時に偽である場合、結果のベクターは未定義になります。
%2:_(<vscale x 4 x i64>) = G_INSERT_SUBVECTOR %0:_(<vscale x 4 x i64>), %1:_(<vscale x 2 x i64>), 0
G_EXTRACT_SUBVECTOR¶
ソースベクターから宛先型のベクターを抽出します。インデックスオペランドは、ソースベクターからサブベクターが抽出される開始インデックスを表します。
インデックスは、ソースベクターの最小ベクター長の定数倍でなければなりません。ソースベクターがスケーラブルなベクターの場合、インデックスは最初にランタイムスケーリングファクターでスケーリングされます。ソースベクターから抽出されたインデックスは、そのベクターの有効なインデックスでなければなりません。この条件を静的に判断できないが、実行時に偽である場合、結果のベクターは未定義になります。
%3:_(<vscale x 4 x i64>) = G_EXTRACT_SUBVECTOR %2:_(<vscale x 8 x i64>), 2
G_CONCAT_VECTORS¶
2つのベクターを連結して、より長いベクターを形成します。
G_BUILD_VECTOR, G_BUILD_VECTOR_TRUNC¶
複数のスカラレジスタからベクトルを作成します。暗黙的な変換は実行されません(つまり、結果の要素型はすべてのソースオペランドと同じである必要があります)。
_TRUNCバージョンは、より大きなオペランド型を切り捨てて、宛先ベクトルの要素型に合わせます。
G_INSERT_VECTOR_ELT¶
ベクトルに要素を挿入します。
G_EXTRACT_VECTOR_ELT¶
ベクトルから要素を抽出します。
G_SHUFFLE_VECTOR¶
2つのベクトルを連結し、マスクオペランドに従って要素をシャッフルします。マスクオペランドは、IR shufflevector命令の対応するマスクと完全に一致するIR定数である必要があります。
G_SPLAT_VECTOR¶
すべての要素がソースオペランドからのスカラであるベクトルを作成します。
オペランドの型は、ベクトルの要素型以上である必要があります。オペランドがベクトルの要素型よりも大きい場合、スカラは暗黙的にベクトルの要素型に切り捨てられます。
G_VECTOR_COMPRESS¶
入力ベクトル、マスクベクトル、およびパススルーベクトルが与えられた場合、選択された(つまり、mask[i] = trueの場合)すべての入力レーンを出力ベクトルに連続して配置します。出力内の残りのすべてのレーンはパススルーから取得され、これは未定義にすることができます。
ベクトル縮約演算¶
これらの演算は、スカラ結果を生成する水平ベクトル縮約を表します。
G_VECREDUCE_SEQ_FADD, G_VECREDUCE_SEQ_FMUL¶
SEQバリアントは、順次縮約を実行します。最初のオペランドは初期スカラアキュムレータ値であり、2番目のオペランドは縮約するベクトルです。
G_VECREDUCE_FADD, G_VECREDUCE_FMUL¶
これらの縮約は、任意の順序で要素を縮約できる緩和されたバリアントです。
G_VECREDUCE_FMAX, G_VECREDUCE_FMIN, G_VECREDUCE_FMAXIMUM, G_VECREDUCE_FMINIMUM¶
FMIN/FMAX/FMINIMUM/FMAXIMUMノードには、NaN/NoNaNバリアントのフラグを含めることができます。
整数/ビット単位の縮約¶
G_VECREDUCE_ADD
G_VECREDUCE_MUL
G_VECREDUCE_AND
G_VECREDUCE_OR
G_VECREDUCE_XOR
G_VECREDUCE_SMAX
G_VECREDUCE_SMIN
G_VECREDUCE_UMAX
G_VECREDUCE_UMIN
整数縮約の結果型は、ベクトルの要素型よりも大きくてもかまいません。ただし、縮約はベクトルの要素型を使用して実行され、上位ビットの値は指定されません。
メモリ操作¶
G_LOAD, G_SEXTLOAD, G_ZEXTLOAD¶
汎用ロード。明示的なオペランドに加えて、MachineMemOperandが必要です。結果のサイズがメモリサイズより大きい場合、上位ビットはそれぞれ未定義、符号拡張、またはゼロ拡張されます。
結果がベクトル型の場合、G_LOADのみが有効です。結果がメモリサイズよりも大きい場合、上位要素は未定義です(つまり、これは要素ごとのベクトルanyextloadではありません)。
SelectionDAGとは異なり、アトミックロードは通常のロードと同じオペコードで表現されます。G_LOAD、G_SEXTLOAD、およびG_ZEXTLOADには、すべてアトミックメモリオペランドを含めることができます。
G_INDEXED_LOAD¶
汎用インデックス付きロード。GEPとロードを組み合わせます。$newaddrは、$base + $offsetに設定されます。$amが0(ポストインデックス)の場合、値は$baseからロードされます。$amが1(プリインデックス)の場合、値は$newaddrからロードされます。
G_INDEXED_SEXTLOAD¶
G_INDEXED_LOADと同じですが、実行されるロードは、G_SEXTLOADと同様に符号拡張されています。
G_INDEXED_ZEXTLOAD¶
G_INDEXED_LOADと同じですが、実行されるロードは、G_ZEXTLOADと同様にゼロ拡張されています。
G_STORE¶
汎用ストア。明示的なオペランドに加えて、MachineMemOperandが必要です。格納される値のサイズがメモリサイズよりも大きい場合、上位ビットは暗黙的に切り捨てられます。これがベクトルストアの場合、上位要素は破棄されます(つまり、これはレーンごとのベクトルとして機能する切り捨てストアではありません)。
G_INDEXED_STORE¶
ストアをGEPと組み合わせます。インデックス動作については、G_INDEXED_LOADの説明を参照してください。
G_ATOMIC_CMPXCHG_WITH_SUCCESS¶
内部成功チェック付きの汎用アトミックcmpxchg。明示的なオペランドに加えて、MachineMemOperandが必要です。
G_ATOMIC_CMPXCHG¶
汎用アトミックcmpxchg。明示的なオペランドに加えて、MachineMemOperandが必要です。
G_ATOMICRMW_XCHG, G_ATOMICRMW_ADD, G_ATOMICRMW_SUB, G_ATOMICRMW_AND, G_ATOMICRMW_NAND, G_ATOMICRMW_OR, G_ATOMICRMW_XOR, G_ATOMICRMW_MAX, G_ATOMICRMW_MIN, G_ATOMICRMW_UMAX, G_ATOMICRMW_UMIN, G_ATOMICRMW_FADD, G_ATOMICRMW_FSUB, G_ATOMICRMW_FMAX, G_ATOMICRMW_FMIN¶
汎用アトミックrmw。明示的なオペランドに加えて、MachineMemOperandが必要です。
G_FENCE¶
汎用フェンス。最初のオペランドはメモリオーダーです。2番目のオペランドはsyncscopeです。
詳細については、'fence'
命令に関するLLVM LangRefエントリを参照してください。
G_MEMCPY¶
汎用memcpy。明示的なオペランドに加えて、それぞれストアとロードをカバーする2つのMachineMemOperandが必要です。
G_MEMCPY_INLINE¶
汎用インラインmemcpy。G_MEMCPYと同様ですが、このバージョンは外部関数への呼び出しとして低下しないことが保証されています。現在、サイズオペランドは定数として評価される必要があります(即時ではありません)。これは、llvm.memcpy.inlineが動的サイズをサポートするように教えられたときに変更される予定です。
G_MEMMOVE¶
汎用memmove。G_MEMCPYと同様ですが、ソースと宛先のメモリ範囲は重複することが許可されています。
G_MEMSET¶
汎用memset。明示的なオペランドに加えて、MachineMemOperandが必要です。
G_BZERO¶
汎用bzero。明示的なオペランドに加えて、MachineMemOperandが必要です。
制御フロー¶
G_PHI¶
関数のSSAグラフを表すφノードを実装します。
%dst(s8) = G_PHI %src1(s8), %bb.<id1>, %src2(s8), %bb.<id2>
G_BR¶
無条件分岐
G_BR %bb.<id>
G_BRCOND¶
条件付き分岐
G_BRCOND %condition, %basicblock.<id>
G_BRINDIRECT¶
間接分岐
G_BRINDIRECT %src(p0)
G_BRJT¶
ジャンプテーブルエントリへの間接分岐
G_BRJT %ptr(p0), %jti, %idx(s64)
G_JUMP_TABLE¶
ソースオペランドで指定されたジャンプテーブルのアドレスへのポインタを生成します。ソースオペランドはジャンプテーブルインデックスです。G_JUMP_TABLEは、G_BRJTと組み合わせて使用して、GlobalISelによるジャンプテーブルコード生成をサポートできます。
%dst:_(p0) = G_JUMP_TABLE %jump-table.0
上記の例では、ソースジャンプテーブルインデックスへのポインタを生成します。
G_INVOKE_REGION_START¶
例外をスローする可能性のあるコード領域の疑似ターミネータとして機能するマーカー命令。ターミネータであるため、正当化などのパス中に、その後にコードが挿入されるのを防ぎます。これは、例外スロールーチンへの呼び出しは返されないため、実行可能パス上にある必要があるコードは、スロー後に配置する必要がないため必要です。
G_INTRINSIC, G_INTRINSIC_CONVERGENT¶
副作用のない組み込み関数を呼び出します。
_CONVERGENTバリアントは、convergentとマークされたLLVM IR組み込み関数に対応します。
注意
SelectionDAGとは異なり、_VOIDバリアントはありません。これらは両方とも、ゼロ、1つ、または複数の結果を持つことができます。
G_INTRINSIC_W_SIDE_EFFECTS, G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS¶
不明な副作用があると考えられ、他の副作用のある命令をまたいで並べ替えることができない組み込み関数を呼び出します。
_CONVERGENTバリアントは、convergentとマークされたLLVM IR組み込み関数に対応します。
注意
SelectionDAGとは異なり、_VOIDバリアントはありません。これらは両方とも、ゼロ、1つ、または複数の結果を持つことができます。
G_TRAP, G_DEBUGTRAP, G_UBSANTRAP¶
llvm.trap, llvm.debugtrap および llvm.ubsantrap を表し、ターゲット依存のトラップ命令を生成します。
G_TRAP
G_DEBUGTRAP
G_UBSANTRAP 12
可変長引数¶
G_VASTART¶
注意
執筆時点で、この命令に関するドキュメントは見つかりませんでした。
G_VAARG¶
注意
執筆時点で、この命令に関するドキュメントは見つかりませんでした。
その他の操作¶
G_DYN_STACKALLOC¶
スタックポインタを指定されたサイズとアライメントに動的に再調整します。アライメント値が0または1の場合は、特定のアライメントがないことを意味します。
%8:_(p0) = G_DYN_STACKALLOC %7(s64), 32
最適化ヒント¶
これらの命令は、ターゲット命令には対応していません。これらは、様々な組み合わせに対するヒントとして機能します。
G_ASSERT_SEXT, G_ASSERT_ZEXT¶
これは、レジスタの内容が以前に小さい型から拡張されたことを示します。
より小さい型は、即値オペランドを用いて示されます。スカラーの場合、これはより小さい型全体の幅です。ベクトルの場合、これはより小さい要素型の幅です。
%x_was_zexted:_(s32) = G_ASSERT_ZEXT %x(s32), 16
%y_was_zexted:_(<2 x s32>) = G_ASSERT_ZEXT %y(<2 x s32>), 16
%z_was_sexted:_(s32) = G_ASSERT_SEXT %z(s32), 8
G_ASSERT_SEXTとG_ASSERT_ZEXTは、いくつかの制限はあるものの、コピーのように機能します。
ソースレジスタとデスティネーションレジスタは、以下を満たす必要があります。
仮想であること
同じレジスタクラスに属すること
同じレジスタバンクに属すること
常に以下を行うことは安全である必要があります。
ソースレジスタを調べる
デスティネーションレジスタをソースレジスタで置き換える
その他¶
G_CONSTANT_FOLD_BARRIER¶
この操作は、定数畳み込みを防止するための不透明なバリアとして使用されます。結合やその他の変換は、これを通してはなりません。これらには他のセマンティクスはなく、ターゲットが選択した場合、安全に削除できます。