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

This commit is contained in:
peter 1998-09-01 12:47:57 +00:00
parent 19bf2df53a
commit 1ce8f6f825
5 changed files with 171 additions and 163 deletions

View File

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

View File

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

View File

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

View File

@ -404,85 +404,79 @@ implementation
end; end;
else internalerror(2001); else internalerror(2001);
end; end;
if (procinfo.retdef^.deftype=orddef) then case procinfo.retdef^.deftype of
begin orddef,
case porddef(procinfo.retdef)^.typ of enumdef : begin
s32bit,u32bit,bool32bit : if is_mem then case procinfo.retdef^.size of
exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L, 4 : if is_mem then
newreference(p^.left^.location.reference),R_D0))) exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,
else newreference(p^.left^.location.reference),R_D0)))
emit_reg_reg(A_MOVE,S_L, else
p^.left^.location.register,R_D0); emit_reg_reg(A_MOVE,S_L,p^.left^.location.register,R_D0);
u8bit,s8bit,uchar,bool8bit : if is_mem then 2 : if is_mem then
exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_B, exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_W,
newreference(p^.left^.location.reference),R_D0))) newreference(p^.left^.location.reference),R_D0)))
else else
emit_reg_reg(A_MOVE,S_B, emit_reg_reg(A_MOVE,S_W,p^.left^.location.register,R_D0);
p^.left^.location.register,R_D0); 1 : if is_mem then
s16bit,u16bit,bool16bit : if is_mem then exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_B,
exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_W, newreference(p^.left^.location.reference),R_D0)))
newreference(p^.left^.location.reference),R_D0))) else
else emit_reg_reg(A_MOVE,S_B,p^.left^.location.register,R_D0);
emit_reg_reg(A_MOVE,S_W, end;
p^.left^.location.register,R_D0); end;
end; pointerdef,
end procvardef : begin
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
if is_mem then if is_mem then
exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L, exprasmlist^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,
newreference(p^.left^.location.reference),R_D0))) newreference(p^.left^.location.reference),R_D0)))
else else
begin exprasmlist^.concat(new(pai68k,op_reg_reg(A_MOVE,S_L,p^.left^.location.register,R_D0)));
if pfloatdef(procinfo.retdef)^.typ=f32bit then end
emit_reg_reg(A_MOVE,S_L,p^.left^.location.register,R_D0) floatdef : begin
else { floating point return values .... }
begin { single are returned in d0 }
{ single values are in the floating point registers } if (pfloatdef(procinfo.retdef)^.typ=f32bit) or
if cs_fp_emulation in aktmoduleswitches then (pfloatdef(procinfo.retdef)^.typ=s32real) 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 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), getfloatsize(pfloatdef(procinfo.retdef)^.typ),
newreference(p^.left^.location.reference),R_FP0))); newreference(p^.left^.location.reference),R_FP0)));
end end
else else
{ LOC_FPU } { LOC_FPU }
begin begin
{ convert from extended to correct type } { convert from extended to correct type }
{ when storing } { when storing }
exprasmlist^.concat(new(pai68k,op_reg_reg(A_FMOVE, exprasmlist^.concat(new(pai68k,op_reg_reg(A_FMOVE,
getfloatsize(pfloatdef(procinfo.retdef)^.typ),p^.left^.location.fpureg,R_FP0))); getfloatsize(pfloatdef(procinfo.retdef)^.typ),p^.left^.location.fpureg,R_FP0)));
end; end;
end; end;
end;
end; end;
do_jmp: do_jmp:
truelabel:=otlabel; truelabel:=otlabel;
@ -604,7 +598,7 @@ do_jmp:
begin begin
InternalError(3431243); InternalError(3431243);
(* (*
{ this can be called recursivly } { this can be called recursivly }
oldendexceptlabel:=endexceptlabel; oldendexceptlabel:=endexceptlabel;
{ we modify EAX } { we modify EAX }
@ -782,7 +776,10 @@ do_jmp:
end. end.
{ {
$Log$ $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 * m68k fixes, splitted cg68k like cgi386
} }

View File

@ -767,15 +767,12 @@ begin
reset_reference(hr^); reset_reference(hr^);
hr^.offset:=procinfo.retoffset; hr^.offset:=procinfo.retoffset;
hr^.base:=procinfo.framepointer; hr^.base:=procinfo.framepointer;
if (procinfo.retdef^.deftype=orddef) then if (procinfo.retdef^.deftype in [orddef,enumdef]) then
begin begin
case porddef(procinfo.retdef)^.typ of case procinfo.retdef^.size of
s32bit,u32bit : 4 : procinfo.aktexitcode^.concat(new(pai68k,op_ref_reg(A_MOVE,S_L,hr,R_D0)));
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)));
u8bit,s8bit,uchar,bool8bit : 1 : procinfo.aktexitcode^.concat(new(pai68k,op_ref_reg(A_MOVE,S_B,hr,R_D0)));
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)));
end; end;
end end
else else
@ -1348,7 +1345,10 @@ end;
end. end.
{ {
$Log$ $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 * m68k fixes, splitted cg68k like cgi386
Revision 1.11 1998/08/31 12:26:24 peter Revision 1.11 1998/08/31 12:26:24 peter