Browse Source

m68k: initial asm-level infrastructure to let the codegenerator output float consts as operands, which is supported on 88x/040/060

git-svn-id: trunk@33667 -
Károly Balogh 9 years ago
parent
commit
e7838dad39
3 changed files with 31 additions and 0 deletions
  1. 2 0
      compiler/aasmtai.pas
  2. 22 0
      compiler/m68k/aasmcpu.pas
  3. 7 0
      compiler/m68k/ag68kgas.pas

+ 2 - 0
compiler/aasmtai.pas

@@ -230,6 +230,7 @@ interface
 {$ifdef m68k}
        { m68k only }
        ,top_regset
+       ,top_realconst
 {$endif m68k}
 {$ifdef jvm}
        { jvm only}
@@ -420,6 +421,7 @@ interface
         {$endif defined(arm) or defined(aarch64)}
         {$ifdef m68k}
             top_regset : (dataregset,addrregset,fpuregset: tcpuregisterset);
+            top_realconst : (val_real:bestreal);
         {$endif m68k}
         {$ifdef jvm}
             top_single : (sval:single);

+ 22 - 0
compiler/m68k/aasmcpu.pas

@@ -42,6 +42,7 @@ type
      opsize : topsize;
 
      procedure loadregset(opidx:longint; const dataregs,addrregs,fpuregs:tcpuregisterset);
+     procedure loadrealconst(opidx:longint; const value_real: bestreal);
 
      constructor op_none(op : tasmop);
      constructor op_none(op : tasmop;_size : topsize);
@@ -57,6 +58,7 @@ type
      constructor op_const_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister);
      constructor op_const_const(op : tasmop;_size : topsize;_op1,_op2 : longint);
      constructor op_const_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : treference);
+     constructor op_realconst_reg(op : tasmop;_size : topsize;_op1: bestreal;_op2: tregister);
 
      constructor op_ref_reg(op : tasmop;_size : topsize;_op1 : treference;_op2 : tregister);
      { this is only allowed if _op1 is an int value (_op1^.isintvalue=true) }
@@ -147,6 +149,18 @@ type
          end;
       end;
 
+    procedure taicpu.loadrealconst(opidx:longint; const value_real: bestreal);
+      begin
+        allocate_oper(opidx+1);
+        with oper[opidx]^ do
+          begin
+            if typ<>top_realconst then
+              clearop(opidx);
+            val_real:=value_real;
+            typ:=top_realconst;
+          end;
+      end;
+
 
     procedure taicpu.init(_size : topsize);
       begin
@@ -257,6 +271,14 @@ type
          loadref(1,_op2);
       end;
 
+    constructor taicpu.op_realconst_reg(op : tasmop;_size : topsize;_op1 : bestreal;_op2 : tregister);
+      begin
+         inherited create(op);
+         init(_size);
+         ops:=2;
+         loadrealconst(0,_op1);
+         loadreg(1,_op2);
+      end;
 
     constructor taicpu.op_ref_reg(op : tasmop;_size : topsize;_op1 : treference;_op2 : tregister);
       begin

+ 7 - 0
compiler/m68k/ag68kgas.pas

@@ -180,6 +180,13 @@ interface
             end;
           top_const:
             getopstr:='#'+tostr(longint(o.val));
+          top_realconst:
+            begin
+              str(o.val_real,getopstr);
+              if getopstr[1]=' ' then
+                getopstr[1]:='+';
+              getopstr:='#0d'+getopstr;
+            end;
           else internalerror(200405021);
         end;
       end;