* fixed several arm calling conventions issues

* fixed reference reading in the assembler reader
  * fixed a_loadaddr_ref_reg
This commit is contained in:
florian 2003-12-03 17:39:04 +00:00
parent e418971c77
commit 1a87a5ed45
8 changed files with 250 additions and 167 deletions

View File

@ -1689,6 +1689,14 @@ implementation
reg:=r; reg:=r;
typ:=top_reg; typ:=top_reg;
end; end;
{$ifdef ARM}
{ R15 is the PC on the ARM thus moves to R15 are jumps.
Due to speed considerations we don't use a virtual overridden method here.
Because the pc/r15 isn't handled by the reg. allocator this should never cause
problems with iregs getting r15.
}
is_jmp:=(opcode=A_MOV) and (opidx=0) and (r=NR_R15);
{$endif ARM}
end; end;
@ -1811,55 +1819,86 @@ implementation
var var
wasload: boolean; wasload: boolean;
begin begin
{ oper[1] can also be ref in case of "lis r3,symbol@ha" or so }
if not((oper[1]^.typ=top_ref) and
spilling_decode_loadstore(opcode,op,wasload)) then
Exit;
{ the register that's being stored/loaded } { the register that's being stored/loaded }
supreg:=getsupreg(oper[0]^.reg); supreg:=getsupreg(oper[0]^.reg);
if supregset_in(r,supreg) then if supregset_in(r,supreg) then
begin begin
// Example: if oper[1]^.typ=top_const then
// l?? r20d, 8(r1) ; r20d must be spilled into -60(r1)
//
// Change into:
//
// l?? r21d, 8(r1)
// st? r21d, -60(r1)
//
// And:
//
// st? r20d, 8(r1) ; r20d must be spilled into -60(r1)
//
// Change into:
//
// l?? r21d, -60(r1)
// st? r21d, 8(r1)
pos := get_insert_pos(Tai(previous),supreg,
getsupreg(oper[1]^.ref^.base),
getsupreg(oper[1]^.ref^.index),
unusedregsint);
rgget(list,pos,R_SUBWHOLE,helpreg);
spill_registers := true;
if wasload then
begin begin
helpins:=spilling_create_loadstore(opcode,helpreg,oper[1]^.ref^); // Example:
loadref(1,spilltemplist[supreg]); // mov r20d, 1 ; r20d must be spilled into -60(r1)
opcode := op; //
// Change into:
//
// mov r21d, 1
// st? r21d, -60(r1)
//
pos := get_insert_pos(tai(previous),supreg,
RS_INVALID,
RS_INVALID,
unusedregsint);
rgget(list,pos,R_SUBWHOLE,helpreg);
spill_registers := true;
helpins:=spilling_create_store(helpreg,spilltemplist[supreg]);
if pos=nil then
list.insertafter(helpins,list.first)
else
list.insertafter(helpins,pos.next);
loadreg(0,helpreg);
rgunget(list,helpins,helpreg);
forward_allocation(tai(helpins.next),unusedregsint);
// list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);}
end end
else else if oper[1]^.typ=top_ref then
helpins:=spilling_create_loadstore(op,helpreg,spilltemplist[supreg]); begin
if pos=nil then
list.insertafter(helpins,list.first) // Example:
else // l?? r20d, 8(r1) ; r20d must be spilled into -60(r1)
list.insertafter(helpins,pos.next); //
loadreg(0,helpreg); // Change into:
rgunget(list,helpins,helpreg); //
forward_allocation(tai(helpins.next),unusedregsint); // l?? r21d, 8(r1)
{ list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);} // st? r21d, -60(r1)
//
// And:
//
// st? r20d, 8(r1) ; r20d must be spilled into -60(r1)
//
// Change into:
//
// l?? r21d, -60(r1)
// st? r21d, 8(r1)
pos := get_insert_pos(tai(previous),supreg,
getsupreg(oper[1]^.ref^.base),
getsupreg(oper[1]^.ref^.index),
unusedregsint);
rgget(list,pos,R_SUBWHOLE,helpreg);
spill_registers := true;
if wasload then
begin
helpins:=spilling_create_loadstore(opcode,helpreg,oper[1]^.ref^);
loadref(1,spilltemplist[supreg]);
opcode := op;
end
else
helpins:=spilling_create_loadstore(op,helpreg,spilltemplist[supreg]);
if pos=nil then
list.insertafter(helpins,list.first)
else
list.insertafter(helpins,pos.next);
loadreg(0,helpreg);
rgunget(list,helpins,helpreg);
forward_allocation(tai(helpins.next),unusedregsint);
// list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);}
end;
end; end;
{ oper[1] can also be ref in case of "lis r3,symbol@ha" or so }
if not((oper[1]^.typ=top_ref) and
spilling_decode_loadstore(opcode,op,wasload)) then
Exit;
{ now the registers used in the reference } { now the registers used in the reference }
{ a) base } { a) base }
supreg := getsupreg(oper[1]^.ref^.base); supreg := getsupreg(oper[1]^.ref^.base);
@ -2188,8 +2227,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.56 2003-12-01 18:43:31 peter Revision 1.57 2003-12-03 17:39:04 florian
* s128real type is not compatible with s80real * fixed several arm calling conventions issues
* fixed reference reading in the assembler reader
* fixed a_loadaddr_ref_reg
Revision 1.55 2003/11/12 16:05:39 florian Revision 1.55 2003/11/12 16:05:39 florian
* assembler readers OOPed * assembler readers OOPed

