Преглед изворни кода

+ support for llvm "undef" operand

git-svn-id: trunk@30669 -
Jonas Maebe пре 10 година
родитељ
комит
07141e92d3
3 измењених фајлова са 27 додато и 0 уклоњено
  1. 2 0
      compiler/aasmtai.pas
  2. 23 0
      compiler/llvm/aasmllvm.pas
  3. 2 0
      compiler/llvm/agllvm.pas

+ 2 - 0
compiler/aasmtai.pas

@@ -253,6 +253,7 @@ interface
        { llvm only }
        ,top_single
        ,top_double
+       ,top_undef
 {$ifdef cpuextended}
        ,top_extended80
 {$endif cpuextended}
@@ -433,6 +434,7 @@ interface
         {$ifdef llvm}
             top_single : (sval:single);
             top_double : (dval:double);
+            top_undef :  ();
           {$ifdef cpuextended}
             top_extended80 : (eval:extended);
           {$endif cpuextended}

+ 23 - 0
compiler/llvm/aasmllvm.pas

@@ -71,6 +71,9 @@ interface
         { e.g. dst = bitcast fromsize <abstracttaidata> to tosize }
         constructor op_reg_tai_size(op:tllvmop;dst:tregister;src:tai;tosize:tdef);
 
+        { dst = bitcast size undef to size }
+        constructor op_reg_size_undef(op: tllvmop; dst: tregister; size: tdef);
+
         { e.g. dst = bitcast fromsize src to tosize }
         constructor op_reg_size_ref_size(op:tllvmop;dst:tregister;fromsize:tdef;const src:treference;tosize:tdef);
         { e.g. store fromsize src, ptrsize toref}
@@ -110,6 +113,7 @@ interface
         procedure clearop(opidx: longint); override;
         procedure loadtai(opidx: longint; _ai: tai);
         procedure loaddef(opidx: longint; _def: tdef);
+        procedure loadundef(opidx: longint);
         procedure loadsingle(opidx: longint; _sval: single);
         procedure loaddouble(opidx: longint; _dval: double);
 {$ifdef cpuextended}
@@ -319,6 +323,14 @@ uses
       end;
 
 
+    procedure taillvm.loadundef(opidx: longint);
+      begin
+        allocate_oper(opidx+1);
+        with oper[opidx]^ do
+          typ:=top_undef
+      end;
+
+
     procedure taillvm.loadsingle(opidx: longint; _sval: single);
       begin
         allocate_oper(opidx+1);
@@ -702,6 +714,17 @@ uses
       end;
 
 
+    constructor taillvm.op_reg_size_undef(op: tllvmop; dst: tregister; size: tdef);
+      begin
+        create_llvm(op);
+        ops:=4;
+        loadreg(0,dst);
+        loaddef(1,size);
+        loadundef(2);
+        loaddef(3,size);
+      end;
+
+
     constructor taillvm.op_reg_size_ref_size(op: tllvmop; dst: tregister; fromsize: tdef; const src: treference; tosize: tdef);
       begin
         create_llvm(op);

+ 2 - 0
compiler/llvm/agllvm.pas

@@ -325,6 +325,8 @@ implementation
              result:=llvmextendedtostr(o.eval);
            end;
 {$endif cpuextended}
+         top_undef:
+           result:='undef'
          else
            internalerror(2013060227);
        end;