mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 11:49:23 +02:00
* Some cleanup for AVX part of internal assembler. Functionality is not changed.
git-svn-id: trunk@34948 -
This commit is contained in:
parent
acaae2bf3c
commit
b5660401fe
@ -2903,30 +2903,21 @@ implementation
|
||||
if needed_VEX_Extension then
|
||||
begin
|
||||
// VEX-Prefix-Length = 3 Bytes
|
||||
bytes[0]:=$C4;
|
||||
objdata.writebytes(bytes,1);
|
||||
|
||||
{$ifdef x86_64}
|
||||
VEXmmmmm := VEXmmmmm or ((not(rex) and $07) shl 5); // set REX.rxb
|
||||
VEXvvvv := VEXvvvv or ((rex and $08) shl 7); // set REX.w
|
||||
{$else}
|
||||
VEXmmmmm := VEXmmmmm or (7 shl 5); //
|
||||
{$endif x86_64}
|
||||
|
||||
bytes[0] := VEXmmmmm;
|
||||
objdata.writebytes(bytes,1);
|
||||
|
||||
{$ifdef x86_64}
|
||||
VEXvvvv := VEXvvvv OR ((rex and $08) shl 7); // set REX.w
|
||||
{$endif x86_64}
|
||||
bytes[0] := VEXvvvv;
|
||||
objdata.writebytes(bytes,1);
|
||||
bytes[0]:=$C4;
|
||||
bytes[1]:=VEXmmmmm;
|
||||
bytes[2]:=VEXvvvv;
|
||||
objdata.writebytes(bytes,3);
|
||||
end
|
||||
else
|
||||
begin
|
||||
// VEX-Prefix-Length = 2 Bytes
|
||||
bytes[0]:=$C5;
|
||||
objdata.writebytes(bytes,1);
|
||||
|
||||
{$ifdef x86_64}
|
||||
if rex and $04 = 0 then
|
||||
{$endif x86_64}
|
||||
@ -2934,8 +2925,9 @@ implementation
|
||||
VEXvvvv := VEXvvvv or (1 shl 7);
|
||||
end;
|
||||
|
||||
bytes[0] := VEXvvvv;
|
||||
objdata.writebytes(bytes,1);
|
||||
bytes[0]:=$C5;
|
||||
bytes[1]:=VEXvvvv;
|
||||
objdata.writebytes(bytes,2);
|
||||
end;
|
||||
end
|
||||
else
|
||||
@ -3287,48 +3279,20 @@ implementation
|
||||
are not needed }
|
||||
end;
|
||||
&362..&364: ; // VEX flags =>> nothing todo
|
||||
&366: begin
|
||||
if needed_VEX then
|
||||
begin
|
||||
if ops = 4 then
|
||||
begin
|
||||
if (oper[2]^.typ=top_reg) then
|
||||
begin
|
||||
if (oper[2]^.ot and otf_reg_xmm <> 0) or
|
||||
(oper[2]^.ot and otf_reg_ymm <> 0) then
|
||||
begin
|
||||
bytes[0] := ((getsupreg(oper[2]^.reg) and 15) shl 4);
|
||||
objdata.writebytes(bytes,1);
|
||||
end
|
||||
else Internalerror(2014032001);
|
||||
end
|
||||
else Internalerror(2014032002);
|
||||
end
|
||||
else Internalerror(2014032003);
|
||||
end
|
||||
else Internalerror(2014032004);
|
||||
end;
|
||||
&367: begin
|
||||
if needed_VEX then
|
||||
begin
|
||||
if ops = 4 then
|
||||
begin
|
||||
if (oper[3]^.typ=top_reg) then
|
||||
begin
|
||||
if (oper[3]^.ot and otf_reg_xmm <> 0) or
|
||||
(oper[3]^.ot and otf_reg_ymm <> 0) then
|
||||
begin
|
||||
bytes[0] := ((getsupreg(oper[3]^.reg) and 15) shl 4);
|
||||
objdata.writebytes(bytes,1);
|
||||
end
|
||||
else Internalerror(2014032005);
|
||||
end
|
||||
else Internalerror(2014032006);
|
||||
end
|
||||
else Internalerror(2014032007);
|
||||
end
|
||||
else Internalerror(2014032008);
|
||||
end;
|
||||
&366, &367:
|
||||
begin
|
||||
opidx:=c-&364; { 0366->operand 2, 0367->operand 3 }
|
||||
if needed_VEX and
|
||||
(ops=4) and
|
||||
(oper[opidx]^.typ=top_reg) and
|
||||
(oper[opidx]^.ot and (otf_reg_xmm or otf_reg_ymm)<>0) then
|
||||
begin
|
||||
bytes[0] := ((getsupreg(oper[opidx]^.reg) and 15) shl 4);
|
||||
objdata.writebytes(bytes,1);
|
||||
end
|
||||
else
|
||||
Internalerror(2014032001);
|
||||
end;
|
||||
&370..&372: ; // VEX flags =>> nothing todo
|
||||
&37:
|
||||
begin
|
||||
|
Loading…
Reference in New Issue
Block a user