New EVEX maps 5,6,7.

This commit is contained in:
Margers 2025-05-14 18:18:56 +00:00 committed by FPK
parent ff9aa15143
commit 0dea63ab08

View File

@ -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}