View File

@ -309,6 +309,11 @@ implementation
begin begin
counterpart := A_STR; counterpart := A_STR;
end; end;
A_STR:
begin
wasload:=false;
counterpart := A_LDR;
end;
A_LDM: A_LDM:
internalerror(2003070602); internalerror(2003070602);
else else
@ -369,7 +374,12 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.16 2003-11-30 19:35:29 florian Revision 1.17 2003-12-03 17:39:05 florian
* fixed several arm calling conventions issues
* fixed reference reading in the assembler reader
* fixed a_loadaddr_ref_reg
Revision 1.16 2003/11/30 19:35:29 florian
* fixed several arm related problems * fixed several arm related problems
Revision 1.15 2003/11/29 17:36:56 peter Revision 1.15 2003/11/29 17:36:56 peter

View File

@ -43,6 +43,7 @@ unit cgcpu;
procedure init_register_allocators;override; procedure init_register_allocators;override;
procedure done_register_allocators;override; procedure done_register_allocators;override;
procedure ungetreference(list:Taasmoutput;const r:Treference);override;
function getintregister(list:Taasmoutput;size:Tcgsize):Tregister;override; function getintregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
function getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;override; function getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
function getmmregister(list:Taasmoutput;size:Tcgsize):Tregister;override; function getmmregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
@ -133,6 +134,15 @@ unit cgcpu;
procinfo,cpupi; procinfo,cpupi;
procedure tcgarm.ungetreference(list:Taasmoutput;const r:Treference);
begin
if r.base<>NR_NO then
ungetregister(list,r.base);
if r.index<>NR_NO then
ungetregister(list,r.index);
end;
procedure tcgarm.init_register_allocators; procedure tcgarm.init_register_allocators;
begin begin
rgint:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE, rgint:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,
@ -887,7 +897,7 @@ unit cgcpu;
reference_reset(ref); reference_reset(ref);
ref.index:=NR_STACK_POINTER_REG; ref.index:=NR_STACK_POINTER_REG;
ref.addressmode:=AM_PREINDEXED; ref.addressmode:=AM_PREINDEXED;
list.concat(setoppostfix(taicpu.op_ref_regset(A_STM,ref,rgint.used_in_proc-[RS_R0..RS_R3]+[RS_R11,RS_R12,RS_R15]),PF_FD)); list.concat(setoppostfix(taicpu.op_ref_regset(A_STM,ref,rgint.used_in_proc-[RS_R0..RS_R3]+[RS_R11,RS_R12,RS_R14,RS_R15]),PF_DB));
list.concat(taicpu.op_reg_reg_const(A_SUB,NR_FRAME_POINTER_REG,NR_R12,4)); list.concat(taicpu.op_reg_reg_const(A_SUB,NR_FRAME_POINTER_REG,NR_R12,4));
@ -919,7 +929,7 @@ unit cgcpu;
{ restore int registers and return } { restore int registers and return }
reference_reset(ref); reference_reset(ref);
ref.index:=NR_FRAME_POINTER_REG; ref.index:=NR_FRAME_POINTER_REG;
list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,rgint.used_in_proc-[RS_R0..RS_R3]+[RS_R11,RS_R13,RS_R15]),PF_EA)); list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,rgint.used_in_proc-[RS_R0..RS_R3]+[RS_R11,RS_R13,RS_R15]),PF_DB));
end; end;
end; end;
@ -944,18 +954,34 @@ unit cgcpu;
begin begin
if tmpref.shiftmode<>SM_None then if tmpref.shiftmode<>SM_None then
internalerror(200308294); internalerror(200308294);
if tmpref.signindex<0 then
internalerror(200312023);
tmpref.base:=tmpref.index; tmpref.base:=tmpref.index;
tmpref.index:=NR_NO; tmpref.index:=NR_NO;
end; end;
if assigned(tmpref.symbol) or if assigned(tmpref.symbol) or
not(is_shifter_const(dword(tmpref.offset),b)) or not((is_shifter_const(dword(tmpref.offset),b)) or
((tmpref.base<>NR_NO) and (tmpref.index<>NR_NO)) then (is_shifter_const(dword(-tmpref.offset),b))
) then
fixref(list,tmpref); fixref(list,tmpref);
{ expect a base here }
if tmpref.base=NR_NO then
internalerror(200312022);
if tmpref.index<>NR_NO then if tmpref.index<>NR_NO then
begin begin
{!!!!!!!} if tmpref.shiftmode<>SM_None then
internalerror(200312021);
if tmpref.signindex<0 then
list.concat(taicpu.op_reg_reg_reg(A_SUB,r,tmpref.base,tmpref.index))
else
list.concat(taicpu.op_reg_reg_reg(A_ADD,r,tmpref.base,tmpref.index));
if tmpref.offset>0 then
list.concat(taicpu.op_reg_reg_const(A_ADD,r,r,tmpref.offset))
else if tmpref.offset<0 then
list.concat(taicpu.op_reg_reg_const(A_SUB,r,r,-tmpref.offset));
end end
else else
begin begin
@ -1294,7 +1320,12 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.25 2003-11-30 19:35:29 florian Revision 1.26 2003-12-03 17:39:05 florian
* fixed several arm calling conventions issues
* fixed reference reading in the assembler reader
* fixed a_loadaddr_ref_reg
Revision 1.25 2003/11/30 19:35:29 florian
* fixed several arm related problems * fixed several arm related problems
Revision 1.24 2003/11/24 15:17:37 florian Revision 1.24 2003/11/24 15:17:37 florian

