Browse Source

* use pdef^.size instead of orddef^.typ

peter 27 years ago
parent
commit
1ce8f6f825
5 changed files with 171 additions and 163 deletions
  1. 11 8
      compiler/cg386cal.pas
  2. 67 60
      compiler/cg386flw.pas
  3. 13 12
      compiler/cg68kcal.pas
  4. 71 74
      compiler/cg68kflw.pas
  5. 9 9
      compiler/cga68k.pas

+ 11 - 8
compiler/cg386cal.pas

@@ -260,11 +260,11 @@ implementation
                         tempreference:=p^.left^.location.reference;
                         del_reference(p^.left^.location.reference);
                         case p^.resulttype^.deftype of
+                        enumdef,
                         orddef :
                           begin
-                             case porddef(p^.resulttype)^.typ of
-                               s32bit,u32bit,bool32bit :
-                                 begin
+                            case p^.resulttype^.size of
+                             4 : begin
                                     inc(pushedparasize,4);
                                     if inlined then
                                       begin
@@ -276,9 +276,7 @@ implementation
                                     else
                                       emit_push_mem(tempreference);
                                  end;
-                               s8bit,u8bit,uchar,bool8bit,
-                               bool16bit,s16bit,u16bit :
-                                 begin
+                           1,2 : begin
                                    inc(pushedparasize,2);
                                    if inlined then
                                      begin
@@ -291,6 +289,8 @@ implementation
                                      exprasmlist^.concat(new(pai386,op_ref(A_PUSH,S_W,
                                        newreference(tempreference))));
                                  end;
+                             else
+                              internalerror(234231);
                              end;
                           end;
                         floatdef :
@@ -376,7 +376,7 @@ implementation
                             end;
                           end;
                         pointerdef,procvardef,
-                        enumdef,classrefdef:
+                        classrefdef:
                           begin
                              inc(pushedparasize,4);
                              if inlined then
@@ -1408,7 +1408,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.20  1998-08-31 12:22:15  peter
+  Revision 1.21  1998-09-01 12:47:57  peter
+    * use pdef^.size instead of orddef^.typ
+
+  Revision 1.20  1998/08/31 12:22:15  peter
     * secondinline moved to cg386inl
 
   Revision 1.19  1998/08/31 08:52:03  peter

+ 67 - 60
compiler/cg386flw.pas

@@ -381,67 +381,68 @@ implementation
               secondpass(p^.left);
               case p^.left^.location.loc of
                  LOC_FPU : goto do_jmp;
-                 LOC_MEM,LOC_REFERENCE : is_mem:=true;
-                 LOC_CREGISTER,
-                 LOC_REGISTER : is_mem:=false;
-                     LOC_FLAGS : begin
-                                exprasmlist^.concat(new(pai386,op_reg(flag_2_set[p^.right^.location.resflags],S_B,R_AL)));
-                                        goto do_jmp;
-                             end;
-                 LOC_JUMP : begin
-                                      emitl(A_LABEL,truelabel);
-                               exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_B,1,R_AL)));
-                               emitl(A_JMP,aktexit2label);
-                               exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_B,R_AL,R_AL)));
-                               goto do_jmp;
-                            end;
-                 else internalerror(2001);
+                 LOC_MEM,
+           LOC_REFERENCE : is_mem:=true;
+           LOC_CREGISTER,
+            LOC_REGISTER : is_mem:=false;
+               LOC_FLAGS : begin
+                             exprasmlist^.concat(new(pai386,op_reg(flag_2_set[p^.right^.location.resflags],S_B,R_AL)));
+                             goto do_jmp;
+                           end;
+                LOC_JUMP : begin
+                             emitl(A_LABEL,truelabel);
+                             exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_B,1,R_AL)));
+                             emitl(A_JMP,aktexit2label);
+                             exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_B,R_AL,R_AL)));
+                             goto do_jmp;
+                           end;
+              else
+                internalerror(2001);
               end;
