This commit is contained in:
Pavel 2025-02-07 15:05:13 +03:00
parent 9d9edd79a1
commit 4bdf20712b
7 changed files with 218 additions and 25 deletions

View File

@ -1687,12 +1687,15 @@ begin
end;
str:=str+' ';
//operand #1
str:=str+_get_sdst7(SPI.SOP2.SDST);
str:=str+', ';
//operand #2
str:=str+_get_ssrc8(SPI.SOP2.SSRC0,SPI.INLINE32);
str:=str+', ';
//operand #3
str:=str+_get_ssrc8(SPI.SOP2.SSRC1,SPI.INLINE32);
Result:=str;
@ -1759,9 +1762,11 @@ begin
end;
str:=str+' ';
//operand #1
str:=str+_get_sdst7(SPI.SOP1.SDST);
str:=str+', ';
//operand #2
str:=str+_get_ssrc8(SPI.SOP1.SSRC,SPI.INLINE32);
Result:=str;
@ -1794,9 +1799,11 @@ begin
end;
str:=str+' ';
//operand #1
str:=str+_get_ssrc8(SPI.SOPC.SSRC0,SPI.INLINE32);
str:=str+', ';
//operand #2
str:=str+_get_ssrc8(SPI.SOPC.SSRC1,SPI.INLINE32);
Result:=str;
@ -1970,6 +1977,7 @@ begin
str:=str+' ';
end;
//operand #1
case t1 of
1:begin
With SPI.SMRD do
@ -1991,6 +1999,7 @@ begin
str:=str+', ';
end;
//operand #2
case t2 of
2,4:
begin
@ -2006,6 +2015,7 @@ begin
str:=str+', ';
end;
//operand #3
if (t3<>0) then
With SPI.SMRD do
Case IMM of
@ -2049,9 +2059,11 @@ begin
end;
str:=str+' ';
//operand #1
str:=str+_get_sdst7(SPI.SOPK.SDST);
str:=str+', ';
//operand #2
Case SPI.SOPK.OP of
S_MOVK_I32 ,
S_MOVK_HI_I32,
@ -2305,15 +2317,18 @@ begin
end;
str:=str+' ';
//operand #1
str:=str+_get_sdst7(VOP3.VDST);
str:=str+', ';
//operand #2
if Byte(VOP3.NEG).TestBit(0) then str:=str+'-';
if Byte(VOP3.ABS).TestBit(0) then str:=str+'abs(';
str:=str+_get_ssrc9(VOP3.SRC0);
if Byte(VOP3.ABS).TestBit(0) then str:=str+')';
str:=str+', ';
//operand #3
if Byte(VOP3.NEG).TestBit(1) then str:=str+'-';
if Byte(VOP3.ABS).TestBit(1) then str:=str+'abs(';
str:=str+_get_ssrc9(VOP3.SRC1);
@ -2501,24 +2516,45 @@ begin
end;
str:=str+' ';
str:=str+_get_vdst8(VOP3.VDST);
//operand #1
Case VOP3.OP of
384+V_NOP:; //zero operands
Case VOP3.OMOD of
0:;
1:str:=str+'*2';
2:str:=str+'*4';
3:str:=str+'/2';
256+V_READLANE_B32,
384+V_READFIRSTLANE_B32:
begin
//Exception
str:=str+_get_ssrc8(VOP3.VDST); //sdst
end;
else
begin
str:=str+_get_vdst8(VOP3.VDST);
end;
end;
str:=str+', ';
if (VOP3.OP<>(384+V_NOP)) then
begin
if Byte(VOP3.NEG).TestBit(0) then str:=str+'-';
if Byte(VOP3.ABS).TestBit(0) then str:=str+'abs(';
str:=str+_get_ssrc9(VOP3.SRC0);
if Byte(VOP3.ABS).TestBit(0) then str:=str+')';
//dest modifier
Case VOP3.OMOD of
0:;
1:str:=str+'*2';
2:str:=str+'*4';
3:str:=str+'/2';
end;
str:=str+', ';
//operand #2
if Byte(VOP3.NEG).TestBit(0) then str:=str+'-';
if Byte(VOP3.ABS).TestBit(0) then str:=str+'abs(';
str:=str+_get_ssrc9(VOP3.SRC0);
if Byte(VOP3.ABS).TestBit(0) then str:=str+')';
end;
//operand #3
Case VOP3.OP of
384+V_NOP..384+V_MOVRELSD_B32:;
384+V_NOP..384+V_MOVRELSD_B32:; //only 2 operands
else
begin
str:=str+', ';
@ -2533,6 +2569,7 @@ begin
V_MAD_LEGACY_F32..V_DIV_FIXUP_F64,
V_DIV_FMAS_F32..V_MAD_I64_I32:
begin
//operand #4
str:=str+', ';
if Byte(VOP3.NEG).TestBit(2) then str:=str+'-';
if Byte(VOP3.ABS).TestBit(2) then str:=str+'abs(';
@ -2570,8 +2607,10 @@ begin
end;
str:=str+' ';
//operand #1
str:=str+_get_vdst8(VOP3.VDST);
//dest modifier
Case VOP3.OMOD of
0:;
1:str:=str+'*2';
@ -2581,17 +2620,21 @@ begin
str:=str+', ';
//operand #2
str:=str+_get_sdst7(VOP3.SDST);
str:=str+', ';
//operand #3
if Byte(VOP3.NEG).TestBit(0) then str:=str+'-';
str:=str+_get_ssrc9(VOP3.SRC0);
str:=str+', ';
//operand #4
if Byte(VOP3.NEG).TestBit(1) then str:=str+'-';
str:=str+_get_ssrc9(VOP3.SRC1);
str:=str+', ';
//operand #5
if Byte(VOP3.NEG).TestBit(2) then str:=str+'-';
str:=str+_get_ssrc9(VOP3.SRC2);
@ -2671,22 +2714,36 @@ begin
end;
str:=str+' ';
str:=str+_get_vdst8(SPI.VOP2.VDST);
//operand #1
Case SPI.VOP2.OP of
V_READLANE_B32:
begin
//Exception
str:=str+_get_ssrc8(SPI.VOP2.VDST); //sdst
end;
else
begin
str:=str+_get_vdst8(SPI.VOP2.VDST);
end;
end;
str:=str+', ';
//operand #2
str:=str+_get_ssrc9(SPI.VOP2.SRC0,SPI.INLINE32);
str:=str+', ';
//operand #3
Case SPI.VOP2.OP of
V_READLANE_B32,
V_WRITELANE_B32:
begin
str:=str+_get_ssrc8(SPI.VOP2.VSRC1);
//Exception
str:=str+_get_ssrc8(SPI.VOP2.VSRC1); //slane
end;
else
begin
str:=str+_get_vdst8(SPI.VOP2.VSRC1);
end;
begin
str:=str+_get_vdst8(SPI.VOP2.VSRC1);
end;
end;
Result:=str;
@ -2918,9 +2975,11 @@ begin
end;
str:=str+' VCC, ';
//operand #1
str:=str+_get_ssrc9(SPI.VOPC.SRC0,SPI.INLINE32);
str:=str+', ';
//operand #2
str:=str+_get_vdst8(SPI.VOPC.VSRC1);
Result:=str;
@ -3003,10 +3062,27 @@ begin
end;
str:=str+' ';
str:=str+_get_vdst8(SPI.VOP1.VDST);
str:=str+', ';
//operand #1
Case SPI.VOP1.OP of
V_NOP:; //zero operands
str:=str+_get_ssrc9(SPI.VOP1.SRC0,SPI.INLINE32);
V_READFIRSTLANE_B32:
begin
//Exception
str:=str+_get_ssrc8(SPI.VOP1.VDST);
end;
else
begin
str:=str+_get_vdst8(SPI.VOP1.VDST);
end;
end;
//operand #2
if (SPI.VOP1.OP<>V_NOP) then
begin
str:=str+', ';
str:=str+_get_ssrc9(SPI.VOP1.SRC0,SPI.INLINE32);
end;
Result:=str;
end;
@ -3076,18 +3152,23 @@ begin
end;
str:=str+' ';
//operand #1
str:=str+_get_vdst8(SPI.MUBUF.VDATA);
str:=str+', ';
//operand #2
str:=str+_get_vdst8(SPI.MUBUF.VADDR);
str:=str+', ';
//operand #3
str:=str+'s['+IntToStr(SPI.MUBUF.SRSRC*4)+':'+IntToStr(SPI.MUBUF.SRSRC*4+3)+']';
str:=str+', ';
//operand #4
str:=str+IntToStr(SPI.MUBUF.OFFSET);
str:=str+', ';
//operand #5
str:=str+'[';
str:=str+_get_ssrc8(SPI.MUBUF.SOFFSET);
str:=str+']';
@ -3119,18 +3200,23 @@ begin
end;
str:=str+' ';
//operand #1
str:=str+_get_vdst8(SPI.MTBUF.VDATA);
str:=str+', ';
//operand #2
str:=str+_get_vdst8(SPI.MTBUF.VADDR);
str:=str+', ';
//operand #3
str:=str+'s['+IntToStr(SPI.MTBUF.SRSRC*4)+':'+IntToStr(SPI.MTBUF.SRSRC*4+3)+']';
str:=str+', ';
//operand #4
str:=str+IntToStr(SPI.MTBUF.OFFSET);
str:=str+', ';
//operand #5
str:=str+'[';
str:=str+_get_ssrc8(SPI.MTBUF.SOFFSET);
str:=str+']';
@ -3287,6 +3373,7 @@ begin
t:=PopCnt(Byte(SPI.MIMG.DMASK));
//operand #1
Case t of
2,3,4:
begin
@ -3303,8 +3390,10 @@ begin
end;
str:=str+', ';
//operand #2
str:=str+'s['+IntToStr(SPI.MIMG.SRSRC*4)+':'+IntToStr(SPI.MIMG.SRSRC*4+7)+']';
//operand #3
Case SPI.MIMG.OP of
IMAGE_SAMPLE..IMAGE_SAMPLE_C_CD_CL_O:
begin