View File

@ -293,11 +293,11 @@ unit cpupara;
end; end;
if side=calleeside then if side=calleeside then
begin begin
{$warning FIXME Calleeside offset needs to be calculated} if paraloc.loc=LOC_REFERENCE then
{!!!!!! begin
if (paraloc.loc = LOC_REFERENCE) then paraloc.reference.index:=NR_FRAME_POINTER_REG;
paraloc.reference.offset := tvarsym(hp.parasym).adjusted_address; inc(paraloc.reference.offset,4);
} end;
end; end;
hp.paraloc[side]:=paraloc; hp.paraloc[side]:=paraloc;
hp:=tparaitem(hp.next); hp:=tparaitem(hp.next);
@ -336,7 +336,12 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.9 2003-11-07 15:58:32 florian Revision 1.10 2003-12-03 17:39:05 florian
* fixed several arm calling conventions issues
* fixed reference reading in the assembler reader
* fixed a_loadaddr_ref_reg
Revision 1.9 2003/11/07 15:58:32 florian
* Florian's culmutative nr. 1; contains: * Florian's culmutative nr. 1; contains:
- invalid calling conventions for a certain cpu are rejected - invalid calling conventions for a certain cpu are rejected
- arm softfloat calling conventions - arm softfloat calling conventions

View File

