1
2.. _gmir-opcodes:
3
4Generic Opcodes
5===============
6
7.. contents::
8   :local:
9
10.. note::
11
12  This documentation does not yet fully account for vectors. Many of the
13  scalar/integer/floating-point operations can also take vectors.
14
15Constants
16---------
17
18G_IMPLICIT_DEF
19^^^^^^^^^^^^^^
20
21An undefined value.
22
23.. code-block:: none
24
25  %0:_(s32) = G_IMPLICIT_DEF
26
27G_CONSTANT
28^^^^^^^^^^
29
30An integer constant.
31
32.. code-block:: none
33
34  %0:_(s32) = G_CONSTANT i32 1
35
36G_FCONSTANT
37^^^^^^^^^^^
38
39A floating point constant.
40
41.. code-block:: none
42
43  %0:_(s32) = G_FCONSTANT float 1.0
44
45G_FRAME_INDEX
46^^^^^^^^^^^^^
47
48The address of an object in the stack frame.
49
50.. code-block:: none
51
52  %1:_(p0) = G_FRAME_INDEX %stack.0.ptr0
53
54G_GLOBAL_VALUE
55^^^^^^^^^^^^^^
56
57The address of a global value.
58
59.. code-block:: none
60
61  %0(p0) = G_GLOBAL_VALUE @var_local
62
63G_BLOCK_ADDR
64^^^^^^^^^^^^
65
66The address of a basic block.
67
68.. code-block:: none
69
70  %0:_(p0) = G_BLOCK_ADDR blockaddress(@test_blockaddress, %ir-block.block)
71
72Integer Extension and Truncation
73--------------------------------
74
75G_ANYEXT
76^^^^^^^^
77
78Extend the underlying scalar type of an operation, leaving the high bits
79unspecified.
80
81.. code-block:: none
82
83  %1:_(s32) = G_ANYEXT %0:_(s16)
84
85G_SEXT
86^^^^^^
87
88Sign extend the underlying scalar type of an operation, copying the sign bit
89into the newly-created space.
90
91.. code-block:: none
92
93  %1:_(s32) = G_SEXT %0:_(s16)
94
95G_SEXT_INREG
96^^^^^^^^^^^^
97
98Sign extend the value from an arbitrary bit position, copying the sign bit
99into all bits above it. This is equivalent to a shl + ashr pair with an
100appropriate shift amount. $sz is an immediate (MachineOperand::isImm()
101returns true) to allow targets to have some bitwidths legal and others
102lowered. This opcode is particularly useful if the target has sign-extension
103instructions that are cheaper than the constituent shifts as the optimizer is
104able to make decisions on whether it's better to hang on to the G_SEXT_INREG
105or to lower it and optimize the individual shifts.
106
107.. code-block:: none
108
109  %1:_(s32) = G_SEXT_INREG %0:_(s32), 16
110
111G_ZEXT
112^^^^^^
113
114Zero extend the underlying scalar type of an operation, putting zero bits
115into the newly-created space.
116
117.. code-block:: none
118
119  %1:_(s32) = G_ZEXT %0:_(s16)
120
121G_TRUNC
122^^^^^^^
123
124Truncate the underlying scalar type of an operation. This is equivalent to
125G_EXTRACT for scalar types, but acts elementwise on vectors.
126
127.. code-block:: none
128
129  %1:_(s16) = G_TRUNC %0:_(s32)
130
131Type Conversions
132----------------
133
134G_INTTOPTR
135^^^^^^^^^^
136
137Convert an integer to a pointer.
138
139.. code-block:: none
140
141  %1:_(p0) = G_INTTOPTR %0:_(s32)
142
143G_PTRTOINT
144^^^^^^^^^^
145
146Convert a pointer to an integer.
147
148.. code-block:: none
149
150  %1:_(s32) = G_PTRTOINT %0:_(p0)
151
152G_BITCAST
153^^^^^^^^^
154
155Reinterpret a value as a new type. This is usually done without
156changing any bits but this is not always the case due a subtlety in the
157definition of the :ref:`LLVM-IR Bitcast Instruction <i_bitcast>`. It
158is allowed to bitcast between pointers with the same size, but
159different address spaces.
160
161.. code-block:: none
162
163  %1:_(s64) = G_BITCAST %0:_(<2 x s32>)
164
165G_ADDRSPACE_CAST
166^^^^^^^^^^^^^^^^
167
168Convert a pointer to an address space to a pointer to another address space.
169
170.. code-block:: none
171
172  %1:_(p1) = G_ADDRSPACE_CAST %0:_(p0)
173
174.. caution::
175
176  :ref:`i_addrspacecast` doesn't mention what happens if the cast is simply
177  invalid (i.e. if the address spaces are disjoint).
178
179Scalar Operations
180-----------------
181
182G_EXTRACT
183^^^^^^^^^
184
185Extract a register of the specified size, starting from the block given by
186index. This will almost certainly be mapped to sub-register COPYs after
187register banks have been selected.
188
189.. code-block:: none
190
191  %3:_(s32) = G_EXTRACT %2:_(s64), 32
192
193G_INSERT
194^^^^^^^^
195
196Insert a smaller register into a larger one at the specified bit-index.
197
198.. code-block:: none
199
200  %2:_(s64) = G_INSERT %0:(_s64), %1:_(s32), 0
201
202G_MERGE_VALUES
203^^^^^^^^^^^^^^
204
205Concatenate multiple registers of the same size into a wider register.
206The input operands are always ordered from lowest bits to highest:
207
208.. code-block:: none
209
210  %0:(s32) = G_MERGE_VALUES %bits_0_7:(s8), %bits_8_15:(s8),
211                            %bits_16_23:(s8), %bits_24_31:(s8)
212
213G_UNMERGE_VALUES
214^^^^^^^^^^^^^^^^
215
216Extract multiple registers of the specified size, starting from blocks given by
217indexes. This will almost certainly be mapped to sub-register COPYs after
218register banks have been selected.
219The output operands are always ordered from lowest bits to highest:
220
221.. code-block:: none
222
223  %bits_0_7:(s8), %bits_8_15:(s8),
224      %bits_16_23:(s8), %bits_24_31:(s8) = G_UNMERGE_VALUES %0:(s32)
225
226G_BSWAP
227^^^^^^^
228
229Reverse the order of the bytes in a scalar.
230
231.. code-block:: none
232
233  %1:_(s32) = G_BSWAP %0:_(s32)
234
235G_BITREVERSE
236^^^^^^^^^^^^
237
238Reverse the order of the bits in a scalar.
239
240.. code-block:: none
241
242  %1:_(s32) = G_BITREVERSE %0:_(s32)
243
244G_SBFX, G_UBFX
245^^^^^^^^^^^^^^
246
247Extract a range of bits from a register.
248
249The source operands are registers as follows:
250
251- Source
252- The least-significant bit for the extraction
253- The width of the extraction
254
255The least-significant bit (lsb) and width operands are in the range:
256
257::
258
259      0 <= lsb < lsb + width <= source bitwidth, where all values are unsigned
260
261G_SBFX sign-extends the result, while G_UBFX zero-extends the result.
262
263.. code-block:: none
264
265  ; Extract 5 bits starting at bit 1 from %x and store them in %a.
266  ; Sign-extend the result.
267  ;
268  ; Example:
269  ; %x = 0...0000[10110]1 ---> %a = 1...111111[10110]
270  %lsb_one = G_CONSTANT i32 1
271  %width_five = G_CONSTANT i32 5
272  %a:_(s32) = G_SBFX %x, %lsb_one, %width_five
273
274  ; Extract 3 bits starting at bit 2 from %x and store them in %b. Zero-extend
275  ; the result.
276  ;
277  ; Example:
278  ; %x = 1...11111[100]11 ---> %b = 0...00000[100]
279  %lsb_two = G_CONSTANT i32 2
280  %width_three = G_CONSTANT i32 3
281  %b:_(s32) = G_UBFX %x, %lsb_two, %width_three
282
283Integer Operations
284-------------------
285
286G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR, G_SDIV, G_UDIV, G_SREM, G_UREM
287^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
288
289These each perform their respective integer arithmetic on a scalar.
290
291.. code-block:: none
292
293  %dst:_(s32) = G_ADD %src0:_(s32), %src1:_(s32)
294
295The above example adds %src1 to %src0 and stores the result in %dst.
296
297G_SDIVREM, G_UDIVREM
298^^^^^^^^^^^^^^^^^^^^
299
300Perform integer division and remainder thereby producing two results.
301
302.. code-block:: none
303
304  %div:_(s32), %rem:_(s32) = G_SDIVREM %0:_(s32), %1:_(s32)
305
306G_SADDSAT, G_UADDSAT, G_SSUBSAT, G_USUBSAT, G_SSHLSAT, G_USHLSAT
307^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
308
309Signed and unsigned addition, subtraction and left shift with saturation.
310
311.. code-block:: none
312
313  %2:_(s32) = G_SADDSAT %0:_(s32), %1:_(s32)
314
315G_SHL, G_LSHR, G_ASHR
316^^^^^^^^^^^^^^^^^^^^^
317
318Shift the bits of a scalar left or right inserting zeros (sign-bit for G_ASHR).
319
320G_ROTR, G_ROTL
321^^^^^^^^^^^^^^
322
323Rotate the bits right (G_ROTR) or left (G_ROTL).
324
325G_ICMP
326^^^^^^
327
328Perform integer comparison producing non-zero (true) or zero (false). It's
329target specific whether a true value is 1, ~0U, or some other non-zero value.
330
331G_SELECT
332^^^^^^^^
333
334Select between two values depending on a zero/non-zero value.
335
336.. code-block:: none
337
338  %5:_(s32) = G_SELECT %4(s1), %6, %2
339
340G_PTR_ADD
341^^^^^^^^^
342
343Add a scalar offset in addressible units to a pointer. Addressible units are
344typically bytes but this may vary between targets.
345
346.. code-block:: none
347
348  %1:_(p0) = G_PTR_ADD %0:_(p0), %1:_(s32)
349
350.. caution::
351
352  There are currently no in-tree targets that use this with addressable units
353  not equal to 8 bit.
354
355G_PTRMASK
356^^^^^^^^^^
357
358Zero out an arbitrary mask of bits of a pointer. The mask type must be
359an integer, and the number of vector elements must match for all
360operands. This corresponds to `i_intr_llvm_ptrmask`.
361
362.. code-block:: none
363
364  %2:_(p0) = G_PTRMASK %0, %1
365
366G_SMIN, G_SMAX, G_UMIN, G_UMAX
367^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
368
369Take the minimum/maximum of two values.
370
371.. code-block:: none
372
373  %5:_(s32) = G_SMIN %6, %2
374
375G_ABS
376^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
377
378Take the absolute value of a signed integer. The absolute value of the minimum
379negative value (e.g. the 8-bit value `0x80`) is defined to be itself.
380
381.. code-block:: none
382
383  %1:_(s32) = G_ABS %0
384
385G_UADDO, G_SADDO, G_USUBO, G_SSUBO, G_SMULO, G_UMULO
386^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
387
388Perform the requested arithmetic and produce a carry output in addition to the
389normal result.
390
391.. code-block:: none
392
393  %3:_(s32), %4:_(s1) = G_UADDO %0, %1
394
395G_UADDE, G_SADDE, G_USUBE, G_SSUBE
396^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
397
398Perform the requested arithmetic and consume a carry input in addition to the
399normal input. Also produce a carry output in addition to the normal result.
400
401.. code-block:: none
402
403  %4:_(s32), %5:_(s1) = G_UADDE %0, %1, %3:_(s1)
404
405G_UMULH, G_SMULH
406^^^^^^^^^^^^^^^^
407
408Multiply two numbers at twice the incoming bit width (unsigned or signed) and
409return the high half of the result.
410
411.. code-block:: none
412
413  %3:_(s32) = G_UMULH %0, %1
414
415G_CTLZ, G_CTTZ, G_CTPOP
416^^^^^^^^^^^^^^^^^^^^^^^
417
418Count leading zeros, trailing zeros, or number of set bits.
419
420.. code-block:: none
421
422  %2:_(s33) = G_CTLZ_ZERO_UNDEF %1
423  %2:_(s33) = G_CTTZ_ZERO_UNDEF %1
424  %2:_(s33) = G_CTPOP %1
425
426G_CTLZ_ZERO_UNDEF, G_CTTZ_ZERO_UNDEF
427^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
428
429Count leading zeros or trailing zeros. If the value is zero then the result is
430undefined.
431
432.. code-block:: none
433
434  %2:_(s33) = G_CTLZ_ZERO_UNDEF %1
435  %2:_(s33) = G_CTTZ_ZERO_UNDEF %1
436
437Floating Point Operations
438-------------------------
439
440G_FCMP
441^^^^^^
442
443Perform floating point comparison producing non-zero (true) or zero
444(false). It's target specific whether a true value is 1, ~0U, or some other
445non-zero value.
446
447G_FNEG
448^^^^^^
449
450Floating point negation.
451
452G_FPEXT
453^^^^^^^
454
455Convert a floating point value to a larger type.
456
457G_FPTRUNC
458^^^^^^^^^
459
460Convert a floating point value to a narrower type.
461
462G_FPTOSI, G_FPTOUI, G_SITOFP, G_UITOFP
463^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
464
465Convert between integer and floating point.
466
467G_FABS
468^^^^^^
469
470Take the absolute value of a floating point value.
471
472G_FCOPYSIGN
473^^^^^^^^^^^
474
475Copy the value of the first operand, replacing the sign bit with that of the
476second operand.
477
478G_FCANONICALIZE
479^^^^^^^^^^^^^^^
480
481See :ref:`i_intr_llvm_canonicalize`.
482
483G_IS_FPCLASS
484^^^^^^^^^^^^
485
486Tests if the first operand, which must be floating-point scalar or vector, has
487floating-point class specified by the second operand. Returns non-zero (true)
488or zero (false). It's target specific whether a true value is 1, ~0U, or some
489other non-zero value. If the first operand is a vector, the returned value is a
490vector of the same length.
491
492G_FMINNUM
493^^^^^^^^^
494
495Perform floating-point minimum on two values.
496
497In the case where a single input is a NaN (either signaling or quiet),
498the non-NaN input is returned.
499
500The return value of (FMINNUM 0.0, -0.0) could be either 0.0 or -0.0.
501
502G_FMAXNUM
503^^^^^^^^^
504
505Perform floating-point maximum on two values.
506
507In the case where a single input is a NaN (either signaling or quiet),
508the non-NaN input is returned.
509
510The return value of (FMAXNUM 0.0, -0.0) could be either 0.0 or -0.0.
511
512G_FMINNUM_IEEE
513^^^^^^^^^^^^^^
514
515Perform floating-point minimum on two values, following the IEEE-754 2008
516definition. This differs from FMINNUM in the handling of signaling NaNs. If one
517input is a signaling NaN, returns a quiet NaN.
518
519G_FMAXNUM_IEEE
520^^^^^^^^^^^^^^
521
522Perform floating-point maximum on two values, following the IEEE-754 2008
523definition. This differs from FMAXNUM in the handling of signaling NaNs. If one
524input is a signaling NaN, returns a quiet NaN.
525
526G_FMINIMUM
527^^^^^^^^^^
528
529NaN-propagating minimum that also treat -0.0 as less than 0.0. While
530FMINNUM_IEEE follow IEEE 754-2008 semantics, FMINIMUM follows IEEE 754-2018
531draft semantics.
532
533G_FMAXIMUM
534^^^^^^^^^^
535
536NaN-propagating maximum that also treat -0.0 as less than 0.0. While
537FMAXNUM_IEEE follow IEEE 754-2008 semantics, FMAXIMUM follows IEEE 754-2018
538draft semantics.
539
540G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FREM
541^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
542
543Perform the specified floating point arithmetic.
544
545G_FMA
546^^^^^
547
548Perform a fused multiply add (i.e. without the intermediate rounding step).
549
550G_FMAD
551^^^^^^
552
553Perform a non-fused multiply add (i.e. with the intermediate rounding step).
554
555G_FPOW
556^^^^^^
557
558Raise the first operand to the power of the second.
559
560G_FEXP, G_FEXP2
561^^^^^^^^^^^^^^^
562
563Calculate the base-e or base-2 exponential of a value
564
565G_FLOG, G_FLOG2, G_FLOG10
566^^^^^^^^^^^^^^^^^^^^^^^^^
567
568Calculate the base-e, base-2, or base-10 respectively.
569
570G_FCEIL, G_FCOS, G_FSIN, G_FSQRT, G_FFLOOR, G_FRINT, G_FNEARBYINT
571^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
572
573These correspond to the standard C functions of the same name.
574
575G_INTRINSIC_TRUNC
576^^^^^^^^^^^^^^^^^
577
578Returns the operand rounded to the nearest integer not larger in magnitude than the operand.
579
580G_INTRINSIC_ROUND
581^^^^^^^^^^^^^^^^^
582
583Returns the operand rounded to the nearest integer.
584
585G_LROUND, G_LLROUND
586^^^^^^^^^^^^^^^^^^^
587
588Returns the source operand rounded to the nearest integer with ties away from
589zero.
590
591See the LLVM LangRef entry on '``llvm.lround.*'`` for details on behaviour.
592
593.. code-block:: none
594
595  %rounded_32:_(s32) = G_LROUND %round_me:_(s64)
596  %rounded_64:_(s64) = G_LLROUND %round_me:_(s64)
597
598Vector Specific Operations
599--------------------------
600
601G_CONCAT_VECTORS
602^^^^^^^^^^^^^^^^
603
604Concatenate two vectors to form a longer vector.
605
606G_BUILD_VECTOR, G_BUILD_VECTOR_TRUNC
607^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
608
609Create a vector from multiple scalar registers. No implicit
610conversion is performed (i.e. the result element type must be the
611same as all source operands)
612
613The _TRUNC version truncates the larger operand types to fit the
614destination vector elt type.
615
616G_INSERT_VECTOR_ELT
617^^^^^^^^^^^^^^^^^^^
618
619Insert an element into a vector
620
621G_EXTRACT_VECTOR_ELT
622^^^^^^^^^^^^^^^^^^^^
623
624Extract an element from a vector
625
626G_SHUFFLE_VECTOR
627^^^^^^^^^^^^^^^^
628
629Concatenate two vectors and shuffle the elements according to the mask operand.
630The mask operand should be an IR Constant which exactly matches the
631corresponding mask for the IR shufflevector instruction.
632
633Vector Reduction Operations
634---------------------------
635
636These operations represent horizontal vector reduction, producing a scalar result.
637
638G_VECREDUCE_SEQ_FADD, G_VECREDUCE_SEQ_FMUL
639^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
640
641The SEQ variants perform reductions in sequential order. The first operand is
642an initial scalar accumulator value, and the second operand is the vector to reduce.
643
644G_VECREDUCE_FADD, G_VECREDUCE_FMUL
645^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
646
647These reductions are relaxed variants which may reduce the elements in any order.
648
649G_VECREDUCE_FMAX, G_VECREDUCE_FMIN
650^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
651
652FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
653
654
655Integer/bitwise reductions
656^^^^^^^^^^^^^^^^^^^^^^^^^^
657
658* G_VECREDUCE_ADD
659* G_VECREDUCE_MUL
660* G_VECREDUCE_AND
661* G_VECREDUCE_OR
662* G_VECREDUCE_XOR
663* G_VECREDUCE_SMAX
664* G_VECREDUCE_SMIN
665* G_VECREDUCE_UMAX
666* G_VECREDUCE_UMIN
667
668Integer reductions may have a result type larger than the vector element type.
669However, the reduction is performed using the vector element type and the value
670in the top bits is unspecified.
671
672Memory Operations
673-----------------
674
675G_LOAD, G_SEXTLOAD, G_ZEXTLOAD
676^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
677
678Generic load. Expects a MachineMemOperand in addition to explicit
679operands. If the result size is larger than the memory size, the
680high bits are undefined, sign-extended, or zero-extended respectively.
681
682Only G_LOAD is valid if the result is a vector type. If the result is larger
683than the memory size, the high elements are undefined (i.e. this is not a
684per-element, vector anyextload)
685
686Unlike in SelectionDAG, atomic loads are expressed with the same
687opcodes as regular loads. G_LOAD, G_SEXTLOAD and G_ZEXTLOAD may all
688have atomic memory operands.
689
690G_INDEXED_LOAD
691^^^^^^^^^^^^^^
692
693Generic indexed load. Combines a GEP with a load. $newaddr is set to $base + $offset.
694If $am is 0 (post-indexed), then the value is loaded from $base; if $am is 1 (pre-indexed)
695then the value is loaded from $newaddr.
696
697G_INDEXED_SEXTLOAD
698^^^^^^^^^^^^^^^^^^
699
700Same as G_INDEXED_LOAD except that the load performed is sign-extending, as with G_SEXTLOAD.
701
702G_INDEXED_ZEXTLOAD
703^^^^^^^^^^^^^^^^^^
704
705Same as G_INDEXED_LOAD except that the load performed is zero-extending, as with G_ZEXTLOAD.
706
707G_STORE
708^^^^^^^
709
710Generic store. Expects a MachineMemOperand in addition to explicit
711operands. If the stored value size is greater than the memory size,
712the high bits are implicitly truncated. If this is a vector store, the
713high elements are discarded (i.e. this does not function as a per-lane
714vector, truncating store)
715
716G_INDEXED_STORE
717^^^^^^^^^^^^^^^
718
719Combines a store with a GEP. See description of G_INDEXED_LOAD for indexing behaviour.
720
721G_ATOMIC_CMPXCHG_WITH_SUCCESS
722^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
723
724Generic atomic cmpxchg with internal success check. Expects a
725MachineMemOperand in addition to explicit operands.
726
727G_ATOMIC_CMPXCHG
728^^^^^^^^^^^^^^^^
729
730Generic atomic cmpxchg. Expects a MachineMemOperand in addition to explicit
731operands.
732
733G_ATOMICRMW_XCHG, G_ATOMICRMW_ADD, G_ATOMICRMW_SUB, G_ATOMICRMW_AND,
734G_ATOMICRMW_NAND, G_ATOMICRMW_OR, G_ATOMICRMW_XOR, G_ATOMICRMW_MAX,
735G_ATOMICRMW_MIN, G_ATOMICRMW_UMAX, G_ATOMICRMW_UMIN, G_ATOMICRMW_FADD,
736G_ATOMICRMW_FSUB, G_ATOMICRMW_FMAX, G_ATOMICRMW_FMIN
737^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
738
739Generic atomicrmw. Expects a MachineMemOperand in addition to explicit
740operands.
741
742G_FENCE
743^^^^^^^
744
745.. caution::
746
747  I couldn't find any documentation on this at the time of writing.
748
749G_MEMCPY
750^^^^^^^^
751
752Generic memcpy. Expects two MachineMemOperands covering the store and load
753respectively, in addition to explicit operands.
754
755G_MEMCPY_INLINE
756^^^^^^^^^^^^^^^
757
758Generic inlined memcpy. Like G_MEMCPY, but it is guaranteed that this version
759will not be lowered as a call to an external function. Currently the size
760operand is required to evaluate as a constant (not an immediate), though that is
761expected to change when llvm.memcpy.inline is taught to support dynamic sizes.
762
763G_MEMMOVE
764^^^^^^^^^
765
766Generic memmove. Similar to G_MEMCPY, but the source and destination memory
767ranges are allowed to overlap.
768
769G_MEMSET
770^^^^^^^^
771
772Generic memset. Expects a MachineMemOperand in addition to explicit operands.
773
774G_BZERO
775^^^^^^^
776
777Generic bzero. Expects a MachineMemOperand in addition to explicit operands.
778
779Control Flow
780------------
781
782G_PHI
783^^^^^
784
785Implement the φ node in the SSA graph representing the function.
786
787.. code-block:: none
788
789  %dst(s8) = G_PHI %src1(s8), %bb.<id1>, %src2(s8), %bb.<id2>
790
791G_BR
792^^^^
793
794Unconditional branch
795
796.. code-block:: none
797
798  G_BR %bb.<id>
799
800G_BRCOND
801^^^^^^^^
802
803Conditional branch
804
805.. code-block:: none
806
807  G_BRCOND %condition, %basicblock.<id>
808
809G_BRINDIRECT
810^^^^^^^^^^^^
811
812Indirect branch
813
814.. code-block:: none
815
816  G_BRINDIRECT %src(p0)
817
818G_BRJT
819^^^^^^
820
821Indirect branch to jump table entry
822
823.. code-block:: none
824
825  G_BRJT %ptr(p0), %jti, %idx(s64)
826
827G_JUMP_TABLE
828^^^^^^^^^^^^
829
830Generates a pointer to the address of the jump table specified by the source
831operand. The source operand is a jump table index.
832G_JUMP_TABLE can be used in conjunction with G_BRJT to support jump table
833codegen with GlobalISel.
834
835.. code-block:: none
836
837  %dst:_(p0) = G_JUMP_TABLE %jump-table.0
838
839The above example generates a pointer to the source jump table index.
840
841G_INVOKE_REGION_START
842^^^^^^^^^^^^^^^^^^^^^
843
844A marker instruction that acts as a pseudo-terminator for regions of code that may
845throw exceptions. Being a terminator, it prevents code from being inserted after
846it during passes like legalization. This is needed because calls to exception
847throw routines do not return, so no code that must be on an executable path must
848be placed after throwing.
849
850G_INTRINSIC, G_INTRINSIC_W_SIDE_EFFECTS
851^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
852
853Call an intrinsic
854
855The _W_SIDE_EFFECTS version is considered to have unknown side-effects and
856as such cannot be reordered across other side-effecting instructions.
857
858.. note::
859
860  Unlike SelectionDAG, there is no _VOID variant. Both of these are permitted
861  to have zero, one, or multiple results.
862
863Variadic Arguments
864------------------
865
866G_VASTART
867^^^^^^^^^
868
869.. caution::
870
871  I found no documentation for this instruction at the time of writing.
872
873G_VAARG
874^^^^^^^
875
876.. caution::
877
878  I found no documentation for this instruction at the time of writing.
879
880Other Operations
881----------------
882
883G_DYN_STACKALLOC
884^^^^^^^^^^^^^^^^
885
886Dynamically realigns the stack pointer to the specified size and alignment.
887An alignment value of `0` or `1` means no specific alignment.
888
889.. code-block:: none
890
891  %8:_(p0) = G_DYN_STACKALLOC %7(s64), 32
892
893Optimization Hints
894------------------
895
896These instructions do not correspond to any target instructions. They act as
897hints for various combines.
898
899G_ASSERT_SEXT, G_ASSERT_ZEXT
900^^^^^^^^^^^^^^^^^^^^^^^^^^^^
901
902This signifies that the contents of a register were previously extended from a
903smaller type.
904
905The smaller type is denoted using an immediate operand. For scalars, this is the
906width of the entire smaller type. For vectors, this is the width of the smaller
907element type.
908
909.. code-block:: none
910
911  %x_was_zexted:_(s32) = G_ASSERT_ZEXT %x(s32), 16
912  %y_was_zexted:_(<2 x s32>) = G_ASSERT_ZEXT %y(<2 x s32>), 16
913
914  %z_was_sexted:_(s32) = G_ASSERT_SEXT %z(s32), 8
915
916G_ASSERT_SEXT and G_ASSERT_ZEXT act like copies, albeit with some restrictions.
917
918The source and destination registers must
919
920- Be virtual
921- Belong to the same register class
922- Belong to the same register bank
923
924It should always be safe to
925
926- Look through the source register
927- Replace the destination register with the source register
928