mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 08:09:29 +02:00
* 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:
parent
48e4fc4bb2
commit
5cd0684d45
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user