汎用オペコード

注意

このドキュメントはまだベクターを完全に考慮していません。多くのスカラ/整数/浮動小数点演算はベクターも扱うことができます。

定数

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

この操作は、定数畳み込みを防止するための不透明なバリアとして使用されます。結合やその他の変換は、これを通してはなりません。これらには他のセマンティクスはなく、ターゲットが選択した場合、安全に削除できます。