mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-28 19:02:05 +02:00
Replace forbidden chars in more places in the GAS assembler writer.
Add support for .set and .weak on AVR. Fix 64 bit negation on AVR. Add cpu_capabilities to cpuinfo.pas and fixed some peephole optimizations. Pass >4 byte parameters by reference. git-svn-id: trunk@26943 -
This commit is contained in:
parent
5e8f8f4755
commit
2227045e23
@ -1352,11 +1352,17 @@ implementation
|
||||
{$endif arm}
|
||||
ait_set:
|
||||
begin
|
||||
AsmWriteLn(#9'.set '+tai_set(hp).sym^+', '+tai_set(hp).value^);
|
||||
if replaceforbidden then
|
||||
AsmWriteLn(#9'.set '+ReplaceForbiddenAsmSymbolChars(tai_set(hp).sym^)+', '+ReplaceForbiddenAsmSymbolChars(tai_set(hp).value^))
|
||||
else
|
||||
AsmWriteLn(#9'.set '+tai_set(hp).sym^+', '+tai_set(hp).value^);
|
||||
end;
|
||||
ait_weak:
|
||||
begin
|
||||
AsmWriteLn(#9'.weak '+tai_weak(hp).sym^);
|
||||
if replaceforbidden then
|
||||
AsmWriteLn(#9'.weak '+ReplaceForbiddenAsmSymbolChars(tai_weak(hp).sym^))
|
||||
else
|
||||
AsmWriteLn(#9'.weak '+tai_weak(hp).sym^);
|
||||
end;
|
||||
ait_symbol_end :
|
||||
begin
|
||||
|
@ -420,6 +420,8 @@ implementation
|
||||
end;
|
||||
ait_align:
|
||||
inc(CurrOffset,tai_align(curtai).aligntype);
|
||||
ait_weak,
|
||||
ait_set,
|
||||
ait_marker:
|
||||
;
|
||||
ait_label:
|
||||
|
@ -42,6 +42,7 @@ Type
|
||||
Implementation
|
||||
|
||||
uses
|
||||
cpuinfo,
|
||||
aasmbase,aasmcpu,
|
||||
globals,globtype;
|
||||
|
||||
@ -275,7 +276,8 @@ Implementation
|
||||
to
|
||||
movw reg2,reg0
|
||||
}
|
||||
else if (taicpu(p).ops=2) and
|
||||
else if (CPUAVR_HAS_MOVW in cpu_capabilities[current_settings.cputype]) and
|
||||
(taicpu(p).ops=2) and
|
||||
(taicpu(p).oper[0]^.typ = top_reg) and
|
||||
(taicpu(p).oper[1]^.typ = top_reg) and
|
||||
getnextinstruction(p,hp1) and
|
||||
|
@ -226,7 +226,7 @@ unit cgcpu;
|
||||
end;
|
||||
|
||||
var
|
||||
i : longint;
|
||||
i, i2 : longint;
|
||||
hp : PCGParaLocation;
|
||||
|
||||
begin
|
||||
@ -277,15 +277,29 @@ unit cgcpu;
|
||||
|
||||
hp:=cgpara.location;
|
||||
|
||||
for i:=1 to tcgsize2size[cgpara.Size] do
|
||||
i:=0;
|
||||
while i<tcgsize2size[cgpara.Size] do
|
||||
begin
|
||||
if not(assigned(hp)) or
|
||||
(tcgsize2size[hp^.size]<>1) or
|
||||
(hp^.shiftval<>0) then
|
||||
if not(assigned(hp)) then
|
||||
internalerror(2014011102);
|
||||
load_para_loc(r,hp);
|
||||
hp:=hp^.Next;
|
||||
r:=GetNextReg(r);
|
||||
|
||||
inc(i, tcgsize2size[hp^.Size]);
|
||||
|
||||
if hp^.Loc=LOC_REGISTER then
|
||||
begin
|
||||
load_para_loc(r,hp);
|
||||
hp:=hp^.Next;
|
||||
r:=GetNextReg(r);
|
||||
end
|
||||
else
|
||||
begin
|
||||
load_para_loc(r,hp);
|
||||
|
||||
for i2:=1 to tcgsize2size[hp^.Size] do
|
||||
r:=GetNextReg(r);
|
||||
|
||||
hp:=hp^.Next;
|
||||
end;
|
||||
end;
|
||||
if assigned(hp) then
|
||||
internalerror(2014011103);
|
||||
@ -485,7 +499,15 @@ unit cgcpu;
|
||||
OP_NEG:
|
||||
begin
|
||||
if src<>dst then
|
||||
a_load_reg_reg(list,size,size,src,dst);
|
||||
begin
|
||||
if size in [OS_S64,OS_64] then
|
||||
begin
|
||||
a_load_reg_reg(list,OS_32,OS_32,src,dst);
|
||||
a_load_reg_reg(list,OS_32,OS_32,srchi,dsthi);
|
||||
end
|
||||
else
|
||||
a_load_reg_reg(list,size,size,src,dst);
|
||||
end;
|
||||
|
||||
if size in [OS_S16,OS_16,OS_S32,OS_32,OS_S64,OS_64] then
|
||||
begin
|
||||
@ -499,7 +521,7 @@ unit cgcpu;
|
||||
tmpreg:=GetNextReg(dst);
|
||||
for i:=2 to tcgsize2size[size] do
|
||||
begin
|
||||
list.concat(taicpu.op_reg_const(A_SBCI,dst,-1));
|
||||
list.concat(taicpu.op_reg_const(A_SBCI,tmpreg,-1));
|
||||
NextTmp;
|
||||
end;
|
||||
end;
|
||||
@ -1869,7 +1891,7 @@ unit cgcpu;
|
||||
|
||||
procedure tcgavr.g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);
|
||||
begin
|
||||
internalerror(2011021324);
|
||||
//internalerror(2011021324);
|
||||
end;
|
||||
|
||||
|
||||
|
@ -194,16 +194,16 @@ Const
|
||||
const
|
||||
cpu_capabilities : array[tcputype] of set of tcpuflags =
|
||||
( { cpu_none } [],
|
||||
{ cpu_avr1 } [],
|
||||
{ cpu_avr2 } [],
|
||||
{ cpu_avr25 } [],
|
||||
{ cpu_avr3 } [],
|
||||
{ cpu_avr31 } [],
|
||||
{ cpu_avr35 } [],
|
||||
{ cpu_avr4 } [],
|
||||
{ cpu_avr5 } [],
|
||||
{ cpu_avr51 } [],
|
||||
{ cpu_avr6 } []
|
||||
{ cpu_avr1 } [CPUAVR_2_BYTE_PC],
|
||||
{ cpu_avr2 } [CPUAVR_2_BYTE_PC],
|
||||
{ cpu_avr25 } [CPUAVR_HAS_MOVW,CPUAVR_HAS_LPMX,CPUAVR_2_BYTE_PC],
|
||||
{ cpu_avr3 } [CPUAVR_HAS_JMP_CALL,CPUAVR_2_BYTE_PC],
|
||||
{ cpu_avr31 } [CPUAVR_HAS_JMP_CALL,CPUAVR_HAS_RAMPZ,CPUAVR_HAS_ELPM,CPUAVR_2_BYTE_PC],
|
||||
{ cpu_avr35 } [CPUAVR_HAS_JMP_CALL,CPUAVR_HAS_MOVW,CPUAVR_HAS_LPMX,CPUAVR_2_BYTE_PC],
|
||||
{ cpu_avr4 } [CPUAVR_HAS_MOVW,CPUAVR_HAS_LPMX,CPUAVR_HAS_MUL,CPUAVR_2_BYTE_PC],
|
||||
{ cpu_avr5 } [CPUAVR_HAS_JMP_CALL,CPUAVR_HAS_MOVW,CPUAVR_HAS_LPMX,CPUAVR_HAS_MUL,CPUAVR_2_BYTE_PC],
|
||||
{ cpu_avr51 } [CPUAVR_HAS_JMP_CALL,CPUAVR_HAS_MOVW,CPUAVR_HAS_LPMX,CPUAVR_HAS_MUL,CPUAVR_HAS_RAMPZ,CPUAVR_HAS_ELPM,CPUAVR_HAS_ELPMX,CPUAVR_2_BYTE_PC],
|
||||
{ cpu_avr6 } [CPUAVR_HAS_JMP_CALL,CPUAVR_HAS_MOVW,CPUAVR_HAS_LPMX,CPUAVR_HAS_MUL,CPUAVR_HAS_RAMPZ,CPUAVR_HAS_ELPM,CPUAVR_HAS_ELPMX,CPUAVR_3_BYTE_PC]
|
||||
);
|
||||
|
||||
Implementation
|
||||
|
@ -141,6 +141,8 @@ unit cpupara;
|
||||
result:=not is_smallset(def);
|
||||
stringdef :
|
||||
result:=tstringdef(def).stringtype in [st_shortstring,st_longstring];
|
||||
else
|
||||
result:=def.size>4;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -994,7 +994,7 @@ implementation
|
||||
LOC_REGISTER:
|
||||
begin
|
||||
case para.locations_count of
|
||||
{$ifdef cpu16bitalu}
|
||||
{$if defined(cpu16bitalu) or defined(cpu8bitalu)}
|
||||
{ 4 paralocs? }
|
||||
4:
|
||||
if (target_info.endian=ENDIAN_BIG) then
|
||||
@ -1026,7 +1026,7 @@ implementation
|
||||
unget_para(paraloc^.next^.next^.next^);
|
||||
cg.a_load_cgparaloc_anyreg(list,OS_16,paraloc^.next^.next^.next^,GetNextReg(destloc.register64.reghi),2);
|
||||
end;
|
||||
{$endif cpu16bitalu}
|
||||
{$endif defined(cpu16bitalu) or defined(cpu8bitalu)}
|
||||
2:
|
||||
if (target_info.endian=ENDIAN_BIG) then
|
||||
begin
|
||||
|
Loading…
Reference in New Issue
Block a user