浏览代码

m68k: support register pair operands in assembler reader and writer, as used by some instructions (mainly DIVS/DIVU and friends) so we don't have to hack them as three operand instructions

git-svn-id: trunk@34782 -
Károly Balogh 8 年之前
父节点
当前提交
5237a4d5e2
共有 4 个文件被更改,包括 25 次插入2 次删除
  1. 2 0
      compiler/aasmtai.pas
  2. 14 0
      compiler/m68k/aasmcpu.pas
  3. 2 0
      compiler/m68k/ag68kgas.pas
  4. 7 2
      compiler/rautils.pas

+ 2 - 0
compiler/aasmtai.pas

@@ -236,6 +236,7 @@ interface
 {$ifdef m68k}
 {$ifdef m68k}
        { m68k only }
        { m68k only }
        ,top_regset
        ,top_regset
+       ,top_regpair
        ,top_realconst
        ,top_realconst
 {$endif m68k}
 {$endif m68k}
 {$ifdef jvm}
 {$ifdef jvm}
@@ -427,6 +428,7 @@ interface
         {$endif defined(arm) or defined(aarch64)}
         {$endif defined(arm) or defined(aarch64)}
         {$ifdef m68k}
         {$ifdef m68k}
             top_regset : (dataregset,addrregset,fpuregset: tcpuregisterset);
             top_regset : (dataregset,addrregset,fpuregset: tcpuregisterset);
+            top_regpair : (reghi,reglo: tregister);
             top_realconst : (val_real:bestreal);
             top_realconst : (val_real:bestreal);
         {$endif m68k}
         {$endif m68k}
         {$ifdef jvm}
         {$ifdef jvm}

+ 14 - 0
compiler/m68k/aasmcpu.pas

@@ -42,6 +42,7 @@ type
      opsize : topsize;
      opsize : topsize;
 
 
      procedure loadregset(opidx:longint; const dataregs,addrregs,fpuregs:tcpuregisterset);
      procedure loadregset(opidx:longint; const dataregs,addrregs,fpuregs:tcpuregisterset);
+     procedure loadregpair(opidx:longint; const _reghi,_reglo: tregister);
      procedure loadrealconst(opidx:longint; const value_real: bestreal);
      procedure loadrealconst(opidx:longint; const value_real: bestreal);
 
 
      constructor op_none(op : tasmop);
      constructor op_none(op : tasmop);
@@ -149,6 +150,19 @@ type
          end;
          end;
       end;
       end;
 
 
+    procedure taicpu.loadregpair(opidx:longint; const _reghi,_reglo: tregister);
+      begin
+        allocate_oper(opidx+1);
+        with oper[opidx]^ do
+          begin
+            if typ<>top_regpair then
+              clearop(opidx);
+            typ:=top_regpair;
+            reghi:=_reghi;
+            reglo:=_reglo;
+          end;
+      end;
+
     procedure taicpu.loadrealconst(opidx:longint; const value_real: bestreal);
     procedure taicpu.loadrealconst(opidx:longint; const value_real: bestreal);
       begin
       begin
         allocate_oper(opidx+1);
         allocate_oper(opidx+1);

+ 2 - 0
compiler/m68k/ag68kgas.pas

@@ -178,6 +178,8 @@ interface
                 end;
                 end;
               delete(getopstr,length(getopstr),1);
               delete(getopstr,length(getopstr),1);
             end;
             end;
+          top_regpair:
+            getopstr:=gas_regname(o.reghi)+':'+gas_regname(o.reglo);
           top_const:
           top_const:
             getopstr:='#'+tostr(longint(o.val));
             getopstr:='#'+tostr(longint(o.val));
           top_realconst:
           top_realconst:

+ 7 - 2
compiler/rautils.pas

@@ -43,7 +43,9 @@ Function SearchLabel(const s: string; var hl: tasmlabel;emit:boolean): boolean;
 
 
 type
 type
   TOprType=(OPR_NONE,OPR_CONSTANT,OPR_SYMBOL,OPR_LOCAL,
   TOprType=(OPR_NONE,OPR_CONSTANT,OPR_SYMBOL,OPR_LOCAL,
-            OPR_REFERENCE,OPR_REGISTER,OPR_COND,OPR_REGSET,OPR_SHIFTEROP,OPR_MODEFLAGS,OPR_SPECIALREG);
+            OPR_REFERENCE,OPR_REGISTER,OPR_COND,OPR_REGSET,
+            OPR_SHIFTEROP,OPR_MODEFLAGS,OPR_SPECIALREG,
+            OPR_REGPAIR);
 
 
   TOprRec = record
   TOprRec = record
     case typ:TOprType of
     case typ:TOprType of
@@ -54,7 +56,8 @@ type
       OPR_LOCAL     : (localvarsize, localconstoffset: asizeint;localsym:tabstractnormalvarsym;localsymofs:aint;localindexreg:tregister;localscale:byte;localgetoffset,localforceref:boolean);
       OPR_LOCAL     : (localvarsize, localconstoffset: asizeint;localsym:tabstractnormalvarsym;localsymofs:aint;localindexreg:tregister;localscale:byte;localgetoffset,localforceref:boolean);
       OPR_REGISTER  : (reg:tregister);
       OPR_REGISTER  : (reg:tregister);
 {$ifdef m68k}
 {$ifdef m68k}
-      OPR_REGSET   : (regsetdata,regsetaddr,regsetfpu : tcpuregisterset);
+      OPR_REGSET    : (regsetdata,regsetaddr,regsetfpu : tcpuregisterset);
+      OPR_REGPAIR   : (reghi,reglo: tregister);
 {$endif m68k}
 {$endif m68k}
 {$ifdef powerpc}
 {$ifdef powerpc}
       OPR_COND      : (cond : tasmcond);
       OPR_COND      : (cond : tasmcond);
@@ -1108,6 +1111,8 @@ end;
 {$ifdef m68k}
 {$ifdef m68k}
               OPR_REGSET:
               OPR_REGSET:
                 ai.loadregset(i-1,regsetdata,regsetaddr,regsetfpu);
                 ai.loadregset(i-1,regsetdata,regsetaddr,regsetfpu);
+              OPR_REGPAIR:
+                ai.loadregpair(i-1,reghi,reglo);
 {$endif}
 {$endif}
 {$ifdef ARM}
 {$ifdef ARM}
               OPR_REGSET:
               OPR_REGSET: