Last floating point register not used for passing parameters on aarch64
Original Reporter info from Mantis: DonAlfredo @DonAlfredo
-
Reporter name: Alfred
Original Reporter info from Mantis: DonAlfredo @DonAlfredo
- Reporter name: Alfred
Description:
REGD7 is not used for passing float parameters on aarch64.
Steps to reproduce:
program float;
uses
Classes,
SysUtils;
function getdouble(n1,n2,n3,n4,n5,n6,n7,n8,n9,n10: double):int64;
begin
result:=round(n1+n2+n3+n4+n5+n6+n7+n8+n9+n10);
end;
begin
writeln(getdouble(1,2,3,4,5,6,7,8,9,10));
readln;
end.
Additional information:
Assembler on Linux X64:
# Var n1 located at rbp-8, size=OS_F64 # Var n2 located at rbp-16, size=OS_F64 # Var n3 located at rbp-24, size=OS_F64 # Var n4 located at rbp-32, size=OS_F64 # Var n5 located at rbp-40, size=OS_F64 # Var n6 located at rbp-48, size=OS_F64 # Var n7 located at rbp-56, size=OS_F64 # Var n8 located at rbp-64, size=OS_F64 # Var n9 located at rbp+16, size=OS_F64 # Var n10 located at rbp+24, size=OS_F64 # Var $result located at rbp-72, size=OS_S64 movsd %xmm0,-8(%rbp) movsd %xmm1,-16(%rbp) movsd %xmm2,-24(%rbp) movsd %xmm3,-32(%rbp) movsd %xmm4,-40(%rbp) movsd %xmm5,-48(%rbp) movsd %xmm6,-56(%rbp) movsd %xmm7,-64(%rbp)
Assembler on Linux aarch64:
// Var n1 located at sp+0, size=OS_F64
// Var n2 located at sp+8, size=OS_F64
// Var n3 located at sp+16, size=OS_F64
// Var n4 located at sp+24, size=OS_F64
// Var n5 located at sp+32, size=OS_F64
// Var n6 located at sp+40, size=OS_F64
// Var n7 located at sp+48, size=OS_F64
// Var n8 located at x29+16, size=OS_F64
// Var n9 located at x29+24, size=OS_F64
// Var n10 located at x29+32, size=OS_F64
// Var $result located at sp+56, size=OS_S64
str d0,[sp]
str d1,[sp, #8]
str d2,[sp, #16]
str d3,[sp, #24]
str d4,[sp, #32]
str d5,[sp, #40]
str d6,[sp, #48]
Mantis conversion info:
- Mantis ID: 30207
- OS: Linux 64 bit
- OS Build: Arch Linux 64 bi
- Build: Trunk
- Platform: Aarch64
- Version: 3.1.1
- Fixed in version: 3.1.1
- Fixed in revision: 33922 (#0ed6c3d8)