Ver código fonte

+ thlcgobj.location_force_fpureg() implementation

git-svn-id: branches/jvmbackend@18370 -
Jonas Maebe 14 anos atrás
pai
commit
b5ea6ab7d8
1 arquivos alterados com 20 adições e 1 exclusões
  1. 20 1
      compiler/hlcgobj.pas

+ 20 - 1
compiler/hlcgobj.pas

@@ -416,7 +416,7 @@ unit hlcgobj;
           { routines migrated from ncgutil }
 
           procedure location_force_reg(list:TAsmList;var l:tlocation;src_size,dst_size:tdef;maybeconst:boolean);virtual;
-          procedure location_force_fpureg(list:TAsmList;var l: tlocation;size: tdef;maybeconst:boolean);virtual;abstract;
+          procedure location_force_fpureg(list:TAsmList;var l: tlocation;size: tdef;maybeconst:boolean);virtual;
           procedure location_force_mem(list:TAsmList;var l:tlocation;size:tdef);virtual;
 //          procedure location_force_mmregscalar(list:TAsmList;var l: tlocation;size:tdef;maybeconst:boolean);virtual;abstract;
 //          procedure location_force_mmreg(list:TAsmList;var l: tlocation;size:tdef;maybeconst:boolean);virtual;abstract;
@@ -1649,6 +1649,25 @@ implementation
         location_freetemp(list,oldloc);
     end;
 
+  procedure thlcgobj.location_force_fpureg(list: TAsmList; var l: tlocation; size: tdef; maybeconst: boolean);
+    var
+      reg : tregister;
+      href : treference;
+    begin
+      if (l.loc<>LOC_FPUREGISTER)  and
+         ((l.loc<>LOC_CFPUREGISTER) or (not maybeconst)) then
+        begin
+          { if it's in an mm register, store to memory first }
+          if (l.loc in [LOC_MMREGISTER,LOC_CMMREGISTER]) then
+            internalerror(2011012903);
+          reg:=getfpuregister(list,size);
+          a_loadfpu_loc_reg(list,size,size,l,reg);
+          location_freetemp(list,l);
+          location_reset(l,LOC_FPUREGISTER,l.size);
+          l.register:=reg;
+        end;
+    end;
+
   procedure thlcgobj.location_force_mem(list: TAsmList; var l: tlocation; size: tdef);
     var
       r : treference;