Forráskód Böngészése

* fixed longint -> real, was broken in 6153

git-svn-id: trunk@6257 -
florian 18 éve
szülő
commit
0fd3498892
1 módosított fájl, 39 hozzáadás és 29 törlés
  1. 39 29
      compiler/arm/narmcnv.pas

+ 39 - 29
compiler/arm/narmcnv.pas

@@ -122,47 +122,57 @@ implementation
         l1,l2 : tasmlabel;
         hregister : tregister;
       begin
-        current_asmdata.getdatalabel(l1);
-        current_asmdata.getjumplabel(l2);
-        reference_reset_symbol(href,l1,0);
 
         { convert first to double to avoid precision loss }
         location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
         location_force_reg(current_asmdata.CurrAsmList,left.location,OS_32,true);
         location.register:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
         instr:=taicpu.op_reg_reg(A_FLT,location.register,left.location.register);
-        instr.oppostfix:=PF_D;
-        current_asmdata.CurrAsmList.concat(instr);
+        if is_signed(left.resultdef) then
+          begin
+            instr.oppostfix:=cgsize2fpuoppostfix[def_cgsize(resultdef)];;
+            current_asmdata.CurrAsmList.concat(instr);
+          end
+        else
+          begin
+            { flt does a signed load, fix this }
+            case tfloatdef(resultdef).floattype of
+              s32real,
+              s64real:
+                begin
+                  { converting dword to s64real first and cut off at the end avoids precision loss }
+                  instr.oppostfix:=PF_D;
+                  current_asmdata.CurrAsmList.concat(instr);
 
-        current_asmdata.CurrAsmList.concat(Taicpu.op_reg_const(A_CMP,left.location.register,0));
-        cg.a_jmp_flags(current_asmdata.CurrAsmList,F_GE,l2);
+                  current_asmdata.getdatalabel(l1);
+                  current_asmdata.getjumplabel(l2);
+                  reference_reset_symbol(href,l1,0);
 
-        case tfloatdef(resultdef).floattype of
-          { converting dword to s64real first and cut off at the end avoids precision loss }
-          s32real,
-          s64real:
-            begin
-              hregister:=cg.getfpuregister(current_asmdata.CurrAsmList,OS_F64);
-              current_asmdata.asmlists[al_typedconsts].concat(tai_align.create(const_align(8)));
-              current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(l1));
-              { I got this constant from a test program (FK) }
-              current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit($41f00000));
-              current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit(0));
+                  current_asmdata.CurrAsmList.concat(Taicpu.op_reg_const(A_CMP,left.location.register,0));
+                  cg.a_jmp_flags(current_asmdata.CurrAsmList,F_GE,l2);
 
-              cg.a_loadfpu_ref_reg(current_asmdata.CurrAsmList,OS_F64,OS_F64,href,hregister);
-              current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg(A_ADF,location.register,hregister,location.register),PF_D));
-              cg.a_label(current_asmdata.CurrAsmList,l2);
+                  hregister:=cg.getfpuregister(current_asmdata.CurrAsmList,OS_F64);
+                  current_asmdata.asmlists[al_typedconsts].concat(tai_align.create(const_align(8)));
+                  current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(l1));
+                  { I got this constant from a test program (FK) }
+                  current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit($41f00000));
+                  current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit(0));
 
-              { cut off if we should convert to single }
-              if tfloatdef(resultdef).floattype=s32real then
-                begin
-                  hregister:=location.register;
-                  location.register:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
-                  current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg(A_MVF,location.register,hregister),PF_S));
+                  cg.a_loadfpu_ref_reg(current_asmdata.CurrAsmList,OS_F64,OS_F64,href,hregister);
+                  current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg(A_ADF,location.register,hregister,location.register),PF_D));
+                  cg.a_label(current_asmdata.CurrAsmList,l2);
+
+                  { cut off if we should convert to single }
+                  if tfloatdef(resultdef).floattype=s32real then
+                    begin
+                      hregister:=location.register;
+                      location.register:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
+                      current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg(A_MVF,location.register,hregister),PF_S));
+                    end;
                 end;
+              else
+                internalerror(200410031);
             end;
-          else
-            internalerror(200410031);
         end;
       end;