mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 13:09:32 +02:00
* MIPS: cleanup assembler reader, MIPS references allow only a single register in parentheses.
git-svn-id: trunk@25768 -
This commit is contained in:
parent
e10e383b8e
commit
142d20ca30
@ -32,7 +32,6 @@ Interface
|
||||
type
|
||||
tMipsReader = class(tattreader)
|
||||
function is_asmopcode(const s: string):boolean;override;
|
||||
procedure BuildReference(oper : TOperand);
|
||||
procedure BuildOperand(oper : TOperand);
|
||||
procedure BuildOpCode(instr : TInstruction);
|
||||
procedure ReadSym(oper : TOperand);
|
||||
@ -126,76 +125,6 @@ Interface
|
||||
end;
|
||||
|
||||
|
||||
Procedure TMipsReader.BuildReference(oper : TOperand);
|
||||
var
|
||||
l : aint;
|
||||
regs : byte;
|
||||
hasimm : boolean;
|
||||
begin
|
||||
oper.initref;
|
||||
regs:=0;
|
||||
hasimm:=false;
|
||||
Consume(ActAsmToken);
|
||||
repeat
|
||||
Case actasmtoken of
|
||||
AS_INTNUM,
|
||||
AS_MINUS,
|
||||
AS_PLUS:
|
||||
Begin
|
||||
if hasimm or (regs>1) then
|
||||
Begin
|
||||
Message(asmr_e_invalid_reference_syntax);
|
||||
RecoverConsume(true);
|
||||
break;
|
||||
End;
|
||||
oper.opr.Ref.Offset:=BuildConstExpression(false,true);
|
||||
hasimm:=true;
|
||||
End;
|
||||
|
||||
AS_REGISTER:
|
||||
Begin
|
||||
if regs<2 then
|
||||
begin
|
||||
if regs=0 then
|
||||
oper.opr.ref.base:=actasmregister
|
||||
else
|
||||
oper.opr.ref.index:=actasmregister;
|
||||
inc(regs);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Message(asmr_e_invalid_reference_syntax);
|
||||
RecoverConsume(true);
|
||||
break;
|
||||
end;
|
||||
Consume(AS_REGISTER);
|
||||
end;
|
||||
|
||||
AS_ID:
|
||||
Begin
|
||||
l:=BuildConstExpression(true,true);
|
||||
inc(oper.opr.ref.offset,l);
|
||||
End;
|
||||
|
||||
AS_RPAREN:
|
||||
begin
|
||||
if (regs=0) and (not hasimm) then
|
||||
Message(asmr_e_invalid_reference_syntax);
|
||||
Consume(AS_RPAREN);
|
||||
break;
|
||||
end;
|
||||
|
||||
else
|
||||
Begin
|
||||
Message(asmr_e_invalid_reference_syntax);
|
||||
RecoverConsume(false);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
until false;
|
||||
end;
|
||||
|
||||
|
||||
procedure TMipsReader.handlepercent;
|
||||
var
|
||||
len : longint;
|
||||
@ -346,8 +275,12 @@ Interface
|
||||
|
||||
AS_LPAREN :
|
||||
begin
|
||||
{ memory reference }
|
||||
BuildReference(oper);
|
||||
consume(AS_LPAREN);
|
||||
oper.InitRef;
|
||||
if actasmtoken=AS_REGISTER then
|
||||
oper.opr.ref.base:=actasmregister;
|
||||
consume(AS_REGISTER);
|
||||
consume(AS_RPAREN);
|
||||
gotplus:=false;
|
||||
end;
|
||||
|
||||
@ -478,19 +411,6 @@ Interface
|
||||
{ save the type of register used. }
|
||||
tempreg:=actasmregister;
|
||||
Consume(AS_REGISTER);
|
||||
if (oper.opr.typ in [OPR_REGISTER,OPR_REFERENCE]) and gotplus then
|
||||
begin
|
||||
oper.initref;
|
||||
oper.opr.ref.refaddr:=addr_full;
|
||||
if oper.opr.ref.base<>NR_NO then
|
||||
oper.opr.ref.base:=tempreg
|
||||
else
|
||||
if oper.opr.ref.index<>NR_NO then
|
||||
oper.opr.ref.index:=tempreg
|
||||
else
|
||||
Message(asmr_e_multiple_index);
|
||||
end
|
||||
else
|
||||
begin
|
||||
if (oper.opr.typ<>OPR_NONE) then
|
||||
Message(asmr_e_invalid_operand_type);
|
||||
|
Loading…
Reference in New Issue
Block a user