View File

@ -165,6 +165,9 @@ begin
if (SGPRS>=2) then SGPRS:=SGPRS-2; //VCC
if (SGPRS>104) then SGPRS:=104;
FVGPRS:=VGPRS;
FSGPRS:=SGPRS;
if (VGPRS<>0) then
For p:=0 to VGPRS-1 do
begin
@ -175,7 +178,7 @@ begin
end;
if (SGPRS<>0) then
For p:=USER_SGPR to (SGPRS+USER_SGPR)-1 do
For p:=USER_SGPR to (SGPRS-USER_SGPR)-1 do
begin
if (RegsStory.SGRP[p].current=nil) then
begin

View File

@ -33,6 +33,7 @@ type
//
function get_sdst7(SDST:Byte):PsrRegSlot;
function get_sdst7_pair(SDST:Byte;dst:PPsrRegSlot):Boolean;
function get_sdst8(SSRC:Byte):PsrRegSlot;
function get_ssrc8(SSRC:Byte):PsrRegSlot;
function get_ssrc9(SSRC:Word):PsrRegSlot;
function get_ssrc9_pair(SSRC:Word;src:PPsrRegSlot):Boolean;
@ -228,6 +229,11 @@ begin
Result:=RegsStory.get_sdst7_pair(SDST,dst);
end;
function TEmitFetch.get_sdst8(SSRC:Byte):PsrRegSlot;
begin
Result:=RegsStory.get_sdst8(SSRC);
end;
function TEmitFetch.get_ssrc8(SSRC:Byte):PsrRegSlot;
begin
Result:=RegsStory.get_ssrc8(SSRC);