@ -107,7 +107,15 @@ unit cpupi;
procedure tarmprocinfo.set_first_temp_offset; procedure tarmprocinfo.set_first_temp_offset;
begin begin
tg.setfirsttemp(0); { We allocate enough space to save all registers because we can't determine
the necessary space because the used registers aren't known before
secondpass is run. Even worse, patching
the local offsets after generating the code could cause trouble because
"shifter" constants could change to non-"shifter" constants. This
is especially a problem when taking the address of a local. For now,
this extra memory should hurt less than generating all local contants with offsets
>256 as non shifter constants }
tg.setfirsttemp(-12-28);
end; end;
procedure tarmprocinfo.allocate_push_parasize(size:longint); procedure tarmprocinfo.allocate_push_parasize(size:longint);
@ -120,7 +128,7 @@ unit cpupi;
function tarmprocinfo.calc_stackframe_size:longint; function tarmprocinfo.calc_stackframe_size:longint;
begin begin
{ align to 4 bytes at least } { align to 4 bytes at least }
result:=Align(tg.direction*tg.lasttemp,max(aktalignment.localalignmin,4)); result:=Align(tg.direction*tg.lasttemp+maxpushedparasize,max(aktalignment.localalignmin,4));
end; end;
@ -129,7 +137,12 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.4 2003-11-30 19:35:29 florian Revision 1.5 2003-12-03 17:39:05 florian
* fixed several arm calling conventions issues
* fixed reference reading in the assembler reader
* fixed a_loadaddr_ref_reg
Revision 1.4 2003/11/30 19:35:29 florian
* fixed several arm related problems * fixed several arm related problems
Revision 1.3 2003/11/24 15:17:37 florian Revision 1.3 2003/11/24 15:17:37 florian

View File

