xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VESubtarget.cpp (revision 480093f4440d54b30b3025afeac24b48f2ba7a2e)
1*480093f4SDimitry Andric //===-- VESubtarget.cpp - VE Subtarget Information ------------------------===//
2*480093f4SDimitry Andric //
3*480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*480093f4SDimitry Andric //
7*480093f4SDimitry Andric //===----------------------------------------------------------------------===//
8*480093f4SDimitry Andric //
9*480093f4SDimitry Andric // This file implements the VE specific subclass of TargetSubtargetInfo.
10*480093f4SDimitry Andric //
11*480093f4SDimitry Andric //===----------------------------------------------------------------------===//
12*480093f4SDimitry Andric 
13*480093f4SDimitry Andric #include "VESubtarget.h"
14*480093f4SDimitry Andric #include "VE.h"
15*480093f4SDimitry Andric #include "llvm/Support/MathExtras.h"
16*480093f4SDimitry Andric #include "llvm/Support/TargetRegistry.h"
17*480093f4SDimitry Andric 
18*480093f4SDimitry Andric using namespace llvm;
19*480093f4SDimitry Andric 
20*480093f4SDimitry Andric #define DEBUG_TYPE "ve-subtarget"
21*480093f4SDimitry Andric 
22*480093f4SDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC
23*480093f4SDimitry Andric #define GET_SUBTARGETINFO_CTOR
24*480093f4SDimitry Andric #include "VEGenSubtargetInfo.inc"
25*480093f4SDimitry Andric 
26*480093f4SDimitry Andric void VESubtarget::anchor() {}
27*480093f4SDimitry Andric 
28*480093f4SDimitry Andric VESubtarget &VESubtarget::initializeSubtargetDependencies(StringRef CPU,
29*480093f4SDimitry Andric                                                           StringRef FS) {
30*480093f4SDimitry Andric   // Determine default and user specified characteristics
31*480093f4SDimitry Andric   std::string CPUName = CPU;
32*480093f4SDimitry Andric   if (CPUName.empty())
33*480093f4SDimitry Andric     CPUName = "ve";
34*480093f4SDimitry Andric 
35*480093f4SDimitry Andric   // Parse features string.
36*480093f4SDimitry Andric   ParseSubtargetFeatures(CPUName, FS);
37*480093f4SDimitry Andric 
38*480093f4SDimitry Andric   return *this;
39*480093f4SDimitry Andric }
40*480093f4SDimitry Andric 
41*480093f4SDimitry Andric VESubtarget::VESubtarget(const Triple &TT, const std::string &CPU,
42*480093f4SDimitry Andric                          const std::string &FS, const TargetMachine &TM)
43*480093f4SDimitry Andric     : VEGenSubtargetInfo(TT, CPU, FS), TargetTriple(TT),
44*480093f4SDimitry Andric       InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this),
45*480093f4SDimitry Andric       FrameLowering(*this) {}
46*480093f4SDimitry Andric 
47*480093f4SDimitry Andric int VESubtarget::getAdjustedFrameSize(int frameSize) const {
48*480093f4SDimitry Andric 
49*480093f4SDimitry Andric   // VE stack frame:
50*480093f4SDimitry Andric   //
51*480093f4SDimitry Andric   //         +----------------------------------------+
52*480093f4SDimitry Andric   //         | Locals and temporaries                 |
53*480093f4SDimitry Andric   //         +----------------------------------------+
54*480093f4SDimitry Andric   //         | Parameter area for callee              |
55*480093f4SDimitry Andric   // 176(fp) |                                        |
56*480093f4SDimitry Andric   //         +----------------------------------------+
57*480093f4SDimitry Andric   //         | Register save area (RSA) for callee    |
58*480093f4SDimitry Andric   //         |                                        |
59*480093f4SDimitry Andric   //  16(fp) |                         20 * 8 bytes   |
60*480093f4SDimitry Andric   //         +----------------------------------------+
61*480093f4SDimitry Andric   //   8(fp) | Return address                         |
62*480093f4SDimitry Andric   //         +----------------------------------------+
63*480093f4SDimitry Andric   //   0(fp) | Frame pointer of caller                |
64*480093f4SDimitry Andric   // --------+----------------------------------------+--------
65*480093f4SDimitry Andric   //         | Locals and temporaries for callee      |
66*480093f4SDimitry Andric   //         +----------------------------------------+
67*480093f4SDimitry Andric   //         | Parameter area for callee of callee    |
68*480093f4SDimitry Andric   //         +----------------------------------------+
69*480093f4SDimitry Andric   //  16(sp) | RSA for callee of callee               |
70*480093f4SDimitry Andric   //         +----------------------------------------+
71*480093f4SDimitry Andric   //   8(sp) | Return address                         |
72*480093f4SDimitry Andric   //         +----------------------------------------+
73*480093f4SDimitry Andric   //   0(sp) | Frame pointer of callee                |
74*480093f4SDimitry Andric   //         +----------------------------------------+
75*480093f4SDimitry Andric 
76*480093f4SDimitry Andric   // RSA frame:
77*480093f4SDimitry Andric   //         +----------------------------------------------+
78*480093f4SDimitry Andric   // 168(fp) | %s33                                         |
79*480093f4SDimitry Andric   //         +----------------------------------------------+
80*480093f4SDimitry Andric   //         | %s19...%s32                                  |
81*480093f4SDimitry Andric   //         +----------------------------------------------+
82*480093f4SDimitry Andric   //  48(fp) | %s18                                         |
83*480093f4SDimitry Andric   //         +----------------------------------------------+
84*480093f4SDimitry Andric   //  40(fp) | Linkage area register (%s17)                 |
85*480093f4SDimitry Andric   //         +----------------------------------------------+
86*480093f4SDimitry Andric   //  32(fp) | Procedure linkage table register (%plt=%s16) |
87*480093f4SDimitry Andric   //         +----------------------------------------------+
88*480093f4SDimitry Andric   //  24(fp) | Global offset table register (%got=%s15)     |
89*480093f4SDimitry Andric   //         +----------------------------------------------+
90*480093f4SDimitry Andric   //  16(fp) | Thread pointer register (%tp=%s14)           |
91*480093f4SDimitry Andric   //         +----------------------------------------------+
92*480093f4SDimitry Andric 
93*480093f4SDimitry Andric   frameSize += 176;                   // for RSA, RA, and FP
94*480093f4SDimitry Andric   frameSize = alignTo(frameSize, 16); // requires 16 bytes alignment
95*480093f4SDimitry Andric 
96*480093f4SDimitry Andric   return frameSize;
97*480093f4SDimitry Andric }
98*480093f4SDimitry Andric 
99*480093f4SDimitry Andric bool VESubtarget::enableMachineScheduler() const { return true; }
100