mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 00:29:24 +02:00
m68k: extend the the register to full size, when multiplied by an immediate in memory references. Patch based on the work of Pierre Muller.
git-svn-id: trunk@48732 -
This commit is contained in:
parent
8c06529ae2
commit
2ffe777b44
@ -75,8 +75,11 @@ implementation
|
|||||||
var
|
var
|
||||||
hreg: tregister;
|
hreg: tregister;
|
||||||
scaled: boolean;
|
scaled: boolean;
|
||||||
|
regcgsize: tcgsize;
|
||||||
begin
|
begin
|
||||||
scaled:=false;
|
scaled:=false;
|
||||||
|
regcgsize:=def_cgsize(regsize);
|
||||||
|
|
||||||
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: called')));
|
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: called')));
|
||||||
if l<>1 then
|
if l<>1 then
|
||||||
begin
|
begin
|
||||||
@ -86,8 +89,10 @@ implementation
|
|||||||
((CPUM68K_HAS_INDEXSCALE8 in cpu_capabilities[current_settings.cputype]) and (l in [2,4,8]))) then
|
((CPUM68K_HAS_INDEXSCALE8 in cpu_capabilities[current_settings.cputype]) and (l in [2,4,8]))) then
|
||||||
begin
|
begin
|
||||||
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: mul')));
|
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: mul')));
|
||||||
hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_S32);
|
hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
|
||||||
cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_IMUL,def_cgsize(regsize),l,maybe_const_reg,hreg);
|
cg.a_load_reg_reg(current_asmdata.CurrAsmList,regcgsize,OS_ADDR,maybe_const_reg,hreg);
|
||||||
|
cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_IMUL,OS_ADDR,l,hreg);
|
||||||
|
regcgsize:=OS_ADDR;
|
||||||
maybe_const_reg:=hreg;
|
maybe_const_reg:=hreg;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -104,7 +109,7 @@ implementation
|
|||||||
begin
|
begin
|
||||||
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: copytoa')));
|
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: copytoa')));
|
||||||
hreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
|
hreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
|
||||||
cg.a_load_reg_reg(current_asmdata.CurrAsmList,def_cgsize(regsize),OS_ADDR,maybe_const_reg,hreg);
|
cg.a_load_reg_reg(current_asmdata.CurrAsmList,regcgsize,OS_ADDR,maybe_const_reg,hreg);
|
||||||
maybe_const_reg:=hreg;
|
maybe_const_reg:=hreg;
|
||||||
end;
|
end;
|
||||||
location.reference.base:=maybe_const_reg;
|
location.reference.base:=maybe_const_reg;
|
||||||
@ -118,13 +123,13 @@ implementation
|
|||||||
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,hreg);
|
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,hreg);
|
||||||
reference_reset_base(location.reference,hreg,0,location.reference.temppos,location.reference.alignment,location.reference.volatility);
|
reference_reset_base(location.reference,hreg,0,location.reference.temppos,location.reference.alignment,location.reference.volatility);
|
||||||
end;
|
end;
|
||||||
if def_cgsize(regsize) in [OS_8,OS_16] then
|
if regcgsize in [OS_8,OS_16] then
|
||||||
begin
|
begin
|
||||||
{ index registers are always sign extended on m68k, so we have to zero extend by hand,
|
{ index registers are always sign extended on m68k, so we have to zero extend by hand,
|
||||||
if the index variable is unsigned, and its width is less than the whole register }
|
if the index variable is unsigned, and its width is less than the whole register }
|
||||||
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: index zero extend')));
|
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: index zero extend')));
|
||||||
hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
|
hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
|
||||||
cg.a_load_reg_reg(current_asmdata.CurrAsmList,def_cgsize(regsize),OS_ADDR,maybe_const_reg,hreg);
|
cg.a_load_reg_reg(current_asmdata.CurrAsmList,regcgsize,OS_ADDR,maybe_const_reg,hreg);
|
||||||
maybe_const_reg:=hreg;
|
maybe_const_reg:=hreg;
|
||||||
end;
|
end;
|
||||||
{ insert new index register }
|
{ insert new index register }
|
||||||
|
Loading…
Reference in New Issue
Block a user