xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VESubtarget.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1480093f4SDimitry Andric //===-- VESubtarget.cpp - VE Subtarget Information ------------------------===//
2480093f4SDimitry Andric //
3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6480093f4SDimitry Andric //
7480093f4SDimitry Andric //===----------------------------------------------------------------------===//
8480093f4SDimitry Andric //
9480093f4SDimitry Andric // This file implements the VE specific subclass of TargetSubtargetInfo.
10480093f4SDimitry Andric //
11480093f4SDimitry Andric //===----------------------------------------------------------------------===//
12480093f4SDimitry Andric 
13480093f4SDimitry Andric #include "VESubtarget.h"
14480093f4SDimitry Andric #include "VE.h"
15480093f4SDimitry Andric #include "llvm/Support/MathExtras.h"
16480093f4SDimitry Andric #include "llvm/Support/TargetRegistry.h"
17480093f4SDimitry Andric 
18480093f4SDimitry Andric using namespace llvm;
19480093f4SDimitry Andric 
20480093f4SDimitry Andric #define DEBUG_TYPE "ve-subtarget"
21480093f4SDimitry Andric 
22480093f4SDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC
23480093f4SDimitry Andric #define GET_SUBTARGETINFO_CTOR
24480093f4SDimitry Andric #include "VEGenSubtargetInfo.inc"
25480093f4SDimitry Andric 
26480093f4SDimitry Andric void VESubtarget::anchor() {}
27480093f4SDimitry Andric 
28480093f4SDimitry Andric VESubtarget &VESubtarget::initializeSubtargetDependencies(StringRef CPU,
29480093f4SDimitry Andric                                                           StringRef FS) {
30480093f4SDimitry Andric   // Determine default and user specified characteristics
31*5ffd83dbSDimitry Andric   std::string CPUName = std::string(CPU);
32480093f4SDimitry Andric   if (CPUName.empty())
33480093f4SDimitry Andric     CPUName = "ve";
34480093f4SDimitry Andric 
35480093f4SDimitry Andric   // Parse features string.
36480093f4SDimitry Andric   ParseSubtargetFeatures(CPUName, FS);
37480093f4SDimitry Andric 
38480093f4SDimitry Andric   return *this;
39480093f4SDimitry Andric }
40480093f4SDimitry Andric 
41480093f4SDimitry Andric VESubtarget::VESubtarget(const Triple &TT, const std::string &CPU,
42480093f4SDimitry Andric                          const std::string &FS, const TargetMachine &TM)
43480093f4SDimitry Andric     : VEGenSubtargetInfo(TT, CPU, FS), TargetTriple(TT),
44480093f4SDimitry Andric       InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this),
45480093f4SDimitry Andric       FrameLowering(*this) {}
46480093f4SDimitry Andric 
47480093f4SDimitry Andric int VESubtarget::getAdjustedFrameSize(int frameSize) const {
48480093f4SDimitry Andric 
49480093f4SDimitry Andric   // VE stack frame:
50480093f4SDimitry Andric   //
51480093f4SDimitry Andric   //         +----------------------------------------+
52480093f4SDimitry Andric   //         | Locals and temporaries                 |
53480093f4SDimitry Andric   //         +----------------------------------------+
54480093f4SDimitry Andric   //         | Parameter area for callee              |
55480093f4SDimitry Andric   // 176(fp) |                                        |
56480093f4SDimitry Andric   //         +----------------------------------------+
57480093f4SDimitry Andric   //         | Register save area (RSA) for callee    |
58480093f4SDimitry Andric   //         |                                        |
59480093f4SDimitry Andric   //  16(fp) |                         20 * 8 bytes   |
60480093f4SDimitry Andric   //         +----------------------------------------+
61480093f4SDimitry Andric   //   8(fp) | Return address                         |
62480093f4SDimitry Andric   //         +----------------------------------------+
63480093f4SDimitry Andric   //   0(fp) | Frame pointer of caller                |
64480093f4SDimitry Andric   // --------+----------------------------------------+--------
65480093f4SDimitry Andric   //         | Locals and temporaries for callee      |
66480093f4SDimitry Andric   //         +----------------------------------------+
67480093f4SDimitry Andric   //         | Parameter area for callee of callee    |
68480093f4SDimitry Andric   //         +----------------------------------------+
69480093f4SDimitry Andric   //  16(sp) | RSA for callee of callee               |
70480093f4SDimitry Andric   //         +----------------------------------------+
71480093f4SDimitry Andric   //   8(sp) | Return address                         |
72480093f4SDimitry Andric   //         +----------------------------------------+
73480093f4SDimitry Andric   //   0(sp) | Frame pointer of callee                |
74480093f4SDimitry Andric   //         +----------------------------------------+
75480093f4SDimitry Andric 
76480093f4SDimitry Andric   // RSA frame:
77480093f4SDimitry Andric   //         +----------------------------------------------+
78480093f4SDimitry Andric   // 168(fp) | %s33                                         |
79480093f4SDimitry Andric   //         +----------------------------------------------+
80480093f4SDimitry Andric   //         | %s19...%s32                                  |
81480093f4SDimitry Andric   //         +----------------------------------------------+
82480093f4SDimitry Andric   //  48(fp) | %s18                                         |
83480093f4SDimitry Andric   //         +----------------------------------------------+
84480093f4SDimitry Andric   //  40(fp) | Linkage area register (%s17)                 |
85480093f4SDimitry Andric   //         +----------------------------------------------+
86480093f4SDimitry Andric   //  32(fp) | Procedure linkage table register (%plt=%s16) |
87480093f4SDimitry Andric   //         +----------------------------------------------+
88480093f4SDimitry Andric   //  24(fp) | Global offset table register (%got=%s15)     |
89480093f4SDimitry Andric   //         +----------------------------------------------+
90480093f4SDimitry Andric   //  16(fp) | Thread pointer register (%tp=%s14)           |
91480093f4SDimitry Andric   //         +----------------------------------------------+
92480093f4SDimitry Andric 
93480093f4SDimitry Andric   frameSize += 176;                   // for RSA, RA, and FP
94480093f4SDimitry Andric   frameSize = alignTo(frameSize, 16); // requires 16 bytes alignment
95480093f4SDimitry Andric 
96480093f4SDimitry Andric   return frameSize;
97480093f4SDimitry Andric }
98480093f4SDimitry Andric 
99480093f4SDimitry Andric bool VESubtarget::enableMachineScheduler() const { return true; }
100