mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-03 09:18:43 +02: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