Skip to content

Commit 10043e2

Browse files
author
Evan Cheng
committed
ARM backend contribution from Apple.
llvm-svn: 33353
1 parent 28c5b86 commit 10043e2

32 files changed

+8695
-1968
lines changed

llvm/lib/Target/ARM/ARM.h

Lines changed: 66 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,43 +20,77 @@
2020
#include <cassert>
2121

2222
namespace llvm {
23-
// Enums corresponding to ARM condition codes
24-
namespace ARMCC {
25-
enum CondCodes {
26-
EQ,
27-
NE,
28-
CS,
29-
CC,
30-
MI,
31-
PL,
32-
VS,
33-
VC,
34-
HI,
35-
LS,
36-
GE,
37-
LT,
38-
GT,
39-
LE,
40-
AL
41-
};
23+
24+
class ARMTargetMachine;
25+
class FunctionPass;
26+
27+
// Enums corresponding to ARM condition codes
28+
namespace ARMCC {
29+
enum CondCodes {
30+
EQ,
31+
NE,
32+
HS,
33+
LO,
34+
MI,
35+
PL,
36+
VS,
37+
VC,
38+
HI,
39+
LS,
40+
GE,
41+
LT,
42+
GT,
43+
LE,
44+
AL
45+
};
46+
47+
inline static CondCodes getOppositeCondition(CondCodes CC){
48+
switch (CC) {
49+
default: assert(0 && "Unknown condition code");
50+
case EQ: return NE;
51+
case NE: return EQ;
52+
case HS: return LO;
53+
case LO: return HS;
54+
case MI: return PL;
55+
case PL: return MI;
56+
case VS: return VC;
57+
case VC: return VS;
58+
case HI: return LS;
59+
case LS: return HI;
60+
case GE: return LT;
61+
case LT: return GE;
62+
case GT: return LE;
63+
case LE: return GT;
64+
}
4265
}
66+
}
4367

44-
namespace ARMShift {
45-
enum ShiftTypes {
46-
LSL,
47-
LSR,
48-
ASR,
49-
ROR,
50-
RRX
51-
};
68+
inline static const char *ARMCondCodeToString(ARMCC::CondCodes CC) {
69+
switch (CC) {
70+
default: assert(0 && "Unknown condition code");
71+
case ARMCC::EQ: return "eq";
72+
case ARMCC::NE: return "ne";
73+
case ARMCC::HS: return "hs";
74+
case ARMCC::LO: return "lo";
75+
case ARMCC::MI: return "mi";
76+
case ARMCC::PL: return "pl";
77+
case ARMCC::VS: return "vs";
78+
case ARMCC::VC: return "vc";
79+
case ARMCC::HI: return "hi";
80+
case ARMCC::LS: return "ls";
81+
case ARMCC::GE: return "ge";
82+
case ARMCC::LT: return "lt";
83+
case ARMCC::GT: return "gt";
84+
case ARMCC::LE: return "le";
85+
case ARMCC::AL: return "al";
5286
}
87+
}
5388

54-
class FunctionPass;
55-
class TargetMachine;
89+
FunctionPass *createARMISelDag(ARMTargetMachine &TM);
90+
FunctionPass *createARMCodePrinterPass(std::ostream &O, ARMTargetMachine &TM);
91+
FunctionPass *createARMLoadStoreOptimizationPass();
92+
FunctionPass *createARMConstantIslandPass();
5693

57-
FunctionPass *createARMISelDag(TargetMachine &TM);
58-
FunctionPass *createARMCodePrinterPass(std::ostream &OS, TargetMachine &TM);
59-
FunctionPass *createARMFixMulPass();
6094
} // end namespace llvm;
6195

6296
// Defines symbolic names for ARM registers. This defines a mapping from

llvm/lib/Target/ARM/ARM.td

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,73 @@
1717

1818
include "../Target.td"
1919

20+
//===----------------------------------------------------------------------===//
21+
// ARM Subtarget features.
22+
//
23+
24+
def ArchV4T : SubtargetFeature<"v4t", "ARMArchVersion", "V4T",
25+
"ARM v4T">;
26+
def ArchV5T : SubtargetFeature<"v5t", "ARMArchVersion", "V5T",
27+
"ARM v5T">;
28+
def ArchV5TE : SubtargetFeature<"v5te", "ARMArchVersion", "V5TE",
29+
"ARM v5TE, v5TEj, v5TExp">;
30+
def ArchV6 : SubtargetFeature<"v6", "ARMArchVersion", "V6",
31+
"ARM v6">;
32+
def FeatureVFP2 : SubtargetFeature<"vfp2", "HasVFP2", "true",
33+
"Enable VFP2 instructions ">;
34+
35+
//===----------------------------------------------------------------------===//
36+
// ARM Processors supported.
37+
//
38+
39+
class Proc<string Name, list<SubtargetFeature> Features>
40+
: Processor<Name, NoItineraries, Features>;
41+
42+
// V4 Processors.
43+
def : Proc<"generic", []>;
44+
def : Proc<"arm8", []>;
45+
def : Proc<"arm810", []>;
46+
def : Proc<"strongarm", []>;
47+
def : Proc<"strongarm110", []>;
48+
def : Proc<"strongarm1100", []>;
49+
def : Proc<"strongarm1110", []>;
50+
51+
// V4T Processors.
52+
def : Proc<"arm7tdmi", [ArchV4T]>;
53+
def : Proc<"arm7tdmi-s", [ArchV4T]>;
54+
def : Proc<"arm710t", [ArchV4T]>;
55+
def : Proc<"arm720t", [ArchV4T]>;
56+
def : Proc<"arm9", [ArchV4T]>;
57+
def : Proc<"arm9tdmi", [ArchV4T]>;
58+
def : Proc<"arm920", [ArchV4T]>;
59+
def : Proc<"arm920t", [ArchV4T]>;
60+
def : Proc<"arm922t", [ArchV4T]>;
61+
def : Proc<"arm940t", [ArchV4T]>;
62+
def : Proc<"ep9312", [ArchV4T]>;
63+
64+
// V5T Processors.
65+
def : Proc<"arm10tdmi", [ArchV5T]>;
66+
def : Proc<"arm1020t", [ArchV5T]>;
67+
68+
// V5TE Processors.
69+
def : Proc<"arm9e", [ArchV5TE]>;
70+
def : Proc<"arm946e-s", [ArchV5TE]>;
71+
def : Proc<"arm966e-s", [ArchV5TE]>;
72+
def : Proc<"arm968e-s", [ArchV5TE]>;
73+
def : Proc<"arm10e", [ArchV5TE]>;
74+
def : Proc<"arm1020e", [ArchV5TE]>;
75+
def : Proc<"arm1022e", [ArchV5TE]>;
76+
def : Proc<"xscale", [ArchV5TE]>;
77+
def : Proc<"iwmmxt", [ArchV5TE]>;
78+
79+
// V6 Processors.
80+
def : Proc<"arm1136j-s", [ArchV6]>;
81+
def : Proc<"arm1136jf-s", [ArchV6, FeatureVFP2]>;
82+
def : Proc<"arm1176jz-s", [ArchV6]>;
83+
def : Proc<"arm1176jzf-s", [ArchV6, FeatureVFP2]>;
84+
def : Proc<"mpcorenovfp", [ArchV6]>;
85+
def : Proc<"mpcore", [ArchV6, FeatureVFP2]>;
86+
2087
//===----------------------------------------------------------------------===//
2188
// Register File Description
2289
//===----------------------------------------------------------------------===//
@@ -31,8 +98,14 @@ include "ARMInstrInfo.td"
3198

3299
def ARMInstrInfo : InstrInfo {
33100
// Define how we want to layout our target-specific information field.
34-
let TSFlagsFields = [];
35-
let TSFlagsShifts = [];
101+
let TSFlagsFields = ["AddrModeBits",
102+
"SizeFlag",
103+
"IndexModeBits",
104+
"Opcode"];
105+
let TSFlagsShifts = [0,
106+
4,
107+
7,
108+
9];
36109
}
37110

38111
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)