FPPS4/spirv/emit_vop1.pas

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.