View File

@ -8,7 +8,9 @@ uses
sysutils,
ps4_pssl,
spirv,
srNode,
srType,
srTypes,
srReg,
srConst,
emit_fetch;
@ -18,6 +20,7 @@ type
procedure emit_VOP1;
procedure emit_V_MOV_B32;
procedure emit_V_READFIRSTLANE_B32;
procedure emit_V_MOVRELS_B32;
procedure emit_V_CVT(OpId:DWORD;dst_type,src_type:TsrDataType);
procedure emit_V_CVT_F16_F32;
procedure emit_V_CVT_F32_F16;
@ -40,6 +43,9 @@ type
implementation
uses
srPrivate;
procedure TEmit_VOP1.emit_V_MOV_B32;
Var
dst:PsrRegSlot;
@ -50,18 +56,77 @@ begin
MakeCopy(dst,src);
end;
procedure TEmit_VOP1.emit_V_READFIRSTLANE_B32;
procedure TEmit_VOP1.emit_V_READFIRSTLANE_B32; //sdst, vsrc
Var
dst:PsrRegSlot;
src:TsrRegNode;
begin
//TODO: V_READFIRSTLANE_B32
//
dst:=get_vdst8(FSPI.VOP1.VDST);
dst:=get_sdst8 (FSPI.VOP1.VDST); //NOTE: SDST
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtUnknow);
MakeCopy(dst,src);
end;
procedure TEmit_VOP1.emit_V_MOVRELS_B32; //vdst = VGPR[vgpr_index_of(vsrc) + M0.u] OOB:VGPR0
Var
i,vmin,vmax:WORD;
priv:TsrPrivate;
iType:TsrType;
idx:TsrRegNode;
pChain:TsrNode;
dst:PsrRegSlot;
src:TsrRegNode;
begin
idx:=MakeRead(get_m0,dtUnknow);
idx:=RegDown(idx);
if idx.is_const then
begin
i:=idx.AsConst.AsInt32;
dst:=get_vdst8 (FSPI.VOP1.VDST);
src:=fetch_ssrc9(FSPI.VOP1.SRC0+i,dtUnknow);
MakeCopy(dst,src);
end else
begin
vmin:=FSPI.VOP1.SRC0-256;
vmax:=FVGPRS;
Assert(vmin<vmax);
priv :=PrivateList.FetchArray(dtFloat32,vmax-vmin);
iType:=TypeList.Fetch(dtFloat32);
for i:=vmin to vmax-1 do
begin
idx:=self.NewImm_i(dtInt32,(i-vmin));
pChain:=OpAccessChainTo(iType,priv.pVar,idx);
src:=fetch_vsrc8(i,dtFloat32);
OpStore(line,pChain,src);
end;
idx:=MakeRead(get_m0,dtInt32);
pChain:=OpAccessChainTo(iType,priv.pVar,idx);
src:=OpLoadTo(iType,pChain);
dst:=get_vdst8(FSPI.VOP1.VDST);
MakeCopy(dst,src);
end;
end;
procedure TEmit_VOP1.emit_V_CVT(OpId:DWORD;dst_type,src_type:TsrDataType);
Var
dst:PsrRegSlot;
@ -382,6 +447,8 @@ begin
V_BFREV_B32: emit_V_BFREV_B32;
V_MOVRELS_B32: emit_V_MOVRELS_B32;
else
Assert(false,'VOP1?'+IntToStr(FSPI.VOP1.OP)+' '+get_str_spi(FSPI));
end;

