diff --git a/chip/ps4_pssl.pas b/chip/ps4_pssl.pas index c19b486d..dc5ebcba 100644 --- a/chip/ps4_pssl.pas +++ b/chip/ps4_pssl.pas @@ -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 diff --git a/spirv/SprvEmit.pas b/spirv/SprvEmit.pas index edb030c8..373bead4 100644 --- a/spirv/SprvEmit.pas +++ b/spirv/SprvEmit.pas @@ -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 diff --git a/spirv/emit_fetch.pas b/spirv/emit_fetch.pas index 3a2918ae..97c39bd3 100644 --- a/spirv/emit_fetch.pas +++ b/spirv/emit_fetch.pas @@ -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); diff --git a/spirv/emit_vop1.pas b/spirv/emit_vop1.pas index 6480a1a9..b0f0ecbe 100644 --- a/spirv/emit_vop1.pas +++ b/spirv/emit_vop1.pas @@ -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(vminnil) 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; + 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; diff --git a/spirv/srReg.pas b/spirv/srReg.pas index 16228a23..3e7b0705 100644 --- a/spirv/srReg.pas +++ b/spirv/srReg.pas @@ -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