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:
Károly Balogh 2021-02-20 11:21:14 +00:00
parent 8c06529ae2
commit 2ffe777b44

View File

@ -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 }