xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/LoongArch.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
181ad6265SDimitry Andric//===-- LoongArch.td - Describe the LoongArch Target -------*- tablegen -*-===//
281ad6265SDimitry Andric//
381ad6265SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric//
781ad6265SDimitry Andric//===----------------------------------------------------------------------===//
881ad6265SDimitry Andric
981ad6265SDimitry Andricinclude "llvm/Target/Target.td"
1081ad6265SDimitry Andric
1181ad6265SDimitry Andric//===----------------------------------------------------------------------===//
1281ad6265SDimitry Andric// LoongArch subtarget features and instruction predicates.
1381ad6265SDimitry Andric//===----------------------------------------------------------------------===//
1481ad6265SDimitry Andric
1581ad6265SDimitry Andric// LoongArch is divided into two versions, the 32-bit version (LA32) and the
1681ad6265SDimitry Andric// 64-bit version (LA64).
1781ad6265SDimitry Andricdef Feature64Bit
1881ad6265SDimitry Andric    : SubtargetFeature<"64bit", "HasLA64", "true",
1981ad6265SDimitry Andric                       "LA64 Basic Integer and Privilege Instruction Set">;
20bdd1243dSDimitry Andricdef Feature32Bit
21bdd1243dSDimitry Andric    : SubtargetFeature<"32bit", "HasLA32", "true",
22bdd1243dSDimitry Andric                       "LA32 Basic Integer and Privilege Instruction Set">;
2381ad6265SDimitry Andricdef IsLA64
2481ad6265SDimitry Andric    : Predicate<"Subtarget->is64Bit()">,
2581ad6265SDimitry Andric      AssemblerPredicate<(all_of Feature64Bit),
2681ad6265SDimitry Andric                         "LA64 Basic Integer and Privilege Instruction Set">;
2781ad6265SDimitry Andricdef IsLA32
2881ad6265SDimitry Andric    : Predicate<"!Subtarget->is64Bit()">,
2981ad6265SDimitry Andric      AssemblerPredicate<(all_of(not Feature64Bit)),
3081ad6265SDimitry Andric                         "LA32 Basic Integer and Privilege Instruction Set">;
3181ad6265SDimitry Andric
3281ad6265SDimitry Andricdefvar LA32 = DefaultMode;
3306c3fb27SDimitry Andricdef LA64 : HwMode<"+64bit", [IsLA64]>;
3481ad6265SDimitry Andric
3581ad6265SDimitry Andric// Single Precision floating point
3681ad6265SDimitry Andricdef FeatureBasicF
3781ad6265SDimitry Andric    : SubtargetFeature<"f", "HasBasicF", "true",
3881ad6265SDimitry Andric                       "'F' (Single-Precision Floating-Point)">;
3906c3fb27SDimitry Andricdef HasBasicF : Predicate<"Subtarget->hasBasicF()">;
4081ad6265SDimitry Andric
4181ad6265SDimitry Andric// Double Precision floating point
4281ad6265SDimitry Andricdef FeatureBasicD
4381ad6265SDimitry Andric    : SubtargetFeature<"d", "HasBasicD", "true",
4481ad6265SDimitry Andric                       "'D' (Double-Precision Floating-Point)",
4581ad6265SDimitry Andric                       [FeatureBasicF]>;
4606c3fb27SDimitry Andricdef HasBasicD : Predicate<"Subtarget->hasBasicD()">;
4781ad6265SDimitry Andric
4881ad6265SDimitry Andric// Loongson SIMD eXtension (LSX)
4981ad6265SDimitry Andricdef FeatureExtLSX
5081ad6265SDimitry Andric    : SubtargetFeature<"lsx", "HasExtLSX", "true",
5181ad6265SDimitry Andric                       "'LSX' (Loongson SIMD Extension)", [FeatureBasicD]>;
5206c3fb27SDimitry Andricdef HasExtLSX : Predicate<"Subtarget->hasExtLSX()">;
5381ad6265SDimitry Andric
5481ad6265SDimitry Andric// Loongson Advanced SIMD eXtension (LASX)
5581ad6265SDimitry Andricdef FeatureExtLASX
5681ad6265SDimitry Andric    : SubtargetFeature<"lasx", "HasExtLASX", "true",
5781ad6265SDimitry Andric                       "'LASX' (Loongson Advanced SIMD Extension)",
5881ad6265SDimitry Andric                       [FeatureExtLSX]>;
5906c3fb27SDimitry Andricdef HasExtLASX : Predicate<"Subtarget->hasExtLASX()">;
6081ad6265SDimitry Andric
6181ad6265SDimitry Andric// Loongson VirtualiZation (LVZ)
6281ad6265SDimitry Andricdef FeatureExtLVZ
6381ad6265SDimitry Andric    : SubtargetFeature<"lvz", "HasExtLVZ", "true",
6481ad6265SDimitry Andric                       "'LVZ' (Loongson Virtualization Extension)">;
6506c3fb27SDimitry Andricdef HasExtLVZ : Predicate<"Subtarget->hasExtLVZ()">;
6681ad6265SDimitry Andric
6781ad6265SDimitry Andric// Loongson Binary Translation (LBT)
6881ad6265SDimitry Andricdef FeatureExtLBT
6981ad6265SDimitry Andric    : SubtargetFeature<"lbt", "HasExtLBT", "true",
7081ad6265SDimitry Andric                       "'LBT' (Loongson Binary Translation Extension)">;
7106c3fb27SDimitry Andricdef HasExtLBT : Predicate<"Subtarget->hasExtLBT()">;
7281ad6265SDimitry Andric
73bdd1243dSDimitry Andric// Expand la.global as la.pcrel
74bdd1243dSDimitry Andricdef LaGlobalWithPcrel
75bdd1243dSDimitry Andric    : SubtargetFeature<"la-global-with-pcrel", "HasLaGlobalWithPcrel", "true",
76bdd1243dSDimitry Andric                       "Expand la.global as la.pcrel">;
77bdd1243dSDimitry Andricdef HasLaGlobalWithPcrel
78bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasLaGlobalWithPcrel()">,
79bdd1243dSDimitry Andric      AssemblerPredicate<(all_of LaGlobalWithPcrel),
80bdd1243dSDimitry Andric                         "Expand la.global as la.pcrel">;
81bdd1243dSDimitry Andric
82bdd1243dSDimitry Andric// Expand la.global as la.abs
83bdd1243dSDimitry Andricdef LaGlobalWithAbs
84bdd1243dSDimitry Andric    : SubtargetFeature<"la-global-with-abs", "HasLaGlobalWithAbs", "true",
85bdd1243dSDimitry Andric                       "Expand la.global as la.abs">;
86bdd1243dSDimitry Andricdef HasLaGlobalWithAbs
87bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasLaGlobalWithAbs()">,
88bdd1243dSDimitry Andric      AssemblerPredicate<(all_of LaGlobalWithAbs),
89bdd1243dSDimitry Andric                         "Expand la.global as la.abs">;
90bdd1243dSDimitry Andric
91bdd1243dSDimitry Andric// Expand la.local as la.abs
92bdd1243dSDimitry Andricdef LaLocalWithAbs
93bdd1243dSDimitry Andric    : SubtargetFeature<"la-local-with-abs", "HasLaLocalWithAbs", "true",
94bdd1243dSDimitry Andric                       "Expand la.local as la.abs">;
95bdd1243dSDimitry Andricdef HasLaLocalWithAbs
96bdd1243dSDimitry Andric    : Predicate<"Subtarget->hasLaLocalWithAbs()">,
97bdd1243dSDimitry Andric      AssemblerPredicate<(all_of LaLocalWithAbs),
98bdd1243dSDimitry Andric                         "Expand la.local as la.abs">;
99bdd1243dSDimitry Andric
10006c3fb27SDimitry Andric// Unaligned memory access
10106c3fb27SDimitry Andricdef FeatureUAL
10206c3fb27SDimitry Andric    : SubtargetFeature<"ual", "HasUAL", "true",
10306c3fb27SDimitry Andric                       "Allow memory accesses to be unaligned">;
10406c3fb27SDimitry Andric
1055f757f3fSDimitry Andricdef FeatureRelax
1065f757f3fSDimitry Andric    : SubtargetFeature<"relax", "HasLinkerRelax", "true",
1075f757f3fSDimitry Andric                       "Enable Linker relaxation">;
1085f757f3fSDimitry Andric
1097a6dacacSDimitry Andric// Floating point approximation operation
1107a6dacacSDimitry Andricdef FeatureFrecipe
1117a6dacacSDimitry Andric    : SubtargetFeature<"frecipe", "HasFrecipe", "true",
1127a6dacacSDimitry Andric                       "Support frecipe.{s/d} and frsqrte.{s/d} instructions.">;
1137a6dacacSDimitry Andricdef HasFrecipe : Predicate<"Subtarget->hasFrecipe()">;
1147a6dacacSDimitry Andric
115*0fca6ea1SDimitry Andricdef TunePreferWInst
116*0fca6ea1SDimitry Andric    : SubtargetFeature<"prefer-w-inst", "PreferWInst", "true",
117*0fca6ea1SDimitry Andric                       "Prefer instructions with W suffix">;
1187a6dacacSDimitry Andric
11981ad6265SDimitry Andric//===----------------------------------------------------------------------===//
12081ad6265SDimitry Andric// Registers, instruction descriptions ...
12181ad6265SDimitry Andric//===----------------------------------------------------------------------===//
12281ad6265SDimitry Andric
12381ad6265SDimitry Andricinclude "LoongArchRegisterInfo.td"
12481ad6265SDimitry Andricinclude "LoongArchCallingConv.td"
12581ad6265SDimitry Andricinclude "LoongArchInstrInfo.td"
12681ad6265SDimitry Andric
12781ad6265SDimitry Andric//===----------------------------------------------------------------------===//
12881ad6265SDimitry Andric// LoongArch processors supported.
12981ad6265SDimitry Andric//===----------------------------------------------------------------------===//
13081ad6265SDimitry Andric
131bdd1243dSDimitry Andricdef : ProcessorModel<"generic-la32", NoSchedModel, [Feature32Bit]>;
13206c3fb27SDimitry Andricdef : ProcessorModel<"generic-la64", NoSchedModel, [Feature64Bit, FeatureUAL]>;
13381ad6265SDimitry Andric
1348a4dda33SDimitry Andric// Generic 64-bit processor with double-precision floating-point support.
1358a4dda33SDimitry Andricdef : ProcessorModel<"loongarch64", NoSchedModel, [Feature64Bit,
1368a4dda33SDimitry Andric                                                   FeatureUAL,
1378a4dda33SDimitry Andric                                                   FeatureBasicD]>;
1388a4dda33SDimitry Andric
139bdd1243dSDimitry Andric// Support generic for compatibility with other targets. The triple will be used
140bdd1243dSDimitry Andric// to change to the appropriate la32/la64 version.
141bdd1243dSDimitry Andricdef : ProcessorModel<"generic", NoSchedModel, []>;
142bdd1243dSDimitry Andric
14381ad6265SDimitry Andricdef : ProcessorModel<"la464", NoSchedModel, [Feature64Bit,
14406c3fb27SDimitry Andric                                             FeatureUAL,
14581ad6265SDimitry Andric                                             FeatureExtLASX,
14681ad6265SDimitry Andric                                             FeatureExtLVZ,
14781ad6265SDimitry Andric                                             FeatureExtLBT]>;
14881ad6265SDimitry Andric
149*0fca6ea1SDimitry Andricdef : ProcessorModel<"la664", NoSchedModel, [Feature64Bit,
150*0fca6ea1SDimitry Andric                                             FeatureUAL,
151*0fca6ea1SDimitry Andric                                             FeatureExtLASX,
152*0fca6ea1SDimitry Andric                                             FeatureExtLVZ,
153*0fca6ea1SDimitry Andric                                             FeatureExtLBT,
154*0fca6ea1SDimitry Andric                                             FeatureFrecipe]>;
155*0fca6ea1SDimitry Andric
15681ad6265SDimitry Andric//===----------------------------------------------------------------------===//
15781ad6265SDimitry Andric// Define the LoongArch target.
15881ad6265SDimitry Andric//===----------------------------------------------------------------------===//
15981ad6265SDimitry Andric
16081ad6265SDimitry Andricdef LoongArchInstrInfo : InstrInfo {
16106c3fb27SDimitry Andric  let guessInstructionProperties = 0;
16281ad6265SDimitry Andric}
16381ad6265SDimitry Andric
16481ad6265SDimitry Andricdef LoongArchAsmParser : AsmParser {
16581ad6265SDimitry Andric  let ShouldEmitMatchRegisterAltName = 1;
16681ad6265SDimitry Andric  let AllowDuplicateRegisterNames = 1;
16781ad6265SDimitry Andric}
16881ad6265SDimitry Andric
16981ad6265SDimitry Andricdef LoongArchAsmParserVariant : AsmParserVariant {
17081ad6265SDimitry Andric  int Variant = 0;
17181ad6265SDimitry Andric  // Recognize hard coded registers.
17281ad6265SDimitry Andric  string RegisterPrefix = "$";
17381ad6265SDimitry Andric}
17481ad6265SDimitry Andric
17581ad6265SDimitry Andricdef LoongArchAsmWriter : AsmWriter {
17681ad6265SDimitry Andric  int PassSubtarget = 1;
17781ad6265SDimitry Andric}
17881ad6265SDimitry Andric
17981ad6265SDimitry Andricdef LoongArch : Target {
18081ad6265SDimitry Andric  let InstructionSet = LoongArchInstrInfo;
18181ad6265SDimitry Andric  let AssemblyParsers = [LoongArchAsmParser];
18281ad6265SDimitry Andric  let AssemblyParserVariants = [LoongArchAsmParserVariant];
18381ad6265SDimitry Andric  let AssemblyWriters = [LoongArchAsmWriter];
18481ad6265SDimitry Andric  let AllowRegisterRenaming = 1;
18581ad6265SDimitry Andric}
186