The no-operand flag and system controls, the sign-extension pair, the string primitives, the multi-byte no-ops, the cache controls, MOVBE, the compare-exchange doubles, the random source and FS/GS base pairs, the descriptor-table accesses, the 0F 00/01 register controls and the LAR/LSL selector reads and far-segment loads, each pinned byte for byte against go tool asm through every corpus line the toolchain's own amd64enc.s carries for the families (279 lines). Assisted-by: GLM 5.3 Flash
312 lines
9.5 KiB
Go
312 lines
9.5 KiB
Go
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package asm
|
|
|
|
import "testing"
|
|
|
|
// amd64SystemCorpus holds every line the Go toolchain's own
|
|
// amd64enc.s carries for the system, flag, string and segment families, with the bytes go tool asm
|
|
// emits for each: the differential ground truth the family is proven
|
|
// against, line for line.
|
|
var amd64SystemCorpus = []struct {
|
|
line string
|
|
want string
|
|
}{
|
|
{"CBW", "66 98"},
|
|
{"CDQ", "99"},
|
|
{"CDQE", "48 98"},
|
|
{"CLAC", "0f 01 ca"},
|
|
{"CLC", "f8"},
|
|
{"CLFLUSH (BX)", "0f ae 3b"},
|
|
{"CLFLUSH (R11)", "41 0f ae 3b"},
|
|
{"CLFLUSHOPT (BX)", "66 0f ae 3b"},
|
|
{"CLFLUSHOPT (R11)", "66 41 0f ae 3b"},
|
|
{"CLI", "fa"},
|
|
{"CLTS", "0f 06"},
|
|
{"CMC", "f5"},
|
|
{"CMPSB", "a6"},
|
|
{"CMPSL", "a7"},
|
|
{"CMPSQ", "48 a7"},
|
|
{"CMPSW", "66 a7"},
|
|
{"CMPXCHG16B (BX)", "48 0f c7 0b"},
|
|
{"CMPXCHG16B (R11)", "49 0f c7 0b"},
|
|
{"CMPXCHG8B (BX)", "0f c7 0b"},
|
|
{"CMPXCHG8B (R11)", "41 0f c7 0b"},
|
|
{"CQO", "48 99"},
|
|
{"CWD", "66 99"},
|
|
{"CWDE", "98"},
|
|
{"HLT", "f4"},
|
|
{"ICEBP", "f1"},
|
|
{"INSB", "6c"},
|
|
{"INSL", "6d"},
|
|
{"INSW", "66 6d"},
|
|
{"INVD", "0f 08"},
|
|
{"INVLPG (BX)", "0f 01 3b"},
|
|
{"INVLPG (R11)", "41 0f 01 3b"},
|
|
{"IRETW", "66 cf"},
|
|
{"IRETL", "cf"},
|
|
{"IRETQ", "48 cf"},
|
|
{"LAHF", "9f"},
|
|
{"LARW (BX), DX", "66 0f 02 13"},
|
|
{"LARW (R11), DX", "66 41 0f 02 13"},
|
|
{"LARW DX, DX", "66 0f 02 d2"},
|
|
{"LARW R11, DX", "66 41 0f 02 d3"},
|
|
{"LARW (BX), R11", "66 44 0f 02 1b"},
|
|
{"LARW (R11), R11", "66 45 0f 02 1b"},
|
|
{"LARW DX, R11", "66 44 0f 02 da"},
|
|
{"LARW R11, R11", "66 45 0f 02 db"},
|
|
{"LARL (BX), DX", "0f 02 13"},
|
|
{"LARL (R11), DX", "41 0f 02 13"},
|
|
{"LARL DX, DX", "0f 02 d2"},
|
|
{"LARL R11, DX", "41 0f 02 d3"},
|
|
{"LARL (BX), R11", "44 0f 02 1b"},
|
|
{"LARL (R11), R11", "45 0f 02 1b"},
|
|
{"LARL DX, R11", "44 0f 02 da"},
|
|
{"LARL R11, R11", "45 0f 02 db"},
|
|
{"LARQ (BX), DX", "48 0f 02 13"},
|
|
{"LARQ (R11), DX", "49 0f 02 13"},
|
|
{"LARQ DX, DX", "48 0f 02 d2"},
|
|
{"LARQ R11, DX", "49 0f 02 d3"},
|
|
{"LARQ (BX), R11", "4c 0f 02 1b"},
|
|
{"LARQ (R11), R11", "4d 0f 02 1b"},
|
|
{"LARQ DX, R11", "4c 0f 02 da"},
|
|
{"LARQ R11, R11", "4d 0f 02 db"},
|
|
{"LFSW (BX), DX", "66 0f b4 13"},
|
|
{"LFSW (R11), DX", "66 41 0f b4 13"},
|
|
{"LFSW (BX), R11", "66 44 0f b4 1b"},
|
|
{"LFSW (R11), R11", "66 45 0f b4 1b"},
|
|
{"LFSL (BX), DX", "0f b4 13"},
|
|
{"LFSL (R11), DX", "41 0f b4 13"},
|
|
{"LFSL (BX), R11", "44 0f b4 1b"},
|
|
{"LFSL (R11), R11", "45 0f b4 1b"},
|
|
{"LFSQ (BX), DX", "48 0f b4 13"},
|
|
{"LFSQ (R11), DX", "49 0f b4 13"},
|
|
{"LFSQ (BX), R11", "4c 0f b4 1b"},
|
|
{"LFSQ (R11), R11", "4d 0f b4 1b"},
|
|
{"LGDT (BX)", "0f 01 13"},
|
|
{"LGDT (R11)", "41 0f 01 13"},
|
|
{"LGSW (BX), DX", "66 0f b5 13"},
|
|
{"LGSW (R11), DX", "66 41 0f b5 13"},
|
|
{"LGSW (BX), R11", "66 44 0f b5 1b"},
|
|
{"LGSW (R11), R11", "66 45 0f b5 1b"},
|
|
{"LGSL (BX), DX", "0f b5 13"},
|
|
{"LGSL (R11), DX", "41 0f b5 13"},
|
|
{"LGSL (BX), R11", "44 0f b5 1b"},
|
|
{"LGSL (R11), R11", "45 0f b5 1b"},
|
|
{"LGSQ (BX), DX", "48 0f b5 13"},
|
|
{"LGSQ (R11), DX", "49 0f b5 13"},
|
|
{"LGSQ (BX), R11", "4c 0f b5 1b"},
|
|
{"LGSQ (R11), R11", "4d 0f b5 1b"},
|
|
{"LIDT (BX)", "0f 01 1b"},
|
|
{"LIDT (R11)", "41 0f 01 1b"},
|
|
{"LLDT (BX)", "0f 00 13"},
|
|
{"LLDT (R11)", "41 0f 00 13"},
|
|
{"LLDT DX", "0f 00 d2"},
|
|
{"LLDT R11", "41 0f 00 d3"},
|
|
{"LMSW (BX)", "0f 01 33"},
|
|
{"LMSW (R11)", "41 0f 01 33"},
|
|
{"LMSW DX", "0f 01 f2"},
|
|
{"LMSW R11", "41 0f 01 f3"},
|
|
{"LODSB", "ac"},
|
|
{"LODSL", "ad"},
|
|
{"LODSQ", "48 ad"},
|
|
{"LODSW", "66 ad"},
|
|
{"LSLW (BX), DX", "66 0f 03 13"},
|
|
{"LSLW (R11), DX", "66 41 0f 03 13"},
|
|
{"LSLW DX, DX", "66 0f 03 d2"},
|
|
{"LSLW R11, DX", "66 41 0f 03 d3"},
|
|
{"LSLW (BX), R11", "66 44 0f 03 1b"},
|
|
{"LSLW (R11), R11", "66 45 0f 03 1b"},
|
|
{"LSLW DX, R11", "66 44 0f 03 da"},
|
|
{"LSLW R11, R11", "66 45 0f 03 db"},
|
|
{"LSLL (BX), DX", "0f 03 13"},
|
|
{"LSLL (R11), DX", "41 0f 03 13"},
|
|
{"LSLL DX, DX", "0f 03 d2"},
|
|
{"LSLL R11, DX", "41 0f 03 d3"},
|
|
{"LSLL (BX), R11", "44 0f 03 1b"},
|
|
{"LSLL (R11), R11", "45 0f 03 1b"},
|
|
{"LSLL DX, R11", "44 0f 03 da"},
|
|
{"LSLL R11, R11", "45 0f 03 db"},
|
|
{"LSLQ (BX), DX", "48 0f 03 13"},
|
|
{"LSLQ (R11), DX", "49 0f 03 13"},
|
|
{"LSLQ DX, DX", "48 0f 03 d2"},
|
|
{"LSLQ R11, DX", "49 0f 03 d3"},
|
|
{"LSLQ (BX), R11", "4c 0f 03 1b"},
|
|
{"LSLQ (R11), R11", "4d 0f 03 1b"},
|
|
{"LSLQ DX, R11", "4c 0f 03 da"},
|
|
{"LSLQ R11, R11", "4d 0f 03 db"},
|
|
{"LSSW (BX), DX", "66 0f b2 13"},
|
|
{"LSSW (R11), DX", "66 41 0f b2 13"},
|
|
{"LSSW (BX), R11", "66 44 0f b2 1b"},
|
|
{"LSSW (R11), R11", "66 45 0f b2 1b"},
|
|
{"LSSL (BX), DX", "0f b2 13"},
|
|
{"LSSL (R11), DX", "41 0f b2 13"},
|
|
{"LSSL (BX), R11", "44 0f b2 1b"},
|
|
{"LSSL (R11), R11", "45 0f b2 1b"},
|
|
{"LSSQ (BX), DX", "48 0f b2 13"},
|
|
{"LSSQ (R11), DX", "49 0f b2 13"},
|
|
{"LSSQ (BX), R11", "4c 0f b2 1b"},
|
|
{"LSSQ (R11), R11", "4d 0f b2 1b"},
|
|
{"LTR (BX)", "0f 00 1b"},
|
|
{"LTR (R11)", "41 0f 00 1b"},
|
|
{"LTR DX", "0f 00 da"},
|
|
{"LTR R11", "41 0f 00 db"},
|
|
{"MONITOR", "0f 01 c8"},
|
|
{"MOVBEW DX, (BX)", "66 0f 38 f1 13"},
|
|
{"MOVBEW R11, (BX)", "66 44 0f 38 f1 1b"},
|
|
{"MOVBEW DX, (R11)", "66 41 0f 38 f1 13"},
|
|
{"MOVBEW R11, (R11)", "66 45 0f 38 f1 1b"},
|
|
{"MOVBEW (BX), DX", "66 0f 38 f0 13"},
|
|
{"MOVBEW (R11), DX", "66 41 0f 38 f0 13"},
|
|
{"MOVBEW (BX), R11", "66 44 0f 38 f0 1b"},
|
|
{"MOVBEW (R11), R11", "66 45 0f 38 f0 1b"},
|
|
{"MOVBEL DX, (BX)", "0f 38 f1 13"},
|
|
{"MOVBEL R11, (BX)", "44 0f 38 f1 1b"},
|
|
{"MOVBEL DX, (R11)", "41 0f 38 f1 13"},
|
|
{"MOVBEL R11, (R11)", "45 0f 38 f1 1b"},
|
|
{"MOVBEL (BX), DX", "0f 38 f0 13"},
|
|
{"MOVBEL (R11), DX", "41 0f 38 f0 13"},
|
|
{"MOVBEL (BX), R11", "44 0f 38 f0 1b"},
|
|
{"MOVBEL (R11), R11", "45 0f 38 f0 1b"},
|
|
{"MOVBEQ DX, (BX)", "48 0f 38 f1 13"},
|
|
{"MOVBEQ R11, (BX)", "4c 0f 38 f1 1b"},
|
|
{"MOVBEQ DX, (R11)", "49 0f 38 f1 13"},
|
|
{"MOVBEQ R11, (R11)", "4d 0f 38 f1 1b"},
|
|
{"MOVBEQ (BX), DX", "48 0f 38 f0 13"},
|
|
{"MOVBEQ (R11), DX", "49 0f 38 f0 13"},
|
|
{"MOVBEQ (BX), R11", "4c 0f 38 f0 1b"},
|
|
{"MOVBEQ (R11), R11", "4d 0f 38 f0 1b"},
|
|
{"MWAIT", "0f 01 c9"},
|
|
{"NOPW (BX)", "66 0f 1f 03"},
|
|
{"NOPW (R11)", "66 41 0f 1f 03"},
|
|
{"NOPW DX", "66 0f 1f c2"},
|
|
{"NOPW R11", "66 41 0f 1f c3"},
|
|
{"NOPL (BX)", "0f 1f 03"},
|
|
{"NOPL (R11)", "41 0f 1f 03"},
|
|
{"NOPL DX", "0f 1f c2"},
|
|
{"NOPL R11", "41 0f 1f c3"},
|
|
{"OUTSB", "6e"},
|
|
{"OUTSL", "6f"},
|
|
{"OUTSW", "66 6f"},
|
|
{"POPFW", "66 9d"},
|
|
{"PUSHFW", "66 9c"},
|
|
{"RDFSBASEL DX", "f3 0f ae c2"},
|
|
{"RDFSBASEL R11", "f3 41 0f ae c3"},
|
|
{"RDGSBASEL DX", "f3 0f ae ca"},
|
|
{"RDGSBASEL R11", "f3 41 0f ae cb"},
|
|
{"RDFSBASEQ DX", "f3 48 0f ae c2"},
|
|
{"RDFSBASEQ R11", "f3 49 0f ae c3"},
|
|
{"RDGSBASEQ DX", "f3 48 0f ae ca"},
|
|
{"RDGSBASEQ R11", "f3 49 0f ae cb"},
|
|
{"RDMSR", "0f 32"},
|
|
{"RDPKRU", "0f 01 ee"},
|
|
{"RDPMC", "0f 33"},
|
|
{"RDRANDW DX", "66 0f c7 f2"},
|
|
{"RDRANDW R11", "66 41 0f c7 f3"},
|
|
{"RDRANDL DX", "0f c7 f2"},
|
|
{"RDRANDL R11", "41 0f c7 f3"},
|
|
{"RDRANDQ DX", "48 0f c7 f2"},
|
|
{"RDRANDQ R11", "49 0f c7 f3"},
|
|
{"RDSEEDW DX", "66 0f c7 fa"},
|
|
{"RDSEEDW R11", "66 41 0f c7 fb"},
|
|
{"RDSEEDL DX", "0f c7 fa"},
|
|
{"RDSEEDL R11", "41 0f c7 fb"},
|
|
{"RDSEEDQ DX", "48 0f c7 fa"},
|
|
{"RDSEEDQ R11", "49 0f c7 fb"},
|
|
{"RSM", "0f aa"},
|
|
{"SAHF", "9e"},
|
|
{"SCASB", "ae"},
|
|
{"SCASL", "af"},
|
|
{"SCASQ", "48 af"},
|
|
{"SCASW", "66 af"},
|
|
{"SGDT (BX)", "0f 01 03"},
|
|
{"SGDT (R11)", "41 0f 01 03"},
|
|
{"SIDT (BX)", "0f 01 0b"},
|
|
{"SIDT (R11)", "41 0f 01 0b"},
|
|
{"SLDTW (BX)", "66 0f 00 03"},
|
|
{"SLDTW (R11)", "66 41 0f 00 03"},
|
|
{"SLDTW DX", "66 0f 00 c2"},
|
|
{"SLDTW R11", "66 41 0f 00 c3"},
|
|
{"SLDTL (BX)", "0f 00 03"},
|
|
{"SLDTL (R11)", "41 0f 00 03"},
|
|
{"SLDTL DX", "0f 00 c2"},
|
|
{"SLDTL R11", "41 0f 00 c3"},
|
|
{"SLDTQ (BX)", "48 0f 00 03"},
|
|
{"SLDTQ (R11)", "49 0f 00 03"},
|
|
{"SLDTQ DX", "48 0f 00 c2"},
|
|
{"SLDTQ R11", "49 0f 00 c3"},
|
|
{"SMSWW (BX)", "66 0f 01 23"},
|
|
{"SMSWW (R11)", "66 41 0f 01 23"},
|
|
{"SMSWW DX", "66 0f 01 e2"},
|
|
{"SMSWW R11", "66 41 0f 01 e3"},
|
|
{"SMSWL (BX)", "0f 01 23"},
|
|
{"SMSWL (R11)", "41 0f 01 23"},
|
|
{"SMSWL DX", "0f 01 e2"},
|
|
{"SMSWL R11", "41 0f 01 e3"},
|
|
{"SMSWQ (BX)", "48 0f 01 23"},
|
|
{"SMSWQ (R11)", "49 0f 01 23"},
|
|
{"SMSWQ DX", "48 0f 01 e2"},
|
|
{"SMSWQ R11", "49 0f 01 e3"},
|
|
{"STAC", "0f 01 cb"},
|
|
{"STC", "f9"},
|
|
{"STI", "fb"},
|
|
{"STRW (BX)", "66 0f 00 0b"},
|
|
{"STRW (R11)", "66 41 0f 00 0b"},
|
|
{"STRW DX", "66 0f 00 ca"},
|
|
{"STRW R11", "66 41 0f 00 cb"},
|
|
{"STRL (BX)", "0f 00 0b"},
|
|
{"STRL (R11)", "41 0f 00 0b"},
|
|
{"STRL DX", "0f 00 ca"},
|
|
{"STRL R11", "41 0f 00 cb"},
|
|
{"STRQ (BX)", "48 0f 00 0b"},
|
|
{"STRQ (R11)", "49 0f 00 0b"},
|
|
{"STRQ DX", "48 0f 00 ca"},
|
|
{"STRQ R11", "49 0f 00 cb"},
|
|
{"SWAPGS", "0f 01 f8"},
|
|
{"SYSENTER", "0f 34"},
|
|
{"SYSENTER64", "48 0f 34"},
|
|
{"SYSEXIT", "0f 35"},
|
|
{"SYSEXIT64", "48 0f 35"},
|
|
{"SYSRET", "0f 07"},
|
|
{"UD1", "0f b9"},
|
|
{"UD2", "0f 0b"},
|
|
{"VERR (BX)", "0f 00 23"},
|
|
{"VERR (R11)", "41 0f 00 23"},
|
|
{"VERR DX", "0f 00 e2"},
|
|
{"VERR R11", "41 0f 00 e3"},
|
|
{"VERW (BX)", "0f 00 2b"},
|
|
{"VERW (R11)", "41 0f 00 2b"},
|
|
{"VERW DX", "0f 00 ea"},
|
|
{"VERW R11", "41 0f 00 eb"},
|
|
{"WBINVD", "0f 09"},
|
|
{"WRFSBASEL DX", "f3 0f ae d2"},
|
|
{"WRFSBASEL R11", "f3 41 0f ae d3"},
|
|
{"WRGSBASEL DX", "f3 0f ae da"},
|
|
{"WRGSBASEL R11", "f3 41 0f ae db"},
|
|
{"WRFSBASEQ DX", "f3 48 0f ae d2"},
|
|
{"WRFSBASEQ R11", "f3 49 0f ae d3"},
|
|
{"WRGSBASEQ DX", "f3 48 0f ae da"},
|
|
{"WRGSBASEQ R11", "f3 49 0f ae db"},
|
|
{"WRMSR", "0f 30"},
|
|
{"WRPKRU", "0f 01 ef"},
|
|
{"XLAT", "d7"},
|
|
{"XSETBV", "0f 01 d1"},
|
|
}
|
|
|
|
// TestAmd64SystemCorpus assembles every corpus line and requires the same bytes
|
|
// go tool asm emits for it.
|
|
func TestAmd64SystemCorpus(t *testing.T) {
|
|
for _, tc := range amd64SystemCorpus {
|
|
fn := firstText(t, "TEXT ·p(SB), 4, $0\n\t"+tc.line+"\n")
|
|
code, _, err := Assemble(fn)
|
|
if err != nil {
|
|
t.Errorf("%s: %v", tc.line, err)
|
|
continue
|
|
}
|
|
if got := hexBytes(code); got != tc.want {
|
|
t.Errorf("%s: got %s, want %s", tc.line, got, tc.want)
|
|
}
|
|
}
|
|
}
|