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