xref: /llvm-project/llvm/lib/Target/PowerPC/GISel/PPCLegalizerInfo.cpp (revision f71cb9dbb739bb58ce7e52e49fe384ff2ff11687)
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