FPPS4/spirv/emit_vop1.pas

242 lines
4.9 KiB
Plaintext
Raw Normal View History

2022-05-31 07:17:14 +00:00
unit emit_VOP1;
{$mode objfpc}{$H+}
interface
uses
sysutils,
ps4_pssl,
spirv,
2022-09-05 13:30:24 +00:00
srType,
srReg,
2022-11-05 14:48:13 +00:00
srConst,
2022-09-05 13:30:24 +00:00
emit_fetch;
2022-05-31 07:17:14 +00:00
type
2022-09-05 13:30:24 +00:00
TEmit_VOP1=class(TEmitFetch)
procedure emit_VOP1;
procedure emit_V_MOV_B32;
procedure emit_V_CVT(OpId:DWORD;dst_type,src_type:TsrDataType);
2022-10-12 14:00:49 +00:00
procedure emit_V_CVT_F16_F32;
procedure emit_V_CVT_F32_F16;
2022-09-05 13:30:24 +00:00
procedure emit_V_CVT_OFF_F32_I4;
procedure emit_V_CVT_F32_UBYTE0;
procedure emit_V_EXT_F32(OpId:DWORD);
2022-11-05 14:48:13 +00:00
procedure emit_V_RSQ_CLAMP_F32;
2022-10-09 23:32:01 +00:00
procedure emit_V_SIN_COS(OpId:DWORD);
2022-09-05 13:30:24 +00:00
procedure emit_V_RCP_F32;
procedure emit_V_FFBL_B32;
2022-05-31 07:17:14 +00:00
end;
implementation
2022-09-05 13:30:24 +00:00
procedure TEmit_VOP1.emit_V_MOV_B32;
2022-05-31 07:17:14 +00:00
Var
dst:PsrRegSlot;
src:PsrRegNode;
begin
2022-09-05 13:30:24 +00:00
dst:=get_vdst8(FSPI.VOP1.VDST);
2022-05-31 07:17:14 +00:00
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtUnknow);
2022-09-05 13:30:24 +00:00
MakeCopy(dst,src);
2022-05-31 07:17:14 +00:00
end;
2022-09-05 13:30:24 +00:00
procedure TEmit_VOP1.emit_V_CVT(OpId:DWORD;dst_type,src_type:TsrDataType);
2022-05-31 07:17:14 +00:00
Var
dst:PsrRegSlot;
src:PsrRegNode;
begin
2022-09-05 13:30:24 +00:00
dst:=get_vdst8(FSPI.VOP1.VDST);
2022-06-30 09:59:08 +00:00
src:=fetch_ssrc9(FSPI.VOP1.SRC0,src_type);
2022-09-05 13:30:24 +00:00
Op1(OpId,dst_type,dst,src);
2022-05-31 07:17:14 +00:00
end;
2022-10-12 14:00:49 +00:00
procedure TEmit_VOP1.emit_V_CVT_F16_F32; //vdst[15:0].hf = ConvertFloatToHalfFloat(vsrc.f)
Var
dst:PsrRegSlot;
src:array[0..1] of PsrRegNode;
dstv:PsrRegNode;
begin
dst:=get_vdst8(FSPI.VOP1.VDST);
src[0]:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
src[0]:=OpFToF(src[0],dtHalf16);
src[1]:=NewReg_s(dtHalf16,0);
dstv:=OpMakeVec(line,dtVec2h,@src);
dst^.New(line,dtVec2h)^.pWriter:=dstv;
end;
procedure TEmit_VOP1.emit_V_CVT_F32_F16; //vdst.f = ConvertHalfFloatToFloat(vsrc[15:0].hf)
Var
dst:PsrRegSlot;
src:PsrRegNode;
dst0:PsrRegNode;
begin
dst:=get_vdst8(FSPI.VOP1.VDST);
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtVec2h{dtUnknow});
//src:=OpBitwiseAndTo(src,$FFFF);
//src^.PrepType(ord(dtHalf16));
dst0:=NewReg(dtHalf16);
OpExtract(line,dst0,src,0);
Op1(Op.OpFConvert,dtFloat32,dst,{src}dst0);
end;
2022-05-31 07:17:14 +00:00
//V_CVT_OFF_F32_I4
//([0..3]-8)/16
2022-09-05 13:30:24 +00:00
procedure TEmit_VOP1.emit_V_CVT_OFF_F32_I4;
2022-05-31 07:17:14 +00:00
Var
2022-09-05 13:30:24 +00:00
dst:PsrRegSlot;
2022-05-31 07:17:14 +00:00
src:PsrRegNode;
num_16:PsrRegNode;
begin
2022-09-05 13:30:24 +00:00
dst:=get_vdst8(FSPI.VOP1.VDST);
2022-05-31 07:17:14 +00:00
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtUInt32);
2022-09-05 13:30:24 +00:00
src:=OpBitwiseAndTo(src,15);
src^.PrepType(ord(dtInt32));
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
src:=OpISubTo(src,8);
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
src:=OpSToF(src,dtFloat32);
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
num_16:=NewReg_s(dtFloat32,16);
Op2(Op.OpFDiv,dtFloat32,dst,src,num_16);
2022-05-31 07:17:14 +00:00
end;
2022-09-05 13:30:24 +00:00
procedure TEmit_VOP1.emit_V_CVT_F32_UBYTE0;
2022-07-01 12:53:39 +00:00
Var
2022-09-05 13:30:24 +00:00
dst:PsrRegSlot;
2022-07-01 12:53:39 +00:00
src:PsrRegNode;
begin
2022-09-05 13:30:24 +00:00
dst:=get_vdst8(FSPI.VOP1.VDST);
2022-07-01 12:53:39 +00:00
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtUInt32);
2022-09-05 13:30:24 +00:00
src:=OpBitwiseAndTo(src,$FF);
src^.PrepType(ord(dtUInt32));
2022-07-01 12:53:39 +00:00
2022-09-05 13:30:24 +00:00
Op1(Op.OpConvertUToF,dtFloat32,dst,src);
2022-07-01 12:53:39 +00:00
end;
2022-09-05 13:30:24 +00:00
procedure TEmit_VOP1.emit_V_EXT_F32(OpId:DWORD);
2022-05-31 07:17:14 +00:00
Var
dst:PsrRegSlot;
src:PsrRegNode;
begin
2022-09-05 13:30:24 +00:00
dst:=get_vdst8(FSPI.VOP1.VDST);
2022-05-31 07:17:14 +00:00
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
2022-09-05 13:30:24 +00:00
OpGlsl1(OpId,dtFloat32,dst,src);
2022-05-31 07:17:14 +00:00
end;
2022-11-05 14:48:13 +00:00
procedure TEmit_VOP1.emit_V_RSQ_CLAMP_F32;
Var
dst:PsrRegSlot;
src:PsrRegNode;
flt:PsrRegNode;
begin
dst:=get_vdst8(FSPI.VOP1.VDST);
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
OpGlsl1(GlslOp.InverseSqrt,dtFloat32,dst,src);
src:=MakeRead(dst,dtFloat32);
flt:=NewReg_s(dtFloat32,FLT_MAX);
OpGlsl2(GlslOp.NMin,dtFloat32,dst,src,flt);
end;
2022-10-09 23:32:01 +00:00
procedure TEmit_VOP1.emit_V_SIN_COS(OpId:DWORD);
const
PI2:Single=2*PI;
Var
dst:PsrRegSlot;
src:PsrRegNode;
begin
dst:=get_vdst8(FSPI.VOP1.VDST);
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
src:=OpFMulToS(src,PI2);
OpGlsl1(OpId,dtFloat32,dst,src);
end;
2022-09-05 13:30:24 +00:00
procedure TEmit_VOP1.emit_V_RCP_F32;
2022-05-31 07:17:14 +00:00
Var
dst:PsrRegSlot;
src:PsrRegNode;
one:PsrRegNode;
begin
2022-09-05 13:30:24 +00:00
dst:=get_vdst8(FSPI.VOP1.VDST);
2022-05-31 07:17:14 +00:00
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtFloat32);
2022-09-05 13:30:24 +00:00
one:=NewReg_s(dtFloat32,1);
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
Op2(Op.OpFDiv,dtFloat32,dst,one,src);
2022-05-31 07:17:14 +00:00
end;
2022-09-05 13:30:24 +00:00
procedure TEmit_VOP1.emit_V_FFBL_B32;
2022-07-01 12:53:39 +00:00
Var
dst:PsrRegSlot;
src:PsrRegNode;
begin
2022-09-05 13:30:24 +00:00
dst:=get_vdst8(FSPI.VOP1.VDST);
2022-07-01 12:53:39 +00:00
src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtInt32);
2022-09-05 13:30:24 +00:00
OpGlsl1(GlslOp.FindILsb,dtInt32,dst,src);
2022-07-01 12:53:39 +00:00
end;
2022-09-05 13:30:24 +00:00
procedure TEmit_VOP1.emit_VOP1;
2022-05-31 07:17:14 +00:00
begin
Case FSPI.VOP1.OP of
2022-06-30 09:59:08 +00:00
V_NOP:;
2022-09-05 13:30:24 +00:00
V_MOV_B32: emit_V_MOV_B32;
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
V_CVT_F32_I32: emit_V_CVT(Op.OpConvertSToF,dtFloat32,dtInt32);
V_CVT_F32_U32: emit_V_CVT(Op.OpConvertUToF,dtFloat32,dtUInt32);
V_CVT_U32_F32: emit_V_CVT(Op.OpConvertFToU,dtUInt32 ,dtFloat32);
V_CVT_I32_F32: emit_V_CVT(Op.OpConvertFToS,dtInt32 ,dtFloat32);
2022-05-31 07:17:14 +00:00
2022-10-12 14:00:49 +00:00
V_CVT_F16_F32: emit_V_CVT_F16_F32;
V_CVT_F32_F16: emit_V_CVT_F32_F16;
2022-09-05 13:30:24 +00:00
V_CVT_OFF_F32_I4: emit_V_CVT_OFF_F32_I4;
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
V_CVT_F32_UBYTE0: emit_V_CVT_F32_UBYTE0;
2022-07-01 12:53:39 +00:00
2022-09-05 13:30:24 +00:00
V_FRACT_F32: emit_V_EXT_F32(GlslOp.Fract);
V_TRUNC_F32: emit_V_EXT_F32(GlslOp.Trunc);
V_CEIL_F32 : emit_V_EXT_F32(GlslOp.Ceil);
2022-05-31 07:17:14 +00:00
2022-10-12 14:00:49 +00:00
V_RNDNE_F32: emit_V_EXT_F32(GlslOp.RoundEven);
2022-09-05 13:30:24 +00:00
V_FLOOR_F32: emit_V_EXT_F32(GlslOp.Floor);
V_EXP_F32 : emit_V_EXT_F32(GlslOp.Exp2);
V_LOG_F32 : emit_V_EXT_F32(GlslOp.Log2);
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
V_RSQ_F32 : emit_V_EXT_F32(GlslOp.InverseSqrt);
2022-11-05 14:48:13 +00:00
V_RSQ_CLAMP_F32: emit_V_RSQ_CLAMP_F32;
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
V_SQRT_F32 : emit_V_EXT_F32(GlslOp.Sqrt);
2022-05-31 07:17:14 +00:00
2022-10-09 23:32:01 +00:00
V_SIN_F32 : emit_V_SIN_COS(GlslOp.Sin);
V_COS_F32 : emit_V_SIN_COS(GlslOp.Cos);
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
V_RCP_F32 : emit_V_RCP_F32;
2022-05-31 07:17:14 +00:00
2022-09-05 13:30:24 +00:00
V_FFBL_B32 : emit_V_FFBL_B32;
2022-07-01 12:53:39 +00:00
2022-05-31 07:17:14 +00:00
else
Assert(false,'VOP1?'+IntToStr(FSPI.VOP1.OP));
end;
end;
end.