blob: 247d3bfd0441fddf256a3d06cabe69e5d8379426 [file] [log] [blame]
Petar Jovanovicfac93e22018-02-23 11:06:40 +00001//===- MipsLegalizerInfo.cpp ------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Petar Jovanovicfac93e22018-02-23 11:06:40 +00006//
7//===----------------------------------------------------------------------===//
8/// \file
9/// This file implements the targeting of the Machinelegalizer class for Mips.
10/// \todo This should be generated by TableGen.
11//===----------------------------------------------------------------------===//
12
13#include "MipsLegalizerInfo.h"
Roman Tereshinf34d7ec2018-05-31 16:16:49 +000014#include "MipsTargetMachine.h"
Petar Jovanovicaa978902018-10-08 23:59:37 +000015#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
Petar Jovanovicfac93e22018-02-23 11:06:40 +000016
17using namespace llvm;
18
19MipsLegalizerInfo::MipsLegalizerInfo(const MipsSubtarget &ST) {
Petar Jovanovic366857a2018-04-11 15:12:32 +000020 using namespace TargetOpcode;
21
Petar Avramovicb8276f22018-12-17 12:31:07 +000022 const LLT s1 = LLT::scalar(1);
Petar Jovanovic366857a2018-04-11 15:12:32 +000023 const LLT s32 = LLT::scalar(32);
Petar Avramovic0a5e4eb2018-12-18 15:59:51 +000024 const LLT s64 = LLT::scalar(64);
Petar Jovanovic021e4c82018-07-16 13:29:32 +000025 const LLT p0 = LLT::pointer(0, 32);
Petar Jovanovic366857a2018-04-11 15:12:32 +000026
Petar Avramovic0b17e592019-03-11 10:00:17 +000027 getActionDefinitionsBuilder({G_ADD, G_SUB, G_MUL})
Petar Jovanovic1fa50512018-08-26 07:25:33 +000028 .legalFor({s32})
Petar Avramovicb8276f22018-12-17 12:31:07 +000029 .clampScalar(0, s32, s32);
30
Petar Avramovica48285a2019-03-01 07:25:44 +000031 getActionDefinitionsBuilder({G_UADDO, G_UADDE, G_USUBO, G_USUBE, G_UMULO})
Petar Avramovicb8276f22018-12-17 12:31:07 +000032 .lowerFor({{s32, s1}});
Petar Jovanovic366857a2018-04-11 15:12:32 +000033
Petar Avramovica48285a2019-03-01 07:25:44 +000034 getActionDefinitionsBuilder(G_UMULH)
Petar Avramovic5229f472019-03-11 10:08:44 +000035 .legalFor({s32})
36 .maxScalar(0, s32);
Petar Avramovica48285a2019-03-01 07:25:44 +000037
Petar Jovanovic021e4c82018-07-16 13:29:32 +000038 getActionDefinitionsBuilder({G_LOAD, G_STORE})
Matt Arsenault530d05e2019-02-14 22:41:09 +000039 .legalForTypesWithMemDesc({{s32, p0, 8, 8},
40 {s32, p0, 16, 8},
41 {s32, p0, 32, 8},
Petar Avramovicec575f62019-07-08 14:36:36 +000042 {s64, p0, 64, 8},
Matt Arsenault530d05e2019-02-14 22:41:09 +000043 {p0, p0, 32, 8}})
Petar Avramovicc98b26d2019-02-08 14:27:23 +000044 .minScalar(0, s32);
Petar Jovanovic021e4c82018-07-16 13:29:32 +000045
Petar Avramovicaa699b22019-07-08 14:45:52 +000046 getActionDefinitionsBuilder(G_UNMERGE_VALUES)
47 .legalFor({{s32, s64}});
48
Petar Avramovicec575f62019-07-08 14:36:36 +000049 getActionDefinitionsBuilder(G_MERGE_VALUES)
50 .legalFor({{s64, s32}});
51
Petar Avramovic79df8592019-01-24 10:27:21 +000052 getActionDefinitionsBuilder({G_ZEXTLOAD, G_SEXTLOAD})
Matt Arsenault530d05e2019-02-14 22:41:09 +000053 .legalForTypesWithMemDesc({{s32, p0, 8, 8},
54 {s32, p0, 16, 8}})
Petar Avramovic79df8592019-01-24 10:27:21 +000055 .minScalar(0, s32);
56
Petar Avramovice406aa72019-08-21 09:35:02 +000057 getActionDefinitionsBuilder({G_ZEXT, G_SEXT})
58 .legalIf([](const LegalityQuery &Query) { return false; })
59 .maxScalar(0, s32);
60
Petar Avramovic5b4c5c22019-08-21 09:26:39 +000061 getActionDefinitionsBuilder(G_TRUNC)
62 .legalIf([](const LegalityQuery &Query) { return false; })
63 .maxScalar(1, s32);
64
Petar Avramovic09dff332018-12-25 14:42:30 +000065 getActionDefinitionsBuilder(G_SELECT)
Petar Avramovicdbb6d012019-07-09 14:30:29 +000066 .legalForCartesianProduct({p0, s32, s64}, {s32})
Petar Avramovic09dff332018-12-25 14:42:30 +000067 .minScalar(0, s32)
68 .minScalar(1, s32);
69
Petar Avramovic5d9b8ee2019-02-14 11:39:53 +000070 getActionDefinitionsBuilder(G_BRCOND)
71 .legalFor({s32})
72 .minScalar(0, s32);
73
Petar Avramoviccaef9302019-08-08 10:21:12 +000074 getActionDefinitionsBuilder(G_BRJT)
75 .legalFor({{p0, s32}});
76
Petar Avramovic14c7ecf2019-02-14 12:36:19 +000077 getActionDefinitionsBuilder(G_PHI)
Petar Avramovicbe20e362019-07-09 14:36:17 +000078 .legalFor({p0, s32, s64})
Petar Avramovic14c7ecf2019-02-14 12:36:19 +000079 .minScalar(0, s32);
80
Petar Avramovic150fd432018-12-18 11:36:14 +000081 getActionDefinitionsBuilder({G_AND, G_OR, G_XOR})
82 .legalFor({s32})
83 .clampScalar(0, s32, s32);
84
Petar Avramovic0a5e4eb2018-12-18 15:59:51 +000085 getActionDefinitionsBuilder({G_SDIV, G_SREM, G_UREM, G_UDIV})
86 .legalFor({s32})
87 .minScalar(0, s32)
88 .libcallFor({s64});
89
Matt Arsenault30989e42019-01-22 21:42:11 +000090 getActionDefinitionsBuilder({G_SHL, G_ASHR, G_LSHR})
Petar Avramovic61bf2672019-08-21 09:31:29 +000091 .legalFor({{s32, s32}})
92 .clampScalar(1, s32, s32);
Matt Arsenault30989e42019-01-22 21:42:11 +000093
Petar Jovanovicce4dd0a2018-09-10 15:56:52 +000094 getActionDefinitionsBuilder(G_ICMP)
Petar Avramovic1e626352019-07-17 12:08:01 +000095 .legalForCartesianProduct({s32}, {s32, p0})
96 .clampScalar(1, s32, s32)
Petar Jovanovicce4dd0a2018-09-10 15:56:52 +000097 .minScalar(0, s32);
98
Petar Jovanovic021e4c82018-07-16 13:29:32 +000099 getActionDefinitionsBuilder(G_CONSTANT)
Petar Jovanovic8a084122018-10-17 10:30:03 +0000100 .legalFor({s32})
Petar Avramovic2cefaa22018-11-09 14:21:16 +0000101 .clampScalar(0, s32, s32);
Petar Jovanovic021e4c82018-07-16 13:29:32 +0000102
Petar Avramovicb1fc6f62019-07-26 13:08:06 +0000103 getActionDefinitionsBuilder({G_GEP, G_INTTOPTR})
Petar Jovanovic021e4c82018-07-16 13:29:32 +0000104 .legalFor({{p0, s32}});
105
Petar Avramovicb1fc6f62019-07-26 13:08:06 +0000106 getActionDefinitionsBuilder(G_PTRTOINT)
107 .legalFor({{s32, p0}});
108
Petar Jovanovic021e4c82018-07-16 13:29:32 +0000109 getActionDefinitionsBuilder(G_FRAME_INDEX)
110 .legalFor({p0});
111
Petar Avramoviccaef9302019-08-08 10:21:12 +0000112 getActionDefinitionsBuilder({G_GLOBAL_VALUE, G_JUMP_TABLE})
Petar Jovanovic64c10ba2018-08-01 09:03:23 +0000113 .legalFor({p0});
114
Petar Avramovicafa3afa2019-04-03 14:12:59 +0000115 // FP instructions
116 getActionDefinitionsBuilder(G_FCONSTANT)
117 .legalFor({s32, s64});
118
Petar Avramovic81132ce2019-06-06 10:00:41 +0000119 getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FABS, G_FSQRT})
Petar Avramovicafa3afa2019-04-03 14:12:59 +0000120 .legalFor({s32, s64});
121
Petar Avramovic22e99c42019-06-05 14:03:13 +0000122 getActionDefinitionsBuilder(G_FCMP)
123 .legalFor({{s32, s32}, {s32, s64}})
124 .minScalar(0, s32);
125
Petar Avramovicfaaa2b52019-06-06 09:02:24 +0000126 getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR})
127 .libcallFor({s32, s64});
128
Petar Avramovica7d00062019-06-06 09:16:58 +0000129 getActionDefinitionsBuilder(G_FPEXT)
130 .legalFor({{s64, s32}});
131
132 getActionDefinitionsBuilder(G_FPTRUNC)
133 .legalFor({{s32, s64}});
134
Petar Avramovic4b4dae12019-06-20 08:52:53 +0000135 // FP to int conversion instructions
136 getActionDefinitionsBuilder(G_FPTOSI)
137 .legalForCartesianProduct({s32}, {s64, s32})
138 .libcallForCartesianProduct({s64}, {s64, s32})
139 .minScalar(0, s32);
140
141 getActionDefinitionsBuilder(G_FPTOUI)
142 .libcallForCartesianProduct({s64}, {s64, s32})
143 .minScalar(0, s32);
144
Petar Avramovic153bd242019-06-20 09:05:02 +0000145 // Int to FP conversion instructions
146 getActionDefinitionsBuilder(G_SITOFP)
147 .legalForCartesianProduct({s64, s32}, {s32})
148 .libcallForCartesianProduct({s64, s32}, {s64})
149 .minScalar(1, s32);
150
151 getActionDefinitionsBuilder(G_UITOFP)
152 .libcallForCartesianProduct({s64, s32}, {s64})
153 .minScalar(1, s32);
154
Daniel Sanderse9a57c22019-08-09 21:11:20 +0000155 getActionDefinitionsBuilder(G_SEXT_INREG).lower();
156
Petar Jovanovicfac93e22018-02-23 11:06:40 +0000157 computeTables();
Roman Tereshinf34d7ec2018-05-31 16:16:49 +0000158 verify(*ST.getInstrInfo());
Petar Jovanovicfac93e22018-02-23 11:06:40 +0000159}
Petar Jovanovicaa978902018-10-08 23:59:37 +0000160
161bool MipsLegalizerInfo::legalizeCustom(MachineInstr &MI,
162 MachineRegisterInfo &MRI,
Aditya Nandakumarf75d4f32018-12-05 20:14:52 +0000163 MachineIRBuilder &MIRBuilder,
164 GISelChangeObserver &Observer) const {
Petar Jovanovicaa978902018-10-08 23:59:37 +0000165
166 using namespace TargetOpcode;
167
168 MIRBuilder.setInstr(MI);
169
Petar Avramovicf9c9bc02018-12-17 15:12:53 +0000170 return false;
Petar Jovanovicaa978902018-10-08 23:59:37 +0000171}
Amara Emersoncf12c782019-07-19 00:24:45 +0000172
173bool MipsLegalizerInfo::legalizeIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
174 MachineIRBuilder &MIRBuilder) const {
175 switch (MI.getIntrinsicID()) {
176 case Intrinsic::memcpy:
177 case Intrinsic::memset:
178 case Intrinsic::memmove:
179 if (createMemLibcall(MIRBuilder, MRI, MI) ==
180 LegalizerHelper::UnableToLegalize)
181 return false;
182 MI.eraseFromParent();
183 return true;
184 default:
185 break;
186 }
187 return true;
188}