| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_LIB_TARGET_POWERPC_PPCSELECTIONDAGINFO_H | |
| #define LLVM_LIB_TARGET_POWERPC_PPCSELECTIONDAGINFO_H | |
| #include "llvm/CodeGen/SelectionDAGTargetInfo.h" | |
| #define GET_SDNODE_ENUM | |
| #include "PPCGenSDNodeInfo.inc" | |
| namespace llvm { | |
| namespace PPCISD { | |
| enum NodeType : unsigned { | |
| /// The result of the mflr at function entry, used for PIC code. | |
| GlobalBaseReg = GENERATED_OPCODE_END, | |
| /// The combination of sra[wd]i and addze used to implemented signed | |
| /// integer division by a power of 2. The first operand is the dividend, | |
| /// and the second is the constant shift amount (representing the | |
| /// divisor). | |
| SRA_ADDZE, | |
| /// R32 = MFOCRF(CRREG, INFLAG) - Represents the MFOCRF instruction. | |
| /// This copies the bits corresponding to the specified CRREG into the | |
| /// resultant GPR. Bits corresponding to other CR regs are undefined. | |
| MFOCRF, | |
| // FIXME: Remove these once the ANDI glue bug is fixed: | |
| /// i1 = ANDI_rec_1_[EQ|GT]_BIT(i32 or i64 x) - Represents the result of the | |
| /// eq or gt bit of CR0 after executing andi. x, 1. This is used to | |
| /// implement truncation of i32 or i64 to i1. | |
| ANDI_rec_1_EQ_BIT, | |
| ANDI_rec_1_GT_BIT, | |
| // READ_TIME_BASE - A read of the 64-bit time-base register on a 32-bit | |
| // target (returns (Lo, Hi)). It takes a chain operand. | |
| READ_TIME_BASE, | |
| /// CHAIN = BDNZ CHAIN, DESTBB - These are used to create counter-based | |
| /// loops. | |
| BDNZ, | |
| BDZ, | |
| /// GPRC = address of _GLOBAL_OFFSET_TABLE_. Used by general dynamic and | |
| /// local dynamic TLS and position indendepent code on PPC32. | |
| PPC32_PICGOT, | |
| /// VRRC = VADD_SPLAT Elt, EltSize - Temporary node to be expanded | |
| /// during instruction selection to optimize a BUILD_VECTOR into | |
| /// operations on splats. This is necessary to avoid losing these | |
| /// optimizations due to constant folding. | |
| VADD_SPLAT, | |
| }; | |
| } // namespace PPCISD | |
| class PPCSelectionDAGInfo : public SelectionDAGGenTargetInfo { | |
| public: | |
| PPCSelectionDAGInfo(); | |
| ~PPCSelectionDAGInfo() override; | |
| const char *getTargetNodeName(unsigned Opcode) const override; | |
| void verifyTargetNode(const SelectionDAG &DAG, | |
| const SDNode *N) const override; | |
| std::pair<SDValue, SDValue> | |
| EmitTargetCodeForMemccpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, | |
| SDValue Dst, SDValue Src, SDValue C, SDValue Size, | |
| const CallInst *CI) const override; | |
| std::pair<SDValue, SDValue> | |
| EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, | |
| SDValue Op1, SDValue Op2, SDValue Op3, | |
| const CallInst *CI) const override; | |
| std::pair<SDValue, SDValue> EmitTargetCodeForStrcmp( | |
| SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Op1, | |
| SDValue Op2, MachinePointerInfo Op1PtrInfo, MachinePointerInfo Op2PtrInfo, | |
| const CallInst *CI) const override; | |
| std::pair<SDValue, SDValue> | |
| EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, | |
| SDValue Dest, SDValue Src, | |
| MachinePointerInfo DestPtrInfo, | |
| MachinePointerInfo SrcPtrInfo, bool isStpcpy, | |
| const CallInst *CI) const override; | |
| std::pair<SDValue, SDValue> | |
| EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, | |
| SDValue Src, const CallInst *CI) const override; | |
| std::pair<SDValue, SDValue> | |
| EmitTargetCodeForStrstr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, | |
| SDValue Op1, SDValue Op2, | |
| const CallInst *CI) const override; | |
| }; | |
| } // namespace llvm | |
| #endif // LLVM_LIB_TARGET_POWERPC_PPCSELECTIONDAGINFO_H |