Merge remote-tracking branch 'origin/GP-5780_ghidorahrex_x86_missing_instructions--SQUASHED' into patch

This commit is contained in:
Ryan Kurtz
2026-06-08 15:31:29 -04:00
7 changed files with 324 additions and 7 deletions
@@ -22,6 +22,7 @@ data/languages/bmi1.sinc||GHIDRA||||END|
data/languages/bmi2.sinc||GHIDRA||||END|
data/languages/cet.sinc||GHIDRA||||END|
data/languages/clwb.sinc||GHIDRA||||END|
data/languages/cmpccxadd.sinc||GHIDRA||||END|
data/languages/fma.sinc||GHIDRA||||END|
data/languages/ia.sinc||GHIDRA||||END|
data/languages/lockable.sinc||GHIDRA||||END|
@@ -61,6 +62,7 @@ data/languages/old/x86smmV2.trans||GHIDRA||||END|
data/languages/old/x86smmV3.lang||GHIDRA||||END|
data/languages/old/x86smmV3.trans||GHIDRA||||END|
data/languages/pclmulqdq.sinc||GHIDRA||||END|
data/languages/rao.sinc||GHIDRA||||END|
data/languages/rdrand.sinc||GHIDRA||||END|
data/languages/sgx.sinc||GHIDRA||||END|
data/languages/sha.sinc||GHIDRA||||END|
@@ -0,0 +1,27 @@
####
#### CMPccXADD instructions
####
@ifdef IA64
:CMP^cc^"XADD" m32, Reg32, vexVVVV_r32 is $(VEX_NDS) & $(VEX_L128) & $(VEX_PRE_66) & $(VEX_0F38) & $(VEX_W0) & vexVVVV_r32 & row=0xe & cc; Reg32 ... & m32 {
local op1 = m32;
local op2 = Reg32;
subflags(op1, op2);
local tmp = op1 - op2;
resultflags(tmp);
build cc;
if (!cc) goto inst_next;
m32 = vexVVVV_r32;
}
:CMP^cc^"XADD" m64, Reg64, vexVVVV_r64 is $(VEX_NDS) & $(VEX_L128) & $(VEX_PRE_66) & $(VEX_0F38) & $(VEX_W1) & vexVVVV_r64 & row=0xe & cc; Reg64 ... & m64 {
local op1 = m64;
local op2 = Reg64;
subflags(op1, op2);
local tmp = op1 - op2;
resultflags(tmp);
build cc;
if (!cc) goto inst_next;
m64 = vexVVVV_r64;
}
@endif
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,44 @@
####
#### RAO-INT instructions
####
:AADD m32,Reg32 is vexMode=0 & rexprefix=0 & $(PRE_NO) & byte=0x0F; byte=0x38; byte=0xFC; Reg32 ... & m32 {
m32 = m32 + Reg32;
}
@ifdef IA64
:AADD m64,Reg64 is $(REX_W) & $(PRE_NO) & byte=0x0F; byte=0x38; byte=0xFC; Reg64 ... & m64 {
m64 = m64 + Reg64;
}
@endif
:AAND m32,Reg32 is vexMode=0 & rexprefix=0 & $(PRE_66) & byte=0x0F; byte=0x38; byte=0xFC; Reg32 ... & m32 {
m32 = m32 & Reg32;
}
@ifdef IA64
:AAND m64,Reg64 is $(REX_W) & $(PRE_66) & byte=0x0F; byte=0x38; byte=0xFC; Reg64 ... & m64 {
m64 = m64 & Reg64;
}
@endif
:AOR m32,Reg32 is vexMode=0 & rexprefix=0 & $(PRE_F2) & byte=0x0F; byte=0x38; byte=0xFC; Reg32 ... & m32 {
m32 = m32 | Reg32;
}
@ifdef IA64
:AOR m64,Reg64 is $(REX_W) & $(PRE_F2) & byte=0x0F; byte=0x38; byte=0xFC; Reg64 ... & m64 {
m64 = m64 | Reg64;
}
@endif
:AXOR m32,Reg32 is vexMode=0 & rexprefix=0 & $(PRE_F3) & byte=0x0F; byte=0x38; byte=0xFC; Reg32 ... & m32 {
m32 = m32 ^ Reg32;
}
@ifdef IA64
:AXOR m64,Reg64 is $(REX_W) & $(PRE_F3) & byte=0x0F; byte=0x38; byte=0xFC; Reg64 ... & m64 {
m64 = m64 ^ Reg64;
}
@endif
@@ -255,3 +255,48 @@ define pcodeop enclu_unknown;
<done>
}
define pcodeop enclv_edecvirtchild;
define pcodeop enclv_eincvirtchild;
define pcodeop enclv_esetcontext;
define pcodeop enclv_unknown;
:ENCLV is vexMode=0 & byte=0x0f; byte=0x01; byte=0xc0 {
if ( EAX != 0x0 ) goto <leaf_1>;
RAX = enclv_edecvirtchild( RBX, RCX );
ZF = (RAX != 0);
CF = 0;
PF = 0;
AF = 0;
OF = 0;
SF = 0;
goto <done>;
<leaf_1>
if ( EAX != 0x1 ) goto <leaf_2>;
RAX = enclv_eincvirtchild( RBX, RCX );
ZF = (RAX != 0);
CF = 0;
PF = 0;
AF = 0;
OF = 0;
SF = 0;
goto <done>;
<leaf_2>
if ( EAX != 0x2 ) goto <unknown>;
RAX = enclv_esetcontext( RCX, RDX );
ZF = (RAX != 0);
CF = 0;
PF = 0;
AF = 0;
OF = 0;
SF = 0;
goto <done>;
<unknown>
enclv_unknown();
<done>
}
@@ -3,4 +3,5 @@
with : lockprefx=0 {
@include "sgx.sinc"
@include "fma.sinc"
@include "cmpccxadd.sinc"
}
@@ -18,4 +18,5 @@ with : lockprefx=0 {
@include "smx.sinc"
@include "cet.sinc"
@include "rdrand.sinc"
@include "rao.sinc"
}