Parcourir la source

- removed ti8086inlinenode.second_round_real, second_trunc_real and load_fpu_location as they mostly repeat the code in tx86inlinenode.load_fpu_location; tx86inlinenode.load_fpu_location adapted for i8086 instead

git-svn-id: branches/i8086@24237 -
nickysn il y a 12 ans
Parent
commit
97ca0fa323
2 fichiers modifiés avec 16 ajouts et 77 suppressions
  1. 0 70
      compiler/i8086/n8086inl.pas
  2. 16 7
      compiler/x86/nx86inl.pas

+ 0 - 70
compiler/i8086/n8086inl.pas

@@ -33,14 +33,9 @@ interface
        { ti8086inlinenode }
 
        ti8086inlinenode = class(tx86inlinenode)
-         procedure second_round_real; override;
-         procedure second_trunc_real; override;
-
          function typecheck_seg: tnode; override;
          function first_seg: tnode; override;
          procedure second_seg; override;
-       private
-         procedure load_fpu_location;
        end;
 
 implementation
@@ -61,37 +56,6 @@ implementation
     cga,cgutils,cgx86,cgobj,hlcgobj,
     htypechk;
 
-     procedure ti8086inlinenode.second_round_real;
-       begin
-         load_fpu_location;
-         location_reset_ref(location,LOC_REFERENCE,OS_S64,0);
-         tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
-         emit_ref(A_FISTP,S_IQ,location.reference);
-         tcgx86(cg).dec_fpu_stack;
-         emit_none(A_FWAIT,S_NO);
-       end;
-
-     procedure ti8086inlinenode.second_trunc_real;
-       var
-         oldcw,newcw : treference;
-       begin
-         tg.GetTemp(current_asmdata.CurrAsmList,2,2,tt_normal,oldcw);
-         tg.GetTemp(current_asmdata.CurrAsmList,2,2,tt_normal,newcw);
-         emit_ref(A_FNSTCW,S_NO,newcw);
-         emit_ref(A_FNSTCW,S_NO,oldcw);
-         emit_const_ref(A_OR,S_W,$0f00,newcw);
-         load_fpu_location;
-         emit_ref(A_FLDCW,S_NO,newcw);
-         location_reset_ref(location,LOC_REFERENCE,OS_S64,0);
-         tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
-         emit_ref(A_FISTP,S_IQ,location.reference);
-         tcgx86(cg).dec_fpu_stack;
-         emit_ref(A_FLDCW,S_NO,oldcw);
-         emit_none(A_FWAIT,S_NO);
-         tg.UnGetTemp(current_asmdata.CurrAsmList,oldcw);
-         tg.UnGetTemp(current_asmdata.CurrAsmList,newcw);
-       end;
-
      function ti8086inlinenode.typecheck_seg: tnode;
        begin
          result := nil;
@@ -111,40 +75,6 @@ implementation
          current_asmdata.CurrAsmList.Concat(Taicpu.op_reg_reg(A_MOV,S_W,NR_DS,location.register));
        end;
 
-     procedure ti8086inlinenode.load_fpu_location;
-       var
-         lnode: tnode;
-       begin
-         location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
-         location.register:=NR_FPU_RESULT_REG;
-         if left.nodetype <> callparan then
-           internalerror(2013031501);
-         lnode := tcallparanode(left).left;
-         secondpass(lnode);
-         case lnode.location.loc of
-           LOC_FPUREGISTER:
-             ;
-           LOC_CFPUREGISTER:
-             begin
-               cg.a_loadfpu_reg_reg(current_asmdata.CurrAsmList,lnode.location.size,
-                 lnode.location.size,lnode.location.register,location.register);
-             end;
-           LOC_REFERENCE,LOC_CREFERENCE:
-             begin
-               cg.a_loadfpu_ref_reg(current_asmdata.CurrAsmList,
-                  lnode.location.size,lnode.location.size,
-                  lnode.location.reference,location.register);
-             end;
-           LOC_MMREGISTER,LOC_CMMREGISTER:
-             begin
-               location:=lnode.location;
-               location_force_fpureg(current_asmdata.CurrAsmList,location,false);
-             end;
-           else
-             internalerror(309991);
-         end;
-       end;
-
 begin
    cinlinenode:=ti8086inlinenode;
 end.

+ 16 - 7
compiler/x86/nx86inl.pas

@@ -199,27 +199,36 @@ implementation
 
      { load the FPU into the an fpu register }
      procedure tx86inlinenode.load_fpu_location;
+       var
+         lnode: tnode;
        begin
          location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
          location.register:=NR_FPU_RESULT_REG;
-         secondpass(left);
-         case left.location.loc of
+{$ifdef i8086}
+         if left.nodetype <> callparan then
+           internalerror(2013031501);
+         lnode := tcallparanode(left).left;
+{$else i8086}
+         lnode := left;
+{$endif i8086}
+         secondpass(lnode);
+         case lnode.location.loc of
            LOC_FPUREGISTER:
              ;
            LOC_CFPUREGISTER:
              begin
-               cg.a_loadfpu_reg_reg(current_asmdata.CurrAsmList,left.location.size,
-                 left.location.size,left.location.register,location.register);
+               cg.a_loadfpu_reg_reg(current_asmdata.CurrAsmList,lnode.location.size,
+                 lnode.location.size,lnode.location.register,location.register);
              end;
            LOC_REFERENCE,LOC_CREFERENCE:
              begin
                cg.a_loadfpu_ref_reg(current_asmdata.CurrAsmList,
-                  left.location.size,left.location.size,
-                  left.location.reference,location.register);
+                  lnode.location.size,lnode.location.size,
+                  lnode.location.reference,location.register);
              end;
            LOC_MMREGISTER,LOC_CMMREGISTER:
              begin
-               location:=left.location;
+               location:=lnode.location;
                location_force_fpureg(current_asmdata.CurrAsmList,location,false);
              end;
            else