-                 if (procinfo.retdef^.deftype=orddef) then
-                begin
-                   case porddef(procinfo.retdef)^.typ of
-            s32bit,u32bit,bool32bit : if is_mem then
-                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                          newreference(p^.left^.location.reference),R_EAX)))
-                                      else
-                                        emit_reg_reg(A_MOV,S_L,p^.left^.location.register,R_EAX);
-         u8bit,s8bit,uchar,bool8bit : if is_mem then
-                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_B,
-                                          newreference(p^.left^.location.reference),R_AL)))
-                                      else
-                                        emit_reg_reg(A_MOV,S_B,p^.left^.location.register,R_AL);
-            s16bit,u16bit,bool16bit : if is_mem then
-                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_W,
-                                          newreference(p^.left^.location.reference),R_AX)))
-                                      else
-                                        emit_reg_reg(A_MOV,S_W,p^.left^.location.register,R_AX);
-                   end;
-                end
-                  else
-                     if (procinfo.retdef^.deftype in [pointerdef,enumdef,procvardef]) then
-                       begin
-                           if is_mem then
-                             exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                               newreference(p^.left^.location.reference),R_EAX)))
-                           else
-                             exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,S_L,
-                               p^.left^.location.register,R_EAX)));
-                       end
-                 else
-                    if (procinfo.retdef^.deftype=floatdef) then
-                      begin
-                          if pfloatdef(procinfo.retdef)^.typ=f32bit then
-                            begin
-                                if is_mem then
-                                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+              case procinfo.retdef^.deftype of
+               orddef,
+              enumdef : begin
+                          case procinfo.retdef^.size of
+                           4 : if is_mem then
+                                 exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                                   newreference(p^.left^.location.reference),R_EAX)))
+                               else
+                                 emit_reg_reg(A_MOV,S_L,p^.left^.location.register,R_EAX);
+                           2 : if is_mem then
+                                 exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_W,
+                                   newreference(p^.left^.location.reference),R_AX)))
+                               else
+                                 emit_reg_reg(A_MOV,S_W,p^.left^.location.register,R_AX);
+                           1 : if is_mem then
+                                 exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_B,
+                                   newreference(p^.left^.location.reference),R_AL)))
+                               else
+                                 emit_reg_reg(A_MOV,S_B,p^.left^.location.register,R_AL);
+                          end;
+                        end;
+           pointerdef,
+           procvardef : begin
+                          if is_mem then
+                            exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
                               newreference(p^.left^.location.reference),R_EAX)))
                           else
-                            emit_reg_reg(A_MOV,S_L,p^.left^.location.register,R_EAX);
-                       end
-                     else
-                       if is_mem then
-                         floatload(pfloatdef(procinfo.retdef)^.typ,p^.left^.location.reference);
-                end;
+                            exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,S_L,
+                              p^.left^.location.register,R_EAX)));
+                        end;
+             floatdef : begin
+                          if pfloatdef(procinfo.retdef)^.typ=f32bit then
+                           begin
+                             if is_mem then
+                               exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                                 newreference(p^.left^.location.reference),R_EAX)))
+                             else
+                               emit_reg_reg(A_MOV,S_L,p^.left^.location.register,R_EAX);
+                           end
+                          else
+                           if is_mem then
+                            floatload(pfloatdef(procinfo.retdef)^.typ,p^.left^.location.reference);
+                        end;
+              end;
 do_jmp:
               truelabel:=otlabel;
               falselabel:=oflabel;
@@ -737,13 +738,19 @@ do_jmp:
 end.
 {
   $Log$
-  Revision 1.12  1998-08-28 10:56:58  peter
+  Revision 1.13  1998-09-01 12:47:58  peter
+    * use pdef^.size instead of orddef^.typ
+
+  Revision 1.12  1998/08/28 10:56:58  peter
     * removed warnings
 
   Revision 1.11  1998/08/05 16:00:10  florian
     * some fixes for ansi strings
     * $log$ to $Log$
-    * $log$ to Revision 1.12  1998-08-28 10:56:58  peter
+    * $log$ to Revision 1.13  1998-09-01 12:47:58  peter
+    * $log$ to   * use pdef^.size instead of orddef^.typ
+    * $log$ to
+    * $log$ to Revision 1.12  1998/08/28 10:56:58  peter
     * $log$ to   * removed warnings
     * $log$ to changed
 

+ 13 - 12
compiler/cg68kcal.pas

@@ -219,15 +219,14 @@ implementation
                                   tempreference:=p^.left^.location.reference;
                                   del_reference(p^.left^.location.reference);
                                   case p^.resulttype^.deftype of
+                                    enumdef,
                                      orddef : begin
-                                                   case porddef(p^.resulttype)^.typ of
-                                                      s32bit,u32bit :
-                                                        begin
+                                                   case p^.resulttype^.size of
+                                                    4 : begin
                                                            emit_push_mem(tempreference);
                                                            inc(pushedparasize,4);
                                                         end;
-                                                      s8bit,u8bit,uchar,bool8bit:
-                                                      Begin
+                                                    1 : Begin
                                                           { We push a BUT, the SP is incremented by 2      }
                                                           { as specified in the Motorola Prog's Ref Manual }
                                                           { Therefore offet increments BY 2!!!             }
@@ -258,14 +257,13 @@ implementation
                                                              newreference(tempreference),R_SPPUSH))); }
                                                           end;
                                                           inc(pushedparasize,2);
-
-                                                      end;
-                                                      s16bit,u16bit : begin
+                                                        end;
+                                                    2 : begin
                                                           exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_W,
                                                             newreference(tempreference),R_SPPUSH)));
                                                           inc(pushedparasize,2);
