mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 18:09:30 +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
|
||||
hreg: tregister;
|
||||
scaled: boolean;
|
||||
regcgsize: tcgsize;
|
||||
begin
|
||||
scaled:=false;
|
||||
regcgsize:=def_cgsize(regsize);
|
||||
|
||||
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: called')));
|
||||
if l<>1 then
|
||||
begin
|
||||
@ -86,8 +89,10 @@ implementation
|
||||
((CPUM68K_HAS_INDEXSCALE8 in cpu_capabilities[current_settings.cputype]) and (l in [2,4,8]))) then
|
||||
begin
|
||||
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: mul')));
|
||||
hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_S32);
|
||||
cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_IMUL,def_cgsize(regsize),l,maybe_const_reg,hreg);
|
||||
hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
|
||||
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;
|
||||
end
|
||||
else
|
||||
@ -104,7 +109,7 @@ implementation
|
||||
begin
|
||||
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: copytoa')));
|
||||
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;
|
||||
end;
|
||||
location.reference.base:=maybe_const_reg;
|
||||
@ -118,13 +123,13 @@ implementation
|
||||
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);
|
||||
end;
|
||||
if def_cgsize(regsize) in [OS_8,OS_16] then
|
||||
if regcgsize in [OS_8,OS_16] then
|
||||
begin
|
||||
{ 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 }
|
||||
//current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('updref: index zero extend')));
|
||||
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;
|
||||
end;
|
||||
{ insert new index register }
|
||||
|
Loading…
Reference in New Issue
Block a user