aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/PowerPC/PPCSelectionDAGInfo.cpp
blob: 80aa1122167dff4c39ca09e193b3d8b039af41b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

#include "PPCSelectionDAGInfo.h"
#include "llvm/CodeGen/SelectionDAG.h"

#define GET_SDNODE_DESC
#include "PPCGenSDNodeInfo.inc"

using namespace llvm;

PPCSelectionDAGInfo::PPCSelectionDAGInfo()
    : SelectionDAGGenTargetInfo(PPCGenSDNodeInfo) {}

PPCSelectionDAGInfo::~PPCSelectionDAGInfo() = default;

const char *PPCSelectionDAGInfo::getTargetNodeName(unsigned Opcode) const {
  switch (static_cast<PPCISD::NodeType>(Opcode)) {
  case PPCISD::GlobalBaseReg:
    return "PPCISD::GlobalBaseReg";
  case PPCISD::SRA_ADDZE:
    return "PPCISD::SRA_ADDZE";
  case PPCISD::READ_TIME_BASE:
    return "PPCISD::READ_TIME_BASE";
  case PPCISD::MFOCRF:
    return "PPCISD::MFOCRF";
  case PPCISD::ANDI_rec_1_EQ_BIT:
    return "PPCISD::ANDI_rec_1_EQ_BIT";
  case PPCISD::ANDI_rec_1_GT_BIT:
    return "PPCISD::ANDI_rec_1_GT_BIT";
  case PPCISD::BDNZ:
    return "PPCISD::BDNZ";
  case PPCISD::BDZ:
    return "PPCISD::BDZ";
  case PPCISD::PPC32_PICGOT:
    return "PPCISD::PPC32_PICGOT";
  case PPCISD::VADD_SPLAT:
    return "PPCISD::VADD_SPLAT";
  }

  return SelectionDAGGenTargetInfo::getTargetNodeName(Opcode);
}

void PPCSelectionDAGInfo::verifyTargetNode(const SelectionDAG &DAG,
                                           const SDNode *N) const {
  switch (N->getOpcode()) {
  default:
    break;
  case PPCISD::DYNAREAOFFSET:
    // invalid number of results; expected 2, got 1
  case PPCISD::TOC_ENTRY:
    // invalid number of results; expected 1, got 2
  case PPCISD::STORE_COND:
    // invalid number of results; expected 2, got 3
  case PPCISD::LD_SPLAT:
  case PPCISD::SEXT_LD_SPLAT:
  case PPCISD::ZEXT_LD_SPLAT:
    // invalid number of operands; expected 2, got 3
  case PPCISD::ST_VSR_SCAL_INT:
    // invalid number of operands; expected 4, got 5
  case PPCISD::XXPERM:
    // operand #1 must have type v2f64, but has type v16i8
  case PPCISD::ACC_BUILD:
    // operand #3 must have type v4i32, but has type v16i8
  case PPCISD::PAIR_BUILD:
    // operand #1 must have type v4i32, but has type v16i8
    return;
  }

  SelectionDAGGenTargetInfo::verifyTargetNode(DAG, N);
}

std::pair<SDValue, SDValue> PPCSelectionDAGInfo::EmitTargetCodeForMemcmp(
    SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2,
    SDValue Op3, const CallInst *CI) const {
  return DAG.getMemcmp(Chain, dl, Op1, Op2, Op3, CI);
}

std::pair<SDValue, SDValue>
PPCSelectionDAGInfo::EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL,
                                             SDValue Chain, SDValue Src,
                                             const CallInst *CI) const {
  return DAG.getStrlen(Chain, DL, Src, CI);
}