+ 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:
florian 2011-02-26 21:04:56 +00:00
parent ad9956022c
commit 7b9276ae8a
5 changed files with 158 additions and 20 deletions

View File

@ -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

View File

@ -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

View File

@ -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 ? }

View File

@ -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>

View File

@ -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;