Foundation for replacing fold's dead/abstract binary encoder with a real
SSA P-Code frontend. Verified root-cause gap: serializeBinaryIR() emits only
data-discovery nodes (sections/strings/imports/exports); the control-flow
BinaryExprKind values (BasicBlock/CallSite/...) are never constructed, so the
Z3-BB encoder's encodable filter is always empty and encodeBinaryBBs never
runs — hence 0 binary Z3 findings. The P-Code pipeline supersedes that path.
Phase 0 — docs/internal/ghidra-pcode-integration-research.md: P-Code opcode
core, the decompiler C++ embedding API (LoadImage/SleighArchitecture/Funcdata),
the CORE+DECCORE+SLEIGH source sets, no-bison finding, and pypcode as build
reference.
Phase 1 — vendored Ghidra decompiler at pinned commit (Ghidra_12.1_build,
7e89d94e34...) under third_party/ghidra-decompiler/ (cpp + AArch64 specs +
Apache-2.0 LICENSE + VENDOR.md + .gitignore for build artifacts). Validated by
hand on this clang-21/macOS toolchain:
- full SSA engine (CORE+DECCORE+SLEIGH, 80 files incl. heritage/funcdata/
action) compiles clean, -std=c++11 -O2, NO BFD, NO bison (generated
parsers are committed upstream; ruleparse isn't in the lib set);
- sleigh compiler builds; AArch64 .slaspec -> .sla compiles;
- tools/pcode_dump.cpp (custom LoadImage, no BFD) lifts the real arm64
sym._div_by_zero_direct to correct P-Code: `mov w9,#0 -> COPY(const 0)`,
`sdiv -> INT_SDIV(w8,w9)` — divisor zero-ness explicit in the data flow,
so the Phase-3 encoder proves div-by-zero trivially, multi-arch.
Not yet meson-wired (next step) and no fold-side IR/encoder yet (Phase 2-3);
this commit is the validated vendor + smoke tool.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
171 lines
No EOL
4.3 KiB
Text
171 lines
No EOL
4.3 KiB
Text
#
|
|
# Apple AARCH64 extended matrix instructions
|
|
# Contents based on evolving information published on Web
|
|
#
|
|
#
|
|
|
|
define pcodeop __amx_ldx;
|
|
define pcodeop __amx_ldy;
|
|
define pcodeop __amx_stx;
|
|
define pcodeop __amx_sty;
|
|
define pcodeop __amx_ldz;
|
|
define pcodeop __amx_stz;
|
|
define pcodeop __amx_ldzi;
|
|
define pcodeop __amx_stzi;
|
|
define pcodeop __amx_extrx;
|
|
define pcodeop __amx_extry;
|
|
define pcodeop __amx_fma64;
|
|
define pcodeop __amx_fms64;
|
|
define pcodeop __amx_fma32;
|
|
define pcodeop __amx_fms32;
|
|
define pcodeop __amx_mac16;
|
|
define pcodeop __amx_fma16;
|
|
define pcodeop __amx_fms16;
|
|
define pcodeop __amx_enable;
|
|
define pcodeop __amx_disable;
|
|
define pcodeop __amx_vecint;
|
|
define pcodeop __amx_vecfp;
|
|
define pcodeop __amx_matint;
|
|
define pcodeop __amx_matfp;
|
|
define pcodeop __amx_genlut;
|
|
|
|
|
|
with : ImmS_ImmR_TestSet=1 {
|
|
|
|
AMXAddr: is Rd_GPR64 {
|
|
addr:8 = Rd_GPR64 & 0x00FFFFFFFFFFFFFF;
|
|
export addr;
|
|
}
|
|
|
|
AMXRegOff: is Rd_GPR64 {
|
|
registerOff:8 = (Rd_GPR64 >> 56) & 0x1F;
|
|
export registerOff;
|
|
}
|
|
|
|
AMXSize: is Rd_GPR64 {
|
|
local size = ((Rd_GPR64 >> 62) & 1);
|
|
size = zext(size == 0) * 0x40 | zext(size ==1 ) * 0x80;
|
|
export size;
|
|
}
|
|
|
|
:__amx_ldx Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=0 & AMXAddr & AMXRegOff & AMXSize & Rd_GPR64
|
|
{
|
|
__amx_ldx(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_ldy Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=1 & AMXAddr & AMXRegOff & AMXSize & Rd_GPR64
|
|
{
|
|
__amx_ldy(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_stx Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=2 & AMXAddr & AMXRegOff & AMXSize & Rd_GPR64
|
|
{
|
|
__amx_stx(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_sty Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=3 & AMXAddr & AMXRegOff & AMXSize & Rd_GPR64
|
|
{
|
|
__amx_sty(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_ldz Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=4 & AMXAddr & AMXRegOff & AMXSize & Rd_GPR64
|
|
{
|
|
__amx_ldz(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_stz Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=5 & AMXAddr & AMXRegOff & AMXSize & Rd_GPR64
|
|
{
|
|
__amx_stz(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_ldzi Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=6 & AMXAddr & AMXRegOff & AMXSize & Rd_GPR64
|
|
{
|
|
__amx_ldzi(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_stzi Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=7 & AMXAddr & AMXRegOff & AMXSize & Rd_GPR64
|
|
{
|
|
__amx_stzi(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_extrx Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=8 & Rd_GPR64
|
|
{
|
|
__amx_extrx(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_extry Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=9 & Rd_GPR64
|
|
{
|
|
__amx_extry(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_fma64 Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=10 & Rd_GPR64
|
|
{
|
|
__amx_fma64(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_fms64 Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=11 & Rd_GPR64
|
|
{
|
|
__amx_fms64(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_fma32 Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=12 & Rd_GPR64
|
|
{
|
|
__amx_fma32(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_fms32 Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=13 & Rd_GPR64
|
|
{
|
|
__amx_fms32(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_mac16 Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=14 & Rd_GPR64
|
|
{
|
|
__amx_mac16(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_fma16 Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=15 & Rd_GPR64
|
|
{
|
|
__amx_fma16(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_fms16 Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=16 & Rd_GPR64
|
|
{
|
|
__amx_fms16(Rd_GPR64);
|
|
}
|
|
|
|
:__amxdisable is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=17 & b_0004=1
|
|
{
|
|
__amx_disable();
|
|
}
|
|
|
|
:__amxenable is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=17 & b_0004=0
|
|
{
|
|
__amx_enable();
|
|
}
|
|
|
|
:__amx_vecint Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=18 & Rd_GPR64
|
|
{
|
|
__amx_vecint(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_vecfp Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=19 & Rd_GPR64
|
|
{
|
|
__amx_vecfp(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_matint Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=20 & Rd_GPR64
|
|
{
|
|
__amx_matint(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_matfp Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=21 & Rd_GPR64
|
|
{
|
|
__amx_matfp(Rd_GPR64);
|
|
}
|
|
|
|
:__amx_genlut Rd_GPR64 is b_2431=0x00 & b_1623=0x20 & b_1215=1 & b_1011=0 & b_0509=22 & Rd_GPR64
|
|
{
|
|
__amx_genlut(Rd_GPR64);
|
|
}
|
|
|
|
} |