瀏覽代碼

* take care of the used fpu instruction set when saving/restoring function results on x86

git-svn-id: trunk@8617 -
florian 18 年之前
父節點
當前提交
4cd15058df
共有 1 個文件被更改,包括 19 次插入7 次删除
  1. 19 7
      compiler/ncgadd.pas

+ 19 - 7
compiler/ncgadd.pas

@@ -136,14 +136,26 @@ interface
           end;
         if pushedfpu then
           begin
-            tmpreg := cg.getfpuregister(current_asmdata.CurrAsmList,left.location.size);
-            cg.a_loadfpu_loc_reg(current_asmdata.CurrAsmList,left.location.size,left.location,tmpreg);
-            location_reset(left.location,LOC_FPUREGISTER,left.location.size);
-            left.location.register := tmpreg;
 {$ifdef x86}
-            { left operand is now on top of the stack, instead of the right one! }
-            toggleflag(nf_swapped);
+            if use_sse(left.resultdef) then
+              begin
+                tmpreg := cg.getmmregister(current_asmdata.CurrAsmList,left.location.size);
+                cg.a_loadmm_loc_reg(current_asmdata.CurrAsmList,left.location.size,left.location,tmpreg,mms_movescalar);
+                location_reset(left.location,LOC_MMREGISTER,left.location.size);
+                left.location.register := tmpreg;
+              end
 {$endif x86}
+            else
+              begin
+                tmpreg := cg.getfpuregister(current_asmdata.CurrAsmList,left.location.size);
+                cg.a_loadfpu_loc_reg(current_asmdata.CurrAsmList,left.location.size,left.location,tmpreg);
+                location_reset(left.location,LOC_FPUREGISTER,left.location.size);
+                left.location.register := tmpreg;
+{$ifdef x86}
+                { left operand is now on top of the stack, instead of the right one! }
+                toggleflag(nf_swapped);
+{$endif x86}
+              end;
           end;
       end;
 
@@ -248,7 +260,7 @@ interface
         tmpreg : tregister;
         mask,
         setbase : aint;
-        
+
         cgop    : TOpCg;
         opdone  : boolean;
       begin