* MIPS: cleanup assembler reader, MIPS references allow only a single register in parentheses.

git-svn-id: trunk@25768 -
This commit is contained in:
sergei 2013-10-13 21:22:04 +00:00
parent e10e383b8e
commit 142d20ca30

View File

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