mirror of https://github.com/red-prig/fpPS4.git
274 lines
4.8 KiB
Plaintext
274 lines
4.8 KiB
Plaintext
![]() |
unit emit_VOP1;
|
||
|
|
||
|
{$mode objfpc}{$H+}
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
sysutils,
|
||
|
ps4_pssl,
|
||
|
srTypes,
|
||
|
srReg,
|
||
|
spirv,
|
||
|
SprvEmit,
|
||
|
emit_op;
|
||
|
|
||
|
type
|
||
|
TEmit_VOP1=object(TEmitOp)
|
||
|
procedure _emit_VOP1;
|
||
|
procedure _emit_V_MOV_B32;
|
||
|
procedure _emit_V_CVT_F32_I32;
|
||
|
procedure _emit_V_CVT_U32_F32;
|
||
|
procedure _emit_V_CVT_I32_F32;
|
||
|
procedure _emit_V_CVT_F32_U32;
|
||
|
procedure _emit_V_CVT_OFF_F32_I4;
|
||
|
procedure _emit_V_SQRT_F32;
|
||
|
procedure _emit_V_RSQ_F32;
|
||
|
procedure _emit_V_FLOOR_F32;
|
||
|
procedure _emit_V_FRACT_F32;
|
||
|
procedure _emit_V_EXP_F32;
|
||
|
procedure _emit_V_RCP_F32;
|
||
|
procedure _emit_V_SIN_F32;
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_MOV_B32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtUnknow);
|
||
|
_MakeCopy(dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_CVT_F32_I32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtInt32);
|
||
|
emit_Op1(Op.OpConvertSToF,dtFloat32,dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_CVT_I32_F32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
|
||
|
emit_Op1(Op.OpConvertFToS,dtInt32,dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_CVT_U32_F32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
|
||
|
emit_Op1(Op.OpConvertFToU,dtUInt32,dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_CVT_F32_U32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtUInt32);
|
||
|
emit_Op1(Op.OpConvertUToF,dtFloat32,dst,src);
|
||
|
end;
|
||
|
|
||
|
//V_CVT_OFF_F32_I4
|
||
|
//([0..3]-8)/16
|
||
|
procedure TEmit_VOP1._emit_V_CVT_OFF_F32_I4;
|
||
|
Var
|
||
|
dst,tmp:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
num_8:PsrRegNode;
|
||
|
num_15:PsrRegNode;
|
||
|
num_16:PsrRegNode;
|
||
|
subi,subf:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtUInt32);
|
||
|
|
||
|
tmp:=@FRegsStory.FUnattach;
|
||
|
num_15:=FetchReg(FConsts.Fetch(dtUInt32,15));
|
||
|
|
||
|
emit_OpBitwiseAnd(tmp,src,num_15);
|
||
|
src:=MakeRead(tmp,dtUInt32);
|
||
|
|
||
|
num_8:=FetchReg(FConsts.Fetch(dtInt32,8));
|
||
|
subi:=dst^.New(line,dtInt32);
|
||
|
|
||
|
_emit_OpISub(line,subi,src,num_8);
|
||
|
|
||
|
subi^.mark_read;
|
||
|
subf:=dst^.New(line,dtFloat32);
|
||
|
|
||
|
_emit_Op1(line,Op.OpConvertSToF,subf,subi);
|
||
|
|
||
|
subf^.mark_read;
|
||
|
num_16:=FetchReg(FConsts.Fetchf(dtFloat32,16));
|
||
|
|
||
|
emit_OpFDiv(dst,subf,num_16);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_SQRT_F32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
|
||
|
emit_OpSqrt(dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_RSQ_F32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
|
||
|
emit_OpInverseSqrt(dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_FLOOR_F32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
|
||
|
emit_OpFloor(dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_FRACT_F32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
|
||
|
emit_OpFract(dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_EXP_F32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
|
||
|
emit_OpExp2(dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_RCP_F32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
one:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
|
||
|
|
||
|
one:=FetchReg(FConsts.Fetchf(dtFloat32,1));
|
||
|
|
||
|
emit_OpFDiv(dst,one,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_V_SIN_F32;
|
||
|
Var
|
||
|
dst:PsrRegSlot;
|
||
|
src:PsrRegNode;
|
||
|
begin
|
||
|
dst:=FRegsStory.get_vdst8(FSPI.VOP1.VDST);
|
||
|
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
|
||
|
emit_OpSin(dst,src);
|
||
|
end;
|
||
|
|
||
|
procedure TEmit_VOP1._emit_VOP1;
|
||
|
begin
|
||
|
|
||
|
Case FSPI.VOP1.OP of
|
||
|
|
||
|
V_MOV_B32:
|
||
|
begin
|
||
|
_emit_V_MOV_B32;
|
||
|
end;
|
||
|
|
||
|
V_CVT_F32_I32:
|
||
|
begin
|
||
|
_emit_V_CVT_F32_I32;
|
||
|
end;
|
||
|
|
||
|
V_CVT_I32_F32:
|
||
|
begin
|
||
|
_emit_V_CVT_I32_F32;
|
||
|
end;
|
||
|
|
||
|
V_CVT_U32_F32:
|
||
|
begin
|
||
|
_emit_V_CVT_U32_F32;
|
||
|
end;
|
||
|
|
||
|
V_CVT_F32_U32:
|
||
|
begin
|
||
|
_emit_V_CVT_F32_U32;
|
||
|
end;
|
||
|
|
||
|
V_CVT_OFF_F32_I4:
|
||
|
begin
|
||
|
_emit_V_CVT_OFF_F32_I4;
|
||
|
end;
|
||
|
|
||
|
V_SQRT_F32:
|
||
|
begin
|
||
|
_emit_V_SQRT_F32;
|
||
|
end;
|
||
|
|
||
|
V_RSQ_F32:
|
||
|
begin
|
||
|
_emit_V_RSQ_F32;
|
||
|
end;
|
||
|
|
||
|
V_FLOOR_F32:
|
||
|
begin
|
||
|
_emit_V_FLOOR_F32;
|
||
|
end;
|
||
|
|
||
|
V_FRACT_F32:
|
||
|
begin
|
||
|
_emit_V_FRACT_F32;
|
||
|
end;
|
||
|
|
||
|
V_EXP_F32:
|
||
|
begin
|
||
|
_emit_V_EXP_F32;
|
||
|
end;
|
||
|
|
||
|
V_RCP_F32:
|
||
|
begin
|
||
|
_emit_V_RCP_F32;
|
||
|
end;
|
||
|
|
||
|
V_SIN_F32:
|
||
|
begin
|
||
|
_emit_V_SIN_F32;
|
||
|
end;
|
||
|
|
||
|
else
|
||
|
Assert(false,'VOP1?'+IntToStr(FSPI.VOP1.OP));
|
||
|
end;
|
||
|
|
||
|
end;
|
||
|
|
||
|
end.
|
||
|
|