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

* fixed missing sign extension when adding a signed integer variable with
size < sizeof(pointer) to a pointer for LLVM (fixes tfmtbcd)

git-svn-id: trunk@43833 -

Jonas Maebe 5 лет назад
Родитель
Сommit
044d946782
1 измененных файлов с 10 добавлено и 0 удалено
  1. 10 0
      compiler/llvm/hlcgllvm.pas

+ 10 - 0
compiler/llvm/hlcgllvm.pas

@@ -775,6 +775,16 @@ implementation
         else
           ;
       end;
+      { inttoptr performs zero extension -> avoid inc(ptr,longint(-1)) from
+        increasing ptr by 4GB on a 64bit platform }
+      if (op=la_inttoptr) and
+         (fromsize.size<tosize.size) then
+        begin
+          tmpreg:=getintregister(list,fromsize);
+          a_load_reg_reg(list,fromsize,ptrsinttype,reg1,tmpreg);
+          reg1:=tmpreg;
+          fromsize:=ptrsinttype;
+        end;
       { reg2 = bitcast fromsize reg1 to tosize }
       list.concat(taillvm.op_reg_size_reg_size(op,reg2,fromsize,reg1,tosize));
     end;