1ad0dfb0aSDaniel Sanders
2ad0dfb0aSDaniel Sanders.. _gmir-opcodes:
3ad0dfb0aSDaniel Sanders
4ad0dfb0aSDaniel SandersGeneric Opcodes
5ad0dfb0aSDaniel Sanders===============
6ad0dfb0aSDaniel Sanders
7ad0dfb0aSDaniel Sanders.. contents::
8ad0dfb0aSDaniel Sanders   :local:
9ad0dfb0aSDaniel Sanders
10ad0dfb0aSDaniel Sanders.. note::
11ad0dfb0aSDaniel Sanders
12ad0dfb0aSDaniel Sanders  This documentation does not yet fully account for vectors. Many of the
13ad0dfb0aSDaniel Sanders  scalar/integer/floating-point operations can also take vectors.
14ad0dfb0aSDaniel Sanders
15ad0dfb0aSDaniel SandersConstants
16ad0dfb0aSDaniel Sanders---------
17ad0dfb0aSDaniel Sanders
18ad0dfb0aSDaniel SandersG_IMPLICIT_DEF
19ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^
20ad0dfb0aSDaniel Sanders
21ad0dfb0aSDaniel SandersAn undefined value.
22ad0dfb0aSDaniel Sanders
23ad0dfb0aSDaniel Sanders.. code-block:: none
24ad0dfb0aSDaniel Sanders
25ad0dfb0aSDaniel Sanders  %0:_(s32) = G_IMPLICIT_DEF
26ad0dfb0aSDaniel Sanders
27ad0dfb0aSDaniel SandersG_CONSTANT
28ad0dfb0aSDaniel Sanders^^^^^^^^^^
29ad0dfb0aSDaniel Sanders
30ad0dfb0aSDaniel SandersAn integer constant.
31ad0dfb0aSDaniel Sanders
32ad0dfb0aSDaniel Sanders.. code-block:: none
33ad0dfb0aSDaniel Sanders
34ad0dfb0aSDaniel Sanders  %0:_(s32) = G_CONSTANT i32 1
35ad0dfb0aSDaniel Sanders
36ad0dfb0aSDaniel SandersG_FCONSTANT
37ad0dfb0aSDaniel Sanders^^^^^^^^^^^
38ad0dfb0aSDaniel Sanders
39ad0dfb0aSDaniel SandersA floating point constant.
40ad0dfb0aSDaniel Sanders
41ad0dfb0aSDaniel Sanders.. code-block:: none
42ad0dfb0aSDaniel Sanders
43ad0dfb0aSDaniel Sanders  %0:_(s32) = G_FCONSTANT float 1.0
44ad0dfb0aSDaniel Sanders
45ad0dfb0aSDaniel SandersG_FRAME_INDEX
46ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^
47ad0dfb0aSDaniel Sanders
48ad0dfb0aSDaniel SandersThe address of an object in the stack frame.
49ad0dfb0aSDaniel Sanders
50ad0dfb0aSDaniel Sanders.. code-block:: none
51ad0dfb0aSDaniel Sanders
52ad0dfb0aSDaniel Sanders  %1:_(p0) = G_FRAME_INDEX %stack.0.ptr0
53ad0dfb0aSDaniel Sanders
54ad0dfb0aSDaniel SandersG_GLOBAL_VALUE
55ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^
56ad0dfb0aSDaniel Sanders
57ad0dfb0aSDaniel SandersThe address of a global value.
58ad0dfb0aSDaniel Sanders
59ad0dfb0aSDaniel Sanders.. code-block:: none
60ad0dfb0aSDaniel Sanders
61ad0dfb0aSDaniel Sanders  %0(p0) = G_GLOBAL_VALUE @var_local
62ad0dfb0aSDaniel Sanders
63ad0dfb0aSDaniel SandersG_BLOCK_ADDR
64ad0dfb0aSDaniel Sanders^^^^^^^^^^^^
65ad0dfb0aSDaniel Sanders
66ad0dfb0aSDaniel SandersThe address of a basic block.
67ad0dfb0aSDaniel Sanders
68ad0dfb0aSDaniel Sanders.. code-block:: none
69ad0dfb0aSDaniel Sanders
70ad0dfb0aSDaniel Sanders  %0:_(p0) = G_BLOCK_ADDR blockaddress(@test_blockaddress, %ir-block.block)
71ad0dfb0aSDaniel Sanders
72ad0dfb0aSDaniel SandersInteger Extension and Truncation
73ad0dfb0aSDaniel Sanders--------------------------------
74ad0dfb0aSDaniel Sanders
75ad0dfb0aSDaniel SandersG_ANYEXT
76ad0dfb0aSDaniel Sanders^^^^^^^^
77ad0dfb0aSDaniel Sanders
78ad0dfb0aSDaniel SandersExtend the underlying scalar type of an operation, leaving the high bits
79ad0dfb0aSDaniel Sandersunspecified.
80ad0dfb0aSDaniel Sanders
81ad0dfb0aSDaniel Sanders.. code-block:: none
82ad0dfb0aSDaniel Sanders
83ad0dfb0aSDaniel Sanders  %1:_(s32) = G_ANYEXT %0:_(s16)
84ad0dfb0aSDaniel Sanders
85ad0dfb0aSDaniel SandersG_SEXT
86ad0dfb0aSDaniel Sanders^^^^^^
87ad0dfb0aSDaniel Sanders
88ad0dfb0aSDaniel SandersSign extend the underlying scalar type of an operation, copying the sign bit
89ad0dfb0aSDaniel Sandersinto the newly-created space.
90ad0dfb0aSDaniel Sanders
91ad0dfb0aSDaniel Sanders.. code-block:: none
92ad0dfb0aSDaniel Sanders
93ad0dfb0aSDaniel Sanders  %1:_(s32) = G_SEXT %0:_(s16)
94ad0dfb0aSDaniel Sanders
95ad0dfb0aSDaniel SandersG_SEXT_INREG
96ad0dfb0aSDaniel Sanders^^^^^^^^^^^^
97ad0dfb0aSDaniel Sanders
98e0dd8f36SDaniel SandersSign extend the value from an arbitrary bit position, copying the sign bit
99ad0dfb0aSDaniel Sandersinto all bits above it. This is equivalent to a shl + ashr pair with an
100ad0dfb0aSDaniel Sandersappropriate shift amount. $sz is an immediate (MachineOperand::isImm()
101ad0dfb0aSDaniel Sandersreturns true) to allow targets to have some bitwidths legal and others
102ad0dfb0aSDaniel Sanderslowered. This opcode is particularly useful if the target has sign-extension
103ad0dfb0aSDaniel Sandersinstructions that are cheaper than the constituent shifts as the optimizer is
104ad0dfb0aSDaniel Sandersable to make decisions on whether it's better to hang on to the G_SEXT_INREG
105ad0dfb0aSDaniel Sandersor to lower it and optimize the individual shifts.
106ad0dfb0aSDaniel Sanders
107ad0dfb0aSDaniel Sanders.. code-block:: none
108ad0dfb0aSDaniel Sanders
109ad0dfb0aSDaniel Sanders  %1:_(s32) = G_SEXT_INREG %0:_(s32), 16
110ad0dfb0aSDaniel Sanders
111ad0dfb0aSDaniel SandersG_ZEXT
112ad0dfb0aSDaniel Sanders^^^^^^
113ad0dfb0aSDaniel Sanders
114ad0dfb0aSDaniel SandersZero extend the underlying scalar type of an operation, putting zero bits
115ad0dfb0aSDaniel Sandersinto the newly-created space.
116ad0dfb0aSDaniel Sanders
117ad0dfb0aSDaniel Sanders.. code-block:: none
118ad0dfb0aSDaniel Sanders
119ad0dfb0aSDaniel Sanders  %1:_(s32) = G_ZEXT %0:_(s16)
120ad0dfb0aSDaniel Sanders
121ad0dfb0aSDaniel SandersG_TRUNC
122ad0dfb0aSDaniel Sanders^^^^^^^
123ad0dfb0aSDaniel Sanders
124ad0dfb0aSDaniel SandersTruncate the underlying scalar type of an operation. This is equivalent to
125ad0dfb0aSDaniel SandersG_EXTRACT for scalar types, but acts elementwise on vectors.
126ad0dfb0aSDaniel Sanders
127ad0dfb0aSDaniel Sanders.. code-block:: none
128ad0dfb0aSDaniel Sanders
129ad0dfb0aSDaniel Sanders  %1:_(s16) = G_TRUNC %0:_(s32)
130ad0dfb0aSDaniel Sanders
131ad0dfb0aSDaniel SandersType Conversions
132ad0dfb0aSDaniel Sanders----------------
133ad0dfb0aSDaniel Sanders
134ad0dfb0aSDaniel SandersG_INTTOPTR
135ad0dfb0aSDaniel Sanders^^^^^^^^^^
136ad0dfb0aSDaniel Sanders
137ad0dfb0aSDaniel SandersConvert an integer to a pointer.
138ad0dfb0aSDaniel Sanders
139ad0dfb0aSDaniel Sanders.. code-block:: none
140ad0dfb0aSDaniel Sanders
141ad0dfb0aSDaniel Sanders  %1:_(p0) = G_INTTOPTR %0:_(s32)
142ad0dfb0aSDaniel Sanders
143ad0dfb0aSDaniel SandersG_PTRTOINT
144ad0dfb0aSDaniel Sanders^^^^^^^^^^
145ad0dfb0aSDaniel Sanders
146e334a3a6SHans WennborgConvert a pointer to an integer.
147ad0dfb0aSDaniel Sanders
148ad0dfb0aSDaniel Sanders.. code-block:: none
149ad0dfb0aSDaniel Sanders
150ad0dfb0aSDaniel Sanders  %1:_(s32) = G_PTRTOINT %0:_(p0)
151ad0dfb0aSDaniel Sanders
152ad0dfb0aSDaniel SandersG_BITCAST
153ad0dfb0aSDaniel Sanders^^^^^^^^^
154ad0dfb0aSDaniel Sanders
15559ce6ffeSMatt ArsenaultReinterpret a value as a new type. This is usually done without
156a31b3893SKazu Hiratachanging any bits but this is not always the case due a subtlety in the
15759ce6ffeSMatt Arsenaultdefinition of the :ref:`LLVM-IR Bitcast Instruction <i_bitcast>`. It
15859ce6ffeSMatt Arsenaultis allowed to bitcast between pointers with the same size, but
15959ce6ffeSMatt Arsenaultdifferent address spaces.
160ad0dfb0aSDaniel Sanders
161ad0dfb0aSDaniel Sanders.. code-block:: none
162ad0dfb0aSDaniel Sanders
163ad0dfb0aSDaniel Sanders  %1:_(s64) = G_BITCAST %0:_(<2 x s32>)
164ad0dfb0aSDaniel Sanders
165ad0dfb0aSDaniel SandersG_ADDRSPACE_CAST
166ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^
167ad0dfb0aSDaniel Sanders
168ad0dfb0aSDaniel SandersConvert a pointer to an address space to a pointer to another address space.
169ad0dfb0aSDaniel Sanders
170ad0dfb0aSDaniel Sanders.. code-block:: none
171ad0dfb0aSDaniel Sanders
172ad0dfb0aSDaniel Sanders  %1:_(p1) = G_ADDRSPACE_CAST %0:_(p0)
173ad0dfb0aSDaniel Sanders
174ad0dfb0aSDaniel Sanders.. caution::
175ad0dfb0aSDaniel Sanders
176ad0dfb0aSDaniel Sanders  :ref:`i_addrspacecast` doesn't mention what happens if the cast is simply
177ad0dfb0aSDaniel Sanders  invalid (i.e. if the address spaces are disjoint).
178ad0dfb0aSDaniel Sanders
179ad0dfb0aSDaniel SandersScalar Operations
180ad0dfb0aSDaniel Sanders-----------------
181ad0dfb0aSDaniel Sanders
182ad0dfb0aSDaniel SandersG_EXTRACT
183ad0dfb0aSDaniel Sanders^^^^^^^^^
184ad0dfb0aSDaniel Sanders
185ad0dfb0aSDaniel SandersExtract a register of the specified size, starting from the block given by
186ad0dfb0aSDaniel Sandersindex. This will almost certainly be mapped to sub-register COPYs after
187ad0dfb0aSDaniel Sandersregister banks have been selected.
188ad0dfb0aSDaniel Sanders
189e4eec519SSushma Unnibhavi.. code-block:: none
190e4eec519SSushma Unnibhavi
191e4eec519SSushma Unnibhavi  %3:_(s32) = G_EXTRACT %2:_(s64), 32
192e4eec519SSushma Unnibhavi
193ad0dfb0aSDaniel SandersG_INSERT
194ad0dfb0aSDaniel Sanders^^^^^^^^
195ad0dfb0aSDaniel Sanders
196ad0dfb0aSDaniel SandersInsert a smaller register into a larger one at the specified bit-index.
197ad0dfb0aSDaniel Sanders
198e4eec519SSushma Unnibhavi.. code-block:: none
199e4eec519SSushma Unnibhavi
200e4eec519SSushma Unnibhavi  %2:_(s64) = G_INSERT %0:(_s64), %1:_(s32), 0
201e4eec519SSushma Unnibhavi
202ad0dfb0aSDaniel SandersG_MERGE_VALUES
203ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^
204ad0dfb0aSDaniel Sanders
205ad0dfb0aSDaniel SandersConcatenate multiple registers of the same size into a wider register.
206ad0dfb0aSDaniel SandersThe input operands are always ordered from lowest bits to highest:
207ad0dfb0aSDaniel Sanders
208ad0dfb0aSDaniel Sanders.. code-block:: none
209ad0dfb0aSDaniel Sanders
210ad0dfb0aSDaniel Sanders  %0:(s32) = G_MERGE_VALUES %bits_0_7:(s8), %bits_8_15:(s8),
211ad0dfb0aSDaniel Sanders                            %bits_16_23:(s8), %bits_24_31:(s8)
212ad0dfb0aSDaniel Sanders
213ad0dfb0aSDaniel SandersG_UNMERGE_VALUES
214ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^
215ad0dfb0aSDaniel Sanders
216e0dd8f36SDaniel SandersExtract multiple registers of the specified size, starting from blocks given by
217ad0dfb0aSDaniel Sandersindexes. This will almost certainly be mapped to sub-register COPYs after
218ad0dfb0aSDaniel Sandersregister banks have been selected.
219ad0dfb0aSDaniel SandersThe output operands are always ordered from lowest bits to highest:
220ad0dfb0aSDaniel Sanders
221ad0dfb0aSDaniel Sanders.. code-block:: none
222ad0dfb0aSDaniel Sanders
223ad0dfb0aSDaniel Sanders  %bits_0_7:(s8), %bits_8_15:(s8),
224ad0dfb0aSDaniel Sanders      %bits_16_23:(s8), %bits_24_31:(s8) = G_UNMERGE_VALUES %0:(s32)
225ad0dfb0aSDaniel Sanders
226ad0dfb0aSDaniel SandersG_BSWAP
227ad0dfb0aSDaniel Sanders^^^^^^^
228ad0dfb0aSDaniel Sanders
229e0dd8f36SDaniel SandersReverse the order of the bytes in a scalar.
230ad0dfb0aSDaniel Sanders
231ad0dfb0aSDaniel Sanders.. code-block:: none
232ad0dfb0aSDaniel Sanders
233ad0dfb0aSDaniel Sanders  %1:_(s32) = G_BSWAP %0:_(s32)
234ad0dfb0aSDaniel Sanders
235ad0dfb0aSDaniel SandersG_BITREVERSE
236ad0dfb0aSDaniel Sanders^^^^^^^^^^^^
237ad0dfb0aSDaniel Sanders
238e0dd8f36SDaniel SandersReverse the order of the bits in a scalar.
239ad0dfb0aSDaniel Sanders
240ad0dfb0aSDaniel Sanders.. code-block:: none
241ad0dfb0aSDaniel Sanders
242ad0dfb0aSDaniel Sanders  %1:_(s32) = G_BITREVERSE %0:_(s32)
243ad0dfb0aSDaniel Sanders
2444773dd5bSJessica PaquetteG_SBFX, G_UBFX
2454773dd5bSJessica Paquette^^^^^^^^^^^^^^
2464773dd5bSJessica Paquette
2474773dd5bSJessica PaquetteExtract a range of bits from a register.
2484773dd5bSJessica Paquette
2494773dd5bSJessica PaquetteThe source operands are registers as follows:
2504773dd5bSJessica Paquette
2514773dd5bSJessica Paquette- Source
2524773dd5bSJessica Paquette- The least-significant bit for the extraction
2534773dd5bSJessica Paquette- The width of the extraction
2544773dd5bSJessica Paquette
255927b8097SBrendon CahoonThe least-significant bit (lsb) and width operands are in the range:
256927b8097SBrendon Cahoon
257927b8097SBrendon Cahoon::
258927b8097SBrendon Cahoon
259927b8097SBrendon Cahoon      0 <= lsb < lsb + width <= source bitwidth, where all values are unsigned
260927b8097SBrendon Cahoon
2614773dd5bSJessica PaquetteG_SBFX sign-extends the result, while G_UBFX zero-extends the result.
2624773dd5bSJessica Paquette
2634773dd5bSJessica Paquette.. code-block:: none
2644773dd5bSJessica Paquette
2654773dd5bSJessica Paquette  ; Extract 5 bits starting at bit 1 from %x and store them in %a.
2664773dd5bSJessica Paquette  ; Sign-extend the result.
2674773dd5bSJessica Paquette  ;
2684773dd5bSJessica Paquette  ; Example:
2694773dd5bSJessica Paquette  ; %x = 0...0000[10110]1 ---> %a = 1...111111[10110]
2704773dd5bSJessica Paquette  %lsb_one = G_CONSTANT i32 1
2714773dd5bSJessica Paquette  %width_five = G_CONSTANT i32 5
2724773dd5bSJessica Paquette  %a:_(s32) = G_SBFX %x, %lsb_one, %width_five
2734773dd5bSJessica Paquette
2744773dd5bSJessica Paquette  ; Extract 3 bits starting at bit 2 from %x and store them in %b. Zero-extend
2754773dd5bSJessica Paquette  ; the result.
2764773dd5bSJessica Paquette  ;
2774773dd5bSJessica Paquette  ; Example:
2784773dd5bSJessica Paquette  ; %x = 1...11111[100]11 ---> %b = 0...00000[100]
2794773dd5bSJessica Paquette  %lsb_two = G_CONSTANT i32 2
2804773dd5bSJessica Paquette  %width_three = G_CONSTANT i32 3
2814773dd5bSJessica Paquette  %b:_(s32) = G_UBFX %x, %lsb_two, %width_three
2824773dd5bSJessica Paquette
283ad0dfb0aSDaniel SandersInteger Operations
284ad0dfb0aSDaniel Sanders-------------------
285ad0dfb0aSDaniel Sanders
286ad0dfb0aSDaniel SandersG_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR, G_SDIV, G_UDIV, G_SREM, G_UREM
287ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
288ad0dfb0aSDaniel Sanders
289ad0dfb0aSDaniel SandersThese each perform their respective integer arithmetic on a scalar.
290ad0dfb0aSDaniel Sanders
291ad0dfb0aSDaniel Sanders.. code-block:: none
292ad0dfb0aSDaniel Sanders
293460d2208Spooja2299  %dst:_(s32) = G_ADD %src0:_(s32), %src1:_(s32)
294460d2208Spooja2299
2955294a0f7SKazu HirataThe above example adds %src1 to %src0 and stores the result in %dst.
296ad0dfb0aSDaniel Sanders
2974c6ab48fSChristudasan DevadasanG_SDIVREM, G_UDIVREM
2984c6ab48fSChristudasan Devadasan^^^^^^^^^^^^^^^^^^^^
2994c6ab48fSChristudasan Devadasan
3004c6ab48fSChristudasan DevadasanPerform integer division and remainder thereby producing two results.
3014c6ab48fSChristudasan Devadasan
3024c6ab48fSChristudasan Devadasan.. code-block:: none
3034c6ab48fSChristudasan Devadasan
3044c6ab48fSChristudasan Devadasan  %div:_(s32), %rem:_(s32) = G_SDIVREM %0:_(s32), %1:_(s32)
3054c6ab48fSChristudasan Devadasan
3065de6c56fSBevin HanssonG_SADDSAT, G_UADDSAT, G_SSUBSAT, G_USUBSAT, G_SSHLSAT, G_USHLSAT
3075de6c56fSBevin Hansson^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3080444d16aSJay Foad
3095de6c56fSBevin HanssonSigned and unsigned addition, subtraction and left shift with saturation.
3100444d16aSJay Foad
3110444d16aSJay Foad.. code-block:: none
3120444d16aSJay Foad
3130444d16aSJay Foad  %2:_(s32) = G_SADDSAT %0:_(s32), %1:_(s32)
3140444d16aSJay Foad
315ad0dfb0aSDaniel SandersG_SHL, G_LSHR, G_ASHR
316ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^
317ad0dfb0aSDaniel Sanders
318ad0dfb0aSDaniel SandersShift the bits of a scalar left or right inserting zeros (sign-bit for G_ASHR).
319ad0dfb0aSDaniel Sanders
32055533203SAmara EmersonG_ROTR, G_ROTL
32155533203SAmara Emerson^^^^^^^^^^^^^^
32255533203SAmara Emerson
32355533203SAmara EmersonRotate the bits right (G_ROTR) or left (G_ROTL).
32455533203SAmara Emerson
325ad0dfb0aSDaniel SandersG_ICMP
326ad0dfb0aSDaniel Sanders^^^^^^
327ad0dfb0aSDaniel Sanders
328ad0dfb0aSDaniel SandersPerform integer comparison producing non-zero (true) or zero (false). It's
329ad0dfb0aSDaniel Sanderstarget specific whether a true value is 1, ~0U, or some other non-zero value.
330ad0dfb0aSDaniel Sanders
331ad0dfb0aSDaniel SandersG_SELECT
332ad0dfb0aSDaniel Sanders^^^^^^^^
333ad0dfb0aSDaniel Sanders
334ad0dfb0aSDaniel SandersSelect between two values depending on a zero/non-zero value.
335ad0dfb0aSDaniel Sanders
336ad0dfb0aSDaniel Sanders.. code-block:: none
337ad0dfb0aSDaniel Sanders
338ad0dfb0aSDaniel Sanders  %5:_(s32) = G_SELECT %4(s1), %6, %2
339ad0dfb0aSDaniel Sanders
340ad0dfb0aSDaniel SandersG_PTR_ADD
341ad0dfb0aSDaniel Sanders^^^^^^^^^
342ad0dfb0aSDaniel Sanders
343e0dd8f36SDaniel SandersAdd a scalar offset in addressible units to a pointer. Addressible units are
344e0dd8f36SDaniel Sanderstypically bytes but this may vary between targets.
345ad0dfb0aSDaniel Sanders
346ad0dfb0aSDaniel Sanders.. code-block:: none
347ad0dfb0aSDaniel Sanders
348e0dd8f36SDaniel Sanders  %1:_(p0) = G_PTR_ADD %0:_(p0), %1:_(s32)
349e0dd8f36SDaniel Sanders
350e0dd8f36SDaniel Sanders.. caution::
351e0dd8f36SDaniel Sanders
352e0dd8f36SDaniel Sanders  There are currently no in-tree targets that use this with addressable units
353e0dd8f36SDaniel Sanders  not equal to 8 bit.
354ad0dfb0aSDaniel Sanders
3558bc03d21SMatt ArsenaultG_PTRMASK
356ad0dfb0aSDaniel Sanders^^^^^^^^^^
357ad0dfb0aSDaniel Sanders
3588bc03d21SMatt ArsenaultZero out an arbitrary mask of bits of a pointer. The mask type must be
3598bc03d21SMatt Arsenaultan integer, and the number of vector elements must match for all
360019d7a32SDjordje Todorovicoperands. This corresponds to `i_intr_llvm_ptrmask`.
361ad0dfb0aSDaniel Sanders
362ad0dfb0aSDaniel Sanders.. code-block:: none
363ad0dfb0aSDaniel Sanders
3648bc03d21SMatt Arsenault  %2:_(p0) = G_PTRMASK %0, %1
365ad0dfb0aSDaniel Sanders
366ad0dfb0aSDaniel SandersG_SMIN, G_SMAX, G_UMIN, G_UMAX
367ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
368ad0dfb0aSDaniel Sanders
369ad0dfb0aSDaniel SandersTake the minimum/maximum of two values.
370ad0dfb0aSDaniel Sanders
371ad0dfb0aSDaniel Sanders.. code-block:: none
372ad0dfb0aSDaniel Sanders
373ad0dfb0aSDaniel Sanders  %5:_(s32) = G_SMIN %6, %2
374ad0dfb0aSDaniel Sanders
375fa2b836eSJay FoadG_ABS
376fa2b836eSJay Foad^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
377fa2b836eSJay Foad
378fa2b836eSJay FoadTake the absolute value of a signed integer. The absolute value of the minimum
379fa2b836eSJay Foadnegative value (e.g. the 8-bit value `0x80`) is defined to be itself.
380fa2b836eSJay Foad
381fa2b836eSJay Foad.. code-block:: none
382fa2b836eSJay Foad
383fa2b836eSJay Foad  %1:_(s32) = G_ABS %0
384fa2b836eSJay Foad
385ad0dfb0aSDaniel SandersG_UADDO, G_SADDO, G_USUBO, G_SSUBO, G_SMULO, G_UMULO
386ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
387ad0dfb0aSDaniel Sanders
388ad0dfb0aSDaniel SandersPerform the requested arithmetic and produce a carry output in addition to the
389ad0dfb0aSDaniel Sandersnormal result.
390ad0dfb0aSDaniel Sanders
391ad0dfb0aSDaniel Sanders.. code-block:: none
392ad0dfb0aSDaniel Sanders
393ad0dfb0aSDaniel Sanders  %3:_(s32), %4:_(s1) = G_UADDO %0, %1
394ad0dfb0aSDaniel Sanders
395ad0dfb0aSDaniel SandersG_UADDE, G_SADDE, G_USUBE, G_SSUBE
396ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
397ad0dfb0aSDaniel Sanders
398ad0dfb0aSDaniel SandersPerform the requested arithmetic and consume a carry input in addition to the
399ad0dfb0aSDaniel Sandersnormal input. Also produce a carry output in addition to the normal result.
400ad0dfb0aSDaniel Sanders
401ad0dfb0aSDaniel Sanders.. code-block:: none
402ad0dfb0aSDaniel Sanders
403e0dd8f36SDaniel Sanders  %4:_(s32), %5:_(s1) = G_UADDE %0, %1, %3:_(s1)
404ad0dfb0aSDaniel Sanders
405ad0dfb0aSDaniel SandersG_UMULH, G_SMULH
406ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^
407ad0dfb0aSDaniel Sanders
40838bb4652SNicolai HähnleMultiply two numbers at twice the incoming bit width (unsigned or signed) and
40938bb4652SNicolai Hähnlereturn the high half of the result.
410ad0dfb0aSDaniel Sanders
411ad0dfb0aSDaniel Sanders.. code-block:: none
412ad0dfb0aSDaniel Sanders
413e0dd8f36SDaniel Sanders  %3:_(s32) = G_UMULH %0, %1
414ad0dfb0aSDaniel Sanders
415ad0dfb0aSDaniel SandersG_CTLZ, G_CTTZ, G_CTPOP
416ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^
417ad0dfb0aSDaniel Sanders
418e0dd8f36SDaniel SandersCount leading zeros, trailing zeros, or number of set bits.
419e0dd8f36SDaniel Sanders
420e0dd8f36SDaniel Sanders.. code-block:: none
421e0dd8f36SDaniel Sanders
422e0dd8f36SDaniel Sanders  %2:_(s33) = G_CTLZ_ZERO_UNDEF %1
423e0dd8f36SDaniel Sanders  %2:_(s33) = G_CTTZ_ZERO_UNDEF %1
424e0dd8f36SDaniel Sanders  %2:_(s33) = G_CTPOP %1
425ad0dfb0aSDaniel Sanders
426ad0dfb0aSDaniel SandersG_CTLZ_ZERO_UNDEF, G_CTTZ_ZERO_UNDEF
427ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
428ad0dfb0aSDaniel Sanders
429ad0dfb0aSDaniel SandersCount leading zeros or trailing zeros. If the value is zero then the result is
430ad0dfb0aSDaniel Sandersundefined.
431ad0dfb0aSDaniel Sanders
432e0dd8f36SDaniel Sanders.. code-block:: none
433e0dd8f36SDaniel Sanders
434e0dd8f36SDaniel Sanders  %2:_(s33) = G_CTLZ_ZERO_UNDEF %1
435e0dd8f36SDaniel Sanders  %2:_(s33) = G_CTTZ_ZERO_UNDEF %1
436e0dd8f36SDaniel Sanders
437ad0dfb0aSDaniel SandersFloating Point Operations
438ad0dfb0aSDaniel Sanders-------------------------
439ad0dfb0aSDaniel Sanders
440ad0dfb0aSDaniel SandersG_FCMP
441ad0dfb0aSDaniel Sanders^^^^^^
442ad0dfb0aSDaniel Sanders
443ad0dfb0aSDaniel SandersPerform floating point comparison producing non-zero (true) or zero
444ad0dfb0aSDaniel Sanders(false). It's target specific whether a true value is 1, ~0U, or some other
445ad0dfb0aSDaniel Sandersnon-zero value.
446ad0dfb0aSDaniel Sanders
447ad0dfb0aSDaniel SandersG_FNEG
448ad0dfb0aSDaniel Sanders^^^^^^
449ad0dfb0aSDaniel Sanders
450e0dd8f36SDaniel SandersFloating point negation.
451ad0dfb0aSDaniel Sanders
452ad0dfb0aSDaniel SandersG_FPEXT
453ad0dfb0aSDaniel Sanders^^^^^^^
454ad0dfb0aSDaniel Sanders
455e0dd8f36SDaniel SandersConvert a floating point value to a larger type.
456ad0dfb0aSDaniel Sanders
457ad0dfb0aSDaniel SandersG_FPTRUNC
458ad0dfb0aSDaniel Sanders^^^^^^^^^
459ad0dfb0aSDaniel Sanders
460e0dd8f36SDaniel SandersConvert a floating point value to a narrower type.
461ad0dfb0aSDaniel Sanders
462ad0dfb0aSDaniel SandersG_FPTOSI, G_FPTOUI, G_SITOFP, G_UITOFP
463ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
464ad0dfb0aSDaniel Sanders
465e0dd8f36SDaniel SandersConvert between integer and floating point.
466ad0dfb0aSDaniel Sanders
467ad0dfb0aSDaniel SandersG_FABS
468ad0dfb0aSDaniel Sanders^^^^^^
469ad0dfb0aSDaniel Sanders
470e0dd8f36SDaniel SandersTake the absolute value of a floating point value.
471ad0dfb0aSDaniel Sanders
472ad0dfb0aSDaniel SandersG_FCOPYSIGN
473ad0dfb0aSDaniel Sanders^^^^^^^^^^^
474ad0dfb0aSDaniel Sanders
475ad0dfb0aSDaniel SandersCopy the value of the first operand, replacing the sign bit with that of the
476ad0dfb0aSDaniel Sanderssecond operand.
477ad0dfb0aSDaniel Sanders
478ad0dfb0aSDaniel SandersG_FCANONICALIZE
479ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^
480ad0dfb0aSDaniel Sanders
481e0dd8f36SDaniel SandersSee :ref:`i_intr_llvm_canonicalize`.
482ad0dfb0aSDaniel Sanders
483bdd0093fSSerge PavlovG_IS_FPCLASS
484bdd0093fSSerge Pavlov^^^^^^^^^^^^
485bdd0093fSSerge Pavlov
486bdd0093fSSerge PavlovTests if the first operand, which must be floating-point scalar or vector, has
487bdd0093fSSerge Pavlovfloating-point class specified by the second operand. The third operand
488bdd0093fSSerge Pavlovspecifies floating-point semantics of the tested value. Returns non-zero (true)
489bdd0093fSSerge Pavlovor zero (false). It's target specific whether a true value is 1, ~0U, or some
490bdd0093fSSerge Pavlovother non-zero value. If the first operand is a vector, the returned value is a
491bdd0093fSSerge Pavlovvector of the same length.
492bdd0093fSSerge Pavlov
493ad0dfb0aSDaniel SandersG_FMINNUM
494ad0dfb0aSDaniel Sanders^^^^^^^^^
495ad0dfb0aSDaniel Sanders
496ad0dfb0aSDaniel SandersPerform floating-point minimum on two values.
497ad0dfb0aSDaniel Sanders
498ad0dfb0aSDaniel SandersIn the case where a single input is a NaN (either signaling or quiet),
499ad0dfb0aSDaniel Sandersthe non-NaN input is returned.
500ad0dfb0aSDaniel Sanders
501ad0dfb0aSDaniel SandersThe return value of (FMINNUM 0.0, -0.0) could be either 0.0 or -0.0.
502ad0dfb0aSDaniel Sanders
503ad0dfb0aSDaniel SandersG_FMAXNUM
504ad0dfb0aSDaniel Sanders^^^^^^^^^
505ad0dfb0aSDaniel Sanders
506ad0dfb0aSDaniel SandersPerform floating-point maximum on two values.
507ad0dfb0aSDaniel Sanders
508ad0dfb0aSDaniel SandersIn the case where a single input is a NaN (either signaling or quiet),
509ad0dfb0aSDaniel Sandersthe non-NaN input is returned.
510ad0dfb0aSDaniel Sanders
511ad0dfb0aSDaniel SandersThe return value of (FMAXNUM 0.0, -0.0) could be either 0.0 or -0.0.
512ad0dfb0aSDaniel Sanders
513ad0dfb0aSDaniel SandersG_FMINNUM_IEEE
514ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^
515ad0dfb0aSDaniel Sanders
516ad0dfb0aSDaniel SandersPerform floating-point minimum on two values, following the IEEE-754 2008
517ad0dfb0aSDaniel Sandersdefinition. This differs from FMINNUM in the handling of signaling NaNs. If one
518ad0dfb0aSDaniel Sandersinput is a signaling NaN, returns a quiet NaN.
519ad0dfb0aSDaniel Sanders
520ad0dfb0aSDaniel SandersG_FMAXNUM_IEEE
521ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^
522ad0dfb0aSDaniel Sanders
523ad0dfb0aSDaniel SandersPerform floating-point maximum on two values, following the IEEE-754 2008
524ad0dfb0aSDaniel Sandersdefinition. This differs from FMAXNUM in the handling of signaling NaNs. If one
525ad0dfb0aSDaniel Sandersinput is a signaling NaN, returns a quiet NaN.
526ad0dfb0aSDaniel Sanders
527ad0dfb0aSDaniel SandersG_FMINIMUM
528ad0dfb0aSDaniel Sanders^^^^^^^^^^
529ad0dfb0aSDaniel Sanders
530ad0dfb0aSDaniel SandersNaN-propagating minimum that also treat -0.0 as less than 0.0. While
531ad0dfb0aSDaniel SandersFMINNUM_IEEE follow IEEE 754-2008 semantics, FMINIMUM follows IEEE 754-2018
532ad0dfb0aSDaniel Sandersdraft semantics.
533ad0dfb0aSDaniel Sanders
534ad0dfb0aSDaniel SandersG_FMAXIMUM
535ad0dfb0aSDaniel Sanders^^^^^^^^^^
536ad0dfb0aSDaniel Sanders
537ad0dfb0aSDaniel SandersNaN-propagating maximum that also treat -0.0 as less than 0.0. While
538ad0dfb0aSDaniel SandersFMAXNUM_IEEE follow IEEE 754-2008 semantics, FMAXIMUM follows IEEE 754-2018
539ad0dfb0aSDaniel Sandersdraft semantics.
540ad0dfb0aSDaniel Sanders
541ad0dfb0aSDaniel SandersG_FADD, G_FSUB, G_FMUL, G_FDIV, G_FREM
542ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
543ad0dfb0aSDaniel Sanders
544ad0dfb0aSDaniel SandersPerform the specified floating point arithmetic.
545ad0dfb0aSDaniel Sanders
546ad0dfb0aSDaniel SandersG_FMA
547ad0dfb0aSDaniel Sanders^^^^^
548ad0dfb0aSDaniel Sanders
549e0dd8f36SDaniel SandersPerform a fused multiply add (i.e. without the intermediate rounding step).
550ad0dfb0aSDaniel Sanders
551ad0dfb0aSDaniel SandersG_FMAD
552ad0dfb0aSDaniel Sanders^^^^^^
553ad0dfb0aSDaniel Sanders
554e0dd8f36SDaniel SandersPerform a non-fused multiply add (i.e. with the intermediate rounding step).
555ad0dfb0aSDaniel Sanders
556ad0dfb0aSDaniel SandersG_FPOW
557ad0dfb0aSDaniel Sanders^^^^^^
558ad0dfb0aSDaniel Sanders
559ad0dfb0aSDaniel SandersRaise the first operand to the power of the second.
560ad0dfb0aSDaniel Sanders
561ad0dfb0aSDaniel SandersG_FEXP, G_FEXP2
562ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^
563ad0dfb0aSDaniel Sanders
564ad0dfb0aSDaniel SandersCalculate the base-e or base-2 exponential of a value
565ad0dfb0aSDaniel Sanders
566ad0dfb0aSDaniel SandersG_FLOG, G_FLOG2, G_FLOG10
567ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^
568ad0dfb0aSDaniel Sanders
569ad0dfb0aSDaniel SandersCalculate the base-e, base-2, or base-10 respectively.
570ad0dfb0aSDaniel Sanders
571ad0dfb0aSDaniel SandersG_FCEIL, G_FCOS, G_FSIN, G_FSQRT, G_FFLOOR, G_FRINT, G_FNEARBYINT
572ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
573ad0dfb0aSDaniel Sanders
574ad0dfb0aSDaniel SandersThese correspond to the standard C functions of the same name.
575ad0dfb0aSDaniel Sanders
576ad0dfb0aSDaniel SandersG_INTRINSIC_TRUNC
577ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^
578ad0dfb0aSDaniel Sanders
579ad0dfb0aSDaniel SandersReturns the operand rounded to the nearest integer not larger in magnitude than the operand.
580ad0dfb0aSDaniel Sanders
581ad0dfb0aSDaniel SandersG_INTRINSIC_ROUND
582ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^
583ad0dfb0aSDaniel Sanders
584ad0dfb0aSDaniel SandersReturns the operand rounded to the nearest integer.
585ad0dfb0aSDaniel Sanders
586af8e09d4SJessica PaquetteG_LROUND, G_LLROUND
587af8e09d4SJessica Paquette^^^^^^^^^^^^^^^^^^^
58831189264SJessica Paquette
58931189264SJessica PaquetteReturns the source operand rounded to the nearest integer with ties away from
59031189264SJessica Paquettezero.
59131189264SJessica Paquette
59231189264SJessica PaquetteSee the LLVM LangRef entry on '``llvm.lround.*'`` for details on behaviour.
59331189264SJessica Paquette
59431189264SJessica Paquette.. code-block:: none
59531189264SJessica Paquette
59631189264SJessica Paquette  %rounded_32:_(s32) = G_LROUND %round_me:_(s64)
597af8e09d4SJessica Paquette  %rounded_64:_(s64) = G_LLROUND %round_me:_(s64)
59831189264SJessica Paquette
599ad0dfb0aSDaniel SandersVector Specific Operations
600ad0dfb0aSDaniel Sanders--------------------------
601ad0dfb0aSDaniel Sanders
602ad0dfb0aSDaniel SandersG_CONCAT_VECTORS
603ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^
604ad0dfb0aSDaniel Sanders
605ad0dfb0aSDaniel SandersConcatenate two vectors to form a longer vector.
606ad0dfb0aSDaniel Sanders
607ad0dfb0aSDaniel SandersG_BUILD_VECTOR, G_BUILD_VECTOR_TRUNC
608ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
609ad0dfb0aSDaniel Sanders
610ad0dfb0aSDaniel SandersCreate a vector from multiple scalar registers. No implicit
611ad0dfb0aSDaniel Sandersconversion is performed (i.e. the result element type must be the
612ad0dfb0aSDaniel Sanderssame as all source operands)
613ad0dfb0aSDaniel Sanders
614ad0dfb0aSDaniel SandersThe _TRUNC version truncates the larger operand types to fit the
615ad0dfb0aSDaniel Sandersdestination vector elt type.
616ad0dfb0aSDaniel Sanders
617ad0dfb0aSDaniel SandersG_INSERT_VECTOR_ELT
618ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^
619ad0dfb0aSDaniel Sanders
620ad0dfb0aSDaniel SandersInsert an element into a vector
621ad0dfb0aSDaniel Sanders
622ad0dfb0aSDaniel SandersG_EXTRACT_VECTOR_ELT
623ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^
624ad0dfb0aSDaniel Sanders
625ad0dfb0aSDaniel SandersExtract an element from a vector
626ad0dfb0aSDaniel Sanders
627ad0dfb0aSDaniel SandersG_SHUFFLE_VECTOR
628ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^
629ad0dfb0aSDaniel Sanders
630ad0dfb0aSDaniel SandersConcatenate two vectors and shuffle the elements according to the mask operand.
631ad0dfb0aSDaniel SandersThe mask operand should be an IR Constant which exactly matches the
632ad0dfb0aSDaniel Sanderscorresponding mask for the IR shufflevector instruction.
633ad0dfb0aSDaniel Sanders
634283b4d6bSAmara EmersonVector Reduction Operations
635283b4d6bSAmara Emerson---------------------------
636283b4d6bSAmara Emerson
637283b4d6bSAmara EmersonThese operations represent horizontal vector reduction, producing a scalar result.
638283b4d6bSAmara Emerson
639283b4d6bSAmara EmersonG_VECREDUCE_SEQ_FADD, G_VECREDUCE_SEQ_FMUL
640283b4d6bSAmara Emerson^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
641283b4d6bSAmara Emerson
642283b4d6bSAmara EmersonThe SEQ variants perform reductions in sequential order. The first operand is
643283b4d6bSAmara Emersonan initial scalar accumulator value, and the second operand is the vector to reduce.
644283b4d6bSAmara Emerson
645283b4d6bSAmara EmersonG_VECREDUCE_FADD, G_VECREDUCE_FMUL
646283b4d6bSAmara Emerson^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
647283b4d6bSAmara Emerson
648283b4d6bSAmara EmersonThese reductions are relaxed variants which may reduce the elements in any order.
649283b4d6bSAmara Emerson
650283b4d6bSAmara EmersonG_VECREDUCE_FMAX, G_VECREDUCE_FMIN
651283b4d6bSAmara Emerson^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
652283b4d6bSAmara Emerson
653283b4d6bSAmara EmersonFMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
654283b4d6bSAmara Emerson
655283b4d6bSAmara Emerson
656283b4d6bSAmara EmersonInteger/bitwise reductions
657283b4d6bSAmara Emerson^^^^^^^^^^^^^^^^^^^^^^^^^^
658283b4d6bSAmara Emerson
659283b4d6bSAmara Emerson* G_VECREDUCE_ADD
660283b4d6bSAmara Emerson* G_VECREDUCE_MUL
661283b4d6bSAmara Emerson* G_VECREDUCE_AND
662283b4d6bSAmara Emerson* G_VECREDUCE_OR
663283b4d6bSAmara Emerson* G_VECREDUCE_XOR
664283b4d6bSAmara Emerson* G_VECREDUCE_SMAX
665283b4d6bSAmara Emerson* G_VECREDUCE_SMIN
666283b4d6bSAmara Emerson* G_VECREDUCE_UMAX
667283b4d6bSAmara Emerson* G_VECREDUCE_UMIN
668283b4d6bSAmara Emerson
669283b4d6bSAmara EmersonInteger reductions may have a result type larger than the vector element type.
670283b4d6bSAmara EmersonHowever, the reduction is performed using the vector element type and the value
671283b4d6bSAmara Emersonin the top bits is unspecified.
672283b4d6bSAmara Emerson
673ad0dfb0aSDaniel SandersMemory Operations
674ad0dfb0aSDaniel Sanders-----------------
675ad0dfb0aSDaniel Sanders
676ad0dfb0aSDaniel SandersG_LOAD, G_SEXTLOAD, G_ZEXTLOAD
677ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
678ad0dfb0aSDaniel Sanders
679ad0dfb0aSDaniel SandersGeneric load. Expects a MachineMemOperand in addition to explicit
680ad0dfb0aSDaniel Sandersoperands. If the result size is larger than the memory size, the
681ad0dfb0aSDaniel Sandershigh bits are undefined, sign-extended, or zero-extended respectively.
682ad0dfb0aSDaniel Sanders
683ad0dfb0aSDaniel SandersOnly G_LOAD is valid if the result is a vector type. If the result is larger
684ad0dfb0aSDaniel Sandersthan the memory size, the high elements are undefined (i.e. this is not a
685ad0dfb0aSDaniel Sandersper-element, vector anyextload)
686ad0dfb0aSDaniel Sanders
687*1ee6ce9bSMatt ArsenaultUnlike in SelectionDAG, atomic loads are expressed with the same
688*1ee6ce9bSMatt Arsenaultopcodes as regular loads. G_LOAD, G_SEXTLOAD and G_ZEXTLOAD may all
689*1ee6ce9bSMatt Arsenaulthave atomic memory operands.
690*1ee6ce9bSMatt Arsenault
691ad0dfb0aSDaniel SandersG_INDEXED_LOAD
692ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^
693ad0dfb0aSDaniel Sanders
694ad0dfb0aSDaniel SandersGeneric indexed load. Combines a GEP with a load. $newaddr is set to $base + $offset.
695ad0dfb0aSDaniel SandersIf $am is 0 (post-indexed), then the value is loaded from $base; if $am is 1 (pre-indexed)
696ad0dfb0aSDaniel Sandersthen the value is loaded from $newaddr.
697ad0dfb0aSDaniel Sanders
698ad0dfb0aSDaniel SandersG_INDEXED_SEXTLOAD
699ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^
700ad0dfb0aSDaniel Sanders
701ad0dfb0aSDaniel SandersSame as G_INDEXED_LOAD except that the load performed is sign-extending, as with G_SEXTLOAD.
702ad0dfb0aSDaniel Sanders
703ad0dfb0aSDaniel SandersG_INDEXED_ZEXTLOAD
704ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^
705ad0dfb0aSDaniel Sanders
706ad0dfb0aSDaniel SandersSame as G_INDEXED_LOAD except that the load performed is zero-extending, as with G_ZEXTLOAD.
707ad0dfb0aSDaniel Sanders
708ad0dfb0aSDaniel SandersG_STORE
709ad0dfb0aSDaniel Sanders^^^^^^^
710ad0dfb0aSDaniel Sanders
7118e3307f5SMatt ArsenaultGeneric store. Expects a MachineMemOperand in addition to explicit
7128e3307f5SMatt Arsenaultoperands. If the stored value size is greater than the memory size,
7138e3307f5SMatt Arsenaultthe high bits are implicitly truncated. If this is a vector store, the
7148e3307f5SMatt Arsenaulthigh elements are discarded (i.e. this does not function as a per-lane
7158e3307f5SMatt Arsenaultvector, truncating store)
716ad0dfb0aSDaniel Sanders
717ad0dfb0aSDaniel SandersG_INDEXED_STORE
718ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^
719ad0dfb0aSDaniel Sanders
720ad0dfb0aSDaniel SandersCombines a store with a GEP. See description of G_INDEXED_LOAD for indexing behaviour.
721ad0dfb0aSDaniel Sanders
722ad0dfb0aSDaniel SandersG_ATOMIC_CMPXCHG_WITH_SUCCESS
723ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
724ad0dfb0aSDaniel Sanders
725ad0dfb0aSDaniel SandersGeneric atomic cmpxchg with internal success check. Expects a
726ad0dfb0aSDaniel SandersMachineMemOperand in addition to explicit operands.
727ad0dfb0aSDaniel Sanders
728ad0dfb0aSDaniel SandersG_ATOMIC_CMPXCHG
729ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^
730ad0dfb0aSDaniel Sanders
731ad0dfb0aSDaniel SandersGeneric atomic cmpxchg. Expects a MachineMemOperand in addition to explicit
732ad0dfb0aSDaniel Sandersoperands.
733ad0dfb0aSDaniel Sanders
7341023ddafSShilei TianG_ATOMICRMW_XCHG, G_ATOMICRMW_ADD, G_ATOMICRMW_SUB, G_ATOMICRMW_AND,
7351023ddafSShilei TianG_ATOMICRMW_NAND, G_ATOMICRMW_OR, G_ATOMICRMW_XOR, G_ATOMICRMW_MAX,
7361023ddafSShilei TianG_ATOMICRMW_MIN, G_ATOMICRMW_UMAX, G_ATOMICRMW_UMIN, G_ATOMICRMW_FADD,
7371023ddafSShilei TianG_ATOMICRMW_FSUB, G_ATOMICRMW_FMAX, G_ATOMICRMW_FMIN
738ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
739ad0dfb0aSDaniel Sanders
740ad0dfb0aSDaniel SandersGeneric atomicrmw. Expects a MachineMemOperand in addition to explicit
741ad0dfb0aSDaniel Sandersoperands.
742ad0dfb0aSDaniel Sanders
743ad0dfb0aSDaniel SandersG_FENCE
744ad0dfb0aSDaniel Sanders^^^^^^^
745ad0dfb0aSDaniel Sanders
746ad0dfb0aSDaniel Sanders.. caution::
747ad0dfb0aSDaniel Sanders
748ad0dfb0aSDaniel Sanders  I couldn't find any documentation on this at the time of writing.
749ad0dfb0aSDaniel Sanders
750a6428724SJon RoelofsG_MEMCPY
751a6428724SJon Roelofs^^^^^^^^
752a6428724SJon Roelofs
753a6428724SJon RoelofsGeneric memcpy. Expects two MachineMemOperands covering the store and load
754a6428724SJon Roelofsrespectively, in addition to explicit operands.
755a6428724SJon Roelofs
756a6428724SJon RoelofsG_MEMCPY_INLINE
757a6428724SJon Roelofs^^^^^^^^^^^^^^^
758a6428724SJon Roelofs
759a6428724SJon RoelofsGeneric inlined memcpy. Like G_MEMCPY, but it is guaranteed that this version
760a6428724SJon Roelofswill not be lowered as a call to an external function. Currently the size
761a6428724SJon Roelofsoperand is required to evaluate as a constant (not an immediate), though that is
762a6428724SJon Roelofsexpected to change when llvm.memcpy.inline is taught to support dynamic sizes.
763a6428724SJon Roelofs
764a6428724SJon RoelofsG_MEMMOVE
765a6428724SJon Roelofs^^^^^^^^^
766a6428724SJon Roelofs
767a6428724SJon RoelofsGeneric memmove. Similar to G_MEMCPY, but the source and destination memory
768a6428724SJon Roelofsranges are allowed to overlap.
769a6428724SJon Roelofs
770a6428724SJon RoelofsG_MEMSET
771a6428724SJon Roelofs^^^^^^^^
772a6428724SJon Roelofs
773a6428724SJon RoelofsGeneric memset. Expects a MachineMemOperand in addition to explicit operands.
774a6428724SJon Roelofs
775a6428724SJon RoelofsG_BZERO
776a6428724SJon Roelofs^^^^^^^
777a6428724SJon Roelofs
778a6428724SJon RoelofsGeneric bzero. Expects a MachineMemOperand in addition to explicit operands.
779a6428724SJon Roelofs
780ad0dfb0aSDaniel SandersControl Flow
781ad0dfb0aSDaniel Sanders------------
782ad0dfb0aSDaniel Sanders
783ad0dfb0aSDaniel SandersG_PHI
784ad0dfb0aSDaniel Sanders^^^^^
785ad0dfb0aSDaniel Sanders
786ad0dfb0aSDaniel SandersImplement the φ node in the SSA graph representing the function.
787ad0dfb0aSDaniel Sanders
788ad0dfb0aSDaniel Sanders.. code-block:: none
789ad0dfb0aSDaniel Sanders
790460d2208Spooja2299  %dst(s8) = G_PHI %src1(s8), %bb.<id1>, %src2(s8), %bb.<id2>
791ad0dfb0aSDaniel Sanders
792ad0dfb0aSDaniel SandersG_BR
793ad0dfb0aSDaniel Sanders^^^^
794ad0dfb0aSDaniel Sanders
795ad0dfb0aSDaniel SandersUnconditional branch
796ad0dfb0aSDaniel Sanders
797460d2208Spooja2299.. code-block:: none
798ad28ff71Spooja2299
799460d2208Spooja2299  G_BR %bb.<id>
800460d2208Spooja2299
801ad0dfb0aSDaniel SandersG_BRCOND
802ad0dfb0aSDaniel Sanders^^^^^^^^
803ad0dfb0aSDaniel Sanders
804ad0dfb0aSDaniel SandersConditional branch
805ad0dfb0aSDaniel Sanders
806460d2208Spooja2299.. code-block:: none
807ad28ff71Spooja2299
808460d2208Spooja2299  G_BRCOND %condition, %basicblock.<id>
809460d2208Spooja2299
810ad0dfb0aSDaniel SandersG_BRINDIRECT
811ad0dfb0aSDaniel Sanders^^^^^^^^^^^^
812ad0dfb0aSDaniel Sanders
813ad0dfb0aSDaniel SandersIndirect branch
814ad0dfb0aSDaniel Sanders
815460d2208Spooja2299.. code-block:: none
816ad28ff71Spooja2299
817460d2208Spooja2299  G_BRINDIRECT %src(p0)
818460d2208Spooja2299
819ad0dfb0aSDaniel SandersG_BRJT
820ad0dfb0aSDaniel Sanders^^^^^^
821ad0dfb0aSDaniel Sanders
822ad0dfb0aSDaniel SandersIndirect branch to jump table entry
823ad0dfb0aSDaniel Sanders
824460d2208Spooja2299.. code-block:: none
825ad28ff71Spooja2299
826460d2208Spooja2299  G_BRJT %ptr(p0), %jti, %idx(s64)
827460d2208Spooja2299
828ad0dfb0aSDaniel SandersG_JUMP_TABLE
829ad0dfb0aSDaniel Sanders^^^^^^^^^^^^
830ad0dfb0aSDaniel Sanders
831843da6f4Spooja2299Generates a pointer to the address of the jump table specified by the source
832843da6f4Spooja2299operand. The source operand is a jump table index.
833843da6f4Spooja2299G_JUMP_TABLE can be used in conjunction with G_BRJT to support jump table
834843da6f4Spooja2299codegen with GlobalISel.
835ad0dfb0aSDaniel Sanders
836843da6f4Spooja2299.. code-block:: none
837843da6f4Spooja2299
838843da6f4Spooja2299  %dst:_(p0) = G_JUMP_TABLE %jump-table.0
839843da6f4Spooja2299
840843da6f4Spooja2299The above example generates a pointer to the source jump table index.
841843da6f4Spooja2299
842ad0dfb0aSDaniel Sanders
843ad0dfb0aSDaniel SandersG_INTRINSIC, G_INTRINSIC_W_SIDE_EFFECTS
844ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
845ad0dfb0aSDaniel Sanders
846ad0dfb0aSDaniel SandersCall an intrinsic
847ad0dfb0aSDaniel Sanders
848ad0dfb0aSDaniel SandersThe _W_SIDE_EFFECTS version is considered to have unknown side-effects and
849f65d4aa9SKazuaki Ishizakias such cannot be reordered across other side-effecting instructions.
850ad0dfb0aSDaniel Sanders
851ad0dfb0aSDaniel Sanders.. note::
852ad0dfb0aSDaniel Sanders
853ad0dfb0aSDaniel Sanders  Unlike SelectionDAG, there is no _VOID variant. Both of these are permitted
854ad0dfb0aSDaniel Sanders  to have zero, one, or multiple results.
855ad0dfb0aSDaniel Sanders
856ad0dfb0aSDaniel SandersVariadic Arguments
857ad0dfb0aSDaniel Sanders------------------
858ad0dfb0aSDaniel Sanders
859ad0dfb0aSDaniel SandersG_VASTART
860ad0dfb0aSDaniel Sanders^^^^^^^^^
861ad0dfb0aSDaniel Sanders
862ad0dfb0aSDaniel Sanders.. caution::
863ad0dfb0aSDaniel Sanders
864ad0dfb0aSDaniel Sanders  I found no documentation for this instruction at the time of writing.
865ad0dfb0aSDaniel Sanders
866ad0dfb0aSDaniel SandersG_VAARG
867ad0dfb0aSDaniel Sanders^^^^^^^
868ad0dfb0aSDaniel Sanders
869ad0dfb0aSDaniel Sanders.. caution::
870ad0dfb0aSDaniel Sanders
871ad0dfb0aSDaniel Sanders  I found no documentation for this instruction at the time of writing.
872ad0dfb0aSDaniel Sanders
873ad0dfb0aSDaniel SandersOther Operations
874ad0dfb0aSDaniel Sanders----------------
875ad0dfb0aSDaniel Sanders
876ad0dfb0aSDaniel SandersG_DYN_STACKALLOC
877ad0dfb0aSDaniel Sanders^^^^^^^^^^^^^^^^
878ad0dfb0aSDaniel Sanders
8799f5c7868SGuillaume ChateletDynamically realigns the stack pointer to the specified size and alignment.
880002c6c11SSushma UnnibhaviAn alignment value of `0` or `1` means no specific alignment.
881ad0dfb0aSDaniel Sanders
882ad0dfb0aSDaniel Sanders.. code-block:: none
883ad0dfb0aSDaniel Sanders
884ad0dfb0aSDaniel Sanders  %8:_(p0) = G_DYN_STACKALLOC %7(s64), 32
88524261729SJessica Paquette
88624261729SJessica PaquetteOptimization Hints
88724261729SJessica Paquette------------------
88824261729SJessica Paquette
88924261729SJessica PaquetteThese instructions do not correspond to any target instructions. They act as
89024261729SJessica Paquettehints for various combines.
89124261729SJessica Paquette
89260aa6464SJessica PaquetteG_ASSERT_SEXT, G_ASSERT_ZEXT
8930d829802SDjordje Todorovic^^^^^^^^^^^^^^^^^^^^^^^^^^^^
89424261729SJessica Paquette
895002c6c11SSushma UnnibhaviThis signifies that the contents of a register were previously extended from a
89624261729SJessica Paquettesmaller type.
89724261729SJessica Paquette
89824261729SJessica PaquetteThe smaller type is denoted using an immediate operand. For scalars, this is the
89924261729SJessica Paquettewidth of the entire smaller type. For vectors, this is the width of the smaller
90024261729SJessica Paquetteelement type.
90124261729SJessica Paquette
90224261729SJessica Paquette.. code-block:: none
90324261729SJessica Paquette
90460aa6464SJessica Paquette  %x_was_zexted:_(s32) = G_ASSERT_ZEXT %x(s32), 16
90560aa6464SJessica Paquette  %y_was_zexted:_(<2 x s32>) = G_ASSERT_ZEXT %y(<2 x s32>), 16
90624261729SJessica Paquette
90760aa6464SJessica Paquette  %z_was_sexted:_(s32) = G_ASSERT_SEXT %z(s32), 8
90860aa6464SJessica Paquette
90960aa6464SJessica PaquetteG_ASSERT_SEXT and G_ASSERT_ZEXT act like copies, albeit with some restrictions.
91024261729SJessica Paquette
91124261729SJessica PaquetteThe source and destination registers must
91224261729SJessica Paquette
91324261729SJessica Paquette- Be virtual
91424261729SJessica Paquette- Belong to the same register class
91524261729SJessica Paquette- Belong to the same register bank
91624261729SJessica Paquette
91724261729SJessica PaquetteIt should always be safe to
91824261729SJessica Paquette
91924261729SJessica Paquette- Look through the source register
92024261729SJessica Paquette- Replace the destination register with the source register
921