Просмотр исходного кода

* always insert type conversion for pasbool to int on llvm, as pasbool is
represented by i1 while equally sized integers are i8

git-svn-id: trunk@30709 -

Jonas Maebe 10 лет назад
Родитель
Сommit
f7b5ee64ae
1 измененных файлов с 34 добавлено и 2 удалено
  1. 34 2
      compiler/llvm/nllvmcnv.pas

+ 34 - 2
compiler/llvm/nllvmcnv.pas

@@ -45,7 +45,7 @@ interface
          { procedure second_real_to_real;override; }
          { procedure second_cord_to_pointer;override; }
          { procedure second_proc_to_procvar;override; }
-         { procedure second_bool_to_int;override; }
+         procedure second_bool_to_int;override;
          procedure second_int_to_bool;override;
          { procedure second_load_smallset;override;  }
          { procedure second_ansistring_to_pchar;override; }
@@ -62,7 +62,7 @@ uses
   aasmbase,aasmdata,
   llvmbase,aasmllvm,
   procinfo,
-  symconst,symdef,defutil,
+  symconst,symtype,symdef,defutil,
   cgbase,cgutils,hlcgobj,pass_2;
 
 { tllvmtypeconvnode }
@@ -134,6 +134,38 @@ procedure tllvmtypeconvnode.second_int_to_real;
   end;
 
 
+procedure tllvmtypeconvnode.second_bool_to_int;
+  var
+    pdef: tdef;
+    hreg: tregister;
+  begin
+    inherited;
+    { all boolean/integer of the same size are represented using the same type
+      by FPC in LLVM, except for Pascal booleans, which are i1 -> convert
+      the type if necessary. This never has to be done for registers on the
+      assignment side, because we make everything that's explicitly typecasted
+      on the assignment side non regable for llvm }
+    if is_pasbool(left.resultdef) and
+       (nf_explicit in flags) and
+       (resultdef.size=1) then
+      case location.loc of
+        LOC_REFERENCE,LOC_CREFERENCE:
+          begin
+            pdef:=getpointerdef(resultdef);
+            hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,pdef);
+            hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.resultdef,pdef,location.reference,hreg);
+            hlcg.reference_reset_base(location.reference,pdef,hreg,0,location.reference.alignment);
+          end;
+        LOC_REGISTER,LOC_CREGISTER:
+          begin
+            hreg:=hlcg.getintregister(current_asmdata.CurrAsmList,resultdef);
+            hlcg.a_load_reg_reg(current_asmdata.CurrAsmList,left.resultdef,resultdef,location.register,hreg);
+            location.register:=hreg;
+          end;
+      end;
+  end;
+
+
 procedure tllvmtypeconvnode.second_int_to_bool;
   var
     newsize  : tcgsize;