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