diff --git a/compiler/cg386cal.pas b/compiler/cg386cal.pas index 3edfb8257c..de193d09c8 100644 --- a/compiler/cg386cal.pas +++ b/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 diff --git a/compiler/cg386flw.pas b/compiler/cg386flw.pas index aa18921511..3f65f7a6e9 100644 --- a/compiler/cg386flw.pas +++ b/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 diff --git a/compiler/cg68kcal.pas b/compiler/cg68kcal.pas index ebe054e3b7..8d9b149987 100644 --- a/compiler/cg68kcal.pas +++ b/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 } diff --git a/compiler/cg68kflw.pas b/compiler/cg68kflw.pas index 26aed9d522..c5aa7a7b2c 100644 --- a/compiler/cg68kflw.pas +++ b/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 } diff --git a/compiler/cga68k.pas b/compiler/cga68k.pas index 239f5107d6..bc34198259 100644 --- a/compiler/cga68k.pas +++ b/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