AArch64LegalizerInfo.cpp revision 311142
1//===- AArch64LegalizerInfo.cpp ----------------------------------*- C++ -*-==//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9/// \file
10/// This file implements the targeting of the Machinelegalizer class for
11/// AArch64.
12/// \todo This should be generated by TableGen.
13//===----------------------------------------------------------------------===//
14
15#include "AArch64LegalizerInfo.h"
16#include "llvm/CodeGen/ValueTypes.h"
17#include "llvm/IR/Type.h"
18#include "llvm/IR/DerivedTypes.h"
19#include "llvm/Target/TargetOpcodes.h"
20
21using namespace llvm;
22
23#ifndef LLVM_BUILD_GLOBAL_ISEL
24#error "You shouldn't build this"
25#endif
26
27AArch64LegalizerInfo::AArch64LegalizerInfo() {
28  using namespace TargetOpcode;
29  const LLT p0 = LLT::pointer(0, 64);
30  const LLT s1 = LLT::scalar(1);
31  const LLT s8 = LLT::scalar(8);
32  const LLT s16 = LLT::scalar(16);
33  const LLT s32 = LLT::scalar(32);
34  const LLT s64 = LLT::scalar(64);
35  const LLT v2s32 = LLT::vector(2, 32);
36  const LLT v4s32 = LLT::vector(4, 32);
37  const LLT v2s64 = LLT::vector(2, 64);
38
39  for (auto BinOp : {G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR, G_SHL}) {
40    // These operations naturally get the right answer when used on
41    // GPR32, even if the actual type is narrower.
42    for (auto Ty : {s1, s8, s16, s32, s64, v2s32, v4s32, v2s64})
43      setAction({BinOp, Ty}, Legal);
44  }
45
46  setAction({G_GEP, p0}, Legal);
47  setAction({G_GEP, 1, s64}, Legal);
48
49  for (auto Ty : {s1, s8, s16, s32})
50    setAction({G_GEP, 1, Ty}, WidenScalar);
51
52  for (auto BinOp : {G_LSHR, G_ASHR, G_SDIV, G_UDIV}) {
53    for (auto Ty : {s32, s64})
54      setAction({BinOp, Ty}, Legal);
55
56    for (auto Ty : {s1, s8, s16})
57      setAction({BinOp, Ty}, WidenScalar);
58  }
59
60  for (auto BinOp : { G_SREM, G_UREM })
61    for (auto Ty : { s1, s8, s16, s32, s64 })
62      setAction({BinOp, Ty}, Lower);
63
64  for (auto Op : { G_UADDE, G_USUBE, G_SADDO, G_SSUBO, G_SMULO, G_UMULO }) {
65    for (auto Ty : { s32, s64 })
66      setAction({Op, Ty}, Legal);
67
68    setAction({Op, 1, s1}, Legal);
69  }
70
71  for (auto BinOp : {G_FADD, G_FSUB, G_FMUL, G_FDIV})
72    for (auto Ty : {s32, s64})
73      setAction({BinOp, Ty}, Legal);
74
75  setAction({G_FREM, s32}, Libcall);
76  setAction({G_FREM, s64}, Libcall);
77
78  for (auto MemOp : {G_LOAD, G_STORE}) {
79    for (auto Ty : {s8, s16, s32, s64, p0, v2s32})
80      setAction({MemOp, Ty}, Legal);
81
82    setAction({MemOp, s1}, WidenScalar);
83
84    // And everything's fine in addrspace 0.
85    setAction({MemOp, 1, p0}, Legal);
86  }
87
88  // Constants
89  for (auto Ty : {s32, s64}) {
90    setAction({TargetOpcode::G_CONSTANT, Ty}, Legal);
91    setAction({TargetOpcode::G_FCONSTANT, Ty}, Legal);
92  }
93
94  setAction({G_CONSTANT, p0}, Legal);
95
96  for (auto Ty : {s1, s8, s16})
97    setAction({TargetOpcode::G_CONSTANT, Ty}, WidenScalar);
98
99  setAction({TargetOpcode::G_FCONSTANT, s16}, WidenScalar);
100
101  setAction({G_ICMP, s1}, Legal);
102  setAction({G_ICMP, 1, s32}, Legal);
103  setAction({G_ICMP, 1, s64}, Legal);
104  setAction({G_ICMP, 1, p0}, Legal);
105
106  for (auto Ty : {s1, s8, s16}) {
107    setAction({G_ICMP, 1, Ty}, WidenScalar);
108  }
109
110  setAction({G_FCMP, s1}, Legal);
111  setAction({G_FCMP, 1, s32}, Legal);
112  setAction({G_FCMP, 1, s64}, Legal);
113
114  // Extensions
115  for (auto Ty : { s1, s8, s16, s32, s64 }) {
116    setAction({G_ZEXT, Ty}, Legal);
117    setAction({G_SEXT, Ty}, Legal);
118    setAction({G_ANYEXT, Ty}, Legal);
119  }
120
121  for (auto Ty : { s1, s8, s16, s32 }) {
122    setAction({G_ZEXT, 1, Ty}, Legal);
123    setAction({G_SEXT, 1, Ty}, Legal);
124    setAction({G_ANYEXT, 1, Ty}, Legal);
125  }
126
127  setAction({G_FPEXT, s64}, Legal);
128  setAction({G_FPEXT, 1, s32}, Legal);
129
130  // Truncations
131  for (auto Ty : { s16, s32 })
132    setAction({G_FPTRUNC, Ty}, Legal);
133
134  for (auto Ty : { s32, s64 })
135    setAction({G_FPTRUNC, 1, Ty}, Legal);
136
137  for (auto Ty : { s1, s8, s16, s32 })
138    setAction({G_TRUNC, Ty}, Legal);
139
140  for (auto Ty : { s8, s16, s32, s64 })
141    setAction({G_TRUNC, 1, Ty}, Legal);
142
143  // Conversions
144  for (auto Ty : { s1, s8, s16, s32, s64 }) {
145    setAction({G_FPTOSI, 0, Ty}, Legal);
146    setAction({G_FPTOUI, 0, Ty}, Legal);
147    setAction({G_SITOFP, 1, Ty}, Legal);
148    setAction({G_UITOFP, 1, Ty}, Legal);
149  }
150
151  for (auto Ty : { s32, s64 }) {
152    setAction({G_FPTOSI, 1, Ty}, Legal);
153    setAction({G_FPTOUI, 1, Ty}, Legal);
154    setAction({G_SITOFP, 0, Ty}, Legal);
155    setAction({G_UITOFP, 0, Ty}, Legal);
156  }
157
158  // Control-flow
159  for (auto Ty : {s1, s8, s16, s32})
160    setAction({G_BRCOND, Ty}, Legal);
161
162  // Select
163  for (auto Ty : {s1, s8, s16, s32, s64})
164    setAction({G_SELECT, Ty}, Legal);
165
166  setAction({G_SELECT, 1, s1}, Legal);
167
168  // Pointer-handling
169  setAction({G_FRAME_INDEX, p0}, Legal);
170  setAction({G_GLOBAL_VALUE, p0}, Legal);
171
172  for (auto Ty : {s1, s8, s16, s32, s64})
173    setAction({G_PTRTOINT, 0, Ty}, Legal);
174
175  setAction({G_PTRTOINT, 1, p0}, Legal);
176
177  setAction({G_INTTOPTR, 0, p0}, Legal);
178  setAction({G_INTTOPTR, 1, s64}, Legal);
179
180  // Casts for 32 and 64-bit width type are just copies.
181  for (auto Ty : {s1, s8, s16, s32, s64}) {
182    setAction({G_BITCAST, 0, Ty}, Legal);
183    setAction({G_BITCAST, 1, Ty}, Legal);
184  }
185
186  // For the sake of copying bits around, the type does not really
187  // matter as long as it fits a register.
188  for (int EltSize = 8; EltSize <= 64; EltSize *= 2) {
189    setAction({G_BITCAST, 0, LLT::vector(128/EltSize, EltSize)}, Legal);
190    setAction({G_BITCAST, 1, LLT::vector(128/EltSize, EltSize)}, Legal);
191    if (EltSize >= 64)
192      continue;
193
194    setAction({G_BITCAST, 0, LLT::vector(64/EltSize, EltSize)}, Legal);
195    setAction({G_BITCAST, 1, LLT::vector(64/EltSize, EltSize)}, Legal);
196    if (EltSize >= 32)
197      continue;
198
199    setAction({G_BITCAST, 0, LLT::vector(32/EltSize, EltSize)}, Legal);
200    setAction({G_BITCAST, 1, LLT::vector(32/EltSize, EltSize)}, Legal);
201  }
202
203  computeTables();
204}
205