mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-28 06:50:43 +02:00
* changed reg2opsize to function
This commit is contained in:
parent
c5efd5c7d5
commit
3f0491bb38
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user