fpPS4/spirv/srCFGLabel.pas

111 lines
1.9 KiB
ObjectPascal
Raw Normal View History

2022-09-05 13:30:24 +00:00
unit srCFGLabel;
2022-05-31 07:17:14 +00:00
{$mode ObjFPC}{$H+}
interface
uses
ps4_pssl,
2022-09-05 13:30:24 +00:00
ginodes;
2022-05-31 07:17:14 +00:00
type
TSrcAdr=object
pBody:PDWORD;
Offdw:ptrint;
function get_pc:PDWORD;
end;
TsrLCursor=object(TShaderParser)
private
function get_src_adr:TSrcAdr;
Procedure set_src_adr(src:TSrcAdr);
public
procedure Init(base:Pointer);
property Adr:TSrcAdr read get_src_adr write set_src_adr;
end;
TsrLabelType=(ltBranch,ltUnknow,ltBegAdr,ltEndAdr,ltBegCond,ltEndCond,ltBegLoop,ltEndLoop);
TsrSetLabelType=Set of TsrLabelType;
2022-07-15 10:12:45 +00:00
TsrBlockType=(btMain,btAdr,btAdrBranch,btSetpc,btCond,btLoop,btOther);
2022-05-31 07:17:14 +00:00
PsrLabel=^TsrLabel;
TsrLabel=object
pLeft,pRight:PsrLabel;
//----
Adr:TSrcAdr;
lType:TsrSetLabelType;
function c(n1,n2:PsrLabel):Integer; static;
Procedure AddType(t:TsrLabelType);
Procedure RemType(t:TsrLabelType);
function IsType(t:TsrLabelType):Boolean;
end;
TsrLabels=object
type
TNodeFetch=specialize TNodeFetch<PsrLabel,TsrLabel>;
var
FNTree:TNodeFetch;
end;
function get_branch_offset(var FSPI:TSPI):ptrint;
implementation
function TSrcAdr.get_pc:PDWORD;
begin
Result:=pBody+Offdw;
end;
procedure TsrLCursor.Init(base:Pointer);
begin
Body :=base;
OFFSET_DW:=0;
end;
function TsrLCursor.get_src_adr:TSrcAdr;
begin
Result:=Default(TSrcAdr);
Result.pBody:=Body;
Result.Offdw:=OFFSET_DW;
end;
Procedure TsrLCursor.set_src_adr(src:TSrcAdr);
begin
Body :=src.pBody;
OFFSET_DW:=src.Offdw;
end;
function TsrLabel.c(n1,n2:PsrLabel):Integer;
var
p1,p2:Pointer;
begin
p1:=n1^.Adr.get_pc;
p2:=n2^.Adr.get_pc;
Result:=Integer(p1>p2)-Integer(p1<p2);
end;
Procedure TsrLabel.AddType(t:TsrLabelType);
begin
lType:=lType+[t];
end;
Procedure TsrLabel.RemType(t:TsrLabelType);
begin
lType:=lType-[t];
end;
function TsrLabel.IsType(t:TsrLabelType):Boolean;
begin
Result:=t in lType;
end;
function get_branch_offset(var FSPI:TSPI):ptrint;
begin
Result:=FSPI.OFFSET_DW+Smallint(FSPI.SOPP.SIMM)+1;
end;
end.