1009cd4e4SKit Barton //===- PPCLegalizerInfo.h ----------------------------------------*- C++ -*-==// 2009cd4e4SKit Barton // 3009cd4e4SKit Barton // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4009cd4e4SKit Barton // See https://llvm.org/LICENSE.txt for license information. 5009cd4e4SKit Barton // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6009cd4e4SKit Barton // 7009cd4e4SKit Barton //===----------------------------------------------------------------------===// 8009cd4e4SKit Barton /// \file 9009cd4e4SKit Barton /// This file implements the targeting of the Machinelegalizer class for PowerPC 10009cd4e4SKit Barton //===----------------------------------------------------------------------===// 11009cd4e4SKit Barton 12009cd4e4SKit Barton #include "PPCLegalizerInfo.h" 13009cd4e4SKit Barton 14009cd4e4SKit Barton #define DEBUG_TYPE "ppc-legalinfo" 15009cd4e4SKit Barton 16009cd4e4SKit Barton using namespace llvm; 17009cd4e4SKit Barton using namespace LegalizeActions; 18*3508f123SAmy Kwan using namespace LegalizeMutations; 19*3508f123SAmy Kwan using namespace LegalityPredicates; 20*3508f123SAmy Kwan 21*3508f123SAmy Kwan static LegalityPredicate isRegisterType(unsigned TypeIdx) { 22*3508f123SAmy Kwan return [=](const LegalityQuery &Query) { 23*3508f123SAmy Kwan const LLT QueryTy = Query.Types[TypeIdx]; 24*3508f123SAmy Kwan unsigned TypeSize = QueryTy.getSizeInBits(); 25*3508f123SAmy Kwan 26*3508f123SAmy Kwan if (TypeSize % 32 == 1 || TypeSize > 128) 27*3508f123SAmy Kwan return false; 28*3508f123SAmy Kwan 29*3508f123SAmy Kwan // Check if this is a legal PowerPC vector type. 30*3508f123SAmy Kwan if (QueryTy.isVector()) { 31*3508f123SAmy Kwan const int EltSize = QueryTy.getElementType().getSizeInBits(); 32*3508f123SAmy Kwan return (EltSize == 8 || EltSize == 16 || EltSize == 32 || EltSize == 64); 33*3508f123SAmy Kwan } 34*3508f123SAmy Kwan 35*3508f123SAmy Kwan return true; 36*3508f123SAmy Kwan }; 37*3508f123SAmy Kwan } 38009cd4e4SKit Barton 39aaac2682SDaniel Sanders PPCLegalizerInfo::PPCLegalizerInfo(const PPCSubtarget &ST) { 40be4a1dfbSKai Nacke using namespace TargetOpcode; 41503a935dSChen Zheng const LLT P0 = LLT::pointer(0, 64); 42ac93a4e7SChen Zheng const LLT S1 = LLT::scalar(1); 43b41d22dbSChen Zheng const LLT S8 = LLT::scalar(8); 44b41d22dbSChen Zheng const LLT S16 = LLT::scalar(16); 45d9143ce3SChen Zheng const LLT S32 = LLT::scalar(32); 46be4a1dfbSKai Nacke const LLT S64 = LLT::scalar(64); 47*3508f123SAmy Kwan const LLT V16S8 = LLT::fixed_vector(16, 8); 48*3508f123SAmy Kwan const LLT V8S16 = LLT::fixed_vector(8, 16); 49*3508f123SAmy Kwan const LLT V4S32 = LLT::fixed_vector(4, 32); 50*3508f123SAmy Kwan const LLT V2S64 = LLT::fixed_vector(2, 64); 51be4a1dfbSKai Nacke getActionDefinitionsBuilder(G_IMPLICIT_DEF).legalFor({S64}); 52be4a1dfbSKai Nacke getActionDefinitionsBuilder(G_CONSTANT) 53b41d22dbSChen Zheng .legalFor({S32, S64}) 54b41d22dbSChen Zheng .clampScalar(0, S64, S64); 55ac93a4e7SChen Zheng getActionDefinitionsBuilder({G_ZEXT, G_SEXT, G_ANYEXT}) 56ac93a4e7SChen Zheng .legalForCartesianProduct({S64}, {S1, S8, S16, S32}) 57be4a1dfbSKai Nacke .clampScalar(0, S64, S64); 58be4a1dfbSKai Nacke getActionDefinitionsBuilder({G_AND, G_OR, G_XOR}) 59*3508f123SAmy Kwan .legalFor({S64, V4S32}) 60*3508f123SAmy Kwan .clampScalar(0, S64, S64) 61*3508f123SAmy Kwan .bitcastIf(typeIsNot(0, V4S32), changeTo(0, V4S32)); 622b1e895aSKai Nacke getActionDefinitionsBuilder({G_ADD, G_SUB}) 63*3508f123SAmy Kwan .legalFor({S64, V16S8, V8S16, V4S32, V2S64}) 642b1e895aSKai Nacke .clampScalar(0, S64, S64); 65*3508f123SAmy Kwan getActionDefinitionsBuilder(G_BITCAST) 66*3508f123SAmy Kwan .legalIf(all(isRegisterType(0), isRegisterType(1))) 67*3508f123SAmy Kwan .lower(); 68d9143ce3SChen Zheng 69d9143ce3SChen Zheng getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV}) 70*3508f123SAmy Kwan .legalFor({S32, S64, V4S32, V2S64}); 71d9143ce3SChen Zheng 72ac93a4e7SChen Zheng getActionDefinitionsBuilder(G_FCMP).legalForCartesianProduct({S1}, 73ac93a4e7SChen Zheng {S32, S64}); 74ac93a4e7SChen Zheng 750a9b1c59SChen Zheng getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI}) 760a9b1c59SChen Zheng .legalForCartesianProduct({S64}, {S32, S64}); 770a9b1c59SChen Zheng 780a9b1c59SChen Zheng getActionDefinitionsBuilder({G_SITOFP, G_UITOFP}) 790a9b1c59SChen Zheng .legalForCartesianProduct({S32, S64}, {S64}); 800a9b1c59SChen Zheng 81503a935dSChen Zheng getActionDefinitionsBuilder({G_LOAD, G_STORE}) 82b41d22dbSChen Zheng .legalForTypesWithMemDesc({{S64, P0, S64, 8}, {S32, P0, S32, 4}}); 83503a935dSChen Zheng 846ee2f770SChen Zheng getActionDefinitionsBuilder(G_FCONSTANT).lowerFor({S32, S64}); 856ee2f770SChen Zheng getActionDefinitionsBuilder(G_CONSTANT_POOL).legalFor({P0}); 866ee2f770SChen Zheng 87aaac2682SDaniel Sanders getLegacyLegalizerInfo().computeTables(); 88aaac2682SDaniel Sanders } 89