1e8d8bef9SDimitry Andric //===- PPCLegalizerInfo.h ----------------------------------------*- C++ -*-==// 2e8d8bef9SDimitry Andric // 3e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e8d8bef9SDimitry Andric // 7e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 8e8d8bef9SDimitry Andric /// \file 9e8d8bef9SDimitry Andric /// This file implements the targeting of the Machinelegalizer class for PowerPC 10e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 11e8d8bef9SDimitry Andric 12e8d8bef9SDimitry Andric #include "PPCLegalizerInfo.h" 13e8d8bef9SDimitry Andric #include "llvm/Support/Debug.h" 14e8d8bef9SDimitry Andric 15e8d8bef9SDimitry Andric #define DEBUG_TYPE "ppc-legalinfo" 16e8d8bef9SDimitry Andric 17e8d8bef9SDimitry Andric using namespace llvm; 18e8d8bef9SDimitry Andric using namespace LegalizeActions; 19e8d8bef9SDimitry Andric 20fe6060f1SDimitry Andric PPCLegalizerInfo::PPCLegalizerInfo(const PPCSubtarget &ST) { 21*bdd1243dSDimitry Andric using namespace TargetOpcode; 22*bdd1243dSDimitry Andric const LLT P0 = LLT::pointer(0, 64); 23*bdd1243dSDimitry Andric const LLT S1 = LLT::scalar(1); 24*bdd1243dSDimitry Andric const LLT S8 = LLT::scalar(8); 25*bdd1243dSDimitry Andric const LLT S16 = LLT::scalar(16); 26*bdd1243dSDimitry Andric const LLT S32 = LLT::scalar(32); 27*bdd1243dSDimitry Andric const LLT S64 = LLT::scalar(64); 28*bdd1243dSDimitry Andric getActionDefinitionsBuilder(G_IMPLICIT_DEF).legalFor({S64}); 29*bdd1243dSDimitry Andric getActionDefinitionsBuilder(G_CONSTANT) 30*bdd1243dSDimitry Andric .legalFor({S32, S64}) 31*bdd1243dSDimitry Andric .clampScalar(0, S64, S64); 32*bdd1243dSDimitry Andric getActionDefinitionsBuilder({G_ZEXT, G_SEXT, G_ANYEXT}) 33*bdd1243dSDimitry Andric .legalForCartesianProduct({S64}, {S1, S8, S16, S32}) 34*bdd1243dSDimitry Andric .clampScalar(0, S64, S64); 35*bdd1243dSDimitry Andric getActionDefinitionsBuilder({G_AND, G_OR, G_XOR}) 36*bdd1243dSDimitry Andric .legalFor({S64}) 37*bdd1243dSDimitry Andric .clampScalar(0, S64, S64); 38*bdd1243dSDimitry Andric getActionDefinitionsBuilder({G_ADD, G_SUB}) 39*bdd1243dSDimitry Andric .legalFor({S64}) 40*bdd1243dSDimitry Andric .clampScalar(0, S64, S64); 41*bdd1243dSDimitry Andric 42*bdd1243dSDimitry Andric getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV}) 43*bdd1243dSDimitry Andric .legalFor({S32, S64}); 44*bdd1243dSDimitry Andric 45*bdd1243dSDimitry Andric getActionDefinitionsBuilder(G_FCMP).legalForCartesianProduct({S1}, 46*bdd1243dSDimitry Andric {S32, S64}); 47*bdd1243dSDimitry Andric 48*bdd1243dSDimitry Andric getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI}) 49*bdd1243dSDimitry Andric .legalForCartesianProduct({S64}, {S32, S64}); 50*bdd1243dSDimitry Andric 51*bdd1243dSDimitry Andric getActionDefinitionsBuilder({G_SITOFP, G_UITOFP}) 52*bdd1243dSDimitry Andric .legalForCartesianProduct({S32, S64}, {S64}); 53*bdd1243dSDimitry Andric 54*bdd1243dSDimitry Andric getActionDefinitionsBuilder({G_LOAD, G_STORE}) 55*bdd1243dSDimitry Andric .legalForTypesWithMemDesc({{S64, P0, S64, 8}, {S32, P0, S32, 4}}); 56*bdd1243dSDimitry Andric 57fe6060f1SDimitry Andric getLegacyLegalizerInfo().computeTables(); 58fe6060f1SDimitry Andric } 59