-                                                      end;
-                                                    end;
+                                                        end;
+                                                   end;
                                               end;
                                      floatdef : begin
                                                    case pfloatdef(p^.resulttype)^.typ of
@@ -302,7 +300,7 @@ implementation
                                                    end;
                                                 end;
                                      pointerdef,procvardef,
-                                         enumdef,classrefdef:  begin
+                                         classrefdef:  begin
                                                       emit_push_mem(tempreference);
                                                       inc(pushedparasize,4);
                                                    end;
@@ -1048,7 +1046,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.1  1998-09-01 09:07:09  peter
+  Revision 1.2  1998-09-01 12:47:59  peter
+    * use pdef^.size instead of orddef^.typ
+
+  Revision 1.1  1998/09/01 09:07:09  peter
     * m68k fixes, splitted cg68k like cgi386
 
 }

+ 71 - 74
compiler/cg68kflw.pas

@@ -404,85 +404,79 @@ implementation
                             end;
                  else internalerror(2001);
               end;
-              if (procinfo.retdef^.deftype=orddef) then
-                begin
-                   case porddef(procinfo.retdef)^.typ of
-                      s32bit,u32bit,bool32bit : if is_mem then
-                                        exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,
-                                          newreference(p^.left^.location.reference),R_D0)))
-                                      else
-                                        emit_reg_reg(A_MOVE,S_L,
-                                          p^.left^.location.register,R_D0);
-                      u8bit,s8bit,uchar,bool8bit : if is_mem then
-                                        exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_B,
-                                          newreference(p^.left^.location.reference),R_D0)))
-                                      else
-                                        emit_reg_reg(A_MOVE,S_B,
-                                          p^.left^.location.register,R_D0);
-                      s16bit,u16bit,bool16bit : if is_mem then
-                                        exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_W,
-                                          newreference(p^.left^.location.reference),R_D0)))
-                                      else
-                                        emit_reg_reg(A_MOVE,S_W,
-                                          p^.left^.location.register,R_D0);
-                   end;
-                end
-               else
-                 if (procinfo.retdef^.deftype in
-                     [pointerdef,enumdef,procvardef]) then
-                   begin
-                      if is_mem then
-                        exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,
-                          newreference(p^.left^.location.reference),R_D0)))
-                      else
-                        exprasmlist^.concat(new(pai68k,op_reg_reg(A_MOVE,S_L,
-                          p^.left^.location.register,R_D0)));
-                   end
-              else
-                if (procinfo.retdef^.deftype=floatdef) then
-            { floating point return values .... }
-            { single are returned in d0         }
-                  begin
-                     if (pfloatdef(procinfo.retdef)^.typ=f32bit) or
-                   (pfloatdef(procinfo.retdef)^.typ=s32real) then
-                       begin
+              case procinfo.retdef^.deftype of
+               orddef,
+              enumdef : begin
+                          case procinfo.retdef^.size of
+                           4 : if is_mem then
+                                 exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,
+                                   newreference(p^.left^.location.reference),R_D0)))
+                               else
+                                 emit_reg_reg(A_MOVE,S_L,p^.left^.location.register,R_D0);
+                           2 : if is_mem then
+                                 exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_W,
+                                   newreference(p^.left^.location.reference),R_D0)))
+                               else
+                                 emit_reg_reg(A_MOVE,S_W,p^.left^.location.register,R_D0);
+                           1 : if is_mem then
+                                 exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_B,
+                                   newreference(p^.left^.location.reference),R_D0)))
+                               else
+                                 emit_reg_reg(A_MOVE,S_B,p^.left^.location.register,R_D0);
+                          end;
+                        end;
+           pointerdef,
+           procvardef : begin
                           if is_mem then
                             exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,
                               newreference(p^.left^.location.reference),R_D0)))
                           else
-                            begin
-                               if pfloatdef(procinfo.retdef)^.typ=f32bit then
-                                  emit_reg_reg(A_MOVE,S_L,p^.left^.location.register,R_D0)
-                               else
-                                  begin
-                                     { single values are in the floating point registers }
-                                     if cs_fp_emulation in aktmoduleswitches then
-                                        emit_reg_reg(A_MOVE,S_L,p^.left^.location.fpureg,R_D0)
-                                     else
-                                        exprasmlist^.concat(new(pai68k,op_reg_reg(A_FMOVE,S_FS,
-                                           p^.left^.location.fpureg,R_D0)));
-                                  end;
-                            end;
-                       end
-                     else
-                       Begin
-                         { this is only possible in real non emulation mode }
-                         { LOC_MEM,LOC_REFERENCE }
-                         if is_mem then
+                            exprasmlist^.concat(new(pai68k,op_reg_reg(A_MOVE,S_L,p^.left^.location.register,R_D0)));
+                        end
+             floatdef : begin
+                          { floating point return values .... }
+                          { single are returned in d0         }
+                          if (pfloatdef(procinfo.retdef)^.typ=f32bit) or
+                             (pfloatdef(procinfo.retdef)^.typ=s32real) then
                            begin
