mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 07:43:04 +01:00 
			
		
		
		
	* use pdef^.size instead of orddef^.typ
This commit is contained in:
		
							parent
							
								
									19bf2df53a
								
							
						
					
					
						commit
						1ce8f6f825
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user