浏览代码

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

git-svn-id: trunk@34890 -

Jonas Maebe 8 年之前
父节点
当前提交
f3409b4c9d
共有 3 个文件被更改,包括 16 次插入2 次删除
  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) }
         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 clearop(opidx: longint); override;
         procedure loadtai(opidx: longint; _ai: tai);
@@ -1059,4 +1062,13 @@ uses
         loadparas(4,paras);
       end;
 
+
+    constructor taillvm.asm_paras(asmlist: tasmlist; paras: tfplist);
+      begin
+        create_llvm(la_asmblock);
+        ops:=2;
+        loadasmlist(0,asmlist);
+        loadparas(1,paras);
+      end;
+
 end.

+ 2 - 1
compiler/llvm/itllvm.pas

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

+ 2 - 1
compiler/llvm/llvmbase.pas

@@ -69,7 +69,8 @@ interface
       { fpc pseudo opcodes }
       la_type, { type definition }
       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);