Sfoglia il codice sorgente

+ new la_asm LLVM pseudo-instruction to represent function-level inline
assembly blocks

git-svn-id: trunk@34890 -

Jonas Maebe 8 anni fa
parent
commit
f3409b4c9d
3 ha cambiato i file con 16 aggiunte e 2 eliminazioni
  1. 12 0
      compiler/llvm/aasmllvm.pas
  2. 2 1
      compiler/llvm/itllvm.pas
  3. 2 1
      compiler/llvm/llvmbase.pas

+ 12 - 0
compiler/llvm/aasmllvm.pas

@@ -111,6 +111,9 @@ interface
         { e.g. dst = call retsize reg (paras) }
         { e.g. dst = call retsize reg (paras) }
         constructor call_size_reg_paras(callpd: tdef; dst: tregister;retsize: tdef;reg:tregister;paras: tfplist);
         constructor call_size_reg_paras(callpd: tdef; dst: tregister;retsize: tdef;reg:tregister;paras: tfplist);
 
 
+        { inline function-level assembler code and parameters }
+        constructor asm_paras(asmlist: tasmlist; paras: tfplist);
+
         procedure loadoper(opidx: longint; o: toper); override;
         procedure loadoper(opidx: longint; o: toper); override;
         procedure clearop(opidx: longint); override;
         procedure clearop(opidx: longint); override;
         procedure loadtai(opidx: longint; _ai: tai);
         procedure loadtai(opidx: longint; _ai: tai);
@@ -1059,4 +1062,13 @@ uses
         loadparas(4,paras);
         loadparas(4,paras);
       end;
       end;
 
 
+
+    constructor taillvm.asm_paras(asmlist: tasmlist; paras: tfplist);
+      begin
+        create_llvm(la_asmblock);
+        ops:=2;
+        loadasmlist(0,asmlist);
+        loadparas(1,paras);
+      end;
+
 end.
 end.

+ 2 - 1
compiler/llvm/itllvm.pas

@@ -61,7 +61,8 @@ interface
         { fpc pseudo opcodes }
         { fpc pseudo opcodes }
         'type', { type definition }
         'type', { type definition }
         'invalid1', { la_x_to_inttoptr }
         'invalid1', { la_x_to_inttoptr }
-        'invalid2'  { la_ptrtoint_to_x }
+        'invalid2', { la_ptrtoint_to_x }
+        'asm' { la_asmblock }
       );
       );
 
 
       llvm_cond2str : array[topcmp] of ansistring = ('',
       llvm_cond2str : array[topcmp] of ansistring = ('',

+ 2 - 1
compiler/llvm/llvmbase.pas

@@ -69,7 +69,8 @@ interface
       { fpc pseudo opcodes }
       { fpc pseudo opcodes }
       la_type, { type definition }
       la_type, { type definition }
       la_x_to_inttoptr, { have to convert something first to int before it can be converted to a pointer }
       la_x_to_inttoptr, { have to convert something first to int before it can be converted to a pointer }
-      la_ptrtoint_to_x { have to convert a pointer first to int before it can be converted to something else }
+      la_ptrtoint_to_x, { have to convert a pointer first to int before it can be converted to something else }
+      la_asmblock
     );
     );
 
 
     tllvmvalueextension = (lve_none, lve_zeroext, lve_signext);
     tllvmvalueextension = (lve_none, lve_zeroext, lve_signext);