Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | //===-- llvm/CodeGen/ISDOpcodes.h - CodeGen opcodes -------------*- C++ -*-===// |
| 2 | // |
||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
| 6 | // |
||
| 7 | //===----------------------------------------------------------------------===// |
||
| 8 | // |
||
| 9 | // This file declares codegen opcodes and related utilities. |
||
| 10 | // |
||
| 11 | //===----------------------------------------------------------------------===// |
||
| 12 | |||
| 13 | #ifndef LLVM_CODEGEN_ISDOPCODES_H |
||
| 14 | #define LLVM_CODEGEN_ISDOPCODES_H |
||
| 15 | |||
| 16 | #include "llvm/CodeGen/ValueTypes.h" |
||
| 17 | |||
| 18 | namespace llvm { |
||
| 19 | |||
| 20 | /// ISD namespace - This namespace contains an enum which represents all of the |
||
| 21 | /// SelectionDAG node types and value types. |
||
| 22 | /// |
||
| 23 | namespace ISD { |
||
| 24 | |||
| 25 | //===--------------------------------------------------------------------===// |
||
| 26 | /// ISD::NodeType enum - This enum defines the target-independent operators |
||
| 27 | /// for a SelectionDAG. |
||
| 28 | /// |
||
| 29 | /// Targets may also define target-dependent operator codes for SDNodes. For |
||
| 30 | /// example, on x86, these are the enum values in the X86ISD namespace. |
||
| 31 | /// Targets should aim to use target-independent operators to model their |
||
| 32 | /// instruction sets as much as possible, and only use target-dependent |
||
| 33 | /// operators when they have special requirements. |
||
| 34 | /// |
||
| 35 | /// Finally, during and after selection proper, SNodes may use special |
||
| 36 | /// operator codes that correspond directly with MachineInstr opcodes. These |
||
| 37 | /// are used to represent selected instructions. See the isMachineOpcode() |
||
| 38 | /// and getMachineOpcode() member functions of SDNode. |
||
| 39 | /// |
||
| 40 | enum NodeType { |
||
| 41 | |||
| 42 | /// DELETED_NODE - This is an illegal value that is used to catch |
||
| 43 | /// errors. This opcode is not a legal opcode for any node. |
||
| 44 | DELETED_NODE, |
||
| 45 | |||
| 46 | /// EntryToken - This is the marker used to indicate the start of a region. |
||
| 47 | EntryToken, |
||
| 48 | |||
| 49 | /// TokenFactor - This node takes multiple tokens as input and produces a |
||
| 50 | /// single token result. This is used to represent the fact that the operand |
||
| 51 | /// operators are independent of each other. |
||
| 52 | TokenFactor, |
||
| 53 | |||
| 54 | /// AssertSext, AssertZext - These nodes record if a register contains a |
||
| 55 | /// value that has already been zero or sign extended from a narrower type. |
||
| 56 | /// These nodes take two operands. The first is the node that has already |
||
| 57 | /// been extended, and the second is a value type node indicating the width |
||
| 58 | /// of the extension. |
||
| 59 | /// NOTE: In case of the source value (or any vector element value) is |
||
| 60 | /// poisoned the assertion will not be true for that value. |
||
| 61 | AssertSext, |
||
| 62 | AssertZext, |
||
| 63 | |||
| 64 | /// AssertAlign - These nodes record if a register contains a value that |
||
| 65 | /// has a known alignment and the trailing bits are known to be zero. |
||
| 66 | /// NOTE: In case of the source value (or any vector element value) is |
||
| 67 | /// poisoned the assertion will not be true for that value. |
||
| 68 | AssertAlign, |
||
| 69 | |||
| 70 | /// Various leaf nodes. |
||
| 71 | BasicBlock, |
||
| 72 | VALUETYPE, |
||
| 73 | CONDCODE, |
||
| 74 | Register, |
||
| 75 | RegisterMask, |
||
| 76 | Constant, |
||
| 77 | ConstantFP, |
||
| 78 | GlobalAddress, |
||
| 79 | GlobalTLSAddress, |
||
| 80 | FrameIndex, |
||
| 81 | JumpTable, |
||
| 82 | ConstantPool, |
||
| 83 | ExternalSymbol, |
||
| 84 | BlockAddress, |
||
| 85 | |||
| 86 | /// The address of the GOT |
||
| 87 | GLOBAL_OFFSET_TABLE, |
||
| 88 | |||
| 89 | /// FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and |
||
| 90 | /// llvm.returnaddress on the DAG. These nodes take one operand, the index |
||
| 91 | /// of the frame or return address to return. An index of zero corresponds |
||
| 92 | /// to the current function's frame or return address, an index of one to |
||
| 93 | /// the parent's frame or return address, and so on. |
||
| 94 | FRAMEADDR, |
||
| 95 | RETURNADDR, |
||
| 96 | |||
| 97 | /// ADDROFRETURNADDR - Represents the llvm.addressofreturnaddress intrinsic. |
||
| 98 | /// This node takes no operand, returns a target-specific pointer to the |
||
| 99 | /// place in the stack frame where the return address of the current |
||
| 100 | /// function is stored. |
||
| 101 | ADDROFRETURNADDR, |
||
| 102 | |||
| 103 | /// SPONENTRY - Represents the llvm.sponentry intrinsic. Takes no argument |
||
| 104 | /// and returns the stack pointer value at the entry of the current |
||
| 105 | /// function calling this intrinsic. |
||
| 106 | SPONENTRY, |
||
| 107 | |||
| 108 | /// LOCAL_RECOVER - Represents the llvm.localrecover intrinsic. |
||
| 109 | /// Materializes the offset from the local object pointer of another |
||
| 110 | /// function to a particular local object passed to llvm.localescape. The |
||
| 111 | /// operand is the MCSymbol label used to represent this offset, since |
||
| 112 | /// typically the offset is not known until after code generation of the |
||
| 113 | /// parent. |
||
| 114 | LOCAL_RECOVER, |
||
| 115 | |||
| 116 | /// READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on |
||
| 117 | /// the DAG, which implements the named register global variables extension. |
||
| 118 | READ_REGISTER, |
||
| 119 | WRITE_REGISTER, |
||
| 120 | |||
| 121 | /// FRAME_TO_ARGS_OFFSET - This node represents offset from frame pointer to |
||
| 122 | /// first (possible) on-stack argument. This is needed for correct stack |
||
| 123 | /// adjustment during unwind. |
||
| 124 | FRAME_TO_ARGS_OFFSET, |
||
| 125 | |||
| 126 | /// EH_DWARF_CFA - This node represents the pointer to the DWARF Canonical |
||
| 127 | /// Frame Address (CFA), generally the value of the stack pointer at the |
||
| 128 | /// call site in the previous frame. |
||
| 129 | EH_DWARF_CFA, |
||
| 130 | |||
| 131 | /// OUTCHAIN = EH_RETURN(INCHAIN, OFFSET, HANDLER) - This node represents |
||
| 132 | /// 'eh_return' gcc dwarf builtin, which is used to return from |
||
| 133 | /// exception. The general meaning is: adjust stack by OFFSET and pass |
||
| 134 | /// execution to HANDLER. Many platform-related details also :) |
||
| 135 | EH_RETURN, |
||
| 136 | |||
| 137 | /// RESULT, OUTCHAIN = EH_SJLJ_SETJMP(INCHAIN, buffer) |
||
| 138 | /// This corresponds to the eh.sjlj.setjmp intrinsic. |
||
| 139 | /// It takes an input chain and a pointer to the jump buffer as inputs |
||
| 140 | /// and returns an outchain. |
||
| 141 | EH_SJLJ_SETJMP, |
||
| 142 | |||
| 143 | /// OUTCHAIN = EH_SJLJ_LONGJMP(INCHAIN, buffer) |
||
| 144 | /// This corresponds to the eh.sjlj.longjmp intrinsic. |
||
| 145 | /// It takes an input chain and a pointer to the jump buffer as inputs |
||
| 146 | /// and returns an outchain. |
||
| 147 | EH_SJLJ_LONGJMP, |
||
| 148 | |||
| 149 | /// OUTCHAIN = EH_SJLJ_SETUP_DISPATCH(INCHAIN) |
||
| 150 | /// The target initializes the dispatch table here. |
||
| 151 | EH_SJLJ_SETUP_DISPATCH, |
||
| 152 | |||
| 153 | /// TargetConstant* - Like Constant*, but the DAG does not do any folding, |
||
| 154 | /// simplification, or lowering of the constant. They are used for constants |
||
| 155 | /// which are known to fit in the immediate fields of their users, or for |
||
| 156 | /// carrying magic numbers which are not values which need to be |
||
| 157 | /// materialized in registers. |
||
| 158 | TargetConstant, |
||
| 159 | TargetConstantFP, |
||
| 160 | |||
| 161 | /// TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or |
||
| 162 | /// anything else with this node, and this is valid in the target-specific |
||
| 163 | /// dag, turning into a GlobalAddress operand. |
||
| 164 | TargetGlobalAddress, |
||
| 165 | TargetGlobalTLSAddress, |
||
| 166 | TargetFrameIndex, |
||
| 167 | TargetJumpTable, |
||
| 168 | TargetConstantPool, |
||
| 169 | TargetExternalSymbol, |
||
| 170 | TargetBlockAddress, |
||
| 171 | |||
| 172 | MCSymbol, |
||
| 173 | |||
| 174 | /// TargetIndex - Like a constant pool entry, but with completely |
||
| 175 | /// target-dependent semantics. Holds target flags, a 32-bit index, and a |
||
| 176 | /// 64-bit index. Targets can use this however they like. |
||
| 177 | TargetIndex, |
||
| 178 | |||
| 179 | /// RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) |
||
| 180 | /// This node represents a target intrinsic function with no side effects. |
||
| 181 | /// The first operand is the ID number of the intrinsic from the |
||
| 182 | /// llvm::Intrinsic namespace. The operands to the intrinsic follow. The |
||
| 183 | /// node returns the result of the intrinsic. |
||
| 184 | INTRINSIC_WO_CHAIN, |
||
| 185 | |||
| 186 | /// RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) |
||
| 187 | /// This node represents a target intrinsic function with side effects that |
||
| 188 | /// returns a result. The first operand is a chain pointer. The second is |
||
| 189 | /// the ID number of the intrinsic from the llvm::Intrinsic namespace. The |
||
| 190 | /// operands to the intrinsic follow. The node has two results, the result |
||
| 191 | /// of the intrinsic and an output chain. |
||
| 192 | INTRINSIC_W_CHAIN, |
||
| 193 | |||
| 194 | /// OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) |
||
| 195 | /// This node represents a target intrinsic function with side effects that |
||
| 196 | /// does not return a result. The first operand is a chain pointer. The |
||
| 197 | /// second is the ID number of the intrinsic from the llvm::Intrinsic |
||
| 198 | /// namespace. The operands to the intrinsic follow. |
||
| 199 | INTRINSIC_VOID, |
||
| 200 | |||
| 201 | /// CopyToReg - This node has three operands: a chain, a register number to |
||
| 202 | /// set to this value, and a value. |
||
| 203 | CopyToReg, |
||
| 204 | |||
| 205 | /// CopyFromReg - This node indicates that the input value is a virtual or |
||
| 206 | /// physical register that is defined outside of the scope of this |
||
| 207 | /// SelectionDAG. The register is available from the RegisterSDNode object. |
||
| 208 | CopyFromReg, |
||
| 209 | |||
| 210 | /// UNDEF - An undefined node. |
||
| 211 | UNDEF, |
||
| 212 | |||
| 213 | // FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or |
||
| 214 | // is evaluated to UNDEF), or returns VAL otherwise. Note that each |
||
| 215 | // read of UNDEF can yield different value, but FREEZE(UNDEF) cannot. |
||
| 216 | FREEZE, |
||
| 217 | |||
| 218 | /// EXTRACT_ELEMENT - This is used to get the lower or upper (determined by |
||
| 219 | /// a Constant, which is required to be operand #1) half of the integer or |
||
| 220 | /// float value specified as operand #0. This is only for use before |
||
| 221 | /// legalization, for values that will be broken into multiple registers. |
||
| 222 | EXTRACT_ELEMENT, |
||
| 223 | |||
| 224 | /// BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways. |
||
| 225 | /// Given two values of the same integer value type, this produces a value |
||
| 226 | /// twice as big. Like EXTRACT_ELEMENT, this can only be used before |
||
| 227 | /// legalization. The lower part of the composite value should be in |
||
| 228 | /// element 0 and the upper part should be in element 1. |
||
| 229 | BUILD_PAIR, |
||
| 230 | |||
| 231 | /// MERGE_VALUES - This node takes multiple discrete operands and returns |
||
| 232 | /// them all as its individual results. This nodes has exactly the same |
||
| 233 | /// number of inputs and outputs. This node is useful for some pieces of the |
||
| 234 | /// code generator that want to think about a single node with multiple |
||
| 235 | /// results, not multiple nodes. |
||
| 236 | MERGE_VALUES, |
||
| 237 | |||
| 238 | /// Simple integer binary arithmetic operators. |
||
| 239 | ADD, |
||
| 240 | SUB, |
||
| 241 | MUL, |
||
| 242 | SDIV, |
||
| 243 | UDIV, |
||
| 244 | SREM, |
||
| 245 | UREM, |
||
| 246 | |||
| 247 | /// SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing |
||
| 248 | /// a signed/unsigned value of type i[2*N], and return the full value as |
||
| 249 | /// two results, each of type iN. |
||
| 250 | SMUL_LOHI, |
||
| 251 | UMUL_LOHI, |
||
| 252 | |||
| 253 | /// SDIVREM/UDIVREM - Divide two integers and produce both a quotient and |
||
| 254 | /// remainder result. |
||
| 255 | SDIVREM, |
||
| 256 | UDIVREM, |
||
| 257 | |||
| 258 | /// CARRY_FALSE - This node is used when folding other nodes, |
||
| 259 | /// like ADDC/SUBC, which indicate the carry result is always false. |
||
| 260 | CARRY_FALSE, |
||
| 261 | |||
| 262 | /// Carry-setting nodes for multiple precision addition and subtraction. |
||
| 263 | /// These nodes take two operands of the same value type, and produce two |
||
| 264 | /// results. The first result is the normal add or sub result, the second |
||
| 265 | /// result is the carry flag result. |
||
| 266 | /// FIXME: These nodes are deprecated in favor of ADDCARRY and SUBCARRY. |
||
| 267 | /// They are kept around for now to provide a smooth transition path |
||
| 268 | /// toward the use of ADDCARRY/SUBCARRY and will eventually be removed. |
||
| 269 | ADDC, |
||
| 270 | SUBC, |
||
| 271 | |||
| 272 | /// Carry-using nodes for multiple precision addition and subtraction. These |
||
| 273 | /// nodes take three operands: The first two are the normal lhs and rhs to |
||
| 274 | /// the add or sub, and the third is the input carry flag. These nodes |
||
| 275 | /// produce two results; the normal result of the add or sub, and the output |
||
| 276 | /// carry flag. These nodes both read and write a carry flag to allow them |
||
| 277 | /// to them to be chained together for add and sub of arbitrarily large |
||
| 278 | /// values. |
||
| 279 | ADDE, |
||
| 280 | SUBE, |
||
| 281 | |||
| 282 | /// Carry-using nodes for multiple precision addition and subtraction. |
||
| 283 | /// These nodes take three operands: The first two are the normal lhs and |
||
| 284 | /// rhs to the add or sub, and the third is a boolean value that is 1 if and |
||
| 285 | /// only if there is an incoming carry/borrow. These nodes produce two |
||
| 286 | /// results: the normal result of the add or sub, and a boolean value that is |
||
| 287 | /// 1 if and only if there is an outgoing carry/borrow. |
||
| 288 | /// |
||
| 289 | /// Care must be taken if these opcodes are lowered to hardware instructions |
||
| 290 | /// that use the inverse logic -- 0 if and only if there is an |
||
| 291 | /// incoming/outgoing carry/borrow. In such cases, you must preserve the |
||
| 292 | /// semantics of these opcodes by inverting the incoming carry/borrow, feeding |
||
| 293 | /// it to the add/sub hardware instruction, and then inverting the outgoing |
||
| 294 | /// carry/borrow. |
||
| 295 | /// |
||
| 296 | /// The use of these opcodes is preferable to adde/sube if the target supports |
||
| 297 | /// it, as the carry is a regular value rather than a glue, which allows |
||
| 298 | /// further optimisation. |
||
| 299 | /// |
||
| 300 | /// These opcodes are different from [US]{ADD,SUB}O in that ADDCARRY/SUBCARRY |
||
| 301 | /// consume and produce a carry/borrow, whereas [US]{ADD,SUB}O produce an |
||
| 302 | /// overflow. |
||
| 303 | ADDCARRY, |
||
| 304 | SUBCARRY, |
||
| 305 | |||
| 306 | /// Carry-using overflow-aware nodes for multiple precision addition and |
||
| 307 | /// subtraction. These nodes take three operands: The first two are normal lhs |
||
| 308 | /// and rhs to the add or sub, and the third is a boolean indicating if there |
||
| 309 | /// is an incoming carry. They produce two results: the normal result of the |
||
| 310 | /// add or sub, and a boolean that indicates if an overflow occurred (*not* |
||
| 311 | /// flag, because it may be a store to memory, etc.). If the type of the |
||
| 312 | /// boolean is not i1 then the high bits conform to getBooleanContents. |
||
| 313 | SADDO_CARRY, |
||
| 314 | SSUBO_CARRY, |
||
| 315 | |||
| 316 | /// RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition. |
||
| 317 | /// These nodes take two operands: the normal LHS and RHS to the add. They |
||
| 318 | /// produce two results: the normal result of the add, and a boolean that |
||
| 319 | /// indicates if an overflow occurred (*not* a flag, because it may be store |
||
| 320 | /// to memory, etc.). If the type of the boolean is not i1 then the high |
||
| 321 | /// bits conform to getBooleanContents. |
||
| 322 | /// These nodes are generated from llvm.[su]add.with.overflow intrinsics. |
||
| 323 | SADDO, |
||
| 324 | UADDO, |
||
| 325 | |||
| 326 | /// Same for subtraction. |
||
| 327 | SSUBO, |
||
| 328 | USUBO, |
||
| 329 | |||
| 330 | /// Same for multiplication. |
||
| 331 | SMULO, |
||
| 332 | UMULO, |
||
| 333 | |||
| 334 | /// RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 |
||
| 335 | /// integers with the same bit width (W). If the true value of LHS + RHS |
||
| 336 | /// exceeds the largest value that can be represented by W bits, the |
||
| 337 | /// resulting value is this maximum value. Otherwise, if this value is less |
||
| 338 | /// than the smallest value that can be represented by W bits, the |
||
| 339 | /// resulting value is this minimum value. |
||
| 340 | SADDSAT, |
||
| 341 | UADDSAT, |
||
| 342 | |||
| 343 | /// RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 |
||
| 344 | /// integers with the same bit width (W). If the true value of LHS - RHS |
||
| 345 | /// exceeds the largest value that can be represented by W bits, the |
||
| 346 | /// resulting value is this maximum value. Otherwise, if this value is less |
||
| 347 | /// than the smallest value that can be represented by W bits, the |
||
| 348 | /// resulting value is this minimum value. |
||
| 349 | SSUBSAT, |
||
| 350 | USUBSAT, |
||
| 351 | |||
| 352 | /// RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift. The first |
||
| 353 | /// operand is the value to be shifted, and the second argument is the amount |
||
| 354 | /// to shift by. Both must be integers of the same bit width (W). If the true |
||
| 355 | /// value of LHS << RHS exceeds the largest value that can be represented by |
||
| 356 | /// W bits, the resulting value is this maximum value, Otherwise, if this |
||
| 357 | /// value is less than the smallest value that can be represented by W bits, |
||
| 358 | /// the resulting value is this minimum value. |
||
| 359 | SSHLSAT, |
||
| 360 | USHLSAT, |
||
| 361 | |||
| 362 | /// RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication |
||
| 363 | /// on 2 integers with the same width and scale. SCALE represents the scale |
||
| 364 | /// of both operands as fixed point numbers. This SCALE parameter must be a |
||
| 365 | /// constant integer. A scale of zero is effectively performing |
||
| 366 | /// multiplication on 2 integers. |
||
| 367 | SMULFIX, |
||
| 368 | UMULFIX, |
||
| 369 | |||
| 370 | /// Same as the corresponding unsaturated fixed point instructions, but the |
||
| 371 | /// result is clamped between the min and max values representable by the |
||
| 372 | /// bits of the first 2 operands. |
||
| 373 | SMULFIXSAT, |
||
| 374 | UMULFIXSAT, |
||
| 375 | |||
| 376 | /// RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on |
||
| 377 | /// 2 integers with the same width and scale. SCALE represents the scale |
||
| 378 | /// of both operands as fixed point numbers. This SCALE parameter must be a |
||
| 379 | /// constant integer. |
||
| 380 | SDIVFIX, |
||
| 381 | UDIVFIX, |
||
| 382 | |||
| 383 | /// Same as the corresponding unsaturated fixed point instructions, but the |
||
| 384 | /// result is clamped between the min and max values representable by the |
||
| 385 | /// bits of the first 2 operands. |
||
| 386 | SDIVFIXSAT, |
||
| 387 | UDIVFIXSAT, |
||
| 388 | |||
| 389 | /// Simple binary floating point operators. |
||
| 390 | FADD, |
||
| 391 | FSUB, |
||
| 392 | FMUL, |
||
| 393 | FDIV, |
||
| 394 | FREM, |
||
| 395 | |||
| 396 | /// Constrained versions of the binary floating point operators. |
||
| 397 | /// These will be lowered to the simple operators before final selection. |
||
| 398 | /// They are used to limit optimizations while the DAG is being |
||
| 399 | /// optimized. |
||
| 400 | STRICT_FADD, |
||
| 401 | STRICT_FSUB, |
||
| 402 | STRICT_FMUL, |
||
| 403 | STRICT_FDIV, |
||
| 404 | STRICT_FREM, |
||
| 405 | STRICT_FMA, |
||
| 406 | |||
| 407 | /// Constrained versions of libm-equivalent floating point intrinsics. |
||
| 408 | /// These will be lowered to the equivalent non-constrained pseudo-op |
||
| 409 | /// (or expanded to the equivalent library call) before final selection. |
||
| 410 | /// They are used to limit optimizations while the DAG is being optimized. |
||
| 411 | STRICT_FSQRT, |
||
| 412 | STRICT_FPOW, |
||
| 413 | STRICT_FPOWI, |
||
| 414 | STRICT_FSIN, |
||
| 415 | STRICT_FCOS, |
||
| 416 | STRICT_FEXP, |
||
| 417 | STRICT_FEXP2, |
||
| 418 | STRICT_FLOG, |
||
| 419 | STRICT_FLOG10, |
||
| 420 | STRICT_FLOG2, |
||
| 421 | STRICT_FRINT, |
||
| 422 | STRICT_FNEARBYINT, |
||
| 423 | STRICT_FMAXNUM, |
||
| 424 | STRICT_FMINNUM, |
||
| 425 | STRICT_FCEIL, |
||
| 426 | STRICT_FFLOOR, |
||
| 427 | STRICT_FROUND, |
||
| 428 | STRICT_FROUNDEVEN, |
||
| 429 | STRICT_FTRUNC, |
||
| 430 | STRICT_LROUND, |
||
| 431 | STRICT_LLROUND, |
||
| 432 | STRICT_LRINT, |
||
| 433 | STRICT_LLRINT, |
||
| 434 | STRICT_FMAXIMUM, |
||
| 435 | STRICT_FMINIMUM, |
||
| 436 | |||
| 437 | /// STRICT_FP_TO_[US]INT - Convert a floating point value to a signed or |
||
| 438 | /// unsigned integer. These have the same semantics as fptosi and fptoui |
||
| 439 | /// in IR. |
||
| 440 | /// They are used to limit optimizations while the DAG is being optimized. |
||
| 441 | STRICT_FP_TO_SINT, |
||
| 442 | STRICT_FP_TO_UINT, |
||
| 443 | |||
| 444 | /// STRICT_[US]INT_TO_FP - Convert a signed or unsigned integer to |
||
| 445 | /// a floating point value. These have the same semantics as sitofp and |
||
| 446 | /// uitofp in IR. |
||
| 447 | /// They are used to limit optimizations while the DAG is being optimized. |
||
| 448 | STRICT_SINT_TO_FP, |
||
| 449 | STRICT_UINT_TO_FP, |
||
| 450 | |||
| 451 | /// X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating |
||
| 452 | /// point type down to the precision of the destination VT. TRUNC is a |
||
| 453 | /// flag, which is always an integer that is zero or one. If TRUNC is 0, |
||
| 454 | /// this is a normal rounding, if it is 1, this FP_ROUND is known to not |
||
| 455 | /// change the value of Y. |
||
| 456 | /// |
||
| 457 | /// The TRUNC = 1 case is used in cases where we know that the value will |
||
| 458 | /// not be modified by the node, because Y is not using any of the extra |
||
| 459 | /// precision of source type. This allows certain transformations like |
||
| 460 | /// STRICT_FP_EXTEND(STRICT_FP_ROUND(X,1)) -> X which are not safe for |
||
| 461 | /// STRICT_FP_EXTEND(STRICT_FP_ROUND(X,0)) because the extra bits aren't |
||
| 462 | /// removed. |
||
| 463 | /// It is used to limit optimizations while the DAG is being optimized. |
||
| 464 | STRICT_FP_ROUND, |
||
| 465 | |||
| 466 | /// X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP |
||
| 467 | /// type. |
||
| 468 | /// It is used to limit optimizations while the DAG is being optimized. |
||
| 469 | STRICT_FP_EXTEND, |
||
| 470 | |||
| 471 | /// STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used |
||
| 472 | /// for floating-point operands only. STRICT_FSETCC performs a quiet |
||
| 473 | /// comparison operation, while STRICT_FSETCCS performs a signaling |
||
| 474 | /// comparison operation. |
||
| 475 | STRICT_FSETCC, |
||
| 476 | STRICT_FSETCCS, |
||
| 477 | |||
| 478 | // FPTRUNC_ROUND - This corresponds to the fptrunc_round intrinsic. |
||
| 479 | FPTRUNC_ROUND, |
||
| 480 | |||
| 481 | /// FMA - Perform a * b + c with no intermediate rounding step. |
||
| 482 | FMA, |
||
| 483 | |||
| 484 | /// FMAD - Perform a * b + c, while getting the same result as the |
||
| 485 | /// separately rounded operations. |
||
| 486 | FMAD, |
||
| 487 | |||
| 488 | /// FCOPYSIGN(X, Y) - Return the value of X with the sign of Y. NOTE: This |
||
| 489 | /// DAG node does not require that X and Y have the same type, just that |
||
| 490 | /// they are both floating point. X and the result must have the same type. |
||
| 491 | /// FCOPYSIGN(f32, f64) is allowed. |
||
| 492 | FCOPYSIGN, |
||
| 493 | |||
| 494 | /// INT = FGETSIGN(FP) - Return the sign bit of the specified floating point |
||
| 495 | /// value as an integer 0/1 value. |
||
| 496 | FGETSIGN, |
||
| 497 | |||
| 498 | /// Returns platform specific canonical encoding of a floating point number. |
||
| 499 | FCANONICALIZE, |
||
| 500 | |||
| 501 | /// Performs a check of floating point class property, defined by IEEE-754. |
||
| 502 | /// The first operand is the floating point value to check. The second operand |
||
| 503 | /// specifies the checked property and is a TargetConstant which specifies |
||
| 504 | /// test in the same way as intrinsic 'is_fpclass'. |
||
| 505 | /// Returns boolean value. |
||
| 506 | IS_FPCLASS, |
||
| 507 | |||
| 508 | /// BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector |
||
| 509 | /// with the specified, possibly variable, elements. The types of the |
||
| 510 | /// operands must match the vector element type, except that integer types |
||
| 511 | /// are allowed to be larger than the element type, in which case the |
||
| 512 | /// operands are implicitly truncated. The types of the operands must all |
||
| 513 | /// be the same. |
||
| 514 | BUILD_VECTOR, |
||
| 515 | |||
| 516 | /// INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element |
||
| 517 | /// at IDX replaced with VAL. If the type of VAL is larger than the vector |
||
| 518 | /// element type then VAL is truncated before replacement. |
||
| 519 | /// |
||
| 520 | /// If VECTOR is a scalable vector, then IDX may be larger than the minimum |
||
| 521 | /// vector width. IDX is not first scaled by the runtime scaling factor of |
||
| 522 | /// VECTOR. |
||
| 523 | INSERT_VECTOR_ELT, |
||
| 524 | |||
| 525 | /// EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR |
||
| 526 | /// identified by the (potentially variable) element number IDX. If the return |
||
| 527 | /// type is an integer type larger than the element type of the vector, the |
||
| 528 | /// result is extended to the width of the return type. In that case, the high |
||
| 529 | /// bits are undefined. |
||
| 530 | /// |
||
| 531 | /// If VECTOR is a scalable vector, then IDX may be larger than the minimum |
||
| 532 | /// vector width. IDX is not first scaled by the runtime scaling factor of |
||
| 533 | /// VECTOR. |
||
| 534 | EXTRACT_VECTOR_ELT, |
||
| 535 | |||
| 536 | /// CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of |
||
| 537 | /// vector type with the same length and element type, this produces a |
||
| 538 | /// concatenated vector result value, with length equal to the sum of the |
||
| 539 | /// lengths of the input vectors. If VECTOR0 is a fixed-width vector, then |
||
| 540 | /// VECTOR1..VECTORN must all be fixed-width vectors. Similarly, if VECTOR0 |
||
| 541 | /// is a scalable vector, then VECTOR1..VECTORN must all be scalable vectors. |
||
| 542 | CONCAT_VECTORS, |
||
| 543 | |||
| 544 | /// INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 |
||
| 545 | /// inserted into VECTOR1. IDX represents the starting element number at which |
||
| 546 | /// VECTOR2 will be inserted. IDX must be a constant multiple of T's known |
||
| 547 | /// minimum vector length. Let the type of VECTOR2 be T, then if T is a |
||
| 548 | /// scalable vector, IDX is first scaled by the runtime scaling factor of T. |
||
| 549 | /// The elements of VECTOR1 starting at IDX are overwritten with VECTOR2. |
||
| 550 | /// Elements IDX through (IDX + num_elements(T) - 1) must be valid VECTOR1 |
||
| 551 | /// indices. If this condition cannot be determined statically but is false at |
||
| 552 | /// runtime, then the result vector is undefined. The IDX parameter must be a |
||
| 553 | /// vector index constant type, which for most targets will be an integer |
||
| 554 | /// pointer type. |
||
| 555 | /// |
||
| 556 | /// This operation supports inserting a fixed-width vector into a scalable |
||
| 557 | /// vector, but not the other way around. |
||
| 558 | INSERT_SUBVECTOR, |
||
| 559 | |||
| 560 | /// EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR. |
||
| 561 | /// Let the result type be T, then IDX represents the starting element number |
||
| 562 | /// from which a subvector of type T is extracted. IDX must be a constant |
||
| 563 | /// multiple of T's known minimum vector length. If T is a scalable vector, |
||
| 564 | /// IDX is first scaled by the runtime scaling factor of T. Elements IDX |
||
| 565 | /// through (IDX + num_elements(T) - 1) must be valid VECTOR indices. If this |
||
| 566 | /// condition cannot be determined statically but is false at runtime, then |
||
| 567 | /// the result vector is undefined. The IDX parameter must be a vector index |
||
| 568 | /// constant type, which for most targets will be an integer pointer type. |
||
| 569 | /// |
||
| 570 | /// This operation supports extracting a fixed-width vector from a scalable |
||
| 571 | /// vector, but not the other way around. |
||
| 572 | EXTRACT_SUBVECTOR, |
||
| 573 | |||
| 574 | /// VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, |
||
| 575 | /// whose elements are shuffled using the following algorithm: |
||
| 576 | /// RESULT[i] = VECTOR[VECTOR.ElementCount - 1 - i] |
||
| 577 | VECTOR_REVERSE, |
||
| 578 | |||
| 579 | /// VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as |
||
| 580 | /// VEC1/VEC2. A VECTOR_SHUFFLE node also contains an array of constant int |
||
| 581 | /// values that indicate which value (or undef) each result element will |
||
| 582 | /// get. These constant ints are accessible through the |
||
| 583 | /// ShuffleVectorSDNode class. This is quite similar to the Altivec |
||
| 584 | /// 'vperm' instruction, except that the indices must be constants and are |
||
| 585 | /// in terms of the element size of VEC1/VEC2, not in terms of bytes. |
||
| 586 | VECTOR_SHUFFLE, |
||
| 587 | |||
| 588 | /// VECTOR_SPLICE(VEC1, VEC2, IMM) - Returns a subvector of the same type as |
||
| 589 | /// VEC1/VEC2 from CONCAT_VECTORS(VEC1, VEC2), based on the IMM in two ways. |
||
| 590 | /// Let the result type be T, if IMM is positive it represents the starting |
||
| 591 | /// element number (an index) from which a subvector of type T is extracted |
||
| 592 | /// from CONCAT_VECTORS(VEC1, VEC2). If IMM is negative it represents a count |
||
| 593 | /// specifying the number of trailing elements to extract from VEC1, where the |
||
| 594 | /// elements of T are selected using the following algorithm: |
||
| 595 | /// RESULT[i] = CONCAT_VECTORS(VEC1,VEC2)[VEC1.ElementCount - ABS(IMM) + i] |
||
| 596 | /// If IMM is not in the range [-VL, VL-1] the result vector is undefined. IMM |
||
| 597 | /// is a constant integer. |
||
| 598 | VECTOR_SPLICE, |
||
| 599 | |||
| 600 | /// SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a |
||
| 601 | /// scalar value into element 0 of the resultant vector type. The top |
||
| 602 | /// elements 1 to N-1 of the N-element vector are undefined. The type |
||
| 603 | /// of the operand must match the vector element type, except when they |
||
| 604 | /// are integer types. In this case the operand is allowed to be wider |
||
| 605 | /// than the vector element type, and is implicitly truncated to it. |
||
| 606 | SCALAR_TO_VECTOR, |
||
| 607 | |||
| 608 | /// SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL |
||
| 609 | /// duplicated in all lanes. The type of the operand must match the vector |
||
| 610 | /// element type, except when they are integer types. In this case the |
||
| 611 | /// operand is allowed to be wider than the vector element type, and is |
||
| 612 | /// implicitly truncated to it. |
||
| 613 | SPLAT_VECTOR, |
||
| 614 | |||
| 615 | /// SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the |
||
| 616 | /// scalar values joined together and then duplicated in all lanes. This |
||
| 617 | /// represents a SPLAT_VECTOR that has had its scalar operand expanded. This |
||
| 618 | /// allows representing a 64-bit splat on a target with 32-bit integers. The |
||
| 619 | /// total width of the scalars must cover the element width. SCALAR1 contains |
||
| 620 | /// the least significant bits of the value regardless of endianness and all |
||
| 621 | /// scalars should have the same type. |
||
| 622 | SPLAT_VECTOR_PARTS, |
||
| 623 | |||
| 624 | /// STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised |
||
| 625 | /// of a linear sequence of unsigned values starting from 0 with a step of |
||
| 626 | /// IMM, where IMM must be a TargetConstant with type equal to the vector |
||
| 627 | /// element type. The arithmetic is performed modulo the bitwidth of the |
||
| 628 | /// element. |
||
| 629 | /// |
||
| 630 | /// The operation does not support returning fixed-width vectors or |
||
| 631 | /// non-constant operands. |
||
| 632 | STEP_VECTOR, |
||
| 633 | |||
| 634 | /// MULHU/MULHS - Multiply high - Multiply two integers of type iN, |
||
| 635 | /// producing an unsigned/signed value of type i[2*N], then return the top |
||
| 636 | /// part. |
||
| 637 | MULHU, |
||
| 638 | MULHS, |
||
| 639 | |||
| 640 | /// AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of |
||
| 641 | /// type i[N+1], halving the result by shifting it one bit right. |
||
| 642 | /// shr(add(ext(X), ext(Y)), 1) |
||
| 643 | AVGFLOORS, |
||
| 644 | AVGFLOORU, |
||
| 645 | /// AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an |
||
| 646 | /// integer of type i[N+2], add 1 and halve the result by shifting it one bit |
||
| 647 | /// right. shr(add(ext(X), ext(Y), 1), 1) |
||
| 648 | AVGCEILS, |
||
| 649 | AVGCEILU, |
||
| 650 | |||
| 651 | // ABDS/ABDU - Absolute difference - Return the absolute difference between |
||
| 652 | // two numbers interpreted as signed/unsigned. |
||
| 653 | // i.e trunc(abs(sext(Op0) - sext(Op1))) becomes abds(Op0, Op1) |
||
| 654 | // or trunc(abs(zext(Op0) - zext(Op1))) becomes abdu(Op0, Op1) |
||
| 655 | ABDS, |
||
| 656 | ABDU, |
||
| 657 | |||
| 658 | /// [US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned |
||
| 659 | /// integers. |
||
| 660 | SMIN, |
||
| 661 | SMAX, |
||
| 662 | UMIN, |
||
| 663 | UMAX, |
||
| 664 | |||
| 665 | /// Bitwise operators - logical and, logical or, logical xor. |
||
| 666 | AND, |
||
| 667 | OR, |
||
| 668 | XOR, |
||
| 669 | |||
| 670 | /// ABS - Determine the unsigned absolute value of a signed integer value of |
||
| 671 | /// the same bitwidth. |
||
| 672 | /// Note: A value of INT_MIN will return INT_MIN, no saturation or overflow |
||
| 673 | /// is performed. |
||
| 674 | ABS, |
||
| 675 | |||
| 676 | /// Shift and rotation operations. After legalization, the type of the |
||
| 677 | /// shift amount is known to be TLI.getShiftAmountTy(). Before legalization |
||
| 678 | /// the shift amount can be any type, but care must be taken to ensure it is |
||
| 679 | /// large enough. TLI.getShiftAmountTy() is i8 on some targets, but before |
||
| 680 | /// legalization, types like i1024 can occur and i8 doesn't have enough bits |
||
| 681 | /// to represent the shift amount. |
||
| 682 | /// When the 1st operand is a vector, the shift amount must be in the same |
||
| 683 | /// type. (TLI.getShiftAmountTy() will return the same type when the input |
||
| 684 | /// type is a vector.) |
||
| 685 | /// For rotates and funnel shifts, the shift amount is treated as an unsigned |
||
| 686 | /// amount modulo the element size of the first operand. |
||
| 687 | /// |
||
| 688 | /// Funnel 'double' shifts take 3 operands, 2 inputs and the shift amount. |
||
| 689 | /// fshl(X,Y,Z): (X << (Z % BW)) | (Y >> (BW - (Z % BW))) |
||
| 690 | /// fshr(X,Y,Z): (X << (BW - (Z % BW))) | (Y >> (Z % BW)) |
||
| 691 | SHL, |
||
| 692 | SRA, |
||
| 693 | SRL, |
||
| 694 | ROTL, |
||
| 695 | ROTR, |
||
| 696 | FSHL, |
||
| 697 | FSHR, |
||
| 698 | |||
| 699 | /// Byte Swap and Counting operators. |
||
| 700 | BSWAP, |
||
| 701 | CTTZ, |
||
| 702 | CTLZ, |
||
| 703 | CTPOP, |
||
| 704 | BITREVERSE, |
||
| 705 | PARITY, |
||
| 706 | |||
| 707 | /// Bit counting operators with an undefined result for zero inputs. |
||
| 708 | CTTZ_ZERO_UNDEF, |
||
| 709 | CTLZ_ZERO_UNDEF, |
||
| 710 | |||
| 711 | /// Select(COND, TRUEVAL, FALSEVAL). If the type of the boolean COND is not |
||
| 712 | /// i1 then the high bits must conform to getBooleanContents. |
||
| 713 | SELECT, |
||
| 714 | |||
| 715 | /// Select with a vector condition (op #0) and two vector operands (ops #1 |
||
| 716 | /// and #2), returning a vector result. All vectors have the same length. |
||
| 717 | /// Much like the scalar select and setcc, each bit in the condition selects |
||
| 718 | /// whether the corresponding result element is taken from op #1 or op #2. |
||
| 719 | /// At first, the VSELECT condition is of vXi1 type. Later, targets may |
||
| 720 | /// change the condition type in order to match the VSELECT node using a |
||
| 721 | /// pattern. The condition follows the BooleanContent format of the target. |
||
| 722 | VSELECT, |
||
| 723 | |||
| 724 | /// Select with condition operator - This selects between a true value and |
||
| 725 | /// a false value (ops #2 and #3) based on the boolean result of comparing |
||
| 726 | /// the lhs and rhs (ops #0 and #1) of a conditional expression with the |
||
| 727 | /// condition code in op #4, a CondCodeSDNode. |
||
| 728 | SELECT_CC, |
||
| 729 | |||
| 730 | /// SetCC operator - This evaluates to a true value iff the condition is |
||
| 731 | /// true. If the result value type is not i1 then the high bits conform |
||
| 732 | /// to getBooleanContents. The operands to this are the left and right |
||
| 733 | /// operands to compare (ops #0, and #1) and the condition code to compare |
||
| 734 | /// them with (op #2) as a CondCodeSDNode. If the operands are vector types |
||
| 735 | /// then the result type must also be a vector type. |
||
| 736 | SETCC, |
||
| 737 | |||
| 738 | /// Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but |
||
| 739 | /// op #2 is a boolean indicating if there is an incoming carry. This |
||
| 740 | /// operator checks the result of "LHS - RHS - Carry", and can be used to |
||
| 741 | /// compare two wide integers: |
||
| 742 | /// (setcccarry lhshi rhshi (subcarry lhslo rhslo) cc). |
||
| 743 | /// Only valid for integers. |
||
| 744 | SETCCCARRY, |
||
| 745 | |||
| 746 | /// SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded |
||
| 747 | /// integer shift operations. The operation ordering is: |
||
| 748 | /// [Lo,Hi] = op [LoLHS,HiLHS], Amt |
||
| 749 | SHL_PARTS, |
||
| 750 | SRA_PARTS, |
||
| 751 | SRL_PARTS, |
||
| 752 | |||
| 753 | /// Conversion operators. These are all single input single output |
||
| 754 | /// operations. For all of these, the result type must be strictly |
||
| 755 | /// wider or narrower (depending on the operation) than the source |
||
| 756 | /// type. |
||
| 757 | |||
| 758 | /// SIGN_EXTEND - Used for integer types, replicating the sign bit |
||
| 759 | /// into new bits. |
||
| 760 | SIGN_EXTEND, |
||
| 761 | |||
| 762 | /// ZERO_EXTEND - Used for integer types, zeroing the new bits. |
||
| 763 | ZERO_EXTEND, |
||
| 764 | |||
| 765 | /// ANY_EXTEND - Used for integer types. The high bits are undefined. |
||
| 766 | ANY_EXTEND, |
||
| 767 | |||
| 768 | /// TRUNCATE - Completely drop the high bits. |
||
| 769 | TRUNCATE, |
||
| 770 | |||
| 771 | /// [SU]INT_TO_FP - These operators convert integers (whose interpreted sign |
||
| 772 | /// depends on the first letter) to floating point. |
||
| 773 | SINT_TO_FP, |
||
| 774 | UINT_TO_FP, |
||
| 775 | |||
| 776 | /// SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to |
||
| 777 | /// sign extend a small value in a large integer register (e.g. sign |
||
| 778 | /// extending the low 8 bits of a 32-bit register to fill the top 24 bits |
||
| 779 | /// with the 7th bit). The size of the smaller type is indicated by the 1th |
||
| 780 | /// operand, a ValueType node. |
||
| 781 | SIGN_EXTEND_INREG, |
||
| 782 | |||
| 783 | /// ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an |
||
| 784 | /// in-register any-extension of the low lanes of an integer vector. The |
||
| 785 | /// result type must have fewer elements than the operand type, and those |
||
| 786 | /// elements must be larger integer types such that the total size of the |
||
| 787 | /// operand type is less than or equal to the size of the result type. Each |
||
| 788 | /// of the low operand elements is any-extended into the corresponding, |
||
| 789 | /// wider result elements with the high bits becoming undef. |
||
| 790 | /// NOTE: The type legalizer prefers to make the operand and result size |
||
| 791 | /// the same to allow expansion to shuffle vector during op legalization. |
||
| 792 | ANY_EXTEND_VECTOR_INREG, |
||
| 793 | |||
| 794 | /// SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an |
||
| 795 | /// in-register sign-extension of the low lanes of an integer vector. The |
||
| 796 | /// result type must have fewer elements than the operand type, and those |
||
| 797 | /// elements must be larger integer types such that the total size of the |
||
| 798 | /// operand type is less than or equal to the size of the result type. Each |
||
| 799 | /// of the low operand elements is sign-extended into the corresponding, |
||
| 800 | /// wider result elements. |
||
| 801 | /// NOTE: The type legalizer prefers to make the operand and result size |
||
| 802 | /// the same to allow expansion to shuffle vector during op legalization. |
||
| 803 | SIGN_EXTEND_VECTOR_INREG, |
||
| 804 | |||
| 805 | /// ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an |
||
| 806 | /// in-register zero-extension of the low lanes of an integer vector. The |
||
| 807 | /// result type must have fewer elements than the operand type, and those |
||
| 808 | /// elements must be larger integer types such that the total size of the |
||
| 809 | /// operand type is less than or equal to the size of the result type. Each |
||
| 810 | /// of the low operand elements is zero-extended into the corresponding, |
||
| 811 | /// wider result elements. |
||
| 812 | /// NOTE: The type legalizer prefers to make the operand and result size |
||
| 813 | /// the same to allow expansion to shuffle vector during op legalization. |
||
| 814 | ZERO_EXTEND_VECTOR_INREG, |
||
| 815 | |||
| 816 | /// FP_TO_[US]INT - Convert a floating point value to a signed or unsigned |
||
| 817 | /// integer. These have the same semantics as fptosi and fptoui in IR. If |
||
| 818 | /// the FP value cannot fit in the integer type, the results are undefined. |
||
| 819 | FP_TO_SINT, |
||
| 820 | FP_TO_UINT, |
||
| 821 | |||
| 822 | /// FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a |
||
| 823 | /// signed or unsigned scalar integer type given in operand 1 with the |
||
| 824 | /// following semantics: |
||
| 825 | /// |
||
| 826 | /// * If the value is NaN, zero is returned. |
||
| 827 | /// * If the value is larger/smaller than the largest/smallest integer, |
||
| 828 | /// the largest/smallest integer is returned (saturation). |
||
| 829 | /// * Otherwise the result of rounding the value towards zero is returned. |
||
| 830 | /// |
||
| 831 | /// The scalar width of the type given in operand 1 must be equal to, or |
||
| 832 | /// smaller than, the scalar result type width. It may end up being smaller |
||
| 833 | /// than the result width as a result of integer type legalization. |
||
| 834 | /// |
||
| 835 | /// After converting to the scalar integer type in operand 1, the value is |
||
| 836 | /// extended to the result VT. FP_TO_SINT_SAT sign extends and FP_TO_UINT_SAT |
||
| 837 | /// zero extends. |
||
| 838 | FP_TO_SINT_SAT, |
||
| 839 | FP_TO_UINT_SAT, |
||
| 840 | |||
| 841 | /// X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type |
||
| 842 | /// down to the precision of the destination VT. TRUNC is a flag, which is |
||
| 843 | /// always an integer that is zero or one. If TRUNC is 0, this is a |
||
| 844 | /// normal rounding, if it is 1, this FP_ROUND is known to not change the |
||
| 845 | /// value of Y. |
||
| 846 | /// |
||
| 847 | /// The TRUNC = 1 case is used in cases where we know that the value will |
||
| 848 | /// not be modified by the node, because Y is not using any of the extra |
||
| 849 | /// precision of source type. This allows certain transformations like |
||
| 850 | /// FP_EXTEND(FP_ROUND(X,1)) -> X which are not safe for |
||
| 851 | /// FP_EXTEND(FP_ROUND(X,0)) because the extra bits aren't removed. |
||
| 852 | FP_ROUND, |
||
| 853 | |||
| 854 | /// Returns current rounding mode: |
||
| 855 | /// -1 Undefined |
||
| 856 | /// 0 Round to 0 |
||
| 857 | /// 1 Round to nearest, ties to even |
||
| 858 | /// 2 Round to +inf |
||
| 859 | /// 3 Round to -inf |
||
| 860 | /// 4 Round to nearest, ties to zero |
||
| 861 | /// Result is rounding mode and chain. Input is a chain. |
||
| 862 | GET_ROUNDING, |
||
| 863 | |||
| 864 | /// Set rounding mode. |
||
| 865 | /// The first operand is a chain pointer. The second specifies the required |
||
| 866 | /// rounding mode, encoded in the same way as used in '``GET_ROUNDING``'. |
||
| 867 | SET_ROUNDING, |
||
| 868 | |||
| 869 | /// X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type. |
||
| 870 | FP_EXTEND, |
||
| 871 | |||
| 872 | /// BITCAST - This operator converts between integer, vector and FP |
||
| 873 | /// values, as if the value was stored to memory with one type and loaded |
||
| 874 | /// from the same address with the other type (or equivalently for vector |
||
| 875 | /// format conversions, etc). The source and result are required to have |
||
| 876 | /// the same bit size (e.g. f32 <-> i32). This can also be used for |
||
| 877 | /// int-to-int or fp-to-fp conversions, but that is a noop, deleted by |
||
| 878 | /// getNode(). |
||
| 879 | /// |
||
| 880 | /// This operator is subtly different from the bitcast instruction from |
||
| 881 | /// LLVM-IR since this node may change the bits in the register. For |
||
| 882 | /// example, this occurs on big-endian NEON and big-endian MSA where the |
||
| 883 | /// layout of the bits in the register depends on the vector type and this |
||
| 884 | /// operator acts as a shuffle operation for some vector type combinations. |
||
| 885 | BITCAST, |
||
| 886 | |||
| 887 | /// ADDRSPACECAST - This operator converts between pointers of different |
||
| 888 | /// address spaces. |
||
| 889 | ADDRSPACECAST, |
||
| 890 | |||
| 891 | /// FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions |
||
| 892 | /// and truncation for half-precision (16 bit) floating numbers. These nodes |
||
| 893 | /// form a semi-softened interface for dealing with f16 (as an i16), which |
||
| 894 | /// is often a storage-only type but has native conversions. |
||
| 895 | FP16_TO_FP, |
||
| 896 | FP_TO_FP16, |
||
| 897 | STRICT_FP16_TO_FP, |
||
| 898 | STRICT_FP_TO_FP16, |
||
| 899 | |||
| 900 | /// BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions |
||
| 901 | /// and truncation for bfloat16. These nodes form a semi-softened interface |
||
| 902 | /// for dealing with bf16 (as an i16), which is often a storage-only type but |
||
| 903 | /// has native conversions. |
||
| 904 | BF16_TO_FP, |
||
| 905 | FP_TO_BF16, |
||
| 906 | |||
| 907 | /// Perform various unary floating-point operations inspired by libm. For |
||
| 908 | /// FPOWI, the result is undefined if if the integer operand doesn't fit into |
||
| 909 | /// sizeof(int). |
||
| 910 | FNEG, |
||
| 911 | FABS, |
||
| 912 | FSQRT, |
||
| 913 | FCBRT, |
||
| 914 | FSIN, |
||
| 915 | FCOS, |
||
| 916 | FPOWI, |
||
| 917 | FPOW, |
||
| 918 | FLOG, |
||
| 919 | FLOG2, |
||
| 920 | FLOG10, |
||
| 921 | FEXP, |
||
| 922 | FEXP2, |
||
| 923 | FCEIL, |
||
| 924 | FTRUNC, |
||
| 925 | FRINT, |
||
| 926 | FNEARBYINT, |
||
| 927 | FROUND, |
||
| 928 | FROUNDEVEN, |
||
| 929 | FFLOOR, |
||
| 930 | LROUND, |
||
| 931 | LLROUND, |
||
| 932 | LRINT, |
||
| 933 | LLRINT, |
||
| 934 | |||
| 935 | /// FMINNUM/FMAXNUM - Perform floating-point minimum or maximum on two |
||
| 936 | /// values. |
||
| 937 | // |
||
| 938 | /// In the case where a single input is a NaN (either signaling or quiet), |
||
| 939 | /// the non-NaN input is returned. |
||
| 940 | /// |
||
| 941 | /// The return value of (FMINNUM 0.0, -0.0) could be either 0.0 or -0.0. |
||
| 942 | FMINNUM, |
||
| 943 | FMAXNUM, |
||
| 944 | |||
| 945 | /// FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimum or maximum on |
||
| 946 | /// two values, following the IEEE-754 2008 definition. This differs from |
||
| 947 | /// FMINNUM/FMAXNUM in the handling of signaling NaNs. If one input is a |
||
| 948 | /// signaling NaN, returns a quiet NaN. |
||
| 949 | FMINNUM_IEEE, |
||
| 950 | FMAXNUM_IEEE, |
||
| 951 | |||
| 952 | /// FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 |
||
| 953 | /// as less than 0.0. While FMINNUM_IEEE/FMAXNUM_IEEE follow IEEE 754-2008 |
||
| 954 | /// semantics, FMINIMUM/FMAXIMUM follow IEEE 754-2018 draft semantics. |
||
| 955 | FMINIMUM, |
||
| 956 | FMAXIMUM, |
||
| 957 | |||
| 958 | /// FSINCOS - Compute both fsin and fcos as a single operation. |
||
| 959 | FSINCOS, |
||
| 960 | |||
| 961 | /// LOAD and STORE have token chains as their first operand, then the same |
||
| 962 | /// operands as an LLVM load/store instruction, then an offset node that |
||
| 963 | /// is added / subtracted from the base pointer to form the address (for |
||
| 964 | /// indexed memory ops). |
||
| 965 | LOAD, |
||
| 966 | STORE, |
||
| 967 | |||
| 968 | /// DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned |
||
| 969 | /// to a specified boundary. This node always has two return values: a new |
||
| 970 | /// stack pointer value and a chain. The first operand is the token chain, |
||
| 971 | /// the second is the number of bytes to allocate, and the third is the |
||
| 972 | /// alignment boundary. The size is guaranteed to be a multiple of the |
||
| 973 | /// stack alignment, and the alignment is guaranteed to be bigger than the |
||
| 974 | /// stack alignment (if required) or 0 to get standard stack alignment. |
||
| 975 | DYNAMIC_STACKALLOC, |
||
| 976 | |||
| 977 | /// Control flow instructions. These all have token chains. |
||
| 978 | |||
| 979 | /// BR - Unconditional branch. The first operand is the chain |
||
| 980 | /// operand, the second is the MBB to branch to. |
||
| 981 | BR, |
||
| 982 | |||
| 983 | /// BRIND - Indirect branch. The first operand is the chain, the second |
||
| 984 | /// is the value to branch to, which must be of the same type as the |
||
| 985 | /// target's pointer type. |
||
| 986 | BRIND, |
||
| 987 | |||
| 988 | /// BR_JT - Jumptable branch. The first operand is the chain, the second |
||
| 989 | /// is the jumptable index, the last one is the jumptable entry index. |
||
| 990 | BR_JT, |
||
| 991 | |||
| 992 | /// BRCOND - Conditional branch. The first operand is the chain, the |
||
| 993 | /// second is the condition, the third is the block to branch to if the |
||
| 994 | /// condition is true. If the type of the condition is not i1, then the |
||
| 995 | /// high bits must conform to getBooleanContents. If the condition is undef, |
||
| 996 | /// it nondeterministically jumps to the block. |
||
| 997 | /// TODO: Its semantics w.r.t undef requires further discussion; we need to |
||
| 998 | /// make it sure that it is consistent with optimizations in MIR & the |
||
| 999 | /// meaning of IMPLICIT_DEF. See https://reviews.llvm.org/D92015 |
||
| 1000 | BRCOND, |
||
| 1001 | |||
| 1002 | /// BR_CC - Conditional branch. The behavior is like that of SELECT_CC, in |
||
| 1003 | /// that the condition is represented as condition code, and two nodes to |
||
| 1004 | /// compare, rather than as a combined SetCC node. The operands in order |
||
| 1005 | /// are chain, cc, lhs, rhs, block to branch to if condition is true. If |
||
| 1006 | /// condition is undef, it nondeterministically jumps to the block. |
||
| 1007 | BR_CC, |
||
| 1008 | |||
| 1009 | /// INLINEASM - Represents an inline asm block. This node always has two |
||
| 1010 | /// return values: a chain and a flag result. The inputs are as follows: |
||
| 1011 | /// Operand #0 : Input chain. |
||
| 1012 | /// Operand #1 : a ExternalSymbolSDNode with a pointer to the asm string. |
||
| 1013 | /// Operand #2 : a MDNodeSDNode with the !srcloc metadata. |
||
| 1014 | /// Operand #3 : HasSideEffect, IsAlignStack bits. |
||
| 1015 | /// After this, it is followed by a list of operands with this format: |
||
| 1016 | /// ConstantSDNode: Flags that encode whether it is a mem or not, the |
||
| 1017 | /// of operands that follow, etc. See InlineAsm.h. |
||
| 1018 | /// ... however many operands ... |
||
| 1019 | /// Operand #last: Optional, an incoming flag. |
||
| 1020 | /// |
||
| 1021 | /// The variable width operands are required to represent target addressing |
||
| 1022 | /// modes as a single "operand", even though they may have multiple |
||
| 1023 | /// SDOperands. |
||
| 1024 | INLINEASM, |
||
| 1025 | |||
| 1026 | /// INLINEASM_BR - Branching version of inline asm. Used by asm-goto. |
||
| 1027 | INLINEASM_BR, |
||
| 1028 | |||
| 1029 | /// EH_LABEL - Represents a label in mid basic block used to track |
||
| 1030 | /// locations needed for debug and exception handling tables. These nodes |
||
| 1031 | /// take a chain as input and return a chain. |
||
| 1032 | EH_LABEL, |
||
| 1033 | |||
| 1034 | /// ANNOTATION_LABEL - Represents a mid basic block label used by |
||
| 1035 | /// annotations. This should remain within the basic block and be ordered |
||
| 1036 | /// with respect to other call instructions, but loads and stores may float |
||
| 1037 | /// past it. |
||
| 1038 | ANNOTATION_LABEL, |
||
| 1039 | |||
| 1040 | /// CATCHRET - Represents a return from a catch block funclet. Used for |
||
| 1041 | /// MSVC compatible exception handling. Takes a chain operand and a |
||
| 1042 | /// destination basic block operand. |
||
| 1043 | CATCHRET, |
||
| 1044 | |||
| 1045 | /// CLEANUPRET - Represents a return from a cleanup block funclet. Used for |
||
| 1046 | /// MSVC compatible exception handling. Takes only a chain operand. |
||
| 1047 | CLEANUPRET, |
||
| 1048 | |||
| 1049 | /// STACKSAVE - STACKSAVE has one operand, an input chain. It produces a |
||
| 1050 | /// value, the same type as the pointer type for the system, and an output |
||
| 1051 | /// chain. |
||
| 1052 | STACKSAVE, |
||
| 1053 | |||
| 1054 | /// STACKRESTORE has two operands, an input chain and a pointer to restore |
||
| 1055 | /// to it returns an output chain. |
||
| 1056 | STACKRESTORE, |
||
| 1057 | |||
| 1058 | /// CALLSEQ_START/CALLSEQ_END - These operators mark the beginning and end |
||
| 1059 | /// of a call sequence, and carry arbitrary information that target might |
||
| 1060 | /// want to know. The first operand is a chain, the rest are specified by |
||
| 1061 | /// the target and not touched by the DAG optimizers. |
||
| 1062 | /// Targets that may use stack to pass call arguments define additional |
||
| 1063 | /// operands: |
||
| 1064 | /// - size of the call frame part that must be set up within the |
||
| 1065 | /// CALLSEQ_START..CALLSEQ_END pair, |
||
| 1066 | /// - part of the call frame prepared prior to CALLSEQ_START. |
||
| 1067 | /// Both these parameters must be constants, their sum is the total call |
||
| 1068 | /// frame size. |
||
| 1069 | /// CALLSEQ_START..CALLSEQ_END pairs may not be nested. |
||
| 1070 | CALLSEQ_START, // Beginning of a call sequence |
||
| 1071 | CALLSEQ_END, // End of a call sequence |
||
| 1072 | |||
| 1073 | /// VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, |
||
| 1074 | /// and the alignment. It returns a pair of values: the vaarg value and a |
||
| 1075 | /// new chain. |
||
| 1076 | VAARG, |
||
| 1077 | |||
| 1078 | /// VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, |
||
| 1079 | /// a source pointer, a SRCVALUE for the destination, and a SRCVALUE for the |
||
| 1080 | /// source. |
||
| 1081 | VACOPY, |
||
| 1082 | |||
| 1083 | /// VAEND, VASTART - VAEND and VASTART have three operands: an input chain, |
||
| 1084 | /// pointer, and a SRCVALUE. |
||
| 1085 | VAEND, |
||
| 1086 | VASTART, |
||
| 1087 | |||
| 1088 | // PREALLOCATED_SETUP - This has 2 operands: an input chain and a SRCVALUE |
||
| 1089 | // with the preallocated call Value. |
||
| 1090 | PREALLOCATED_SETUP, |
||
| 1091 | // PREALLOCATED_ARG - This has 3 operands: an input chain, a SRCVALUE |
||
| 1092 | // with the preallocated call Value, and a constant int. |
||
| 1093 | PREALLOCATED_ARG, |
||
| 1094 | |||
| 1095 | /// SRCVALUE - This is a node type that holds a Value* that is used to |
||
| 1096 | /// make reference to a value in the LLVM IR. |
||
| 1097 | SRCVALUE, |
||
| 1098 | |||
| 1099 | /// MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to |
||
| 1100 | /// reference metadata in the IR. |
||
| 1101 | MDNODE_SDNODE, |
||
| 1102 | |||
| 1103 | /// PCMARKER - This corresponds to the pcmarker intrinsic. |
||
| 1104 | PCMARKER, |
||
| 1105 | |||
| 1106 | /// READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic. |
||
| 1107 | /// It produces a chain and one i64 value. The only operand is a chain. |
||
| 1108 | /// If i64 is not legal, the result will be expanded into smaller values. |
||
| 1109 | /// Still, it returns an i64, so targets should set legality for i64. |
||
| 1110 | /// The result is the content of the architecture-specific cycle |
||
| 1111 | /// counter-like register (or other high accuracy low latency clock source). |
||
| 1112 | READCYCLECOUNTER, |
||
| 1113 | |||
| 1114 | /// HANDLENODE node - Used as a handle for various purposes. |
||
| 1115 | HANDLENODE, |
||
| 1116 | |||
| 1117 | /// INIT_TRAMPOLINE - This corresponds to the init_trampoline intrinsic. It |
||
| 1118 | /// takes as input a token chain, the pointer to the trampoline, the pointer |
||
| 1119 | /// to the nested function, the pointer to pass for the 'nest' parameter, a |
||
| 1120 | /// SRCVALUE for the trampoline and another for the nested function |
||
| 1121 | /// (allowing targets to access the original Function*). |
||
| 1122 | /// It produces a token chain as output. |
||
| 1123 | INIT_TRAMPOLINE, |
||
| 1124 | |||
| 1125 | /// ADJUST_TRAMPOLINE - This corresponds to the adjust_trampoline intrinsic. |
||
| 1126 | /// It takes a pointer to the trampoline and produces a (possibly) new |
||
| 1127 | /// pointer to the same trampoline with platform-specific adjustments |
||
| 1128 | /// applied. The pointer it returns points to an executable block of code. |
||
| 1129 | ADJUST_TRAMPOLINE, |
||
| 1130 | |||
| 1131 | /// TRAP - Trapping instruction |
||
| 1132 | TRAP, |
||
| 1133 | |||
| 1134 | /// DEBUGTRAP - Trap intended to get the attention of a debugger. |
||
| 1135 | DEBUGTRAP, |
||
| 1136 | |||
| 1137 | /// UBSANTRAP - Trap with an immediate describing the kind of sanitizer |
||
| 1138 | /// failure. |
||
| 1139 | UBSANTRAP, |
||
| 1140 | |||
| 1141 | /// PREFETCH - This corresponds to a prefetch intrinsic. The first operand |
||
| 1142 | /// is the chain. The other operands are the address to prefetch, |
||
| 1143 | /// read / write specifier, locality specifier and instruction / data cache |
||
| 1144 | /// specifier. |
||
| 1145 | PREFETCH, |
||
| 1146 | |||
| 1147 | /// ARITH_FENCE - This corresponds to a arithmetic fence intrinsic. Both its |
||
| 1148 | /// operand and output are the same floating type. |
||
| 1149 | ARITH_FENCE, |
||
| 1150 | |||
| 1151 | /// MEMBARRIER - Compiler barrier only; generate a no-op. |
||
| 1152 | MEMBARRIER, |
||
| 1153 | |||
| 1154 | /// OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) |
||
| 1155 | /// This corresponds to the fence instruction. It takes an input chain, and |
||
| 1156 | /// two integer constants: an AtomicOrdering and a SynchronizationScope. |
||
| 1157 | ATOMIC_FENCE, |
||
| 1158 | |||
| 1159 | /// Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) |
||
| 1160 | /// This corresponds to "load atomic" instruction. |
||
| 1161 | ATOMIC_LOAD, |
||
| 1162 | |||
| 1163 | /// OUTCHAIN = ATOMIC_STORE(INCHAIN, ptr, val) |
||
| 1164 | /// This corresponds to "store atomic" instruction. |
||
| 1165 | ATOMIC_STORE, |
||
| 1166 | |||
| 1167 | /// Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) |
||
| 1168 | /// For double-word atomic operations: |
||
| 1169 | /// ValLo, ValHi, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmpLo, cmpHi, |
||
| 1170 | /// swapLo, swapHi) |
||
| 1171 | /// This corresponds to the cmpxchg instruction. |
||
| 1172 | ATOMIC_CMP_SWAP, |
||
| 1173 | |||
| 1174 | /// Val, Success, OUTCHAIN |
||
| 1175 | /// = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) |
||
| 1176 | /// N.b. this is still a strong cmpxchg operation, so |
||
| 1177 | /// Success == "Val == cmp". |
||
| 1178 | ATOMIC_CMP_SWAP_WITH_SUCCESS, |
||
| 1179 | |||
| 1180 | /// Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) |
||
| 1181 | /// Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN, ptr, amt) |
||
| 1182 | /// For double-word atomic operations: |
||
| 1183 | /// ValLo, ValHi, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amtLo, amtHi) |
||
| 1184 | /// ValLo, ValHi, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN, ptr, amtLo, amtHi) |
||
| 1185 | /// These correspond to the atomicrmw instruction. |
||
| 1186 | ATOMIC_SWAP, |
||
| 1187 | ATOMIC_LOAD_ADD, |
||
| 1188 | ATOMIC_LOAD_SUB, |
||
| 1189 | ATOMIC_LOAD_AND, |
||
| 1190 | ATOMIC_LOAD_CLR, |
||
| 1191 | ATOMIC_LOAD_OR, |
||
| 1192 | ATOMIC_LOAD_XOR, |
||
| 1193 | ATOMIC_LOAD_NAND, |
||
| 1194 | ATOMIC_LOAD_MIN, |
||
| 1195 | ATOMIC_LOAD_MAX, |
||
| 1196 | ATOMIC_LOAD_UMIN, |
||
| 1197 | ATOMIC_LOAD_UMAX, |
||
| 1198 | ATOMIC_LOAD_FADD, |
||
| 1199 | ATOMIC_LOAD_FSUB, |
||
| 1200 | ATOMIC_LOAD_FMAX, |
||
| 1201 | ATOMIC_LOAD_FMIN, |
||
| 1202 | ATOMIC_LOAD_UINC_WRAP, |
||
| 1203 | ATOMIC_LOAD_UDEC_WRAP, |
||
| 1204 | |||
| 1205 | // Masked load and store - consecutive vector load and store operations |
||
| 1206 | // with additional mask operand that prevents memory accesses to the |
||
| 1207 | // masked-off lanes. |
||
| 1208 | // |
||
| 1209 | // Val, OutChain = MLOAD(BasePtr, Mask, PassThru) |
||
| 1210 | // OutChain = MSTORE(Value, BasePtr, Mask) |
||
| 1211 | MLOAD, |
||
| 1212 | MSTORE, |
||
| 1213 | |||
| 1214 | // Masked gather and scatter - load and store operations for a vector of |
||
| 1215 | // random addresses with additional mask operand that prevents memory |
||
| 1216 | // accesses to the masked-off lanes. |
||
| 1217 | // |
||
| 1218 | // Val, OutChain = GATHER(InChain, PassThru, Mask, BasePtr, Index, Scale) |
||
| 1219 | // OutChain = SCATTER(InChain, Value, Mask, BasePtr, Index, Scale) |
||
| 1220 | // |
||
| 1221 | // The Index operand can have more vector elements than the other operands |
||
| 1222 | // due to type legalization. The extra elements are ignored. |
||
| 1223 | MGATHER, |
||
| 1224 | MSCATTER, |
||
| 1225 | |||
| 1226 | /// This corresponds to the llvm.lifetime.* intrinsics. The first operand |
||
| 1227 | /// is the chain and the second operand is the alloca pointer. |
||
| 1228 | LIFETIME_START, |
||
| 1229 | LIFETIME_END, |
||
| 1230 | |||
| 1231 | /// GC_TRANSITION_START/GC_TRANSITION_END - These operators mark the |
||
| 1232 | /// beginning and end of GC transition sequence, and carry arbitrary |
||
| 1233 | /// information that target might need for lowering. The first operand is |
||
| 1234 | /// a chain, the rest are specified by the target and not touched by the DAG |
||
| 1235 | /// optimizers. GC_TRANSITION_START..GC_TRANSITION_END pairs may not be |
||
| 1236 | /// nested. |
||
| 1237 | GC_TRANSITION_START, |
||
| 1238 | GC_TRANSITION_END, |
||
| 1239 | |||
| 1240 | /// GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of |
||
| 1241 | /// the most recent dynamic alloca. For most targets that would be 0, but |
||
| 1242 | /// for some others (e.g. PowerPC, PowerPC64) that would be compile-time |
||
| 1243 | /// known nonzero constant. The only operand here is the chain. |
||
| 1244 | GET_DYNAMIC_AREA_OFFSET, |
||
| 1245 | |||
| 1246 | /// Pseudo probe for AutoFDO, as a place holder in a basic block to improve |
||
| 1247 | /// the sample counts quality. |
||
| 1248 | PSEUDO_PROBE, |
||
| 1249 | |||
| 1250 | /// VSCALE(IMM) - Returns the runtime scaling factor used to calculate the |
||
| 1251 | /// number of elements within a scalable vector. IMM is a constant integer |
||
| 1252 | /// multiplier that is applied to the runtime value. |
||
| 1253 | VSCALE, |
||
| 1254 | |||
| 1255 | /// Generic reduction nodes. These nodes represent horizontal vector |
||
| 1256 | /// reduction operations, producing a scalar result. |
||
| 1257 | /// The SEQ variants perform reductions in sequential order. The first |
||
| 1258 | /// operand is an initial scalar accumulator value, and the second operand |
||
| 1259 | /// is the vector to reduce. |
||
| 1260 | /// E.g. RES = VECREDUCE_SEQ_FADD f32 ACC, <4 x f32> SRC_VEC |
||
| 1261 | /// ... is equivalent to |
||
| 1262 | /// RES = (((ACC + SRC_VEC[0]) + SRC_VEC[1]) + SRC_VEC[2]) + SRC_VEC[3] |
||
| 1263 | VECREDUCE_SEQ_FADD, |
||
| 1264 | VECREDUCE_SEQ_FMUL, |
||
| 1265 | |||
| 1266 | /// These reductions have relaxed evaluation order semantics, and have a |
||
| 1267 | /// single vector operand. The order of evaluation is unspecified. For |
||
| 1268 | /// pow-of-2 vectors, one valid legalizer expansion is to use a tree |
||
| 1269 | /// reduction, i.e.: |
||
| 1270 | /// For RES = VECREDUCE_FADD <8 x f16> SRC_VEC |
||
| 1271 | /// PART_RDX = FADD SRC_VEC[0:3], SRC_VEC[4:7] |
||
| 1272 | /// PART_RDX2 = FADD PART_RDX[0:1], PART_RDX[2:3] |
||
| 1273 | /// RES = FADD PART_RDX2[0], PART_RDX2[1] |
||
| 1274 | /// For non-pow-2 vectors, this can be computed by extracting each element |
||
| 1275 | /// and performing the operation as if it were scalarized. |
||
| 1276 | VECREDUCE_FADD, |
||
| 1277 | VECREDUCE_FMUL, |
||
| 1278 | /// FMIN/FMAX nodes can have flags, for NaN/NoNaN variants. |
||
| 1279 | VECREDUCE_FMAX, |
||
| 1280 | VECREDUCE_FMIN, |
||
| 1281 | /// Integer reductions may have a result type larger than the vector element |
||
| 1282 | /// type. However, the reduction is performed using the vector element type |
||
| 1283 | /// and the value in the top bits is unspecified. |
||
| 1284 | VECREDUCE_ADD, |
||
| 1285 | VECREDUCE_MUL, |
||
| 1286 | VECREDUCE_AND, |
||
| 1287 | VECREDUCE_OR, |
||
| 1288 | VECREDUCE_XOR, |
||
| 1289 | VECREDUCE_SMAX, |
||
| 1290 | VECREDUCE_SMIN, |
||
| 1291 | VECREDUCE_UMAX, |
||
| 1292 | VECREDUCE_UMIN, |
||
| 1293 | |||
| 1294 | // The `llvm.experimental.stackmap` intrinsic. |
||
| 1295 | // Operands: input chain, glue, <id>, <numShadowBytes>, [live0[, live1...]] |
||
| 1296 | // Outputs: output chain, glue |
||
| 1297 | STACKMAP, |
||
| 1298 | |||
| 1299 | // The `llvm.experimental.patchpoint.*` intrinsic. |
||
| 1300 | // Operands: input chain, [glue], reg-mask, <id>, <numShadowBytes>, callee, |
||
| 1301 | // <numArgs>, cc, ... |
||
| 1302 | // Outputs: [rv], output chain, glue |
||
| 1303 | PATCHPOINT, |
||
| 1304 | |||
| 1305 | // Vector Predication |
||
| 1306 | #define BEGIN_REGISTER_VP_SDNODE(VPSDID, ...) VPSDID, |
||
| 1307 | #include "llvm/IR/VPIntrinsics.def" |
||
| 1308 | |||
| 1309 | /// BUILTIN_OP_END - This must be the last enum value in this list. |
||
| 1310 | /// The target-specific pre-isel opcode values start here. |
||
| 1311 | BUILTIN_OP_END |
||
| 1312 | }; |
||
| 1313 | |||
| 1314 | /// FIRST_TARGET_STRICTFP_OPCODE - Target-specific pre-isel operations |
||
| 1315 | /// which cannot raise FP exceptions should be less than this value. |
||
| 1316 | /// Those that do must not be less than this value. |
||
| 1317 | static const int FIRST_TARGET_STRICTFP_OPCODE = BUILTIN_OP_END + 400; |
||
| 1318 | |||
| 1319 | /// FIRST_TARGET_MEMORY_OPCODE - Target-specific pre-isel operations |
||
| 1320 | /// which do not reference a specific memory location should be less than |
||
| 1321 | /// this value. Those that do must not be less than this value, and can |
||
| 1322 | /// be used with SelectionDAG::getMemIntrinsicNode. |
||
| 1323 | static const int FIRST_TARGET_MEMORY_OPCODE = BUILTIN_OP_END + 500; |
||
| 1324 | |||
| 1325 | /// Whether this is bitwise logic opcode. |
||
| 1326 | inline bool isBitwiseLogicOp(unsigned Opcode) { |
||
| 1327 | return Opcode == ISD::AND || Opcode == ISD::OR || Opcode == ISD::XOR; |
||
| 1328 | } |
||
| 1329 | |||
| 1330 | /// Get underlying scalar opcode for VECREDUCE opcode. |
||
| 1331 | /// For example ISD::AND for ISD::VECREDUCE_AND. |
||
| 1332 | NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode); |
||
| 1333 | |||
| 1334 | /// Whether this is a vector-predicated Opcode. |
||
| 1335 | bool isVPOpcode(unsigned Opcode); |
||
| 1336 | |||
| 1337 | /// Whether this is a vector-predicated binary operation opcode. |
||
| 1338 | bool isVPBinaryOp(unsigned Opcode); |
||
| 1339 | |||
| 1340 | /// Whether this is a vector-predicated reduction opcode. |
||
| 1341 | bool isVPReduction(unsigned Opcode); |
||
| 1342 | |||
| 1343 | /// The operand position of the vector mask. |
||
| 1344 | std::optional<unsigned> getVPMaskIdx(unsigned Opcode); |
||
| 1345 | |||
| 1346 | /// The operand position of the explicit vector length parameter. |
||
| 1347 | std::optional<unsigned> getVPExplicitVectorLengthIdx(unsigned Opcode); |
||
| 1348 | |||
| 1349 | //===--------------------------------------------------------------------===// |
||
| 1350 | /// MemIndexedMode enum - This enum defines the load / store indexed |
||
| 1351 | /// addressing modes. |
||
| 1352 | /// |
||
| 1353 | /// UNINDEXED "Normal" load / store. The effective address is already |
||
| 1354 | /// computed and is available in the base pointer. The offset |
||
| 1355 | /// operand is always undefined. In addition to producing a |
||
| 1356 | /// chain, an unindexed load produces one value (result of the |
||
| 1357 | /// load); an unindexed store does not produce a value. |
||
| 1358 | /// |
||
| 1359 | /// PRE_INC Similar to the unindexed mode where the effective address is |
||
| 1360 | /// PRE_DEC the value of the base pointer add / subtract the offset. |
||
| 1361 | /// It considers the computation as being folded into the load / |
||
| 1362 | /// store operation (i.e. the load / store does the address |
||
| 1363 | /// computation as well as performing the memory transaction). |
||
| 1364 | /// The base operand is always undefined. In addition to |
||
| 1365 | /// producing a chain, pre-indexed load produces two values |
||
| 1366 | /// (result of the load and the result of the address |
||
| 1367 | /// computation); a pre-indexed store produces one value (result |
||
| 1368 | /// of the address computation). |
||
| 1369 | /// |
||
| 1370 | /// POST_INC The effective address is the value of the base pointer. The |
||
| 1371 | /// POST_DEC value of the offset operand is then added to / subtracted |
||
| 1372 | /// from the base after memory transaction. In addition to |
||
| 1373 | /// producing a chain, post-indexed load produces two values |
||
| 1374 | /// (the result of the load and the result of the base +/- offset |
||
| 1375 | /// computation); a post-indexed store produces one value (the |
||
| 1376 | /// the result of the base +/- offset computation). |
||
| 1377 | enum MemIndexedMode { UNINDEXED = 0, PRE_INC, PRE_DEC, POST_INC, POST_DEC }; |
||
| 1378 | |||
| 1379 | static const int LAST_INDEXED_MODE = POST_DEC + 1; |
||
| 1380 | |||
| 1381 | //===--------------------------------------------------------------------===// |
||
| 1382 | /// MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's |
||
| 1383 | /// index parameter when calculating addresses. |
||
| 1384 | /// |
||
| 1385 | /// SIGNED_SCALED Addr = Base + ((signed)Index * Scale) |
||
| 1386 | /// UNSIGNED_SCALED Addr = Base + ((unsigned)Index * Scale) |
||
| 1387 | /// |
||
| 1388 | /// NOTE: The value of Scale is typically only known to the node owning the |
||
| 1389 | /// IndexType, with a value of 1 the equivalent of being unscaled. |
||
| 1390 | enum MemIndexType { SIGNED_SCALED = 0, UNSIGNED_SCALED }; |
||
| 1391 | |||
| 1392 | static const int LAST_MEM_INDEX_TYPE = UNSIGNED_SCALED + 1; |
||
| 1393 | |||
| 1394 | inline bool isIndexTypeSigned(MemIndexType IndexType) { |
||
| 1395 | return IndexType == SIGNED_SCALED; |
||
| 1396 | } |
||
| 1397 | |||
| 1398 | //===--------------------------------------------------------------------===// |
||
| 1399 | /// LoadExtType enum - This enum defines the three variants of LOADEXT |
||
| 1400 | /// (load with extension). |
||
| 1401 | /// |
||
| 1402 | /// SEXTLOAD loads the integer operand and sign extends it to a larger |
||
| 1403 | /// integer result type. |
||
| 1404 | /// ZEXTLOAD loads the integer operand and zero extends it to a larger |
||
| 1405 | /// integer result type. |
||
| 1406 | /// EXTLOAD is used for two things: floating point extending loads and |
||
| 1407 | /// integer extending loads [the top bits are undefined]. |
||
| 1408 | enum LoadExtType { NON_EXTLOAD = 0, EXTLOAD, SEXTLOAD, ZEXTLOAD }; |
||
| 1409 | |||
| 1410 | static const int LAST_LOADEXT_TYPE = ZEXTLOAD + 1; |
||
| 1411 | |||
| 1412 | NodeType getExtForLoadExtType(bool IsFP, LoadExtType); |
||
| 1413 | |||
| 1414 | //===--------------------------------------------------------------------===// |
||
| 1415 | /// ISD::CondCode enum - These are ordered carefully to make the bitfields |
||
| 1416 | /// below work out, when considering SETFALSE (something that never exists |
||
| 1417 | /// dynamically) as 0. "U" -> Unsigned (for integer operands) or Unordered |
||
| 1418 | /// (for floating point), "L" -> Less than, "G" -> Greater than, "E" -> Equal |
||
| 1419 | /// to. If the "N" column is 1, the result of the comparison is undefined if |
||
| 1420 | /// the input is a NAN. |
||
| 1421 | /// |
||
| 1422 | /// All of these (except for the 'always folded ops') should be handled for |
||
| 1423 | /// floating point. For integer, only the SETEQ,SETNE,SETLT,SETLE,SETGT, |
||
| 1424 | /// SETGE,SETULT,SETULE,SETUGT, and SETUGE opcodes are used. |
||
| 1425 | /// |
||
| 1426 | /// Note that these are laid out in a specific order to allow bit-twiddling |
||
| 1427 | /// to transform conditions. |
||
| 1428 | enum CondCode { |
||
| 1429 | // Opcode N U L G E Intuitive operation |
||
| 1430 | SETFALSE, // 0 0 0 0 Always false (always folded) |
||
| 1431 | SETOEQ, // 0 0 0 1 True if ordered and equal |
||
| 1432 | SETOGT, // 0 0 1 0 True if ordered and greater than |
||
| 1433 | SETOGE, // 0 0 1 1 True if ordered and greater than or equal |
||
| 1434 | SETOLT, // 0 1 0 0 True if ordered and less than |
||
| 1435 | SETOLE, // 0 1 0 1 True if ordered and less than or equal |
||
| 1436 | SETONE, // 0 1 1 0 True if ordered and operands are unequal |
||
| 1437 | SETO, // 0 1 1 1 True if ordered (no nans) |
||
| 1438 | SETUO, // 1 0 0 0 True if unordered: isnan(X) | isnan(Y) |
||
| 1439 | SETUEQ, // 1 0 0 1 True if unordered or equal |
||
| 1440 | SETUGT, // 1 0 1 0 True if unordered or greater than |
||
| 1441 | SETUGE, // 1 0 1 1 True if unordered, greater than, or equal |
||
| 1442 | SETULT, // 1 1 0 0 True if unordered or less than |
||
| 1443 | SETULE, // 1 1 0 1 True if unordered, less than, or equal |
||
| 1444 | SETUNE, // 1 1 1 0 True if unordered or not equal |
||
| 1445 | SETTRUE, // 1 1 1 1 Always true (always folded) |
||
| 1446 | // Don't care operations: undefined if the input is a nan. |
||
| 1447 | SETFALSE2, // 1 X 0 0 0 Always false (always folded) |
||
| 1448 | SETEQ, // 1 X 0 0 1 True if equal |
||
| 1449 | SETGT, // 1 X 0 1 0 True if greater than |
||
| 1450 | SETGE, // 1 X 0 1 1 True if greater than or equal |
||
| 1451 | SETLT, // 1 X 1 0 0 True if less than |
||
| 1452 | SETLE, // 1 X 1 0 1 True if less than or equal |
||
| 1453 | SETNE, // 1 X 1 1 0 True if not equal |
||
| 1454 | SETTRUE2, // 1 X 1 1 1 Always true (always folded) |
||
| 1455 | |||
| 1456 | SETCC_INVALID // Marker value. |
||
| 1457 | }; |
||
| 1458 | |||
| 1459 | /// Return true if this is a setcc instruction that performs a signed |
||
| 1460 | /// comparison when used with integer operands. |
||
| 1461 | inline bool isSignedIntSetCC(CondCode Code) { |
||
| 1462 | return Code == SETGT || Code == SETGE || Code == SETLT || Code == SETLE; |
||
| 1463 | } |
||
| 1464 | |||
| 1465 | /// Return true if this is a setcc instruction that performs an unsigned |
||
| 1466 | /// comparison when used with integer operands. |
||
| 1467 | inline bool isUnsignedIntSetCC(CondCode Code) { |
||
| 1468 | return Code == SETUGT || Code == SETUGE || Code == SETULT || Code == SETULE; |
||
| 1469 | } |
||
| 1470 | |||
| 1471 | /// Return true if this is a setcc instruction that performs an equality |
||
| 1472 | /// comparison when used with integer operands. |
||
| 1473 | inline bool isIntEqualitySetCC(CondCode Code) { |
||
| 1474 | return Code == SETEQ || Code == SETNE; |
||
| 1475 | } |
||
| 1476 | |||
| 1477 | /// Return true if the specified condition returns true if the two operands to |
||
| 1478 | /// the condition are equal. Note that if one of the two operands is a NaN, |
||
| 1479 | /// this value is meaningless. |
||
| 1480 | inline bool isTrueWhenEqual(CondCode Cond) { return ((int)Cond & 1) != 0; } |
||
| 1481 | |||
| 1482 | /// This function returns 0 if the condition is always false if an operand is |
||
| 1483 | /// a NaN, 1 if the condition is always true if the operand is a NaN, and 2 if |
||
| 1484 | /// the condition is undefined if the operand is a NaN. |
||
| 1485 | inline unsigned getUnorderedFlavor(CondCode Cond) { |
||
| 1486 | return ((int)Cond >> 3) & 3; |
||
| 1487 | } |
||
| 1488 | |||
| 1489 | /// Return the operation corresponding to !(X op Y), where 'op' is a valid |
||
| 1490 | /// SetCC operation. |
||
| 1491 | CondCode getSetCCInverse(CondCode Operation, EVT Type); |
||
| 1492 | |||
| 1493 | inline bool isExtOpcode(unsigned Opcode) { |
||
| 1494 | return Opcode == ISD::ANY_EXTEND || Opcode == ISD::ZERO_EXTEND || |
||
| 1495 | Opcode == ISD::SIGN_EXTEND; |
||
| 1496 | } |
||
| 1497 | |||
| 1498 | namespace GlobalISel { |
||
| 1499 | /// Return the operation corresponding to !(X op Y), where 'op' is a valid |
||
| 1500 | /// SetCC operation. The U bit of the condition code has different meanings |
||
| 1501 | /// between floating point and integer comparisons and LLT's don't provide |
||
| 1502 | /// this distinction. As such we need to be told whether the comparison is |
||
| 1503 | /// floating point or integer-like. Pointers should use integer-like |
||
| 1504 | /// comparisons. |
||
| 1505 | CondCode getSetCCInverse(CondCode Operation, bool isIntegerLike); |
||
| 1506 | } // end namespace GlobalISel |
||
| 1507 | |||
| 1508 | /// Return the operation corresponding to (Y op X) when given the operation |
||
| 1509 | /// for (X op Y). |
||
| 1510 | CondCode getSetCCSwappedOperands(CondCode Operation); |
||
| 1511 | |||
| 1512 | /// Return the result of a logical OR between different comparisons of |
||
| 1513 | /// identical values: ((X op1 Y) | (X op2 Y)). This function returns |
||
| 1514 | /// SETCC_INVALID if it is not possible to represent the resultant comparison. |
||
| 1515 | CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, EVT Type); |
||
| 1516 | |||
| 1517 | /// Return the result of a logical AND between different comparisons of |
||
| 1518 | /// identical values: ((X op1 Y) & (X op2 Y)). This function returns |
||
| 1519 | /// SETCC_INVALID if it is not possible to represent the resultant comparison. |
||
| 1520 | CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, EVT Type); |
||
| 1521 | |||
| 1522 | } // namespace ISD |
||
| 1523 | |||
| 1524 | } // namespace llvm |
||
| 1525 | |||
| 1526 | #endif |