diff options
Diffstat (limited to 'compiler/arm/cpupara.pas')
-rw-r--r-- | compiler/arm/cpupara.pas | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/compiler/arm/cpupara.pas b/compiler/arm/cpupara.pas index 1d43e97119..1b0115ce5e 100644 --- a/compiler/arm/cpupara.pas +++ b/compiler/arm/cpupara.pas @@ -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 tcpuparamanager.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 |