فهرست منبع

m68k: more refactoring for fpu_capabilities instead of hardwired fpu types. 68040 and 68060 fpu types should now work

git-svn-id: trunk@42929 -
Károly Balogh 5 سال پیش
والد
کامیت
fd1d227175
1فایلهای تغییر یافته به همراه86 افزوده شده و 98 حذف شده
  1. 86 98
      compiler/m68k/n68kadd.pas

+ 86 - 98
compiler/m68k/n68kadd.pas

@@ -184,50 +184,44 @@ implementation
         if nf_swapped in flags then
           swapleftright;
 
-        case current_settings.fputype of
-          fpu_68881,fpu_coldfire:
-            begin
-              { initialize the result }
-              location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
+        if not (FPUM68K_HAS_HARDWARE in fpu_capabilities[current_settings.fputype]) then
+          internalerror(2015010201);
 
-              { have left in the register, right can be a memory location }
-              if not (current_settings.fputype = fpu_coldfire) and
-                 inlineable_realconstnode(left) then
-                begin
-                  location.register := cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
-                  current_asmdata.CurrAsmList.concat(taicpu.op_realconst_reg(A_FMOVE,tcgsize2opsize[left.location.size],trealconstnode(left).value_real,location.register))
-                end
-              else
-                begin
-                  hlcg.location_force_fpureg(current_asmdata.CurrAsmList,left.location,left.resultdef,true);
+        location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
 
-                  location.register := cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
-                  cg.a_loadfpu_reg_reg(current_asmdata.CurrAsmlist,OS_NO,OS_NO,left.location.register,location.register);
-                end;
+        { have left in the register, right can be a memory location }
+        if (FPUM68K_HAS_FLOATIMMEDIATE in fpu_capabilities[current_settings.fputype]) and
+           inlineable_realconstnode(left) then
+          begin
+            location.register := cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
+            current_asmdata.CurrAsmList.concat(taicpu.op_realconst_reg(A_FMOVE,tcgsize2opsize[left.location.size],trealconstnode(left).value_real,location.register))
+          end
+        else
+          begin
+            hlcg.location_force_fpureg(current_asmdata.CurrAsmList,left.location,left.resultdef,true);
 
-              { emit the actual operation }
-              case right.location.loc of
-                LOC_FPUREGISTER,LOC_CFPUREGISTER:
-                    current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,fpuregopsize,right.location.register,location.register));
-                LOC_REFERENCE,LOC_CREFERENCE:
-                    begin
-                      if not (current_settings.fputype = fpu_coldfire) and
-                         inlineable_realconstnode(right) then
-                        current_asmdata.CurrAsmList.concat(taicpu.op_realconst_reg(op,tcgsize2opsize[right.location.size],trealconstnode(right).value_real,location.register))
-                      else
-                        begin
-                          href:=right.location.reference;
-                          tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,current_settings.fputype = fpu_coldfire);
-                          current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(op,tcgsize2opsize[right.location.size],href,location.register));
-                        end;
-                    end
+            location.register := cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
+            cg.a_loadfpu_reg_reg(current_asmdata.CurrAsmlist,OS_NO,OS_NO,left.location.register,location.register);
+          end;
+
+        { emit the actual operation }
+        case right.location.loc of
+          LOC_FPUREGISTER,LOC_CFPUREGISTER:
+              current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,fpuregopsize,right.location.register,location.register));
+          LOC_REFERENCE,LOC_CREFERENCE:
+              begin
+                if (FPUM68K_HAS_FLOATIMMEDIATE in fpu_capabilities[current_settings.fputype]) and
+                   inlineable_realconstnode(right) then
+                  current_asmdata.CurrAsmList.concat(taicpu.op_realconst_reg(op,tcgsize2opsize[right.location.size],trealconstnode(right).value_real,location.register))
                 else
-                  internalerror(2015021501);
-              end;
-            end;
+                  begin
+                    href:=right.location.reference;
+                    tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,current_settings.fputype = fpu_coldfire);
+                    current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(op,tcgsize2opsize[right.location.size],href,location.register));
+                  end;
+              end
           else
-            // softfpu should be handled in pass1, others are not yet supported...
-            internalerror(2015010201);
+            internalerror(2015021501);
         end;
       end;
 
@@ -242,72 +236,66 @@ implementation
         if (nf_swapped in flags) then
           swapleftright;
 
