mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 11:09:42 +02:00
+ implementation of avr rtl helpers
+ avr: fixed writing of constants in assembler * avr: fixed reading of constants in assembler * avr: determine used registers at procedure exit properly * changed project name to ppavr git-svn-id: branches/avr@17032 -
This commit is contained in:
parent
ad9956022c
commit
7b9276ae8a
@ -110,7 +110,7 @@ unit agavrgas;
|
||||
top_reg:
|
||||
getopstr:=gas_regname(o.reg);
|
||||
top_const:
|
||||
getopstr:='#'+tostr(longint(o.val));
|
||||
getopstr:=tostr(longint(o.val));
|
||||
top_ref:
|
||||
if o.ref^.refaddr=addr_full then
|
||||
begin
|
||||
|
@ -1070,12 +1070,12 @@ unit cgcpu;
|
||||
begin
|
||||
LocalSize:=current_procinfo.calc_stackframe_size;
|
||||
a_adjust_sp(list,LocalSize);
|
||||
regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
|
||||
|
||||
for reg:=RS_R0 to RS_R31 do
|
||||
if reg in regs then
|
||||
list.concat(taicpu.op_reg(A_POP,newreg(R_INTREGISTER,reg,R_SUBWHOLE)));
|
||||
|
||||
regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
|
||||
end
|
||||
else
|
||||
{ the framepointer cannot be omitted on avr because sp
|
||||
|
@ -333,13 +333,6 @@ Unit raavrgas;
|
||||
BuildReference(oper);
|
||||
end;
|
||||
|
||||
AS_HASH: { Constant expression }
|
||||
Begin
|
||||
Consume(AS_HASH);
|
||||
BuildConstantOperand(oper);
|
||||
end;
|
||||
|
||||
(*
|
||||
AS_INTNUM,
|
||||
AS_MINUS,
|
||||
AS_PLUS:
|
||||
@ -348,16 +341,18 @@ Unit raavrgas;
|
||||
{ This must absolutely be followed by ( }
|
||||
oper.InitRef;
|
||||
oper.opr.ref.offset:=BuildConstExpression(True,False);
|
||||
if actasmtoken<>AS_LPAREN then
|
||||
|
||||
{ absolute memory addresss? }
|
||||
if actopcode in [A_LDS,A_STS] then
|
||||
BuildReference(oper)
|
||||
else
|
||||
begin
|
||||
ofs:=oper.opr.ref.offset;
|
||||
BuildConstantOperand(oper);
|
||||
inc(oper.opr.val,ofs);
|
||||
end
|
||||
else
|
||||
BuildReference(oper);
|
||||
end;
|
||||
end;
|
||||
*)
|
||||
|
||||
AS_ID: { A constant expression, or a Variable ref. }
|
||||
Begin
|
||||
{ Local Label ? }
|
||||
|
@ -12,7 +12,7 @@
|
||||
</Flags>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<MainUnit Value="0"/>
|
||||
<Title Value="pp"/>
|
||||
<Title Value="ppavr"/>
|
||||
</General>
|
||||
<BuildModes Count="1">
|
||||
<Item1 Name="default" Default="True"/>
|
||||
@ -74,6 +74,9 @@
|
||||
<ConfigFile>
|
||||
<StopAfterErrCount Value="50"/>
|
||||
</ConfigFile>
|
||||
<CompilerMessages>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CustomOptions Value="-davr"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
|
150
rtl/avr/avr.inc
150
rtl/avr/avr.inc
@ -18,10 +18,150 @@
|
||||
{$asmmode gas}
|
||||
|
||||
Procedure SysInitFPU;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||
begin
|
||||
end;
|
||||
begin
|
||||
end;
|
||||
|
||||
|
||||
procedure fpc_cpuinit;
|
||||
begin
|
||||
SysInitFPU;
|
||||
end;
|
||||
begin
|
||||
SysInitFPU;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{$IFNDEF INTERNAL_BACKTRACE}
|
||||
{$define FPC_SYSTEM_HAS_GET_FRAME}
|
||||
function get_frame:pointer;assembler;nostackframe;
|
||||
asm
|
||||
end;
|
||||
{$ENDIF not INTERNAL_BACKTRACE}
|
||||
|
||||
|
||||
{$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
|
||||
function get_caller_addr(framebp:pointer):pointer;assembler;
|
||||
asm
|
||||
end;
|
||||
|
||||
|
||||
{$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
|
||||
function get_caller_frame(framebp:pointer):pointer;assembler;
|
||||
asm
|
||||
end;
|
||||
|
||||
|
||||
{$define FPC_SYSTEM_HAS_SPTR}
|
||||
Function Sptr : pointer;assembler;
|
||||
asm
|
||||
end;
|
||||
|
||||
|
||||
function InterLockedDecrement (var Target: longint) : longint;
|
||||
var
|
||||
sreg : byte;
|
||||
begin
|
||||
{ block interrupts }
|
||||
asm
|
||||
in r0,0x3f
|
||||
st sreg,r0
|
||||
cli
|
||||
end;
|
||||
|
||||
dec(Target);
|
||||
Result:=Target;
|
||||
|
||||
{ release interrupts }
|
||||
asm
|
||||
ld r0,sreg
|
||||
out 0x3f,r0
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function InterLockedIncrement (var Target: longint) : longint;
|
||||
var
|
||||
sreg : byte;
|
||||
begin
|
||||
{ block interrupts }
|
||||
asm
|
||||
in r0,0x3f
|
||||
st sreg,r0
|
||||
cli
|
||||
end;
|
||||
|
||||
inc(Target);
|
||||
Result:=Target;
|
||||
|
||||
{ release interrupts }
|
||||
asm
|
||||
ld r0,sreg
|
||||
out 0x3f,r0
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
||||
var
|
||||
sreg : byte;
|
||||
begin
|
||||
{ block interrupts }
|
||||
asm
|
||||
in r0,0x3f
|
||||
st sreg,r0
|
||||
cli
|
||||
end;
|
||||
|
||||
Result:=Target;
|
||||
Target:=Source;
|
||||
|
||||
{ release interrupts }
|
||||
asm
|
||||
ld r0,sreg
|
||||
out 0x3f,r0
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
|
||||
var
|
||||
sreg : byte;
|
||||
begin
|
||||
{ block interrupts }
|
||||
asm
|
||||
in r0,0x3f
|
||||
st sreg,r0
|
||||
cli
|
||||
end;
|
||||
|
||||
Result:=Target;
|
||||
if Target=Comperand then
|
||||
Target:=NewValue;
|
||||
|
||||
{ release interrupts }
|
||||
asm
|
||||
ld r0,sreg
|
||||
out 0x3f,r0
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
|
||||
var
|
||||
sreg : byte;
|
||||
begin
|
||||
{ block interrupts }
|
||||
asm
|
||||
in r0,0x3f
|
||||
st sreg,r0
|
||||
cli
|
||||
end;
|
||||
|
||||
Result:=Target;
|
||||
inc(Target,Source);
|
||||
|
||||
{ release interrupts }
|
||||
asm
|
||||
ld r0,sreg
|
||||
out 0x3f,r0
|
||||
end;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user