View File

@ -81,6 +81,8 @@ type
//
FLocalSize :TLocalSize;
FLDS_SIZE :DWORD;
FVGPRS :WORD;
FSGPRS :WORD;
FGeometryInfo :TGeometryInfo;
//
Config:TsrConfig;

View File

@ -97,6 +97,7 @@ type
procedure Init(Emit:TCustomEmit); inline;
function Fetch(pSource:PsrRegSlot):TsrPrivate;
function FetchCustom(dtype:TsrDataType):TsrPrivate;
function FetchArray(dtype:TsrDataType;array_count:DWORD):TsrPrivate;
function First:TsrPrivate; inline;
//
procedure build_slot_reset(pSlot:PsrRegSlot;var orig:TsrRegNode);
@ -446,7 +447,7 @@ begin
repeat
nswp:=True;
dnode:=FLineList.pHead;
While true do
While (dnode<>nil) do
begin
dnext:=dnode.pNext;
if (dnext=nil) then Break;
@ -479,7 +480,7 @@ var
pRegs:array[0..1] of TsrRegNode;
begin
dnode:=FLineList.pTail;
While true do
While (dnode<>nil) do
begin
dprev:=dnode.pPrev;
if (dprev=nil) then Break;
@ -651,6 +652,25 @@ begin
FList.Push_tail(Result);
end;
function TsrPrivateList.FetchArray(dtype:TsrDataType;array_count:DWORD):TsrPrivate;
var
pTypeList:PsrTypeList;
begin
Result:=FEmit.specialize New<TsrPrivate>;
Result.Init;
Result.InitVar; ////
Result.FPrivId:=FPrivId; Inc(FPrivId);
//
if (dtype<>dtUnknow) then
begin
pTypeList:=FEmit.GetTypeList;
Result.Ftype:=pTypeList^.Fetch(dtype);
Result.Ftype:=pTypeList^.FetchArray(Result.Ftype,array_count);
end;
//
FList.Push_tail(Result);
end;
Function TsrPrivateList.First:TsrPrivate;
begin
Result:=FList.pHead;

View File

@ -172,6 +172,7 @@ type
//
function get_sdst7(SDST:Byte):PsrRegSlot;
function get_sdst7_pair(SDST:Byte;dst:PPsrRegSlot):Boolean;
function get_sdst8(SDST:Word):PsrRegSlot;
function get_ssrc8(SSRC:Byte):PsrRegSlot;
function get_ssrc9(SSRC:Word):PsrRegSlot;
function get_ssrc9_pair(SSRC:Word;src:PPsrRegSlot):Boolean;
@ -439,6 +440,11 @@ begin
end;
end;
function TsrRegsStory.get_sdst8(SDST:Word):PsrRegSlot;
begin
Result:=get_ssrc8(SDST);
end;
function TsrRegsStory.get_ssrc8(SSRC:Byte):PsrRegSlot;
begin
Case SSRC of