blob: 64cca82f13e90f79eb2a2d73ef096db1283e0609 [file] [log] [blame]
Diana Picus22274932016-11-11 08:27:37 +00001//===- ARMLegalizerInfo.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 ARM.
11/// \todo This should be generated by TableGen.
12//===----------------------------------------------------------------------===//
13
14#include "ARMLegalizerInfo.h"
Diana Picus7cab0782017-02-17 11:25:17 +000015#include "ARMSubtarget.h"
Diana Picus22274932016-11-11 08:27:37 +000016#include "llvm/CodeGen/ValueTypes.h"
17#include "llvm/IR/DerivedTypes.h"
18#include "llvm/IR/Type.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
Diana Picus7cab0782017-02-17 11:25:17 +000027ARMLegalizerInfo::ARMLegalizerInfo(const ARMSubtarget &ST) {
Diana Picus812caee2016-12-16 12:54:46 +000028 using namespace TargetOpcode;
Diana Picus5a724452016-12-19 14:07:56 +000029
Diana Picus519807f2016-12-19 11:26:31 +000030 const LLT p0 = LLT::pointer(0, 32);
Diana Picus5a724452016-12-19 14:07:56 +000031
Diana Picusd83df5d2017-01-25 08:47:40 +000032 const LLT s1 = LLT::scalar(1);
Diana Picus5a724452016-12-19 14:07:56 +000033 const LLT s8 = LLT::scalar(8);
34 const LLT s16 = LLT::scalar(16);
Diana Picus812caee2016-12-16 12:54:46 +000035 const LLT s32 = LLT::scalar(32);
Diana Picus21c3d8e2017-02-16 09:09:49 +000036 const LLT s64 = LLT::scalar(64);
Diana Picus812caee2016-12-16 12:54:46 +000037
Diana Picus519807f2016-12-19 11:26:31 +000038 setAction({G_FRAME_INDEX, p0}, Legal);
39
Diana Picusa2b632a2017-02-24 11:28:24 +000040 for (unsigned Op : {G_LOAD, G_STORE}) {
41 for (auto Ty : {s1, s8, s16, s32, p0})
42 setAction({Op, Ty}, Legal);
43 setAction({Op, 1, p0}, Legal);
44 }
Diana Picus519807f2016-12-19 11:26:31 +000045
Diana Picusd83df5d2017-01-25 08:47:40 +000046 for (auto Ty : {s1, s8, s16, s32})
Diana Picus5a724452016-12-19 14:07:56 +000047 setAction({G_ADD, Ty}, Legal);
Diana Picus812caee2016-12-16 12:54:46 +000048
Quentin Colombet89dbea02017-01-27 01:30:46 +000049 for (unsigned Op : {G_SEXT, G_ZEXT}) {
Diana Picus8b6c6be2017-01-25 08:10:40 +000050 setAction({Op, s32}, Legal);
Diana Picusd83df5d2017-01-25 08:47:40 +000051 for (auto Ty : {s1, s8, s16})
Diana Picus8b6c6be2017-01-25 08:10:40 +000052 setAction({Op, 1, Ty}, Legal);
53 }
54
Diana Picus8598b172017-02-28 09:02:42 +000055 setAction({G_GEP, p0}, Legal);
56 setAction({G_GEP, 1, s32}, Legal);
57
Diana Picuse6beac62017-02-28 11:33:46 +000058 setAction({G_CONSTANT, s32}, Legal);
59
Diana Picusa5bab612017-04-07 09:41:39 +000060 if (!ST.useSoftFloat() && ST.hasVFP2()) {
Diana Picus7cab0782017-02-17 11:25:17 +000061 setAction({G_FADD, s32}, Legal);
62 setAction({G_FADD, s64}, Legal);
63
64 setAction({G_LOAD, s64}, Legal);
Diana Picusa2b632a2017-02-24 11:28:24 +000065 setAction({G_STORE, s64}, Legal);
Diana Picus7cab0782017-02-17 11:25:17 +000066 }
Diana Picus4fa83c02017-02-08 13:23:04 +000067
Diana Picusa5bab612017-04-07 09:41:39 +000068 setAction({G_FREM, s32}, Libcall);
69
Diana Picus22274932016-11-11 08:27:37 +000070 computeTables();
71}