mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 19:25:58 +02:00
* fixed assembling of movd with 64 bit registers
* fixed passing of floats to c varargs git-svn-id: trunk@5477 -
This commit is contained in:
parent
e7f9d82cd5
commit
6118c3e477
@ -1,2 +1,2 @@
|
|||||||
{ don't edit, this file is generated from x86ins.dat }
|
{ don't edit, this file is generated from x86ins.dat }
|
||||||
1368;
|
1370;
|
||||||
|
@ -3150,18 +3150,32 @@
|
|||||||
code : #3#102#15#126#65;
|
code : #3#102#15#126#65;
|
||||||
flags : if_willamette or if_sse2
|
flags : if_willamette or if_sse2
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
opcode : A_MOVD;
|
||||||
|
ops : 2;
|
||||||
|
optypes : (ot_xmmreg,ot_reg64,ot_none);
|
||||||
|
code : #1#102#214#2#15#110#72;
|
||||||
|
flags : if_willamette or if_sse2
|
||||||
|
),
|
||||||
|
(
|
||||||
|
opcode : A_MOVD;
|
||||||
|
ops : 2;
|
||||||
|
optypes : (ot_reg64,ot_xmmreg,ot_none);
|
||||||
|
code : #1#102#214#2#15#126#65;
|
||||||
|
flags : if_willamette or if_sse2
|
||||||
|
),
|
||||||
(
|
(
|
||||||
opcode : A_MOVD;
|
opcode : A_MOVD;
|
||||||
ops : 2;
|
ops : 2;
|
||||||
optypes : (ot_memory,ot_xmmreg,ot_none);
|
optypes : (ot_memory,ot_xmmreg,ot_none);
|
||||||
code : #192#3#102#15#126#65;
|
code : #1#102#214#2#15#126#65;
|
||||||
flags : if_willamette or if_sse2
|
flags : if_willamette or if_sse2
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
opcode : A_MOVD;
|
opcode : A_MOVD;
|
||||||
ops : 2;
|
ops : 2;
|
||||||
optypes : (ot_xmmreg,ot_memory,ot_none);
|
optypes : (ot_xmmreg,ot_memory,ot_none);
|
||||||
code : #193#3#102#15#110#72;
|
code : #1#102#214#2#15#110#72;
|
||||||
flags : if_willamette or if_sse2
|
flags : if_willamette or if_sse2
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
@ -82,7 +82,7 @@ implementation
|
|||||||
aasmbase,aasmtai,aasmdata,
|
aasmbase,aasmtai,aasmdata,
|
||||||
nbas,nmem,nld,ncnv,nutils,
|
nbas,nmem,nld,ncnv,nutils,
|
||||||
{$ifdef x86}
|
{$ifdef x86}
|
||||||
cga,cgx86,
|
cga,cgx86,aasmcpu,
|
||||||
{$endif x86}
|
{$endif x86}
|
||||||
ncgutil,
|
ncgutil,
|
||||||
cgobj,tgobj,
|
cgobj,tgobj,
|
||||||
@ -193,6 +193,13 @@ implementation
|
|||||||
LOC_MMREGISTER,
|
LOC_MMREGISTER,
|
||||||
LOC_CMMREGISTER:
|
LOC_CMMREGISTER:
|
||||||
cg.a_parammm_reg(current_asmdata.CurrAsmList,left.location.size,left.location.register,tempcgpara,mms_movescalar);
|
cg.a_parammm_reg(current_asmdata.CurrAsmList,left.location.size,left.location.register,tempcgpara,mms_movescalar);
|
||||||
|
{$ifdef x86_64}
|
||||||
|
LOC_REGISTER,
|
||||||
|
LOC_CREGISTER :
|
||||||
|
begin
|
||||||
|
current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_MOVD,S_NO,left.location.register,tempcgpara.location^.register));
|
||||||
|
end;
|
||||||
|
{$endif x86_64}
|
||||||
LOC_FPUREGISTER,
|
LOC_FPUREGISTER,
|
||||||
LOC_CFPUREGISTER:
|
LOC_CFPUREGISTER:
|
||||||
begin
|
begin
|
||||||
|
@ -564,6 +564,8 @@ implementation
|
|||||||
not(nf_explicit in p.flags) then
|
not(nf_explicit in p.flags) then
|
||||||
MessagePos(p.fileinfo,type_w_double_c_varargs);
|
MessagePos(p.fileinfo,type_w_double_c_varargs);
|
||||||
if (tfloatdef(p.resultdef).floattype in [{$ifndef x86_64}s32real,{$endif}s64currency]) or
|
if (tfloatdef(p.resultdef).floattype in [{$ifndef x86_64}s32real,{$endif}s64currency]) or
|
||||||
|
{ win64 requires the double type cast for singles as well }
|
||||||
|
((tfloatdef(p.resultdef).floattype=s32real) and (target_info.system=system_x86_64_win64)) or
|
||||||
(is_constrealnode(p) and
|
(is_constrealnode(p) and
|
||||||
not(nf_explicit in p.flags)) then
|
not(nf_explicit in p.flags)) then
|
||||||
p:=ctypeconvnode.create(p,s64floattype);
|
p:=ctypeconvnode.create(p,s64floattype);
|
||||||
|
@ -1054,8 +1054,10 @@ mem,mmxreg \300\2\x0F\x7E\101 PENT,MMX,SD
|
|||||||
reg32,mmxreg \2\x0F\x7E\101 PENT,MMX
|
reg32,mmxreg \2\x0F\x7E\101 PENT,MMX
|
||||||
xmmreg,reg32 \3\x66\x0F\x6E\110 WILLAMETTE,SSE2
|
xmmreg,reg32 \3\x66\x0F\x6E\110 WILLAMETTE,SSE2
|
||||||
reg32,xmmreg \3\x66\x0F\x7E\101 WILLAMETTE,SSE2
|
reg32,xmmreg \3\x66\x0F\x7E\101 WILLAMETTE,SSE2
|
||||||
mem,xmmreg \300\3\x66\x0F\x7E\101 WILLAMETTE,SSE2
|
xmmreg,reg64 \1\x66\326\2\x0F\x6E\110 WILLAMETTE,SSE2
|
||||||
xmmreg,mem \301\3\x66\x0F\x6E\110 WILLAMETTE,SSE2
|
reg64,xmmreg \1\x66\326\2\x0F\x7E\101 WILLAMETTE,SSE2
|
||||||
|
mem,xmmreg \1\x66\326\2\x0F\x7E\101 WILLAMETTE,SSE2
|
||||||
|
xmmreg,mem \1\x66\326\2\x0F\x6E\110 WILLAMETTE,SSE2
|
||||||
|
|
||||||
[MOVQ,movq]
|
[MOVQ,movq]
|
||||||
(Ch_Rop1, Ch_Wop2, Ch_None)
|
(Ch_Rop1, Ch_Wop2, Ch_None)
|
||||||
|
@ -37,7 +37,7 @@ unit cpupara;
|
|||||||
private
|
private
|
||||||
procedure create_funcretloc_info(p : tabstractprocdef; side: tcallercallee);
|
procedure create_funcretloc_info(p : tabstractprocdef; side: tcallercallee);
|
||||||
procedure create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee;paras:tparalist;
|
procedure create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee;paras:tparalist;
|
||||||
var intparareg,mmparareg,parasize:longint);
|
var intparareg,mmparareg,parasize:longint;varargsparas: boolean);
|
||||||
public
|
public
|
||||||
function param_use_paraloc(const cgpara:tcgpara):boolean;override;
|
function param_use_paraloc(const cgpara:tcgpara):boolean;override;
|
||||||
function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
|
function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
|
||||||
@ -364,7 +364,7 @@ unit cpupara;
|
|||||||
|
|
||||||
|
|
||||||
procedure tx86_64paramanager.create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee;paras:tparalist;
|
procedure tx86_64paramanager.create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee;paras:tparalist;
|
||||||
var intparareg,mmparareg,parasize:longint);
|
var intparareg,mmparareg,parasize:longint;varargsparas: boolean);
|
||||||
var
|
var
|
||||||
hp : tparavarsym;
|
hp : tparavarsym;
|
||||||
paraloc : pcgparalocation;
|
paraloc : pcgparalocation;
|
||||||
@ -397,6 +397,20 @@ unit cpupara;
|
|||||||
paralen:=push_size(hp.varspez,hp.vardef,p.proccalloption);
|
paralen:=push_size(hp.varspez,hp.vardef,p.proccalloption);
|
||||||
paracgsize:=def_cgsize(hp.vardef);
|
paracgsize:=def_cgsize(hp.vardef);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ cheat for now, we should copy the value to an mm reg as well (FK) }
|
||||||
|
if varargsparas and
|
||||||
|
(target_info.system = system_x86_64_win64) and
|
||||||
|
(hp.vardef.typ = floatdef) then
|
||||||
|
begin
|
||||||
|
loc[1] := LOC_REGISTER;
|
||||||
|
loc[2] := LOC_INVALID;
|
||||||
|
if paracgsize = OS_F64 then
|
||||||
|
paracgsize := OS_64
|
||||||
|
else
|
||||||
|
paracgsize := OS_32;
|
||||||
|
end;
|
||||||
|
|
||||||
hp.paraloc[side].reset;
|
hp.paraloc[side].reset;
|
||||||
hp.paraloc[side].size:=paracgsize;
|
hp.paraloc[side].size:=paracgsize;
|
||||||
hp.paraloc[side].intsize:=paralen;
|
hp.paraloc[side].intsize:=paralen;
|
||||||
@ -542,9 +556,9 @@ unit cpupara;
|
|||||||
else
|
else
|
||||||
parasize:=0;
|
parasize:=0;
|
||||||
{ calculate the registers for the normal parameters }
|
{ calculate the registers for the normal parameters }
|
||||||
create_paraloc_info_intern(p,callerside,p.paras,intparareg,mmparareg,parasize);
|
create_paraloc_info_intern(p,callerside,p.paras,intparareg,mmparareg,parasize,false);
|
||||||
{ append the varargs }
|
{ append the varargs }
|
||||||
create_paraloc_info_intern(p,callerside,varargspara,intparareg,mmparareg,parasize);
|
create_paraloc_info_intern(p,callerside,varargspara,intparareg,mmparareg,parasize,true);
|
||||||
{ store used no. of SSE registers, that needs to be passed in %AL }
|
{ store used no. of SSE registers, that needs to be passed in %AL }
|
||||||
varargspara.mmregsused:=mmparareg;
|
varargspara.mmregsused:=mmparareg;
|
||||||
result:=parasize;
|
result:=parasize;
|
||||||
@ -562,7 +576,7 @@ unit cpupara;
|
|||||||
parasize:=4*8
|
parasize:=4*8
|
||||||
else
|
else
|
||||||
parasize:=0;
|
parasize:=0;
|
||||||
create_paraloc_info_intern(p,side,p.paras,intparareg,mmparareg,parasize);
|
create_paraloc_info_intern(p,side,p.paras,intparareg,mmparareg,parasize,false);
|
||||||
{ Create Function result paraloc }
|
{ Create Function result paraloc }
|
||||||
create_funcretloc_info(p,side);
|
create_funcretloc_info(p,side);
|
||||||
{ We need to return the size allocated on the stack }
|
{ We need to return the size allocated on the stack }
|
||||||
|
@ -38,6 +38,7 @@ implementation
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
globtype,
|
globtype,
|
||||||
|
systems,
|
||||||
cpubase,
|
cpubase,
|
||||||
aasmtai,aasmdata,aasmcpu;
|
aasmtai,aasmdata,aasmcpu;
|
||||||
|
|
||||||
@ -46,7 +47,7 @@ implementation
|
|||||||
mmregs : aint;
|
mmregs : aint;
|
||||||
begin
|
begin
|
||||||
{ x86_64 requires %al to contain the no. SSE regs passed }
|
{ x86_64 requires %al to contain the no. SSE regs passed }
|
||||||
if cnf_uses_varargs in callnodeflags then
|
if (cnf_uses_varargs in callnodeflags) and (target_info.system<>system_x86_64_win64) then
|
||||||
begin
|
begin
|
||||||
if assigned(varargsparas) then
|
if assigned(varargsparas) then
|
||||||
mmregs:=varargsparas.mmregsused
|
mmregs:=varargsparas.mmregsused
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
{ don't edit, this file is generated from x86ins.dat }
|
{ don't edit, this file is generated from x86ins.dat }
|
||||||
1366;
|
1368;
|
||||||
|
@ -3108,18 +3108,32 @@
|
|||||||
code : #3#102#15#126#65;
|
code : #3#102#15#126#65;
|
||||||
flags : if_willamette or if_sse2
|
flags : if_willamette or if_sse2
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
opcode : A_MOVD;
|
||||||
|
ops : 2;
|
||||||
|
optypes : (ot_xmmreg,ot_reg64,ot_none);
|
||||||
|
code : #1#102#214#2#15#110#72;
|
||||||
|
flags : if_willamette or if_sse2
|
||||||
|
),
|
||||||
|
(
|
||||||
|
opcode : A_MOVD;
|
||||||
|
ops : 2;
|
||||||
|
optypes : (ot_reg64,ot_xmmreg,ot_none);
|
||||||
|
code : #1#102#214#2#15#126#65;
|
||||||
|
flags : if_willamette or if_sse2
|
||||||
|
),
|
||||||
(
|
(
|
||||||
opcode : A_MOVD;
|
opcode : A_MOVD;
|
||||||
ops : 2;
|
ops : 2;
|
||||||
optypes : (ot_memory,ot_xmmreg,ot_none);
|
optypes : (ot_memory,ot_xmmreg,ot_none);
|
||||||
code : #192#3#102#15#126#65;
|
code : #1#102#214#2#15#126#65;
|
||||||
flags : if_willamette or if_sse2
|
flags : if_willamette or if_sse2
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
opcode : A_MOVD;
|
opcode : A_MOVD;
|
||||||
ops : 2;
|
ops : 2;
|
||||||
optypes : (ot_xmmreg,ot_memory,ot_none);
|
optypes : (ot_xmmreg,ot_memory,ot_none);
|
||||||
code : #193#3#102#15#110#72;
|
code : #1#102#214#2#15#110#72;
|
||||||
flags : if_willamette or if_sse2
|
flags : if_willamette or if_sse2
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
Loading…
Reference in New Issue
Block a user