* 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;
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

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -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