mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-14 02:49:17 +02:00
New EVEX maps 5,6,7.
This commit is contained in:
parent
ff9aa15143
commit
0dea63ab08
@ -3378,7 +3378,8 @@ implementation
|
||||
// ignore for calculating length
|
||||
;
|
||||
&371, // VEX-Extension prefix $0F38
|
||||
&372: // VEX-Extension prefix $0F3A
|
||||
&372, // VEX-Extension prefix $0F3A
|
||||
&375..&377: // opcode map 5,6,7
|
||||
begin
|
||||
if not(exists_vex_extension) then
|
||||
begin
|
||||
@ -3565,9 +3566,13 @@ implementation
|
||||
* \366 - operand 2 (ymmreg,zmmreg) encoded in bit 4-7 of the immediate byte
|
||||
* \367 - operand 3 (ymmreg,zmmreg) encoded in bit 4-7 of the immediate byte
|
||||
|
||||
* \370 - VEX 0F-FLAG
|
||||
* \371 - VEX 0F38-FLAG
|
||||
* \372 - VEX 0F3A-FLAG
|
||||
* \370 - VEX 0F-FLAG (map 1)
|
||||
* \371 - VEX 0F38-FLAG (map 2)
|
||||
* \372 - VEX 0F3A-FLAG (map 3)
|
||||
|
||||
* \375 - EVEX map 5
|
||||
* \376 - EVEX map 6
|
||||
* \377 - EVEX map 7
|
||||
}
|
||||
|
||||
var
|
||||
@ -3720,7 +3725,7 @@ implementation
|
||||
{ RELOC_GOTPCREL, RELOC_REX_GOTPCRELX, RELOC_GOTPCRELX need special handling }
|
||||
if assigned(p) and (RelocType in [RELOC_GOTPCREL, RELOC_REX_GOTPCRELX, RELOC_GOTPCRELX]) and
|
||||
{ These relocations seem to be used only for ELF
|
||||
which always has relocs_use_addend set to true
|
||||
which always has relocs_use_addend set to true
|
||||
so that it is the orgsize of the last relocation which needs to be fixed PM }
|
||||
(insend<>objdata.CurrObjSec.size) then
|
||||
dec(TObjRelocation(objdata.CurrObjSec.ObjRelocations.Last).orgsize,insend-objdata.CurrObjSec.size);
|
||||
@ -3768,7 +3773,7 @@ implementation
|
||||
EVEXz : byte;
|
||||
EVEXaaa : byte;
|
||||
EVEXb : byte;
|
||||
EVEXmm : byte;
|
||||
EVEXmmm : byte;
|
||||
|
||||
begin
|
||||
{ safety check }
|
||||
@ -3877,7 +3882,7 @@ implementation
|
||||
EVEXz := 0;
|
||||
EVEXaaa := 0;
|
||||
EVEXb := 0;
|
||||
EVEXmm := 0;
|
||||
EVEXmmm := 0;
|
||||
|
||||
repeat
|
||||
c:=ord(codes^);
|
||||
@ -3971,19 +3976,33 @@ implementation
|
||||
end;
|
||||
&370: begin
|
||||
VEXmmmmm := VEXmmmmm OR $01; // set leading opcode byte $0F
|
||||
EVEXmm := $01;
|
||||
EVEXmmm := $01;
|
||||
end;
|
||||
&371: begin
|
||||
needed_VEX_Extension := true;
|
||||
VEXmmmmm := VEXmmmmm OR $02; // set leading opcode byte $0F38
|
||||
EVEXmm := $02;
|
||||
EVEXmmm := $02;
|
||||
end;
|
||||
&372: begin
|
||||
needed_VEX_Extension := true;
|
||||
VEXmmmmm := VEXmmmmm OR $03; // set leading opcode byte $0F3A
|
||||
EVEXmm := $03;
|
||||
EVEXmmm := $03;
|
||||
end;
|
||||
&375: begin
|
||||
needed_VEX_Extension := true;
|
||||
VEXmmmmm := VEXmmmmm OR $05;
|
||||
EVEXmmm := $05; // set opcode map 5
|
||||
end;
|
||||
&376: begin
|
||||
needed_VEX_Extension := true;
|
||||
VEXmmmmm := VEXmmmmm OR $06;
|
||||
EVEXmmm := $06; // set opcode map 6
|
||||
end;
|
||||
&377: begin
|
||||
needed_VEX_Extension := true;
|
||||
VEXmmmmm := VEXmmmmm OR $07;
|
||||
EVEXmmm := $07; // set opcode map 7
|
||||
end;
|
||||
|
||||
end;
|
||||
until false;
|
||||
|
||||
@ -4093,7 +4112,7 @@ implementation
|
||||
|
||||
bytes[0] := $62;
|
||||
|
||||
bytes[1] := ((EVEXmm and $03) shl 0) or
|
||||
bytes[1] := ((EVEXmmm and $07) shl 0) or
|
||||
{$ifdef x86_64}
|
||||
((not(rex) and $05) shl 5) or
|
||||
{$else}
|
||||
@ -4534,7 +4553,7 @@ implementation
|
||||
Internalerror(2014032001);
|
||||
end;
|
||||
&350..&352: ; // EVEX flags =>> nothing todo
|
||||
&370..&372: ; // VEX flags =>> nothing todo
|
||||
&370..&377: ; // VEX and EVEX flags =>> nothing todo
|
||||
&37:
|
||||
begin
|
||||
{$ifdef i8086}
|
||||
|
Loading…
Reference in New Issue
Block a user