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