| //===-- VESubtarget.cpp - VE Subtarget Information ------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file implements the VE specific subclass of TargetSubtargetInfo. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "VESubtarget.h" | |
| #include "VE.h" | |
| #include "llvm/Support/MathExtras.h" | |
| #include "llvm/Support/TargetRegistry.h" | |
| using namespace llvm; | |
| #define DEBUG_TYPE "ve-subtarget" | |
| #define GET_SUBTARGETINFO_TARGET_DESC | |
| #define GET_SUBTARGETINFO_CTOR | |
| #include "VEGenSubtargetInfo.inc" | |
| void VESubtarget::anchor() {} | |
| VESubtarget &VESubtarget::initializeSubtargetDependencies(StringRef CPU, | |
| StringRef FS) { | |
| // Determine default and user specified characteristics | |
| std::string CPUName = CPU; | |
| if (CPUName.empty()) | |
| CPUName = "ve"; | |
| // Parse features string. | |
| ParseSubtargetFeatures(CPUName, FS); | |
| return *this; | |
| } | |
| VESubtarget::VESubtarget(const Triple &TT, const std::string &CPU, | |
| const std::string &FS, const TargetMachine &TM) | |
| : VEGenSubtargetInfo(TT, CPU, FS), TargetTriple(TT), | |
| InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this), | |
| FrameLowering(*this) {} | |
| int VESubtarget::getAdjustedFrameSize(int frameSize) const { | |
| // VE stack frame: | |
| // | |
| // +----------------------------------------+ | |
| // | Locals and temporaries | | |
| // +----------------------------------------+ | |
| // | Parameter area for callee | | |
| // 176(fp) | | | |
| // +----------------------------------------+ | |
| // | Register save area (RSA) for callee | | |
| // | | | |
| // 16(fp) | 20 * 8 bytes | | |
| // +----------------------------------------+ | |
| // 8(fp) | Return address | | |
| // +----------------------------------------+ | |
| // 0(fp) | Frame pointer of caller | | |
| // --------+----------------------------------------+-------- | |
| // | Locals and temporaries for callee | | |
| // +----------------------------------------+ | |
| // | Parameter area for callee of callee | | |
| // +----------------------------------------+ | |
| // 16(sp) | RSA for callee of callee | | |
| // +----------------------------------------+ | |
| // 8(sp) | Return address | | |
| // +----------------------------------------+ | |
| // 0(sp) | Frame pointer of callee | | |
| // +----------------------------------------+ | |
| // RSA frame: | |
| // +----------------------------------------------+ | |
| // 168(fp) | %s33 | | |
| // +----------------------------------------------+ | |
| // | %s19...%s32 | | |
| // +----------------------------------------------+ | |
| // 48(fp) | %s18 | | |
| // +----------------------------------------------+ | |
| // 40(fp) | Linkage area register (%s17) | | |
| // +----------------------------------------------+ | |
| // 32(fp) | Procedure linkage table register (%plt=%s16) | | |
| // +----------------------------------------------+ | |
| // 24(fp) | Global offset table register (%got=%s15) | | |
| // +----------------------------------------------+ | |
| // 16(fp) | Thread pointer register (%tp=%s14) | | |
| // +----------------------------------------------+ | |
| frameSize += 176; // for RSA, RA, and FP | |
| frameSize = alignTo(frameSize, 16); // requires 16 bytes alignment | |
| return frameSize; | |
| } | |
| bool VESubtarget::enableMachineScheduler() const { return true; } |