소스 검색

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

git-svn-id: trunk@25768 -
sergei 11 년 전
부모
커밋
142d20ca30
1개의 변경된 파일6개의 추가작업 그리고 86개의 파일을 삭제
  1. 6 86
      compiler/mips/racpugas.pas

+ 6 - 86
compiler/mips/racpugas.pas

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