-        case current_settings.fputype of
-          fpu_68881,fpu_coldfire:
-            begin
-              location_reset(location,LOC_FLAGS,OS_NO);
-              location.resflags:=getfloatresflags;
-
-              { emit compare }
-              case right.location.loc of
-                LOC_FPUREGISTER,LOC_CFPUREGISTER:
-                    begin
-                      //current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('second_cmpfloat right reg!')));
+        if not (FPUM68K_HAS_HARDWARE in fpu_capabilities[current_settings.fputype]) then
+          internalerror(2019090601);
+
+        location_reset(location,LOC_FLAGS,OS_NO);
+        location.resflags:=getfloatresflags;
+
+        { emit compare }
+        case right.location.loc of
+          LOC_FPUREGISTER,LOC_CFPUREGISTER:
+              begin
+                //current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('second_cmpfloat right reg!')));
+                if left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
+                  begin
+                    href:=left.location.reference;
+                    tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,current_settings.fputype = fpu_coldfire);
+                    current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(A_FCMP,tcgsize2opsize[left.location.size],href,right.location.register));
+                    toggleflag(nf_swapped);
+                    location.resflags:=getfloatresflags;
+                  end
+                else
+                  begin
+                    hlcg.location_force_fpureg(current_asmdata.CurrAsmList,left.location,left.resultdef,true);
+                    current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FCMP,fpuregopsize,right.location.register,left.location.register));
+                  end;
+              end;
+          LOC_REFERENCE,LOC_CREFERENCE:
+              begin
+                { use FTST, if realconst is 0.0, it would be hard to do this in the
+                  optimizer, because we would need to investigate the referenced value... }
+                if (right.nodetype = realconstn) and
+                   (trealconstnode(right).value_real = 0.0) then
+                  begin
+                    if left.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
+                      current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_FTST,fpuregopsize,left.location.register))
+                    else
                       if left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
                         begin
                           href:=left.location.reference;
-                          tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,current_settings.fputype = fpu_coldfire);
-                          current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(A_FCMP,tcgsize2opsize[left.location.size],href,right.location.register));
-                          toggleflag(nf_swapped);
-                          location.resflags:=getfloatresflags;
+                          tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,false);
+                          current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_FTST,tcgsize2opsize[left.location.size],href))
                         end
                       else
-                        begin
-                          hlcg.location_force_fpureg(current_asmdata.CurrAsmList,left.location,left.resultdef,true);
-                          current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FCMP,fpuregopsize,right.location.register,left.location.register));
-                        end;
-                    end;
-                LOC_REFERENCE,LOC_CREFERENCE:
-                    begin
-                      { use FTST, if realconst is 0.0, it would be hard to do this in the
-                        optimizer, because we would need to investigate the referenced value... }
-                      if (right.nodetype = realconstn) and
-                         (trealconstnode(right).value_real = 0.0) then
-                        begin
-                          if left.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
-                            current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_FTST,fpuregopsize,left.location.register))
-                          else
-                            if left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
-                              begin
-                                href:=left.location.reference;
-                                tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,false);
-                                current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_FTST,tcgsize2opsize[left.location.size],href))
-                              end
-                            else
-                              internalerror(2016051001);
-                        end
-                      else
-                        begin
-                          hlcg.location_force_fpureg(current_asmdata.CurrAsmList,left.location,left.resultdef,true);
-                          if not (current_settings.fputype = fpu_coldfire) and
-                             inlineable_realconstnode(right) then
-                            current_asmdata.CurrAsmList.concat(taicpu.op_realconst_reg(A_FCMP,tcgsize2opsize[right.location.size],trealconstnode(right).value_real,left.location.register))
-                          else
-                            begin
-                              href:=right.location.reference;
-                              tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,current_settings.fputype = fpu_coldfire);
-                              current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(A_FCMP,tcgsize2opsize[right.location.size],href,left.location.register));
-                            end;
-                        end;
-                    end
+                        internalerror(2016051001);
+                  end
                 else
-                  internalerror(2015021502);
-              end;
-
-            end;
+                  begin
+                    hlcg.location_force_fpureg(current_asmdata.CurrAsmList,left.location,left.resultdef,true);
+                    if not (current_settings.fputype = fpu_coldfire) and
+                       inlineable_realconstnode(right) then
+                      current_asmdata.CurrAsmList.concat(taicpu.op_realconst_reg(A_FCMP,tcgsize2opsize[right.location.size],trealconstnode(right).value_real,left.location.register))
+                    else
+                      begin
+                        href:=right.location.reference;
+                        tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,current_settings.fputype = fpu_coldfire);
+                        current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(A_FCMP,tcgsize2opsize[right.location.size],href,left.location.register));
+                      end;
+                  end;
+              end
           else
-            // softfpu should be handled in pass1, others are not yet supported...
-            internalerror(2015010201);
+            internalerror(2015021502);
         end;
       end;