unit emit_VOP1; {$mode objfpc}{$H+} interface uses sysutils, ps4_pssl, spirv, srNode, srType, srTypes, srReg, srConst, emit_fetch; type TEmit_VOP1=class(TEmitFetch) procedure emit_VOP1; procedure emit_V_MOV_B32; procedure emit_V_READFIRSTLANE_B32; procedure emit_V_MOVRELS_B32; procedure emit_V_MOVRELD_B32; procedure emit_V_CVT(OpId:DWORD;dst_type,src_type:TsrDataType); procedure emit_V_CVT_F16_F32; procedure emit_V_CVT_F32_F16; procedure emit_V_CVT_OFF_F32_I4; procedure emit_V_CVT_FLR_I32_F32; procedure emit_V_CVT_RPI_I32_F32; procedure emit_V_CVT_F32_UBYTE0; procedure emit_V_CVT_F32_UBYTE1; procedure emit_V_CVT_F32_UBYTE2; procedure emit_V_CVT_F32_UBYTE3; procedure emit_V_EXT_F32(OpId:DWORD); procedure emit_V_RSQ_CLAMP_F32; procedure emit_V_SIN_COS(OpId:DWORD); procedure emit_V_NOT_B32; procedure emit_V_RCP_F32; procedure emit_V_FFBH_U32; procedure emit_V_FFBL_B32; procedure emit_V_BFREV_B32; end; implementation uses srPrivate; procedure TEmit_VOP1.emit_V_MOV_B32; Var dst:PsrRegSlot; src:TsrRegNode; begin dst:=get_vdst8(FSPI.VOP1.VDST); src:=fetch_ssrc9(FSPI.VOP1.SRC0,dtUnknow); MakeCopy(dst,src); end; procedure TEmit_VOP1.emit_V_READFIRSTLANE_B32; //sdst, vsrc Var dst:PsrRegSlot; src:PsrRegSlot; reg:TsrRegNode; begin //TODO: V_READFIRSTLANE_B32 // dst:=get_sdst8(FSPI.VOP1.VDST); //NOTE: SDST src:=get_ssrc9(FSPI.VOP1.SRC0); if (src^.Category=cVectorArray) then begin Assert(false,'TODO: arrayed V_READFIRSTLANE_B32'); end; reg:=MakeRead(src,dtUnknow); MakeCopy(dst,reg); 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); //vgpr_index_of(vsrc) + M0.u MakeCopy(dst,src); end else begin vmin:=FSPI.VOP1.SRC0-256; vmax:=FVGPRS; Assert(vmin