* changed reg2opsize to function

This commit is contained in:
peter 2003-03-18 18:15:53 +00:00
parent c5efd5c7d5
commit 3f0491bb38
4 changed files with 81 additions and 50 deletions

View File

@ -286,25 +286,6 @@ uses
regset16bit : tregisterset = [R_AX..R_DI,R_CS..R_SS]; regset16bit : tregisterset = [R_AX..R_DI,R_CS..R_SS];
regset32bit : tregisterset = [R_EAX..R_EDI]; regset32bit : tregisterset = [R_EAX..R_EDI];
{ Convert reg to opsize }
reg2opsize : array[firstreg..lastreg] of topsize = (S_NO,
S_L,S_L,S_L,S_L,S_L,S_L,S_L,S_L,
S_W,S_W,S_W,S_W,S_W,S_W,S_W,S_W,
S_B,S_B,S_B,S_B,S_B,S_B,S_B,S_B,
S_W,S_W,S_W,S_W,S_W,S_W,
S_FL,S_FL,S_FL,S_FL,S_FL,S_FL,S_FL,S_FL,S_FL,
S_L,S_L,S_L,S_L,S_L,S_L,
S_L,S_L,S_L,S_L,
S_L,S_L,S_L,S_L,S_L,
S_D,S_D,S_D,S_D,S_D,S_D,S_D,S_D,
S_D,S_D,S_D,S_D,S_D,S_D,S_D,S_D
);
{Converts subregister number to opsize}
subreg2opsize:array[0..4] of Topsize = (S_B,S_B,S_W,S_L,S_D);
{Converts subregister number to cgsize}
{ subreg2cgsize:array[0..4] of Tcgsize = (OS_8,OS_8,OS_16,OS_32);}
{# Standard opcode string table (for each tasmop enumeration). The {# Standard opcode string table (for each tasmop enumeration). The
opcode strings should conform to the names as defined by the opcode strings should conform to the names as defined by the
processor manufacturer. processor manufacturer.
@ -693,6 +674,7 @@ uses
procedure convert_register_to_enum(var r:Tregister); procedure convert_register_to_enum(var r:Tregister);
function cgsize2subreg(s:Tcgsize):Tsubregister; function cgsize2subreg(s:Tcgsize):Tsubregister;
function reg2opsize(r:Tregister):topsize;
function is_calljmp(o:tasmop):boolean; function is_calljmp(o:tasmop):boolean;
function flags_to_cond(const f: TResFlags) : TAsmCond; function flags_to_cond(const f: TResFlags) : TAsmCond;
@ -748,6 +730,49 @@ implementation
end; end;
end; end;
function reg2opsize(r:Tregister):topsize;
const
subreg2opsize : array[0..4] of Topsize = (S_B,S_B,S_W,S_L,S_D);
enum2opsize : array[firstreg..lastreg] of topsize = (S_NO,
S_L,S_L,S_L,S_L,S_L,S_L,S_L,S_L,
S_W,S_W,S_W,S_W,S_W,S_W,S_W,S_W,
S_B,S_B,S_B,S_B,S_B,S_B,S_B,S_B,
S_W,S_W,S_W,S_W,S_W,S_W,
S_FL,S_FL,S_FL,S_FL,S_FL,S_FL,S_FL,S_FL,S_FL,
S_L,S_L,S_L,S_L,S_L,S_L,
S_L,S_L,S_L,S_L,
S_L,S_L,S_L,S_L,S_L,
S_D,S_D,S_D,S_D,S_D,S_D,S_D,S_D,
S_D,S_D,S_D,S_D,S_D,S_D,S_D,S_D
);
begin
reg2opsize:=S_L;
if (r.enum=R_INTREGISTER) then
begin
if (r.number shr 8)=0 then
begin
case r.number of
NR_CS,NR_DS,NR_ES,
NR_SS,NR_FS,NR_GS :
reg2opsize:=S_W;
end;
end
else
begin
if (r.number and $ff)>4 then
internalerror(200303181);
reg2opsize:=subreg2opsize[r.number and $ff];
end;
end
else
begin
reg2opsize:=enum2opsize[r.enum];
end;
end;
function supreg_name(r:Tsuperregister):string; function supreg_name(r:Tsuperregister):string;
var s:string[4]; var s:string[4];
@ -799,7 +824,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.43 2003-03-08 08:59:07 daniel Revision 1.44 2003-03-18 18:15:53 peter
* changed reg2opsize to function
Revision 1.43 2003/03/08 08:59:07 daniel
+ $define newra will enable new register allocator + $define newra will enable new register allocator
+ getregisterint will return imaginary registers with $newra + getregisterint will return imaginary registers with $newra
+ -sr switch added, will skip register allocation so you can see + -sr switch added, will skip register allocation so you can see

View File

@ -1830,7 +1830,7 @@ Begin
begin begin
hp1 := Tai_Marker.Create(NoPropInfoEnd); hp1 := Tai_Marker.Create(NoPropInfoEnd);
insertllitem(asml,p,p.next,hp1); insertllitem(asml,p,p.next,hp1);
hp1 := taicpu.op_reg_ref(A_MOV,reg2opsize[regcounter.enum], hp1 := taicpu.op_reg_ref(A_MOV,reg2opsize(regcounter),
regcounter,taicpu(p).oper[0].ref^); regcounter,taicpu(p).oper[0].ref^);
new(pTaiprop(hp1.optinfo)); new(pTaiprop(hp1.optinfo));
pTaiProp(hp1.optinfo)^ := pTaiProp(p.optinfo)^; pTaiProp(hp1.optinfo)^ := pTaiProp(p.optinfo)^;
@ -1882,7 +1882,7 @@ Begin
begin begin
hp1 := Tai_Marker.Create(NoPropInfoEnd); hp1 := Tai_Marker.Create(NoPropInfoEnd);
insertllitem(asml,p,p.next,hp1); insertllitem(asml,p,p.next,hp1);
hp1 := taicpu.op_reg_ref(A_MOV,reg2opsize[regcounter.enum], hp1 := taicpu.op_reg_ref(A_MOV,reg2opsize(regcounter),
regcounter,taicpu(p).oper[1].ref^); regcounter,taicpu(p).oper[1].ref^);
new(pTaiprop(hp1.optinfo)); new(pTaiprop(hp1.optinfo));
pTaiProp(hp1.optinfo)^ := pTaiProp(p.optinfo)^; pTaiProp(hp1.optinfo)^ := pTaiProp(p.optinfo)^;
@ -1999,7 +1999,10 @@ End.
{ {
$Log$ $Log$
Revision 1.41 2003-02-26 21:15:43 daniel Revision 1.42 2003-03-18 18:15:53 peter
* changed reg2opsize to function
Revision 1.41 2003/02/26 21:15:43 daniel
* Fixed the optimizer * Fixed the optimizer
Revision 1.40 2003/02/19 22:00:15 daniel Revision 1.40 2003/02/19 22:00:15 daniel

View File

@ -1442,7 +1442,7 @@ Begin
opr.reg:=actasmregister; opr.reg:=actasmregister;
if opr.reg.enum<>R_INTREGISTER then if opr.reg.enum<>R_INTREGISTER then
internalerror(200302023); internalerror(200302023);
size:=subreg2opsize[actasmregister.number and $ff]; size:=reg2opsize(actasmregister);
Consume(AS_REGISTER); Consume(AS_REGISTER);
end end
else else
@ -1595,10 +1595,7 @@ Begin
Message(asmr_e_invalid_operand_type); Message(asmr_e_invalid_operand_type);
opr.typ:=OPR_REGISTER; opr.typ:=OPR_REGISTER;
opr.reg:=tempreg; opr.reg:=tempreg;
if opr.reg.enum=R_INTREGISTER then size:=reg2opsize(opr.reg);
size:=subreg2opsize[opr.reg.number and $ff]
else
size:=reg2opsize[opr.reg.enum];
end end
else else
Message(asmr_e_syn_operand); Message(asmr_e_syn_operand);
@ -2138,7 +2135,10 @@ finalization
end. end.
{ {
$Log$ $Log$
Revision 1.39 2003-02-20 15:52:58 pierre Revision 1.40 2003-03-18 18:15:53 peter
* changed reg2opsize to function
Revision 1.39 2003/02/20 15:52:58 pierre
* fix a range check error * fix a range check error
Revision 1.38 2003/02/19 22:00:16 daniel Revision 1.38 2003/02/19 22:00:16 daniel

View File

@ -1584,10 +1584,7 @@ Begin
Message(asmr_e_invalid_operand_type); Message(asmr_e_invalid_operand_type);
opr.typ:=OPR_REGISTER; opr.typ:=OPR_REGISTER;
opr.reg:=tempreg; opr.reg:=tempreg;
if opr.reg.enum=R_INTREGISTER then size:=reg2opsize(opr.reg)
size:=subreg2opsize[opr.reg.number and $ff]
else
size:=reg2opsize[opr.reg.enum];
end; end;
end; end;
@ -1983,7 +1980,10 @@ finalization
end. end.
{ {
$Log$ $Log$
Revision 1.42 2003-03-17 21:32:52 peter Revision 1.43 2003-03-18 18:15:53 peter
* changed reg2opsize to function
Revision 1.42 2003/03/17 21:32:52 peter
* allow character constants in reference declaration * allow character constants in reference declaration
Revision 1.41 2003/02/26 22:57:44 daniel Revision 1.41 2003/02/26 22:57:44 daniel