mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
71d4ca6e7f
commit
bcc9c93674
|
@ -1953,7 +1953,7 @@ begin
|
||||||
end;
|
end;
|
||||||
Write(' ');
|
Write(' ');
|
||||||
_print_sdst7(SPI.SOPK.SDST);
|
_print_sdst7(SPI.SOPK.SDST);
|
||||||
Write(' ');
|
Write(', ');
|
||||||
|
|
||||||
Case SPI.SOPK.OP of
|
Case SPI.SOPK.OP of
|
||||||
S_MOVK_I32 ,
|
S_MOVK_I32 ,
|
||||||
|
@ -2202,7 +2202,7 @@ begin
|
||||||
V_CMPX_CLASS_F64:Write('V_CMPX_CLASS_F64');
|
V_CMPX_CLASS_F64:Write('V_CMPX_CLASS_F64');
|
||||||
|
|
||||||
else
|
else
|
||||||
Write('VOP3a_cmp?',VOP3.OP);
|
Write('VOP3c?',VOP3.OP);
|
||||||
end;
|
end;
|
||||||
Write(' ');
|
Write(' ');
|
||||||
|
|
||||||
|
|
|
@ -168,8 +168,6 @@ type
|
||||||
procedure RegPrepType(node:PsrRegNode;rtype:TsrDataType);
|
procedure RegPrepType(node:PsrRegNode;rtype:TsrDataType);
|
||||||
|
|
||||||
procedure _emit_spi;
|
procedure _emit_spi;
|
||||||
procedure _emit_DS;
|
|
||||||
procedure _emit_SOPK;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function RegDown(node:PsrRegNode):PsrRegNode;
|
function RegDown(node:PsrRegNode):PsrRegNode;
|
||||||
|
@ -191,6 +189,7 @@ uses
|
||||||
emit_SOP2,
|
emit_SOP2,
|
||||||
emit_SOPC,
|
emit_SOPC,
|
||||||
emit_SOPP,
|
emit_SOPP,
|
||||||
|
emit_SOPK,
|
||||||
emit_VOP1,
|
emit_VOP1,
|
||||||
emit_VOP2,
|
emit_VOP2,
|
||||||
emit_VOP3,
|
emit_VOP3,
|
||||||
|
@ -1741,7 +1740,7 @@ begin
|
||||||
W_VINTRP:TEmit_VINTRP(Self)._emit_VINTRP;
|
W_VINTRP:TEmit_VINTRP(Self)._emit_VINTRP;
|
||||||
W_MIMG :TEmit_MIMG(Self)._emit_MIMG;
|
W_MIMG :TEmit_MIMG(Self)._emit_MIMG;
|
||||||
W_SMRD :TEmit_SMRD(Self)._emit_SMRD;
|
W_SMRD :TEmit_SMRD(Self)._emit_SMRD;
|
||||||
W_SOPK :_emit_SOPK;
|
W_SOPK :TEmit_SOPK(Self)._emit_SOPK;
|
||||||
W_SOP2 :TEmit_SOP2(Self)._emit_SOP2;
|
W_SOP2 :TEmit_SOP2(Self)._emit_SOP2;
|
||||||
W_VOP2 :TEmit_VOP2(Self)._emit_VOP2;
|
W_VOP2 :TEmit_VOP2(Self)._emit_VOP2;
|
||||||
else
|
else
|
||||||
|
@ -1749,15 +1748,5 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSprvEmit._emit_DS;
|
|
||||||
begin
|
|
||||||
Assert(false,'DS?'+IntToStr(FSPI.DS.OP));
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TSprvEmit._emit_SOPK;
|
|
||||||
begin
|
|
||||||
Assert(false,'SOPK?'+IntToStr(FSPI.SOPK.OP));
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ type
|
||||||
procedure _emit_S_OR_B64;
|
procedure _emit_S_OR_B64;
|
||||||
procedure _emit_S_NOR_B64;
|
procedure _emit_S_NOR_B64;
|
||||||
procedure _emit_S_CSELECT_B32;
|
procedure _emit_S_CSELECT_B32;
|
||||||
|
procedure _emit_S_CSELECT_B64;
|
||||||
procedure _emit_S_BFE_U32;
|
procedure _emit_S_BFE_U32;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -242,6 +243,24 @@ begin
|
||||||
emit_OpSelect(dst,src[0],src[1],src[2]);
|
emit_OpSelect(dst,src[0],src[1],src[2]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TEmit_SOP2._emit_S_CSELECT_B64; //sdst[2] = SCC ? ssrc0[2] : ssrc1[2]
|
||||||
|
Var
|
||||||
|
dst:array[0..1] of PsrRegSlot;
|
||||||
|
src0,src1:array[0..1] of PsrRegNode;
|
||||||
|
scc:PsrRegNode;
|
||||||
|
begin
|
||||||
|
if not FRegsStory.get_sdst7_pair(FSPI.SOP2.SDST,@dst) then Assert(False);
|
||||||
|
|
||||||
|
if not fetch_ssrc9_pair(@src0,FSPI.SOP2.SSRC0,dtUInt32) then Assert(False);
|
||||||
|
if not fetch_ssrc9_pair(@src1,FSPI.SOP2.SSRC1,dtUInt32) then Assert(False);
|
||||||
|
|
||||||
|
scc:=MakeRead(@FRegsStory.SCC,dtBool);
|
||||||
|
scc^.mark_read;
|
||||||
|
|
||||||
|
emit_OpSelect(dst[0],src0[0],src1[0],scc);
|
||||||
|
emit_OpSelect(dst[1],src0[1],src1[1],scc);
|
||||||
|
end;
|
||||||
|
|
||||||
//offset = ssrc1[4:0].u and 31
|
//offset = ssrc1[4:0].u and 31
|
||||||
//width = ssrc1[22:16].u shr 16
|
//width = ssrc1[22:16].u shr 16
|
||||||
procedure TEmit_SOP2._emit_S_BFE_U32; //sdst.u = bitFieldExtract(ssrc0); SCC = (sdst.u != 0)
|
procedure TEmit_SOP2._emit_S_BFE_U32; //sdst.u = bitFieldExtract(ssrc0); SCC = (sdst.u != 0)
|
||||||
|
@ -330,6 +349,11 @@ begin
|
||||||
_emit_S_CSELECT_B32;
|
_emit_S_CSELECT_B32;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
S_CSELECT_B64:
|
||||||
|
begin
|
||||||
|
_emit_S_CSELECT_B64;
|
||||||
|
end;
|
||||||
|
|
||||||
S_BFE_U32:
|
S_BFE_U32:
|
||||||
begin
|
begin
|
||||||
_emit_S_BFE_U32;
|
_emit_S_BFE_U32;
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
unit emit_SOPK;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
sysutils,
|
||||||
|
ps4_pssl,
|
||||||
|
srTypes,
|
||||||
|
srConst,
|
||||||
|
srReg,
|
||||||
|
SprvEmit,
|
||||||
|
emit_op;
|
||||||
|
|
||||||
|
type
|
||||||
|
TEmit_SOPK=object(TEmitOp)
|
||||||
|
procedure _emit_SOPK;
|
||||||
|
procedure _emit_S_MOVK_I32;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure TEmit_SOPK._emit_S_MOVK_I32;
|
||||||
|
Var
|
||||||
|
dst:PsrRegSlot;
|
||||||
|
src:PsrRegNode;
|
||||||
|
begin
|
||||||
|
dst:=FRegsStory.get_sdst7(FSPI.SOPK.SDST);
|
||||||
|
src:=FetchReg(FConsts.Fetchi(dtInt32,SmallInt(FSPI.SOPK.SIMM)));
|
||||||
|
_MakeCopy(dst,src);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TEmit_SOPK._emit_SOPK;
|
||||||
|
begin
|
||||||
|
|
||||||
|
Case FSPI.SOPK.OP of
|
||||||
|
|
||||||
|
S_MOVK_I32:
|
||||||
|
begin
|
||||||
|
_emit_S_MOVK_I32;
|
||||||
|
end;
|
||||||
|
|
||||||
|
else
|
||||||
|
Assert(false,'SOPK?'+IntToStr(FSPI.SOPK.OP));
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ type
|
||||||
procedure _emit_V_MUL_F32;
|
procedure _emit_V_MUL_F32;
|
||||||
procedure _emit_V_MUL_I32_I24;
|
procedure _emit_V_MUL_I32_I24;
|
||||||
procedure _emit_V_MUL_U32_U24;
|
procedure _emit_V_MUL_U32_U24;
|
||||||
|
procedure _emit_V_MUL_HI_U32;
|
||||||
procedure _emit_V_MAC_F32;
|
procedure _emit_V_MAC_F32;
|
||||||
|
|
||||||
procedure _emit_V_BFE_U32;
|
procedure _emit_V_BFE_U32;
|
||||||
|
@ -388,6 +389,31 @@ begin
|
||||||
emit_OpIMul(dst,src[0],src[1]);
|
emit_OpIMul(dst,src[0],src[1]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TEmit_VOP3._emit_V_MUL_HI_U32;
|
||||||
|
Var
|
||||||
|
dst,tmp:PsrRegSlot;
|
||||||
|
src:array[0..1] of PsrRegNode;
|
||||||
|
tmp_r,dst_r:PsrRegNode;
|
||||||
|
begin
|
||||||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP3a.VDST);
|
||||||
|
tmp:=@FRegsStory.FUnattach;
|
||||||
|
|
||||||
|
Assert(FSPI.VOP3a.OMOD =0,'FSPI.VOP3a.OMOD');
|
||||||
|
Assert(FSPI.VOP3a.ABS =0,'FSPI.VOP3a.ABS');
|
||||||
|
Assert(FSPI.VOP3a.CLAMP=0,'FSPI.VOP3a.CLAMP');
|
||||||
|
Assert(FSPI.VOP3a.NEG =0,'FSPI.VOP3a.NEG');
|
||||||
|
|
||||||
|
src[0]:=fetch_ssrc9(FSPI.VOP3a.SRC0,dtUInt32);
|
||||||
|
src[1]:=fetch_ssrc9(FSPI.VOP3a.SRC1,dtUInt32);
|
||||||
|
|
||||||
|
emit_Op2(Op.OpUMulExtended,dtStruct2u,tmp,src[0],src[1]);
|
||||||
|
|
||||||
|
tmp_r:=MakeRead(tmp,dtStruct2u);
|
||||||
|
dst_r:=dst^.New(line,dtUInt32);
|
||||||
|
|
||||||
|
emit_OpCompExtract(line,dst_r,tmp_r,1);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TEmit_VOP3._emit_V_MAC_F32; //vdst = vsrc0.f * vsrc1.f + vdst.f -> fma
|
procedure TEmit_VOP3._emit_V_MAC_F32; //vdst = vsrc0.f * vsrc1.f + vdst.f -> fma
|
||||||
Var
|
Var
|
||||||
dst:PsrRegSlot;
|
dst:PsrRegSlot;
|
||||||
|
@ -980,6 +1006,11 @@ begin
|
||||||
_emit_V_MUL_LO_I32;
|
_emit_V_MUL_LO_I32;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
V_MUL_HI_U32:
|
||||||
|
begin
|
||||||
|
_emit_V_MUL_HI_U32;
|
||||||
|
end;
|
||||||
|
|
||||||
V_BFE_U32:
|
V_BFE_U32:
|
||||||
begin
|
begin
|
||||||
_emit_V_BFE_U32;
|
_emit_V_BFE_U32;
|
||||||
|
|
Loading…
Reference in New Issue