-                               exprasmlist^.concat(new(pai68k,op_ref_reg(A_FMOVE,
+                             if is_mem then
+                               exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,
+                                 newreference(p^.left^.location.reference),R_D0)))
+                             else
+                               begin
+                                 if pfloatdef(procinfo.retdef)^.typ=f32bit then
+                                   emit_reg_reg(A_MOVE,S_L,p^.left^.location.register,R_D0)
+                                 else
+                                   begin
+                                      { single values are in the floating point registers }
+                                      if cs_fp_emulation in aktmoduleswitches then
+                                         emit_reg_reg(A_MOVE,S_L,p^.left^.location.fpureg,R_D0)
+                                      else
+                                         exprasmlist^.concat(new(pai68k,op_reg_reg(A_FMOVE,S_FS,
+                                            p^.left^.location.fpureg,R_D0)));
+                                   end;
+                               end;
+                           end
+                          else
+                           Begin
+                             { this is only possible in real non emulation mode }
+                             { LOC_MEM,LOC_REFERENCE }
+                             if is_mem then
+                              begin
+                                exprasmlist^.concat(new(pai68k,op_ref_reg(A_FMOVE,
                                   getfloatsize(pfloatdef(procinfo.retdef)^.typ),
                                     newreference(p^.left^.location.reference),R_FP0)));
-                           end
-                         else
-                          { LOC_FPU }
-                            begin
-                               { convert from extended to correct type }
-                               { when storing                          }
-                               exprasmlist^.concat(new(pai68k,op_reg_reg(A_FMOVE,
-                                 getfloatsize(pfloatdef(procinfo.retdef)^.typ),p^.left^.location.fpureg,R_FP0)));
-                            end;
-                       end;
+                              end
+                             else
+                             { LOC_FPU }
+                              begin
+                                { convert from extended to correct type }
+                                { when storing                          }
+                                exprasmlist^.concat(new(pai68k,op_reg_reg(A_FMOVE,
+                                  getfloatsize(pfloatdef(procinfo.retdef)^.typ),p^.left^.location.fpureg,R_FP0)));
+                              end;
+                           end;
+                        end;
               end;
 do_jmp:
               truelabel:=otlabel;
@@ -604,7 +598,7 @@ do_jmp:
 
       begin
         InternalError(3431243);
-(*      
+(*
          { this can be called recursivly }
          oldendexceptlabel:=endexceptlabel;
          { we modify EAX }
@@ -782,7 +776,10 @@ do_jmp:
 end.
 {
   $Log$
-  Revision 1.1  1998-09-01 09:07:09  peter
+  Revision 1.2  1998-09-01 12:48:01  peter
+    * use pdef^.size instead of orddef^.typ
+
+  Revision 1.1  1998/09/01 09:07:09  peter
     * m68k fixes, splitted cg68k like cgi386
 
 }

+ 9 - 9
compiler/cga68k.pas

@@ -767,15 +767,12 @@ begin
                         reset_reference(hr^);
                         hr^.offset:=procinfo.retoffset;
                         hr^.base:=procinfo.framepointer;
-                        if (procinfo.retdef^.deftype=orddef) then
+                        if (procinfo.retdef^.deftype in [orddef,enumdef]) then
                             begin
-                                case porddef(procinfo.retdef)^.typ of
-                                    s32bit,u32bit :
-                                        procinfo.aktexitcode^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,hr,R_D0)));
-                                    u8bit,s8bit,uchar,bool8bit :
-                                        procinfo.aktexitcode^.concat(new(pai68k,op_ref_reg(A_MOVE,S_B,hr,R_D0)));
-                                    s16bit,u16bit :
-                                        procinfo.aktexitcode^.concat(new(pai68k,op_ref_reg(A_MOVE,S_W,hr,R_D0)));
+                                case procinfo.retdef^.size of
+                                 4 : procinfo.aktexitcode^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,hr,R_D0)));
+                                 2 : procinfo.aktexitcode^.concat(new(pai68k,op_ref_reg(A_MOVE,S_W,hr,R_D0)));
+                                 1 : procinfo.aktexitcode^.concat(new(pai68k,op_ref_reg(A_MOVE,S_B,hr,R_D0)));
                                 end;
                             end
                         else
@@ -1348,7 +1345,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.12  1998-09-01 09:07:09  peter
+  Revision 1.13  1998-09-01 12:48:02  peter
+    * use pdef^.size instead of orddef^.typ
+
+  Revision 1.12  1998/09/01 09:07:09  peter
     * m68k fixes, splitted cg68k like cgi386
 
   Revision 1.11  1998/08/31 12:26:24  peter