xref: /src/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUFrameLowering.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
14a16efa3SDimitry Andric //===----------------------- AMDGPUFrameLowering.cpp ----------------------===//
24a16efa3SDimitry Andric //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64a16efa3SDimitry Andric //
74a16efa3SDimitry Andric //==-----------------------------------------------------------------------===//
84a16efa3SDimitry Andric //
901095a5dSDimitry Andric // Interface to describe a layout of a stack frame on a AMDGPU target machine.
104a16efa3SDimitry Andric //
114a16efa3SDimitry Andric //===----------------------------------------------------------------------===//
12b915e9e0SDimitry Andric 
134a16efa3SDimitry Andric #include "AMDGPUFrameLowering.h"
144a16efa3SDimitry Andric 
154a16efa3SDimitry Andric using namespace llvm;
AMDGPUFrameLowering(StackDirection D,Align StackAl,int LAO,Align TransAl)161d5ae102SDimitry Andric AMDGPUFrameLowering::AMDGPUFrameLowering(StackDirection D, Align StackAl,
171d5ae102SDimitry Andric                                          int LAO, Align TransAl)
184a16efa3SDimitry Andric     : TargetFrameLowering(D, StackAl, LAO, TransAl) {}
194a16efa3SDimitry Andric 
20b915e9e0SDimitry Andric AMDGPUFrameLowering::~AMDGPUFrameLowering() = default;
214a16efa3SDimitry Andric 
getStackWidth(const MachineFunction & MF) const224a16efa3SDimitry Andric unsigned AMDGPUFrameLowering::getStackWidth(const MachineFunction &MF) const {
234a16efa3SDimitry Andric   // XXX: Hardcoding to 1 for now.
244a16efa3SDimitry Andric   //
25e3b55780SDimitry Andric   // I think the StackWidth should be stored as metadata associated with the
264a16efa3SDimitry Andric   // MachineFunction.  This metadata can either be added by a frontend, or
274a16efa3SDimitry Andric   // calculated by a R600 specific LLVM IR pass.
284a16efa3SDimitry Andric   //
294a16efa3SDimitry Andric   // The StackWidth determines how stack objects are laid out in memory.
304a16efa3SDimitry Andric   // For a vector stack variable, like: int4 stack[2], the data will be stored
314a16efa3SDimitry Andric   // in the following ways depending on the StackWidth.
324a16efa3SDimitry Andric   //
334a16efa3SDimitry Andric   // StackWidth = 1:
344a16efa3SDimitry Andric   //
354a16efa3SDimitry Andric   // T0.X = stack[0].x
364a16efa3SDimitry Andric   // T1.X = stack[0].y
374a16efa3SDimitry Andric   // T2.X = stack[0].z
384a16efa3SDimitry Andric   // T3.X = stack[0].w
394a16efa3SDimitry Andric   // T4.X = stack[1].x
404a16efa3SDimitry Andric   // T5.X = stack[1].y
414a16efa3SDimitry Andric   // T6.X = stack[1].z
424a16efa3SDimitry Andric   // T7.X = stack[1].w
434a16efa3SDimitry Andric   //
444a16efa3SDimitry Andric   // StackWidth = 2:
454a16efa3SDimitry Andric   //
464a16efa3SDimitry Andric   // T0.X = stack[0].x
474a16efa3SDimitry Andric   // T0.Y = stack[0].y
484a16efa3SDimitry Andric   // T1.X = stack[0].z
494a16efa3SDimitry Andric   // T1.Y = stack[0].w
504a16efa3SDimitry Andric   // T2.X = stack[1].x
514a16efa3SDimitry Andric   // T2.Y = stack[1].y
524a16efa3SDimitry Andric   // T3.X = stack[1].z
534a16efa3SDimitry Andric   // T3.Y = stack[1].w
544a16efa3SDimitry Andric   //
554a16efa3SDimitry Andric   // StackWidth = 4:
564a16efa3SDimitry Andric   // T0.X = stack[0].x
574a16efa3SDimitry Andric   // T0.Y = stack[0].y
584a16efa3SDimitry Andric   // T0.Z = stack[0].z
594a16efa3SDimitry Andric   // T0.W = stack[0].w
604a16efa3SDimitry Andric   // T1.X = stack[1].x
614a16efa3SDimitry Andric   // T1.Y = stack[1].y
624a16efa3SDimitry Andric   // T1.Z = stack[1].z
634a16efa3SDimitry Andric   // T1.W = stack[1].w
644a16efa3SDimitry Andric   return 1;
654a16efa3SDimitry Andric }
66