|
@@ -37,6 +37,7 @@ unit cpupara;
|
|
|
function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override;
|
|
|
function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
|
|
|
function get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;override;
|
|
|
+ procedure get_para_regoff(proccalloption: tproccalloption; paraloc: pcgparalocation; out reg: Byte; out off: LongInt);override;
|
|
|
function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
|
|
|
function ret_in_param(def:tdef;pd:tabstractprocdef):boolean;override;
|
|
|
procedure getintparaloc(list: TAsmList; pd : tabstractprocdef; nr : longint; var cgpara : tcgpara);override;
|
|
@@ -74,6 +75,44 @@ unit cpupara;
|
|
|
result:=VOLATILE_FPUREGISTERS;
|
|
|
end;
|
|
|
|
|
|
+ procedure tarmparamanager.get_para_regoff(proccalloption: tproccalloption; paraloc: pcgparalocation; out reg: Byte; out off: LongInt);
|
|
|
+ var
|
|
|
+ I : SizeInt;
|
|
|
+ begin
|
|
|
+ with paraloc^ do
|
|
|
+ case loc of
|
|
|
+ LOC_REGISTER:
|
|
|
+ begin
|
|
|
+ reg:=getsupreg(register)-RS_R0;
|
|
|
+ off:=0;
|
|
|
+ end;
|
|
|
+ LOC_FPUREGISTER:
|
|
|
+ begin
|
|
|
+ reg:=getsupreg(register)-RS_F0;
|
|
|
+ off:=0;
|
|
|
+ end;
|
|
|
+ LOC_MMREGISTER:
|
|
|
+ begin
|
|
|
+ reg:=getsupreg(register);
|
|
|
+ if reg < RS_S1 then
|
|
|
+ begin
|
|
|
+ reg:=reg-RS_D0;
|
|
|
+ off:=0;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ reg:=reg-RS_S1;
|
|
|
+ off:=4;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ LOC_REFERENCE:
|
|
|
+ begin
|
|
|
+ reg:=255;
|
|
|
+ off:=reference.offset;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+
|
|
|
|
|
|
function tcpuparamanager.get_volatile_registers_mm(calloption: tproccalloption): tcpuregisterset;
|
|
|
begin
|