* tcg.a_load_ref_reg_unaligned: if loading signed 16-bit value, treat upper half as signed 8-bit to ensure that result is properly extended. This routine is used only by SPARC target (other CPUs use specific implementations), and it generates pretty inefficient code, therefore it's probably worth to drop it altogether and implement SPARC-specific version. Mantis #25440.

git-svn-id: trunk@26255 -
This commit is contained in:
sergei 2013-12-20 17:07:00 +00:00
parent 48e4fc4bb2
commit 5cd0684d45

View File

@ -1286,6 +1286,7 @@ implementation
tmpreg,
tmpreg2 : tregister;
i : longint;
hisize : tcgsize;
begin
if ref.alignment in [1,2] then
begin
@ -1298,14 +1299,18 @@ implementation
a_load_ref_reg(list,fromsize,tosize,tmpref,register)
else
begin
if FromSize=OS_16 then
hisize:=OS_8
else
hisize:=OS_S8;
{ first load in tmpreg, because the target register }
{ may be used in ref as well }
if target_info.endian=endian_little then
inc(tmpref.offset);
tmpreg:=getintregister(list,OS_8);
a_load_ref_reg(list,OS_8,OS_8,tmpref,tmpreg);
tmpreg:=makeregsize(list,tmpreg,OS_16);
a_op_const_reg(list,OP_SHL,OS_16,8,tmpreg);
a_load_ref_reg(list,hisize,hisize,tmpref,tmpreg);
tmpreg:=makeregsize(list,tmpreg,FromSize);
a_op_const_reg(list,OP_SHL,FromSize,8,tmpreg);
if target_info.endian=endian_little then
dec(tmpref.offset)
else