mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-27 20:54:30 +02:00
* fixed second_int_to_bool() (but still problem with typecasts used for
var parameters, not sure about solution)
This commit is contained in:
parent
b993c4e2db
commit
f616bfd3e2
@ -102,7 +102,7 @@ implementation
|
||||
result := nil;
|
||||
if registersfpu<1 then
|
||||
registersfpu:=1;
|
||||
location.loc:=LOC_FPUREGISTER;
|
||||
expectloc:=LOC_FPUREGISTER;
|
||||
end;
|
||||
|
||||
|
||||
@ -271,6 +271,12 @@ implementation
|
||||
resflags : tresflags;
|
||||
opsize : tcgsize;
|
||||
begin
|
||||
(*
|
||||
!!!!!!!!!!!!!!!!!!
|
||||
Causes problems with "boolvar := boolean(bytevar)" on the ppc
|
||||
(the conversion isn't done in that case), don't know why it works
|
||||
on the 80x86 (JM)
|
||||
|
||||
{ byte(boolean) or word(wordbool) or longint(longbool) must }
|
||||
{ be accepted for var parameters }
|
||||
if (nf_explicit in flags) and
|
||||
@ -280,7 +286,11 @@ implementation
|
||||
location_copy(location,left.location);
|
||||
exit;
|
||||
end;
|
||||
location_reset(location,LOC_REGISTER,def_cgsize(left.resulttype.def));
|
||||
*)
|
||||
secondpass(left);
|
||||
if codegenerror then
|
||||
exit;
|
||||
location_reset(location,LOC_REGISTER,def_cgsize(resulttype.def));
|
||||
opsize := def_cgsize(left.resulttype.def);
|
||||
case left.location.loc of
|
||||
LOC_CREFERENCE,LOC_REFERENCE,LOC_REGISTER,LOC_CREGISTER :
|
||||
@ -289,21 +299,19 @@ implementation
|
||||
begin
|
||||
reference_release(exprasmlist,left.location.reference);
|
||||
hreg2:=rg.getregisterint(exprasmlist,OS_INT);
|
||||
if left.location.size in [OS_64,OS_S64] then
|
||||
begin
|
||||
cg.a_load_ref_reg(exprasmlist,OS_INT,
|
||||
left.location.reference,hreg2);
|
||||
hreg1:=rg.getregisterint(exprasmlist,OS_INT);
|
||||
href:=left.location.reference;
|
||||
inc(href.offset,4);
|
||||
cg.a_load_ref_reg(exprasmlist,OS_INT,
|
||||
href,hreg1);
|
||||
cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg2,hreg2,hreg1);
|
||||
rg.ungetregisterint(exprasmlist,hreg1);
|
||||
{ it's shrunk down to 32 bit }
|
||||
location.size:=OS_32;
|
||||
if left.location.size in [OS_64,OS_S64] then
|
||||
begin
|
||||
cg.a_load_ref_reg(exprasmlist,OS_INT,
|
||||
left.location.reference,hreg2);
|
||||
hreg1:=rg.getregisterint(exprasmlist,OS_INT);
|
||||
href:=left.location.reference;
|
||||
inc(href.offset,4);
|
||||
cg.a_load_ref_reg(exprasmlist,OS_INT,
|
||||
href,hreg1);
|
||||
cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg2,hreg1,hreg2);
|
||||
rg.ungetregisterint(exprasmlist,hreg1);
|
||||
end
|
||||
else
|
||||
else
|
||||
cg.a_load_ref_reg(exprasmlist,opsize,
|
||||
left.location.reference,hreg2);
|
||||
end
|
||||
@ -312,10 +320,8 @@ implementation
|
||||
if left.location.size in [OS_64,OS_S64] then
|
||||
begin
|
||||
hreg2:=rg.getregisterint(exprasmlist,OS_32);
|
||||
cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg2,left.location.registerhigh,left.location.registerlow);
|
||||
cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,left.location.registerlow,hreg2);
|
||||
location_release(exprasmlist,left.location);
|
||||
{ it's shrunk down to 32 bit }
|
||||
location.size:=OS_32;
|
||||
end
|
||||
else
|
||||
hreg2 := left.location.register;
|
||||
@ -422,7 +428,11 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.34 2003-05-02 15:13:38 jonas
|
||||
Revision 1.35 2003-05-11 13:06:44 jonas
|
||||
* fixed second_int_to_bool() (but still problem with typecasts used for
|
||||
var parameters, not sure about solution)
|
||||
|
||||
Revision 1.34 2003/05/02 15:13:38 jonas
|
||||
* yet another final fix for second_int_to_real() :) (tested this time)
|
||||
|
||||
Revision 1.33 2003/04/24 22:29:58 florian
|
||||
|
Loading…
Reference in New Issue
Block a user