mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-31 11:30:30 +02:00
- removed ifdefed/inactive "ti386addnode.second_addmmx" from ppc code
generator git-svn-id: trunk@21049 -
This commit is contained in:
parent
cecdff01e0
commit
3fc1a274c8
@ -545,192 +545,6 @@ interface
|
||||
end;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
AddMMX
|
||||
*****************************************************************************}
|
||||
|
||||
{$ifdef SUPPORT_MMX}
|
||||
procedure ti386addnode.second_addmmx;
|
||||
var
|
||||
op : TAsmOp;
|
||||
cmpop : boolean;
|
||||
mmxbase : tmmxtype;
|
||||
hregister : tregister;
|
||||
begin
|
||||
pass_left_and_right;
|
||||
|
||||
cmpop:=false;
|
||||
mmxbase:=mmx_type(left.resultdef);
|
||||
case nodetype of
|
||||
addn :
|
||||
begin
|
||||
if (cs_mmx_saturation in current_settings.localswitches) then
|
||||
begin
|
||||
case mmxbase of
|
||||
mmxs8bit:
|
||||
op:=A_PADDSB;
|
||||
mmxu8bit:
|
||||
op:=A_PADDUSB;
|
||||
mmxs16bit,mmxfixed16:
|
||||
op:=A_PADDSB;
|
||||
mmxu16bit:
|
||||
op:=A_PADDUSW;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
case mmxbase of
|
||||
mmxs8bit,mmxu8bit:
|
||||
op:=A_PADDB;
|
||||
mmxs16bit,mmxu16bit,mmxfixed16:
|
||||
op:=A_PADDW;
|
||||
mmxs32bit,mmxu32bit:
|
||||
op:=A_PADDD;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
muln :
|
||||
begin
|
||||
case mmxbase of
|
||||
mmxs16bit,mmxu16bit:
|
||||
op:=A_PMULLW;
|
||||
mmxfixed16:
|
||||
op:=A_PMULHW;
|
||||
end;
|
||||
end;
|
||||
subn :
|
||||
begin
|
||||
if (cs_mmx_saturation in current_settings.localswitches) then
|
||||
begin
|
||||
case mmxbase of
|
||||
mmxs8bit:
|
||||
op:=A_PSUBSB;
|
||||
mmxu8bit:
|
||||
op:=A_PSUBUSB;
|
||||
mmxs16bit,mmxfixed16:
|
||||
op:=A_PSUBSB;
|
||||
mmxu16bit:
|
||||
op:=A_PSUBUSW;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
case mmxbase of
|
||||
mmxs8bit,mmxu8bit:
|
||||
op:=A_PSUBB;
|
||||
mmxs16bit,mmxu16bit,mmxfixed16:
|
||||
op:=A_PSUBW;
|
||||
mmxs32bit,mmxu32bit:
|
||||
op:=A_PSUBD;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
xorn:
|
||||
op:=A_PXOR;
|
||||
orn:
|
||||
op:=A_POR;
|
||||
andn:
|
||||
op:=A_PAND;
|
||||
else
|
||||
internalerror(200403183);
|
||||
end;
|
||||
|
||||
{ left and right no register? }
|
||||
{ then one must be demanded }
|
||||
if (left.location.loc<>LOC_MMXREGISTER) then
|
||||
begin
|
||||
if (right.location.loc=LOC_MMXREGISTER) then
|
||||
begin
|
||||
location_swap(left.location,right.location);
|
||||
toggleflag(nf_swapped);
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ register variable ? }
|
||||
if (left.location.loc=LOC_CMMXREGISTER) then
|
||||
begin
|
||||
hregister:=rg.getregistermm(current_asmdata.CurrAsmList);
|
||||
emit_reg_reg(A_MOVQ,S_NO,left.location.register,hregister);
|
||||
end
|
||||
else
|
||||
begin
|
||||
if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
|
||||
internalerror(200203245);
|
||||
|
||||
location_release(current_asmdata.CurrAsmList,left.location);
|
||||
|
||||
hregister:=rg.getregistermm(current_asmdata.CurrAsmList);
|
||||
emit_ref_reg(A_MOVQ,S_NO,left.location.reference,hregister);
|
||||
end;
|
||||
|
||||
location_reset(left.location,LOC_MMXREGISTER,OS_NO);
|
||||
left.location.register:=hregister;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ at this point, left.location.loc should be LOC_MMXREGISTER }
|
||||
if right.location.loc<>LOC_MMXREGISTER then
|
||||
begin
|
||||
if (nodetype=subn) and (nf_swapped in flags) then
|
||||
begin
|
||||
if right.location.loc=LOC_CMMXREGISTER then
|
||||
begin
|
||||
emit_reg_reg(A_MOVQ,S_NO,right.location.register,R_MM7);
|
||||
emit_reg_reg(op,S_NO,left.location.register,R_MM7);
|
||||
emit_reg_reg(A_MOVQ,S_NO,R_MM7,left.location.register);
|
||||
end
|
||||
else
|
||||
begin
|
||||
if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
|
||||
internalerror(200203247);
|
||||
emit_ref_reg(A_MOVQ,S_NO,right.location.reference,R_MM7);
|
||||
emit_reg_reg(op,S_NO,left.location.register,R_MM7);
|
||||
emit_reg_reg(A_MOVQ,S_NO,R_MM7,left.location.register);
|
||||
location_release(current_asmdata.CurrAsmList,right.location);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
if (right.location.loc=LOC_CMMXREGISTER) then
|
||||
begin
|
||||
emit_reg_reg(op,S_NO,right.location.register,left.location.register);
|
||||
end
|
||||
else
|
||||
begin
|
||||
if not(right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
|
||||
internalerror(200203246);
|
||||
emit_ref_reg(op,S_NO,right.location.reference,left.location.register);
|
||||
location_release(current_asmdata.CurrAsmList,right.location);
|
||||
end;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ right.location=LOC_MMXREGISTER }
|
||||
if (nodetype=subn) and (nf_swapped in flags) then
|
||||
begin
|
||||
emit_reg_reg(op,S_NO,left.location.register,right.location.register);
|
||||
location_swap(left.location,right.location);
|
||||
toggleflag(nf_swapped);
|
||||
end
|
||||
else
|
||||
begin
|
||||
emit_reg_reg(op,S_NO,right.location.register,left.location.register);
|
||||
end;
|
||||
end;
|
||||
|
||||
location_freetemp(current_asmdata.CurrAsmList,right.location);
|
||||
location_release(current_asmdata.CurrAsmList,right.location);
|
||||
if cmpop then
|
||||
begin
|
||||
location_freetemp(current_asmdata.CurrAsmList,left.location);
|
||||
location_release(current_asmdata.CurrAsmList,left.location);
|
||||
end;
|
||||
set_result_location(cmpop,true);
|
||||
end;
|
||||
{$endif SUPPORT_MMX}
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
pass_2
|
||||
*****************************************************************************}
|
||||
|
Loading…
Reference in New Issue
Block a user