@ -150,16 +150,16 @@ Unit raarmgas;
Procedure tarmattreader.BuildReference(oper : tarmoperand); Procedure tarmattreader.BuildReference(oper : tarmoperand);
procedure Consume_RParen; procedure Consume_RBracket;
begin begin
if actasmtoken <> AS_RPAREN then if actasmtoken<>AS_RBRACKET then
Begin Begin
Message(asmr_e_invalid_reference_syntax); Message(asmr_e_invalid_reference_syntax);
RecoverConsume(true); RecoverConsume(true);
end end
else else
begin begin
Consume(AS_RPAREN); Consume(AS_RBRACKET);
if not (actasmtoken in [AS_COMMA,AS_SEPARATOR,AS_END]) then if not (actasmtoken in [AS_COMMA,AS_SEPARATOR,AS_END]) then
Begin Begin
Message(asmr_e_invalid_reference_syntax); Message(asmr_e_invalid_reference_syntax);
@ -168,112 +168,47 @@ Unit raarmgas;
end; end;
end; end;
var
l : longint; procedure read_index;
begin
Consume(AS_COMMA);
if actasmtoken=AS_REGISTER then
Begin
oper.opr.ref.index:=actasmregister;
Consume(AS_REGISTER);
end;
end;
begin begin
Consume(AS_LPAREN); Consume(AS_LBRACKET);
Case actasmtoken of if actasmtoken=AS_REGISTER then
AS_HASH: { Constant expression } begin
Begin oper.opr.ref.base:=actasmregister;
Consume(AS_HASH); Consume(AS_REGISTER);
BuildConstantOperand(oper); { can either be a register or a right parenthesis }
end; { (reg) }
if actasmtoken=AS_RBRACKET then
AS_DOLLAR: { Constant expression } Begin
Begin Consume_RBracket;
Consume(AS_DOLLAR); oper.opr.ref.addressmode:=AM_POSTINDEXED;
BuildConstantOperand(oper); if actasmtoken=AS_COMMA then
end; read_index;
exit;
AS_INTNUM, end;
AS_MINUS, if actasmtoken=AS_COMMA then
AS_PLUS: read_index;
Begin if actasmtoken=AS_NOT then
{ offset(offset) is invalid } begin
If oper.opr.Ref.Offset <> 0 Then consume(AS_NOT);
Begin oper.opr.ref.addressmode:=AM_PREINDEXED;
Message(asmr_e_invalid_reference_syntax); end;
RecoverConsume(true); end {end case }
End
Else
Begin
oper.opr.Ref.Offset:=BuildConstExpression(false,true);
Consume_RParen;
end;
exit;
End;
AS_REGISTER: { (reg ... }
Begin
if ((oper.opr.typ=OPR_REFERENCE) and (oper.opr.ref.base<>NR_NO)) or
((oper.opr.typ=OPR_LOCAL) and (oper.opr.localsym.localloc.loc<>LOC_REGISTER)) then
message(asmr_e_cannot_index_relative_var);
oper.opr.ref.base:=actasmregister;
Consume(AS_REGISTER);
{ can either be a register or a right parenthesis }
{ (reg) }
if actasmtoken=AS_RPAREN then
Begin
Consume_RParen;
exit;
end;
{ (reg,reg .. }
Consume(AS_COMMA);
if actasmtoken=AS_REGISTER then
Begin
oper.opr.ref.index:=actasmregister;
Consume(AS_REGISTER);
Consume_RParen;
end
else
Begin
Message(asmr_e_invalid_reference_syntax);
RecoverConsume(false);
end;
end; {end case }
AS_ID:
Begin
ReadSym(oper);
{ add a constant expression? }
if (actasmtoken=AS_PLUS) then
begin
l:=BuildConstExpression(true,true);
case oper.opr.typ of
OPR_CONSTANT :
inc(oper.opr.val,l);
OPR_LOCAL :
inc(oper.opr.localsymofs,l);
OPR_REFERENCE :
inc(oper.opr.ref.offset,l);
else
internalerror(200309202);
end;
end;
Consume(AS_RPAREN);
End;
AS_COMMA: { (, ... can either be scaling, or index }
Begin
Consume(AS_COMMA);
{ Index }
if (actasmtoken=AS_REGISTER) then
Begin
oper.opr.ref.index:=actasmregister;
Consume(AS_REGISTER);
{ check for scaling ... }
Consume_RParen;
end
else
begin
Message(asmr_e_invalid_reference_syntax);
RecoverConsume(false);
end;
end;
else else
Begin Begin
Message(asmr_e_invalid_reference_syntax); Message(asmr_e_invalid_reference_syntax);
RecoverConsume(false); RecoverConsume(false);
end; end;
end;
end; end;
@ -391,7 +326,7 @@ Unit raarmgas;
Begin Begin
expr:=''; expr:='';
case actasmtoken of case actasmtoken of
AS_LPAREN: { Memory reference or constant expression } AS_LBRACKET: { Memory reference or constant expression }
Begin Begin
oper.InitRef; oper.InitRef;
BuildReference(oper); BuildReference(oper);
@ -675,6 +610,21 @@ Unit raarmgas;
actcondition:=C_None; actcondition:=C_None;
{ first, handle B else BLS is read wrong }
if ((hs[1]='B') and (length(hs)=3)) then
begin
for icond:=low(tasmcond) to high(tasmcond) do
begin
if copy(hs,2,3)=uppercond2str[icond] then
begin
actopcode:=A_B;
actasmtoken:=AS_OPCODE;
actcondition:=icond;
is_asmopcode:=true;
exit;
end;
end;
end;
maxlen:=max(length(hs),5); maxlen:=max(length(hs),5);
for j:=maxlen downto 1 do for j:=maxlen downto 1 do
begin begin
@ -755,6 +705,7 @@ Unit raarmgas;
} }
instr.ConcatInstruction(curlist); instr.ConcatInstruction(curlist);
instr.Free; instr.Free;
actoppostfix:=PF_None;
end; end;
@ -783,7 +734,12 @@ initialization
end. end.
{ {
$Log$ $Log$
Revision 1.3 2003-11-24 15:17:37 florian Revision 1.4 2003-12-03 17:39:05 florian
* fixed several arm calling conventions issues
* fixed reference reading in the assembler reader
* fixed a_loadaddr_ref_reg
Revision 1.3 2003/11/24 15:17:37 florian
* changed some types to prevend range check errors * changed some types to prevend range check errors
Revision 1.2 2003/11/21 16:29:26 florian Revision 1.2 2003/11/21 16:29:26 florian

View File

@ -1061,6 +1061,7 @@ implementation
p:=_asm_statement; p:=_asm_statement;
{$ifndef sparc} {$ifndef sparc}
{$ifndef arm}
if (po_assembler in current_procinfo.procdef.procoptions) then if (po_assembler in current_procinfo.procdef.procoptions) then
begin begin
{ set the framepointer to esp for assembler functions when the { set the framepointer to esp for assembler functions when the
@ -1085,6 +1086,7 @@ implementation
current_procinfo.framepointer:=NR_STACK_POINTER_REG; current_procinfo.framepointer:=NR_STACK_POINTER_REG;
end; end;
end; end;
{$endif arm}
{$endif sparc} {$endif sparc}
{ Flag the result as assigned when it is returned in a { Flag the result as assigned when it is returned in a
@ -1104,7 +1106,12 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.122 2003-11-12 16:05:39 florian Revision 1.123 2003-12-03 17:39:04 florian
* fixed several arm calling conventions issues
* fixed reference reading in the assembler reader
* fixed a_loadaddr_ref_reg
Revision 1.122 2003/11/12 16:05:39 florian
* assembler readers OOPed * assembler readers OOPed
+ typed currency constants + typed currency constants
+ typed 128 bit float constants if the CPU supports it + typed 128 bit float constants if the CPU supports it

View File

@ -47,7 +47,8 @@ unit raatt;
AS_NONE,AS_LABEL,AS_LLABEL,AS_STRING,AS_INTNUM, AS_NONE,AS_LABEL,AS_LLABEL,AS_STRING,AS_INTNUM,
AS_REALNUM,AS_COMMA,AS_LPAREN, AS_REALNUM,AS_COMMA,AS_LPAREN,
AS_RPAREN,AS_COLON,AS_DOT,AS_PLUS,AS_MINUS,AS_STAR, AS_RPAREN,AS_COLON,AS_DOT,AS_PLUS,AS_MINUS,AS_STAR,
AS_SEPARATOR,AS_ID,AS_REGISTER,AS_OPCODE,AS_SLASH,AS_DOLLAR,AS_HASH,AS_LSBRACKET,AS_RSBRACKET, AS_SEPARATOR,AS_ID,AS_REGISTER,AS_OPCODE,AS_SLASH,AS_DOLLAR,
AS_HASH,AS_LSBRACKET,AS_RSBRACKET,AS_LBRACKET,AS_RBRACKET,
{------------------ Assembler directives --------------------} {------------------ Assembler directives --------------------}
AS_DB,AS_DW,AS_DD,AS_DQ,AS_GLOBAL, AS_DB,AS_DW,AS_DD,AS_DQ,AS_GLOBAL,
AS_ALIGN,AS_BALIGN,AS_P2ALIGN,AS_ASCII, AS_ALIGN,AS_BALIGN,AS_P2ALIGN,AS_ASCII,
@ -68,7 +69,8 @@ unit raatt;
'','Label','LLabel','string','integer', '','Label','LLabel','string','integer',
'float',',','(', 'float',',','(',
')',':','.','+','-','*', ')',':','.','+','-','*',
';','identifier','register','opcode','/','$','#','{','}', ';','identifier','register','opcode','/','$',
'#','{','}','[',']',
'.byte','.word','.long','.quad','.globl', '.byte','.word','.long','.quad','.globl',
'.align','.balign','.p2align','.ascii', '.align','.balign','.p2align','.ascii',
'.asciz','.lcomm','.comm','.single','.double','.tfloat', '.asciz','.lcomm','.comm','.single','.double','.tfloat',
@ -574,6 +576,19 @@ unit raatt;
exit; exit;
end; end;
'[' :
begin
actasmtoken:=AS_LBRACKET;
c:=current_scanner.asmgetchar;
exit;
end;
']' :
begin
actasmtoken:=AS_RBRACKET;
c:=current_scanner.asmgetchar;
exit;
end;
{$ifdef arm} {$ifdef arm}
// the arm assembler uses { ... } for register sets // the arm assembler uses { ... } for register sets
'{' : '{' :
@ -1455,7 +1470,12 @@ end.
{ {
$Log$ $Log$
Revision 1.4 2003-11-29 16:27:19 jonas Revision 1.5 2003-12-03 17:39:04 florian
* fixed several arm calling conventions issues
* fixed reference reading in the assembler reader
* fixed a_loadaddr_ref_reg
Revision 1.4 2003/11/29 16:27:19 jonas
* fixed several ppc assembler reader related problems * fixed several ppc assembler reader related problems
* local vars in assembler procedures now start at offset 4 * local vars in assembler procedures now start at offset 4
* fixed second_int_to_bool (apparently an integer can be in LOC_JUMP??) * fixed second_int_to_bool (apparently an integer can be in LOC_JUMP??)