1*48958d02SDaniil Fukalov //===-- R600Subtarget.cpp - R600 Subtarget Information --------------------===//
2*48958d02SDaniil Fukalov //
3*48958d02SDaniil Fukalov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*48958d02SDaniil Fukalov // See https://llvm.org/LICENSE.txt for license information.
5*48958d02SDaniil Fukalov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*48958d02SDaniil Fukalov //
7*48958d02SDaniil Fukalov //===----------------------------------------------------------------------===//
8*48958d02SDaniil Fukalov //
9*48958d02SDaniil Fukalov /// \file
10*48958d02SDaniil Fukalov /// Implements the R600 specific subclass of TargetSubtarget.
11*48958d02SDaniil Fukalov //
12*48958d02SDaniil Fukalov //===----------------------------------------------------------------------===//
13*48958d02SDaniil Fukalov 
14*48958d02SDaniil Fukalov #include "R600Subtarget.h"
15*48958d02SDaniil Fukalov #include "MCTargetDesc/R600MCTargetDesc.h"
16*48958d02SDaniil Fukalov 
17*48958d02SDaniil Fukalov using namespace llvm;
18*48958d02SDaniil Fukalov 
19*48958d02SDaniil Fukalov #define DEBUG_TYPE "r600-subtarget"
20*48958d02SDaniil Fukalov 
21*48958d02SDaniil Fukalov #define GET_SUBTARGETINFO_TARGET_DESC
22*48958d02SDaniil Fukalov #define GET_SUBTARGETINFO_CTOR
23*48958d02SDaniil Fukalov #include "R600GenSubtargetInfo.inc"
24*48958d02SDaniil Fukalov 
R600Subtarget(const Triple & TT,StringRef GPU,StringRef FS,const TargetMachine & TM)25*48958d02SDaniil Fukalov R600Subtarget::R600Subtarget(const Triple &TT, StringRef GPU, StringRef FS,
26*48958d02SDaniil Fukalov                              const TargetMachine &TM)
27*48958d02SDaniil Fukalov     : R600GenSubtargetInfo(TT, GPU, /*TuneCPU*/ GPU, FS), AMDGPUSubtarget(TT),
28*48958d02SDaniil Fukalov       InstrInfo(*this),
29*48958d02SDaniil Fukalov       FrameLowering(TargetFrameLowering::StackGrowsUp, getStackAlignment(), 0),
30*48958d02SDaniil Fukalov       TLInfo(TM, initializeSubtargetDependencies(TT, GPU, FS)),
31*48958d02SDaniil Fukalov       InstrItins(getInstrItineraryForCPU(GPU)) {}
32*48958d02SDaniil Fukalov 
initializeSubtargetDependencies(const Triple & TT,StringRef GPU,StringRef FS)33*48958d02SDaniil Fukalov R600Subtarget &R600Subtarget::initializeSubtargetDependencies(const Triple &TT,
34*48958d02SDaniil Fukalov                                                               StringRef GPU,
35*48958d02SDaniil Fukalov                                                               StringRef FS) {
36*48958d02SDaniil Fukalov   SmallString<256> FullFS("+promote-alloca,");
37*48958d02SDaniil Fukalov   FullFS += FS;
38*48958d02SDaniil Fukalov   ParseSubtargetFeatures(GPU, /*TuneCPU*/ GPU, FullFS);
39*48958d02SDaniil Fukalov 
40*48958d02SDaniil Fukalov   HasMulU24 = getGeneration() >= EVERGREEN;
41*48958d02SDaniil Fukalov   HasMulI24 = hasCaymanISA();
42*48958d02SDaniil Fukalov 
43*48958d02SDaniil Fukalov   return *this;
44*48958d02SDaniil Fukalov }
45