145bb48eaSTom Stellard //===----------------------- AMDGPUFrameLowering.cpp ----------------------===//
245bb48eaSTom Stellard //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
645bb48eaSTom Stellard //
745bb48eaSTom Stellard //==-----------------------------------------------------------------------===//
845bb48eaSTom Stellard //
97836f895SMatt Arsenault // Interface to describe a layout of a stack frame on a AMDGPU target machine.
1045bb48eaSTom Stellard //
1145bb48eaSTom Stellard //===----------------------------------------------------------------------===//
122bc2f33bSEugene Zelenko
1345bb48eaSTom Stellard #include "AMDGPUFrameLowering.h"
1445bb48eaSTom Stellard
1545bb48eaSTom Stellard using namespace llvm;
AMDGPUFrameLowering(StackDirection D,Align StackAl,int LAO,Align TransAl)16882c43d7SGuillaume Chatelet AMDGPUFrameLowering::AMDGPUFrameLowering(StackDirection D, Align StackAl,
17*3cc4835cSGuillaume Chatelet int LAO, Align TransAl)
1845bb48eaSTom Stellard : TargetFrameLowering(D, StackAl, LAO, TransAl) {}
1945bb48eaSTom Stellard
202bc2f33bSEugene Zelenko AMDGPUFrameLowering::~AMDGPUFrameLowering() = default;
2145bb48eaSTom Stellard
getStackWidth(const MachineFunction & MF) const2245bb48eaSTom Stellard unsigned AMDGPUFrameLowering::getStackWidth(const MachineFunction &MF) const {
2345bb48eaSTom Stellard // XXX: Hardcoding to 1 for now.
2445bb48eaSTom Stellard //
2545bb48eaSTom Stellard // I think the StackWidth should stored as metadata associated with the
2645bb48eaSTom Stellard // MachineFunction. This metadata can either be added by a frontend, or
2745bb48eaSTom Stellard // calculated by a R600 specific LLVM IR pass.
2845bb48eaSTom Stellard //
2945bb48eaSTom Stellard // The StackWidth determines how stack objects are laid out in memory.
3045bb48eaSTom Stellard // For a vector stack variable, like: int4 stack[2], the data will be stored
3145bb48eaSTom Stellard // in the following ways depending on the StackWidth.
3245bb48eaSTom Stellard //
3345bb48eaSTom Stellard // StackWidth = 1:
3445bb48eaSTom Stellard //
3545bb48eaSTom Stellard // T0.X = stack[0].x
3645bb48eaSTom Stellard // T1.X = stack[0].y
3745bb48eaSTom Stellard // T2.X = stack[0].z
3845bb48eaSTom Stellard // T3.X = stack[0].w
3945bb48eaSTom Stellard // T4.X = stack[1].x
4045bb48eaSTom Stellard // T5.X = stack[1].y
4145bb48eaSTom Stellard // T6.X = stack[1].z
4245bb48eaSTom Stellard // T7.X = stack[1].w
4345bb48eaSTom Stellard //
4445bb48eaSTom Stellard // StackWidth = 2:
4545bb48eaSTom Stellard //
4645bb48eaSTom Stellard // T0.X = stack[0].x
4745bb48eaSTom Stellard // T0.Y = stack[0].y
4845bb48eaSTom Stellard // T1.X = stack[0].z
4945bb48eaSTom Stellard // T1.Y = stack[0].w
5045bb48eaSTom Stellard // T2.X = stack[1].x
5145bb48eaSTom Stellard // T2.Y = stack[1].y
5245bb48eaSTom Stellard // T3.X = stack[1].z
5345bb48eaSTom Stellard // T3.Y = stack[1].w
5445bb48eaSTom Stellard //
5545bb48eaSTom Stellard // StackWidth = 4:
5645bb48eaSTom Stellard // T0.X = stack[0].x
5745bb48eaSTom Stellard // T0.Y = stack[0].y
5845bb48eaSTom Stellard // T0.Z = stack[0].z
5945bb48eaSTom Stellard // T0.W = stack[0].w
6045bb48eaSTom Stellard // T1.X = stack[1].x
6145bb48eaSTom Stellard // T1.Y = stack[1].y
6245bb48eaSTom Stellard // T1.Z = stack[1].z
6345bb48eaSTom Stellard // T1.W = stack[1].w
6445bb48eaSTom Stellard return 1;
6545bb48eaSTom Stellard }
66