xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/LoongArch.td (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
1*81ad6265SDimitry Andric//===-- LoongArch.td - Describe the LoongArch Target -------*- tablegen -*-===//
2*81ad6265SDimitry Andric//
3*81ad6265SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*81ad6265SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5*81ad6265SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*81ad6265SDimitry Andric//
7*81ad6265SDimitry Andric//===----------------------------------------------------------------------===//
8*81ad6265SDimitry Andric
9*81ad6265SDimitry Andricinclude "llvm/Target/Target.td"
10*81ad6265SDimitry Andric
11*81ad6265SDimitry Andric//===----------------------------------------------------------------------===//
12*81ad6265SDimitry Andric// LoongArch subtarget features and instruction predicates.
13*81ad6265SDimitry Andric//===----------------------------------------------------------------------===//
14*81ad6265SDimitry Andric
15*81ad6265SDimitry Andric// LoongArch is divided into two versions, the 32-bit version (LA32) and the
16*81ad6265SDimitry Andric// 64-bit version (LA64).
17*81ad6265SDimitry Andricdef Feature64Bit
18*81ad6265SDimitry Andric    : SubtargetFeature<"64bit", "HasLA64", "true",
19*81ad6265SDimitry Andric                       "LA64 Basic Integer and Privilege Instruction Set">;
20*81ad6265SDimitry Andricdef IsLA64
21*81ad6265SDimitry Andric    : Predicate<"Subtarget->is64Bit()">,
22*81ad6265SDimitry Andric      AssemblerPredicate<(all_of Feature64Bit),
23*81ad6265SDimitry Andric                         "LA64 Basic Integer and Privilege Instruction Set">;
24*81ad6265SDimitry Andricdef IsLA32
25*81ad6265SDimitry Andric    : Predicate<"!Subtarget->is64Bit()">,
26*81ad6265SDimitry Andric      AssemblerPredicate<(all_of(not Feature64Bit)),
27*81ad6265SDimitry Andric                         "LA32 Basic Integer and Privilege Instruction Set">;
28*81ad6265SDimitry Andric
29*81ad6265SDimitry Andricdefvar LA32 = DefaultMode;
30*81ad6265SDimitry Andricdef LA64 : HwMode<"+64bit">;
31*81ad6265SDimitry Andric
32*81ad6265SDimitry Andric// Single Precision floating point
33*81ad6265SDimitry Andricdef FeatureBasicF
34*81ad6265SDimitry Andric    : SubtargetFeature<"f", "HasBasicF", "true",
35*81ad6265SDimitry Andric                       "'F' (Single-Precision Floating-Point)">;
36*81ad6265SDimitry Andricdef HasBasicF
37*81ad6265SDimitry Andric    : Predicate<"Subtarget->hasBasicF()">,
38*81ad6265SDimitry Andric      AssemblerPredicate<(all_of FeatureBasicF),
39*81ad6265SDimitry Andric                         "'F' (Single-Precision Floating-Point)">;
40*81ad6265SDimitry Andric
41*81ad6265SDimitry Andric// Double Precision floating point
42*81ad6265SDimitry Andricdef FeatureBasicD
43*81ad6265SDimitry Andric    : SubtargetFeature<"d", "HasBasicD", "true",
44*81ad6265SDimitry Andric                       "'D' (Double-Precision Floating-Point)",
45*81ad6265SDimitry Andric                       [FeatureBasicF]>;
46*81ad6265SDimitry Andricdef HasBasicD
47*81ad6265SDimitry Andric    : Predicate<"Subtarget->hasBasicD()">,
48*81ad6265SDimitry Andric      AssemblerPredicate<(all_of FeatureBasicD),
49*81ad6265SDimitry Andric                         "'D' (Double-Precision Floating-Point)">;
50*81ad6265SDimitry Andric
51*81ad6265SDimitry Andric// Loongson SIMD eXtension (LSX)
52*81ad6265SDimitry Andricdef FeatureExtLSX
53*81ad6265SDimitry Andric    : SubtargetFeature<"lsx", "HasExtLSX", "true",
54*81ad6265SDimitry Andric                       "'LSX' (Loongson SIMD Extension)", [FeatureBasicD]>;
55*81ad6265SDimitry Andricdef HasExtLSX
56*81ad6265SDimitry Andric    : Predicate<"Subtarget->hasExtLSX()">,
57*81ad6265SDimitry Andric      AssemblerPredicate<(all_of FeatureExtLSX),
58*81ad6265SDimitry Andric                         "'LSX' (Loongson SIMD Extension)">;
59*81ad6265SDimitry Andric
60*81ad6265SDimitry Andric// Loongson Advanced SIMD eXtension (LASX)
61*81ad6265SDimitry Andricdef FeatureExtLASX
62*81ad6265SDimitry Andric    : SubtargetFeature<"lasx", "HasExtLASX", "true",
63*81ad6265SDimitry Andric                       "'LASX' (Loongson Advanced SIMD Extension)",
64*81ad6265SDimitry Andric                       [FeatureExtLSX]>;
65*81ad6265SDimitry Andricdef HasExtLASX
66*81ad6265SDimitry Andric    : Predicate<"Subtarget->hasExtLASX()">,
67*81ad6265SDimitry Andric      AssemblerPredicate<(all_of FeatureExtLASX),
68*81ad6265SDimitry Andric                         "'LASX' (Loongson Advanced SIMD Extension)">;
69*81ad6265SDimitry Andric
70*81ad6265SDimitry Andric// Loongson VirtualiZation (LVZ)
71*81ad6265SDimitry Andricdef FeatureExtLVZ
72*81ad6265SDimitry Andric    : SubtargetFeature<"lvz", "HasExtLVZ", "true",
73*81ad6265SDimitry Andric                       "'LVZ' (Loongson Virtualization Extension)">;
74*81ad6265SDimitry Andricdef HasExtLVZ
75*81ad6265SDimitry Andric    : Predicate<"Subtarget->hasExtLVZ()">,
76*81ad6265SDimitry Andric      AssemblerPredicate<(all_of FeatureExtLVZ),
77*81ad6265SDimitry Andric                         "'LVZ' (Loongson Virtualization Extension)">;
78*81ad6265SDimitry Andric
79*81ad6265SDimitry Andric// Loongson Binary Translation (LBT)
80*81ad6265SDimitry Andricdef FeatureExtLBT
81*81ad6265SDimitry Andric    : SubtargetFeature<"lbt", "HasExtLBT", "true",
82*81ad6265SDimitry Andric                       "'LBT' (Loongson Binary Translation Extension)">;
83*81ad6265SDimitry Andricdef HasExtLBT
84*81ad6265SDimitry Andric    : Predicate<"Subtarget->hasExtLBT()">,
85*81ad6265SDimitry Andric      AssemblerPredicate<(all_of FeatureExtLBT),
86*81ad6265SDimitry Andric                         "'LBT' (Loongson Binary Translation Extension)">;
87*81ad6265SDimitry Andric
88*81ad6265SDimitry Andric//===----------------------------------------------------------------------===//
89*81ad6265SDimitry Andric// Registers, instruction descriptions ...
90*81ad6265SDimitry Andric//===----------------------------------------------------------------------===//
91*81ad6265SDimitry Andric
92*81ad6265SDimitry Andricinclude "LoongArchRegisterInfo.td"
93*81ad6265SDimitry Andricinclude "LoongArchCallingConv.td"
94*81ad6265SDimitry Andricinclude "LoongArchInstrInfo.td"
95*81ad6265SDimitry Andric
96*81ad6265SDimitry Andric//===----------------------------------------------------------------------===//
97*81ad6265SDimitry Andric// LoongArch processors supported.
98*81ad6265SDimitry Andric//===----------------------------------------------------------------------===//
99*81ad6265SDimitry Andric
100*81ad6265SDimitry Andricdef : ProcessorModel<"generic-la32", NoSchedModel, []>;
101*81ad6265SDimitry Andricdef : ProcessorModel<"generic-la64", NoSchedModel, [Feature64Bit]>;
102*81ad6265SDimitry Andric
103*81ad6265SDimitry Andricdef : ProcessorModel<"la464", NoSchedModel, [Feature64Bit,
104*81ad6265SDimitry Andric                                             FeatureExtLASX,
105*81ad6265SDimitry Andric                                             FeatureExtLVZ,
106*81ad6265SDimitry Andric                                             FeatureExtLBT]>;
107*81ad6265SDimitry Andric
108*81ad6265SDimitry Andric//===----------------------------------------------------------------------===//
109*81ad6265SDimitry Andric// Define the LoongArch target.
110*81ad6265SDimitry Andric//===----------------------------------------------------------------------===//
111*81ad6265SDimitry Andric
112*81ad6265SDimitry Andricdef LoongArchInstrInfo : InstrInfo {
113*81ad6265SDimitry Andric  // guess mayLoad, mayStore, and hasSideEffects
114*81ad6265SDimitry Andric  // This option is a temporary migration help. It will go away.
115*81ad6265SDimitry Andric  let guessInstructionProperties = 1;
116*81ad6265SDimitry Andric}
117*81ad6265SDimitry Andric
118*81ad6265SDimitry Andricdef LoongArchAsmParser : AsmParser {
119*81ad6265SDimitry Andric  let ShouldEmitMatchRegisterAltName = 1;
120*81ad6265SDimitry Andric  let AllowDuplicateRegisterNames = 1;
121*81ad6265SDimitry Andric}
122*81ad6265SDimitry Andric
123*81ad6265SDimitry Andricdef LoongArchAsmParserVariant : AsmParserVariant {
124*81ad6265SDimitry Andric  int Variant = 0;
125*81ad6265SDimitry Andric  // Recognize hard coded registers.
126*81ad6265SDimitry Andric  string RegisterPrefix = "$";
127*81ad6265SDimitry Andric}
128*81ad6265SDimitry Andric
129*81ad6265SDimitry Andricdef LoongArchAsmWriter : AsmWriter {
130*81ad6265SDimitry Andric  int PassSubtarget = 1;
131*81ad6265SDimitry Andric}
132*81ad6265SDimitry Andric
133*81ad6265SDimitry Andricdef LoongArch : Target {
134*81ad6265SDimitry Andric  let InstructionSet = LoongArchInstrInfo;
135*81ad6265SDimitry Andric  let AssemblyParsers = [LoongArchAsmParser];
136*81ad6265SDimitry Andric  let AssemblyParserVariants = [LoongArchAsmParserVariant];
137*81ad6265SDimitry Andric  let AssemblyWriters = [LoongArchAsmWriter];
138*81ad6265SDimitry Andric  let AllowRegisterRenaming = 1;
139*81ad6265SDimitry Andric}
140