mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-12 00:09:32 +02:00
* fixing index overflow in handling new registers arrays.
This commit is contained in:
parent
dd0d04e20f
commit
a33dd56d81
@ -761,17 +761,20 @@ begin
|
|||||||
LastInsOffset:=-1;
|
LastInsOffset:=-1;
|
||||||
end;
|
end;
|
||||||
procedure TAiCpu.SetCondition(const c:TAsmCond);
|
procedure TAiCpu.SetCondition(const c:TAsmCond);
|
||||||
|
const
|
||||||
|
AsmCond2OpCode:array[TAsmCond]of TAsmOp=
|
||||||
|
(A_BN,A_BNE,A_BE,A_BG,A_BLE,A_BGE,A_BI,A_BGU,A_BLEU,A_BCC,
|
||||||
|
A_BCS,A_BPOS,A_NEG,A_BVC,A_BVS,A_BA,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE);
|
||||||
begin
|
begin
|
||||||
inherited SetCondition(c);
|
inherited SetCondition(c);
|
||||||
if Opcode=A_BA
|
if Opcode=A_BA
|
||||||
then
|
then
|
||||||
begin
|
begin
|
||||||
is_jmp:=true;
|
is_jmp:=true;
|
||||||
case c of
|
Opcode:=AsmCond2OpCode[c];
|
||||||
C_NE:Opcode:=A_BNE;
|
{$IFDEF EXTDEBUG}
|
||||||
else
|
WriteLn('In TAiCpu.SetCondition TAsmCond=',Byte(Opcode),'==>',std_op2str[AsmCond2OpCode[c]]);
|
||||||
InternalError(2003021800);
|
{$ENDIF EXTDEBUG}
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
function taicpu.NeedAddrPrefix(opidx:byte):boolean;
|
function taicpu.NeedAddrPrefix(opidx:byte):boolean;
|
||||||
@ -1093,7 +1096,10 @@ procedure InitAsm;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.17 2003-02-18 22:00:20 mazen
|
Revision 1.18 2003-03-10 21:59:54 mazen
|
||||||
|
* fixing index overflow in handling new registers arrays.
|
||||||
|
|
||||||
|
Revision 1.17 2003/02/18 22:00:20 mazen
|
||||||
* asm condition generation modified by TAiCpu.SetCondition
|
* asm condition generation modified by TAiCpu.SetCondition
|
||||||
|
|
||||||
Revision 1.16 2003/01/08 18:43:58 daniel
|
Revision 1.16 2003/01/08 18:43:58 daniel
|
||||||
|
@ -408,12 +408,27 @@ procedure TCgSparc.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TCgSparc.a_loadfpu_reg_ref(list:TAasmOutput;size:tcgsize;reg:tregister;CONST ref:TReference);
|
procedure TCgSparc.a_loadfpu_reg_ref(list:TAasmOutput;size:tcgsize;reg:tregister;const ref:TReference);
|
||||||
|
const
|
||||||
|
FpuStoreInstr: Array[OS_F32..OS_F64,boolean, boolean] of TAsmOp =
|
||||||
|
{ indexed? updating?}
|
||||||
|
(((A_STF,A_STF),(A_STF,A_STF)),
|
||||||
|
((A_STDF,A_STDF),(A_STDF,A_STDF)));
|
||||||
|
var
|
||||||
|
op: tasmop;
|
||||||
|
ref2: treference;
|
||||||
|
freereg: boolean;
|
||||||
begin
|
begin
|
||||||
{ if reg <> R_ST then
|
if not(size in [OS_F32,OS_F64])
|
||||||
a_loadfpu_reg_reg(list,reg,R_ST);}
|
then
|
||||||
floatstore(list,size,ref);
|
internalerror(200201122);
|
||||||
|
{ ref2:=ref;
|
||||||
|
freereg:=fixref(list,ref2);
|
||||||
|
op:=fpustoreinstr[size,ref2.index.enum <> R_NO,false];
|
||||||
|
a_load_store(list,op,reg,ref2);
|
||||||
|
if freereg
|
||||||
|
then
|
||||||
|
cg.free_scratch_reg(list,ref2.base);}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -1214,7 +1229,7 @@ procedure TCgSparc.g_concatcopy(list:taasmoutput;const source,dest:treference;le
|
|||||||
objectlibrary.getlabel(lab);
|
objectlibrary.getlabel(lab);
|
||||||
a_label(list, lab);
|
a_label(list, lab);
|
||||||
list.concat(taicpu.op_reg_const_reg(A_SUB,countreg,1,countreg));
|
list.concat(taicpu.op_reg_const_reg(A_SUB,countreg,1,countreg));
|
||||||
list.concat(taicpu.op_reg_ref(A_LDF,r,src));
|
list.concat(taicpu.op_ref_reg(A_LDF,src,r));
|
||||||
list.concat(taicpu.op_reg_ref(A_STD,r,dst));
|
list.concat(taicpu.op_reg_ref(A_STD,r,dst));
|
||||||
//a_jmp(list,A_BC,C_NE,0,lab);
|
//a_jmp(list,A_BC,C_NE,0,lab);
|
||||||
free_scratch_reg(list,countreg);
|
free_scratch_reg(list,countreg);
|
||||||
@ -1410,7 +1425,10 @@ BEGIN
|
|||||||
END.
|
END.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.40 2003-02-25 21:41:44 mazen
|
Revision 1.41 2003-03-10 21:59:54 mazen
|
||||||
|
* fixing index overflow in handling new registers arrays.
|
||||||
|
|
||||||
|
Revision 1.40 2003/02/25 21:41:44 mazen
|
||||||
* code re-aligned 2 spaces
|
* code re-aligned 2 spaces
|
||||||
|
|
||||||
Revision 1.39 2003/02/19 22:00:16 daniel
|
Revision 1.39 2003/02/19 22:00:16 daniel
|
||||||
|
@ -207,8 +207,8 @@ TYPE
|
|||||||
Tsupregset=set of Tsuperregister;
|
Tsupregset=set of Tsuperregister;
|
||||||
CONST
|
CONST
|
||||||
R_NO=R_NONE;
|
R_NO=R_NONE;
|
||||||
firstreg = R_G0;
|
firstreg = Succ(R_NONE);
|
||||||
lastreg = R_I7;
|
lastreg = Pred(R_INTREGISTER);
|
||||||
|
|
||||||
{General registers.}
|
{General registers.}
|
||||||
|
|
||||||
@ -466,8 +466,8 @@ const
|
|||||||
lastsaveintreg = RS_I7;
|
lastsaveintreg = RS_I7;
|
||||||
firstsavefpureg = R_F0;
|
firstsavefpureg = R_F0;
|
||||||
lastsavefpureg = R_F31;
|
lastsavefpureg = R_F31;
|
||||||
firstsavemmreg = R_I0;
|
firstsavemmreg = R_NONE;
|
||||||
lastsavemmreg = R_I7;
|
lastsavemmreg = R_NONE;
|
||||||
lowsavereg = R_G0;
|
lowsavereg = R_G0;
|
||||||
highsavereg = R_I7;
|
highsavereg = R_I7;
|
||||||
|
|
||||||
@ -676,7 +676,10 @@ END.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.24 2003-02-26 22:06:27 mazen
|
Revision 1.25 2003-03-10 21:59:54 mazen
|
||||||
|
* fixing index overflow in handling new registers arrays.
|
||||||
|
|
||||||
|
Revision 1.24 2003/02/26 22:06:27 mazen
|
||||||
* FirstReg <-- R_G0 instead of Low(TOldRegister)=R_NONE
|
* FirstReg <-- R_G0 instead of Low(TOldRegister)=R_NONE
|
||||||
* LastReg <-- R_L7 instead of High(R_ASR31)=High(TOldRegister)
|
* LastReg <-- R_L7 instead of High(R_ASR31)=High(TOldRegister)
|
||||||
* FirstReg..LastReg rplaced by TOldRegister in several arrays declarions
|
* FirstReg..LastReg rplaced by TOldRegister in several arrays declarions
|
||||||
|
@ -57,18 +57,18 @@ procedure TSparcAddNode.clear_left_right(cmpop:Boolean);
|
|||||||
if(right.location.loc in [LOC_REGISTER,LOC_FPUREGISTER])and(cmpop or(location.register.enum <> right.location.register.enum))
|
if(right.location.loc in [LOC_REGISTER,LOC_FPUREGISTER])and(cmpop or(location.register.enum <> right.location.register.enum))
|
||||||
then
|
then
|
||||||
begin
|
begin
|
||||||
rg.ungetregister(exprasmlist,right.location.register);
|
rg.UnGetRegisterInt(exprasmlist,right.location.register);
|
||||||
if is_64bitint(right.resulttype.def)
|
if is_64bitint(right.resulttype.def)
|
||||||
then
|
then
|
||||||
rg.ungetregister(exprasmlist,right.location.registerhigh);
|
rg.UnGetRegisterInt(exprasmlist,right.location.registerhigh);
|
||||||
end;
|
end;
|
||||||
if(left.location.loc in [LOC_REGISTER,LOC_FPUREGISTER])and(cmpop or(location.register.enum <> left.location.register.enum))
|
if(left.location.loc in [LOC_REGISTER,LOC_FPUREGISTER])and(cmpop or(location.register.enum <> left.location.register.enum))
|
||||||
then
|
then
|
||||||
begin
|
begin
|
||||||
rg.ungetregister(exprasmlist,left.location.register);
|
rg.UnGetRegisterInt(exprasmlist,left.location.register);
|
||||||
if is_64bitint(left.resulttype.def)
|
if is_64bitint(left.resulttype.def)
|
||||||
then
|
then
|
||||||
rg.ungetregister(exprasmlist,left.location.registerhigh);
|
rg.UnGetRegisterInt(exprasmlist,left.location.registerhigh);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
procedure TSparcAddNode.second_addboolean;
|
procedure TSparcAddNode.second_addboolean;
|
||||||
@ -930,7 +930,7 @@ procedure TSparcAddNode.second_addfloat;
|
|||||||
r,left.location.register,right.location.register))
|
r,left.location.register,right.location.register))
|
||||||
end;
|
end;
|
||||||
|
|
||||||
clear_left_right(cmpop);
|
// clear_left_right(cmpop);
|
||||||
end;
|
end;
|
||||||
procedure TSparcAddNode.set_result_location(cmpOp,unsigned:Boolean);
|
procedure TSparcAddNode.set_result_location(cmpOp,unsigned:Boolean);
|
||||||
begin
|
begin
|
||||||
@ -1111,7 +1111,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.10 2003-02-19 22:00:17 daniel
|
Revision 1.11 2003-03-10 21:59:54 mazen
|
||||||
|
* fixing index overflow in handling new registers arrays.
|
||||||
|
|
||||||
|
Revision 1.10 2003/02/19 22:00:17 daniel
|
||||||
* Code generator converted to new register notation
|
* Code generator converted to new register notation
|
||||||
- Horribily outdated todo.txt removed
|
- Horribily outdated todo.txt removed
|
||||||
|
|
||||||
|
@ -238,7 +238,7 @@ procedure TSparctypeconvnode.second_int_to_real;
|
|||||||
if(left.location.loc = LOC_REGISTER) or
|
if(left.location.loc = LOC_REGISTER) or
|
||||||
((left.location.loc = LOC_CREGISTER) and not signed)
|
((left.location.loc = LOC_CREGISTER) and not signed)
|
||||||
then
|
then
|
||||||
rg.ungetregister(exprasmlist,leftreg)
|
rg.UnGetRegisterInt(exprasmlist,leftreg)
|
||||||
else
|
else
|
||||||
cg.free_scratch_reg(exprasmlist,valuereg);
|
cg.free_scratch_reg(exprasmlist,valuereg);
|
||||||
tmpfpureg := rg.getregisterfpu(exprasmlist);
|
tmpfpureg := rg.getregisterfpu(exprasmlist);
|
||||||
@ -300,7 +300,7 @@ procedure TSparctypeconvnode.second_int_to_bool;
|
|||||||
hreg1 := rg.getregisterint(exprasmlist,opsize);
|
hreg1 := rg.getregisterint(exprasmlist,opsize);
|
||||||
exprasmlist.concat(taicpu.op_reg_const_reg(A_SUB,hreg1,1,hreg2));
|
exprasmlist.concat(taicpu.op_reg_const_reg(A_SUB,hreg1,1,hreg2));
|
||||||
exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,hreg1,hreg1,hreg2));
|
exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,hreg1,hreg1,hreg2));
|
||||||
rg.ungetregister(exprasmlist,hreg2);
|
rg.UnGetRegisterInt(exprasmlist,hreg2);
|
||||||
end;
|
end;
|
||||||
LOC_FLAGS :
|
LOC_FLAGS :
|
||||||
begin
|
begin
|
||||||
@ -388,7 +388,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.12 2003-02-19 22:00:17 daniel
|
Revision 1.13 2003-03-10 21:59:54 mazen
|
||||||
|
* fixing index overflow in handling new registers arrays.
|
||||||
|
|
||||||
|
Revision 1.12 2003/02/19 22:00:17 daniel
|
||||||
* Code generator converted to new register notation
|
* Code generator converted to new register notation
|
||||||
- Horribily outdated todo.txt removed
|
- Horribily outdated todo.txt removed
|
||||||
|
|
||||||
|
@ -140,14 +140,14 @@ implementation
|
|||||||
begin
|
begin
|
||||||
exprasmlist.concat(taicpu.op_reg_reg_reg(A_SMUL,resultreg,
|
exprasmlist.concat(taicpu.op_reg_reg_reg(A_SMUL,resultreg,
|
||||||
divider,resultreg));
|
divider,resultreg));
|
||||||
rg.ungetregister(exprasmlist,divider);
|
rg.UnGetRegisterInt(exprasmlist,divider);
|
||||||
exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register,
|
exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register,
|
||||||
numerator,resultreg));
|
numerator,resultreg));
|
||||||
cg.free_scratch_reg(exprasmlist,resultreg);
|
cg.free_scratch_reg(exprasmlist,resultreg);
|
||||||
resultreg := location.register;
|
resultreg := location.register;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
rg.ungetregister(exprasmlist,divider);
|
rg.UnGetRegisterInt(exprasmlist,divider);
|
||||||
end;
|
end;
|
||||||
{ free used registers }
|
{ free used registers }
|
||||||
if numerator.enum <> resultreg.enum then
|
if numerator.enum <> resultreg.enum then
|
||||||
@ -263,12 +263,12 @@ procedure tSparcshlshrnode.pass_2;
|
|||||||
exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,R_0,hregisterlow,R_0));
|
exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,R_0,hregisterlow,R_0));
|
||||||
exprasmlist.concat(taicpu.op_reg_reg_reg(A_OR,location.registerhigh,location.registerhigh,R_0));
|
exprasmlist.concat(taicpu.op_reg_reg_reg(A_OR,location.registerhigh,location.registerhigh,R_0));
|
||||||
exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,location.registerlow,hregisterlow,hregister1));}
|
exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,location.registerlow,hregisterlow,hregister1));}
|
||||||
rg.ungetregister(exprasmlist,r);
|
rg.UnGetRegisterInt(exprasmlist,r);
|
||||||
if right.location.loc in [LOC_CREFERENCE,LOC_REFERENCE]
|
if right.location.loc in [LOC_CREFERENCE,LOC_REFERENCE]
|
||||||
then
|
then
|
||||||
cg.free_scratch_reg(exprasmlist,hregister1)
|
cg.free_scratch_reg(exprasmlist,hregister1)
|
||||||
else
|
else
|
||||||
rg.ungetregister(exprasmlist,hregister1);
|
rg.UnGetRegisterInt(exprasmlist,hregister1);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -301,7 +301,7 @@ procedure tSparcshlshrnode.pass_2;
|
|||||||
location_force_reg(exprasmlist,right.location,def_cgsize(right.resulttype.def),true);
|
location_force_reg(exprasmlist,right.location,def_cgsize(right.resulttype.def),true);
|
||||||
hregister2 := right.location.register;
|
hregister2 := right.location.register;
|
||||||
cg.a_op_reg_reg_reg(exprasmlist,op,OS_32,hregister2,hregister1,resultreg);
|
cg.a_op_reg_reg_reg(exprasmlist,op,OS_32,hregister2,hregister1,resultreg);
|
||||||
rg.ungetregister(exprasmlist,hregister2);
|
rg.UnGetRegisterInt(exprasmlist,hregister2);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -478,7 +478,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.5 2003-02-19 22:00:17 daniel
|
Revision 1.6 2003-03-10 21:59:54 mazen
|
||||||
|
* fixing index overflow in handling new registers arrays.
|
||||||
|
|
||||||
|
Revision 1.5 2003/02/19 22:00:17 daniel
|
||||||
* Code generator converted to new register notation
|
* Code generator converted to new register notation
|
||||||
- Horribily outdated todo.txt removed
|
- Horribily outdated todo.txt removed
|
||||||
|
|
||||||
|
@ -56,10 +56,10 @@ var r:Tregister;
|
|||||||
else result := inherited GetExplicitRegisterInt(list,reg);
|
else result := inherited GetExplicitRegisterInt(list,reg);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure trgcpu.UngetregisterInt(list: taasmoutput; reg: tregister);
|
procedure trgcpu.UngetRegisterInt(list:taasmoutput;reg:tregister);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
if reg.enum<>R_INTREGISTER then
|
if reg.enum<>R_INTREGISTER
|
||||||
|
then
|
||||||
internalerror(200302191);
|
internalerror(200302191);
|
||||||
if (reg.number=RS_O7) or (reg.number=NR_I7)
|
if (reg.number=RS_O7) or (reg.number=NR_I7)
|
||||||
then
|
then
|
||||||
@ -67,13 +67,15 @@ procedure trgcpu.UngetregisterInt(list: taasmoutput; reg: tregister);
|
|||||||
else
|
else
|
||||||
inherited ungetregisterint(list,reg);
|
inherited ungetregisterint(list,reg);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
rg := trgcpu.create;
|
rg := trgcpu.create;
|
||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.6 2003-02-19 22:00:17 daniel
|
Revision 1.7 2003-03-10 21:59:54 mazen
|
||||||
|
* fixing index overflow in handling new registers arrays.
|
||||||
|
|
||||||
|
Revision 1.6 2003/02/19 22:00:17 daniel
|
||||||
* Code generator converted to new register notation
|
* Code generator converted to new register notation
|
||||||
- Horribily outdated todo.txt removed
|
- Horribily outdated todo.txt removed
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user