arch-vega: Architected flat scratch and scratch insts
Architected flat scratch is added in MI300 which store the scratch base address in dedicated registers rather than in SGPRs. These registers are used by scratch_ instructions. These are flat instruction which explicitly target the private memory aperture. These instructions have a different address calculation than global_ instructions. This change implements architected flat scratch support, fixes the address calculation of scratch_ instructions, and implements decodings for some scratch_ instructions. Previous flat_ instructions which happen to access the private memory aperture have no change in address calculation. Since scratch_ instructions are identical to flat_ instruction except for address calculation, the decodings simply reuse existing flat_ instruction definitions. Change-Id: I1e1d15a2fbcc7a4a678157c35608f4f22b359e21
This commit is contained in:
@@ -118,6 +118,7 @@ void
|
||||
Wavefront::initRegState(HSAQueueEntry *task, int wgSizeInWorkItems)
|
||||
{
|
||||
int regInitIdx = 0;
|
||||
gfxVersion = task->gfxVersion();
|
||||
|
||||
// Iterate over all the init fields and check which
|
||||
// bits are enabled. Useful information can be found here:
|
||||
@@ -378,8 +379,29 @@ Wavefront::initRegState(HSAQueueEntry *task, int wgSizeInWorkItems)
|
||||
wfSlotId, wfDynId, physSgprIdx, workGroupId[2]);
|
||||
break;
|
||||
case PrivSegWaveByteOffset:
|
||||
|
||||
// For architected flat scratch, this enable is reused to set
|
||||
// the FLAT_SCRATCH register pair to the scratch backing
|
||||
// memory: https://llvm.org/docs/AMDGPUUsage.html#flat-scratch
|
||||
if (task->gfxVersion() == GfxVersion::gfx942) {
|
||||
Addr arch_flat_scratch =
|
||||
task->amdQueue.scratch_backing_memory_location;
|
||||
computeUnit->srf[simdId]->write(
|
||||
VegaISA::REG_FLAT_SCRATCH_HI,
|
||||
bits(arch_flat_scratch, 63, 32));
|
||||
computeUnit->srf[simdId]->write(
|
||||
VegaISA::REG_FLAT_SCRATCH_LO,
|
||||
bits(arch_flat_scratch, 31, 0));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// Not architected flat scratch. Write the scratch wavefront
|
||||
// offset: https://llvm.org/docs/AMDGPUUsage.html
|
||||
// #amdgpu-amdhsa-initial-kernel-execution-state
|
||||
physSgprIdx =
|
||||
computeUnit->registerManager->mapSgpr(this, regInitIdx);
|
||||
|
||||
/**
|
||||
* the compute_tmpring_size_wavesize specifies the number of
|
||||
* kB allocated per wavefront, hence the multiplication by
|
||||
|
||||
Reference in New Issue
Block a user