mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 21:09:24 +02:00
* some ideas for mm support implemented
This commit is contained in:
parent
46d9a10ecc
commit
947280d8e2
@ -220,10 +220,14 @@ unit cgobj;
|
||||
procedure a_paramfpu_ref(list : taasmoutput;size : tcgsize;const ref : treference;const locpara : tparalocation);virtual;
|
||||
|
||||
{ vector register move instructions }
|
||||
procedure a_loadmm_reg_reg(list: taasmoutput; reg1, reg2: tregister); virtual; abstract;
|
||||
procedure a_loadmm_ref_reg(list: taasmoutput; const ref: treference; reg: tregister); virtual; abstract;
|
||||
procedure a_loadmm_reg_ref(list: taasmoutput; reg: tregister; const ref: treference); virtual; abstract;
|
||||
procedure a_parammm_reg(list: taasmoutput; reg: tregister); virtual; abstract;
|
||||
procedure a_loadmm_reg_reg(list: taasmoutput; fromsize, tosize : tcgsize;reg1, reg2: tregister;shuffle : pmmshuffle); virtual; abstract;
|
||||
procedure a_loadmm_ref_reg(list: taasmoutput; fromsize, tosize : tcgsize;const ref: treference; reg: tregister;shuffle : pmmshuffle); virtual; abstract;
|
||||
procedure a_loadmm_reg_ref(list: taasmoutput; fromsize, tosize : tcgsize;reg: tregister; const ref: treference;shuffle : pmmshuffle); virtual; abstract;
|
||||
procedure a_loadmm_loc_reg(list: taasmoutput; size: tcgsize; const loc: tlocation; const reg: tregister;shuffle : pmmshuffle);
|
||||
procedure a_loadmm_reg_loc(list: taasmoutput; size: tcgsize; const reg: tregister; const loc: tlocation;shuffle : pmmshuffle);
|
||||
procedure a_parammm_reg(list: taasmoutput; size: tcgsize; reg: tregister;const locpara : tparalocation;shuffle : pmmshuffle); virtual;
|
||||
procedure a_parammm_ref(list: taasmoutput; size: tcgsize; ref: treference;const locpara : tparalocation;shuffle : pmmshuffle); virtual;
|
||||
procedure a_parammm_loc(list: taasmoutput; loc: tlocation; const locpara : tparalocation;shuffle : pmmshuffle); virtual;
|
||||
|
||||
{ basic arithmetic operations }
|
||||
{ note: for operators which require only one argument (not, neg), use }
|
||||
@ -1116,10 +1120,8 @@ implementation
|
||||
|
||||
procedure tcg.a_cmp_ref_loc_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;const ref: treference;const loc : tlocation;
|
||||
l : tasmlabel);
|
||||
|
||||
var
|
||||
tmpreg: tregister;
|
||||
|
||||
begin
|
||||
case loc.loc of
|
||||
LOC_REGISTER,LOC_CREGISTER:
|
||||
@ -1137,6 +1139,86 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.a_loadmm_loc_reg(list: taasmoutput; size: tcgsize; const loc: tlocation; const reg: tregister;shuffle : pmmshuffle);
|
||||
begin
|
||||
case loc.loc of
|
||||
LOC_MMREGISTER,LOC_CMMREGISTER:
|
||||
a_loadmm_reg_reg(list,loc.size,size,loc.register,reg,shuffle);
|
||||
LOC_REFERENCE,LOC_CREFERENCE:
|
||||
a_loadmm_ref_reg(list,loc.size,size,loc.reference,reg,shuffle);
|
||||
else
|
||||
internalerror(200310121);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.a_loadmm_reg_loc(list: taasmoutput; size: tcgsize; const reg: tregister; const loc: tlocation;shuffle : pmmshuffle);
|
||||
var
|
||||
tmpreg: tregister;
|
||||
begin
|
||||
case loc.loc of
|
||||
LOC_MMREGISTER,LOC_CMMREGISTER:
|
||||
a_loadmm_reg_reg(list,size,loc.size,reg,loc.register,shuffle);
|
||||
LOC_REFERENCE,LOC_CREFERENCE:
|
||||
a_loadmm_reg_ref(list,size,loc.size,reg,loc.reference,shuffle);
|
||||
else
|
||||
internalerror(200310122);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.a_parammm_reg(list: taasmoutput; size: tcgsize; reg: tregister;const locpara : tparalocation;shuffle : pmmshuffle);
|
||||
var
|
||||
ref : treference;
|
||||
begin
|
||||
case locpara.loc of
|
||||
LOC_MMREGISTER,LOC_CMMREGISTER:
|
||||
a_loadmm_reg_reg(list,size,locpara.size,reg,locpara.register,shuffle);
|
||||
LOC_REFERENCE,LOC_CREFERENCE:
|
||||
begin
|
||||
reference_reset(ref);
|
||||
ref.base:=locpara.reference.index;
|
||||
ref.offset:=locpara.reference.offset;
|
||||
a_loadmm_reg_ref(list,size,locpara.size,reg,ref,shuffle);
|
||||
end
|
||||
else
|
||||
internalerror(200310123);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.a_parammm_ref(list: taasmoutput; size: tcgsize; ref: treference;const locpara : tparalocation;shuffle : pmmshuffle);
|
||||
var
|
||||
hr : tregister;
|
||||
hs : tmmshuffle;
|
||||
begin
|
||||
hr:=getmmregister(list,locpara.size);
|
||||
a_loadmm_ref_reg(list,size,locpara.size,ref,hr,shuffle);
|
||||
if realshuffle(shuffle) then
|
||||
begin
|
||||
hs:=shuffle^;
|
||||
removeshuffles(hs);
|
||||
a_parammm_reg(list,locpara.size,hr,locpara,@hs);
|
||||
end
|
||||
else
|
||||
a_parammm_reg(list,locpara.size,hr,locpara,shuffle);
|
||||
ungetregister(list,hr);
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.a_parammm_loc(list: taasmoutput; loc: tlocation; const locpara : tparalocation;shuffle : pmmshuffle);
|
||||
begin
|
||||
case loc.loc of
|
||||
LOC_MMREGISTER,LOC_CMMREGISTER:
|
||||
a_parammm_reg(list,loc.size,loc.register,locpara,shuffle);
|
||||
LOC_REFERENCE,LOC_CREFERENCE:
|
||||
a_parammm_ref(list,loc.size,loc.reference,locpara,shuffle);
|
||||
else
|
||||
internalerror(200310123);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
class function tcg.reg_cgsize(const reg: tregister) : tcgsize;
|
||||
begin
|
||||
reg_cgsize := OS_INT;
|
||||
@ -1692,7 +1774,10 @@ finalization
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.129 2003-10-11 16:06:42 florian
|
||||
Revision 1.130 2003-10-13 01:23:13 florian
|
||||
* some ideas for mm support implemented
|
||||
|
||||
Revision 1.129 2003/10/11 16:06:42 florian
|
||||
* fixed some MMX<->SSE
|
||||
* started to fix ppc, needs an overhaul
|
||||
+ stabs info improve for spilling, not sure if it works correctly/completly
|
||||
|
@ -96,10 +96,9 @@ unit cgx86;
|
||||
procedure a_loadfpu_reg_ref(list: taasmoutput; size: tcgsize; reg: tregister; const ref: treference); override;
|
||||
|
||||
{ vector register move instructions }
|
||||
procedure a_loadmm_reg_reg(list: taasmoutput; reg1, reg2: tregister); override;
|
||||
procedure a_loadmm_ref_reg(list: taasmoutput; const ref: treference; reg: tregister); override;
|
||||
procedure a_loadmm_reg_ref(list: taasmoutput; reg: tregister; const ref: treference); override;
|
||||
procedure a_parammm_reg(list: taasmoutput; reg: tregister); override;
|
||||
procedure a_loadmm_reg_reg(list: taasmoutput; fromsize, tosize : tcgsize;reg1, reg2: tregister;shuffle : pmmshuffle); override;
|
||||
procedure a_loadmm_ref_reg(list: taasmoutput; fromsize, tosize : tcgsize;const ref: treference; reg: tregister;shuffle : pmmshuffle); override;
|
||||
procedure a_loadmm_reg_ref(list: taasmoutput; fromsize, tosize : tcgsize;reg: tregister; const ref: treference;shuffle : pmmshuffle); override;
|
||||
|
||||
{ comparison operations }
|
||||
procedure a_cmp_const_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
|
||||
@ -757,37 +756,24 @@ unit cgx86;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgx86.a_loadmm_reg_reg(list: taasmoutput; reg1, reg2: tregister);
|
||||
|
||||
procedure tcgx86.a_loadmm_reg_reg(list: taasmoutput; fromsize, tosize : tcgsize;reg1, reg2: tregister;shuffle : pmmshuffle);
|
||||
begin
|
||||
list.concat(taicpu.op_reg_reg(A_MOVQ,S_NO,reg1,reg2));
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgx86.a_loadmm_ref_reg(list: taasmoutput; const ref: treference; reg: tregister);
|
||||
|
||||
procedure tcgx86.a_loadmm_ref_reg(list: taasmoutput; fromsize, tosize : tcgsize;const ref: treference; reg: tregister;shuffle : pmmshuffle);
|
||||
begin
|
||||
list.concat(taicpu.op_ref_reg(A_MOVQ,S_NO,ref,reg));
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgx86.a_loadmm_reg_ref(list: taasmoutput; reg: tregister; const ref: treference);
|
||||
|
||||
procedure tcgx86.a_loadmm_reg_ref(list: taasmoutput; fromsize, tosize : tcgsize;reg: tregister; const ref: treference;shuffle : pmmshuffle);
|
||||
begin
|
||||
list.concat(taicpu.op_reg_ref(A_MOVQ,S_NO,reg,ref));
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgx86.a_parammm_reg(list: taasmoutput; reg: tregister);
|
||||
var
|
||||
href : treference;
|
||||
begin
|
||||
list.concat(taicpu.op_const_reg(A_SUB,S_L,8,NR_ESP));
|
||||
reference_reset_base(href,NR_ESP,0);
|
||||
list.concat(taicpu.op_reg_ref(A_MOVQ,S_NO,reg,href));
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgx86.a_op_const_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; a: AWord; reg: TRegister);
|
||||
|
||||
var
|
||||
@ -1735,7 +1721,10 @@ unit cgx86;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.77 2003-10-11 16:06:42 florian
|
||||
Revision 1.78 2003-10-13 01:23:13 florian
|
||||
* some ideas for mm support implemented
|
||||
|
||||
Revision 1.77 2003/10/11 16:06:42 florian
|
||||
* fixed some MMX<->SSE
|
||||
* started to fix ppc, needs an overhaul
|
||||
+ stabs info improve for spilling, not sure if it works correctly/completly
|
||||
|
Loading…
Reference in New Issue
Block a user