------ empty input ==== [] ------ only newlines ==== [] ------ only comments and newlines # { # ICLASS : ADD # } ==== [] ------ join lines { ICLASS : i\ cla\ ss1 VERSION : 1.\ 0 FLAGS:\ \ \ NOP REAL_OPCODE : \Y CPL : \3 PATTERN: A B OPERANDS: } ==== [{ "Iclass": "i cla ss1", "Version": "1.0", "Flags": "NOP", "RealOpcode": "\\Y", "CPL": "\\3", "Pattern": "A B" }] ------ 1 variant; no iform { ICLASS:iclass1 # comment DISASM : disasm1 PATTERN :pat1 pat1 OPERANDS : ops1 ops1 } # comment { # comment # comment ICLASS : iclass2 OPERANDS:ops2 PATTERN:pat2 # comment } ==== [{ "Iclass": "iclass1", "Disasm": "disasm1", "Pattern": "pat1 pat1", "Operands": "ops1 ops1" }, { "Iclass": "iclass2", "Operands": "ops2", "Pattern": "pat2" }] ------ 2 variants; no iform { PATTERN : pat1_1 COMMENT : comment1 OPERANDS : ops1_1 OPERANDS : ops1_2 PATTERN : pat1_2 } { PATTERN : pat2_1 PATTERN : pat2_2 OPERANDS : ops2_1 OPERANDS : ops2_2 } ==== [{ "Comment": "comment1", "Pattern": "pat1_1", "Operands": "ops1_1" }, { "Comment": "comment1", "Pattern": "pat1_2", "Operands": "ops1_2" }, { "Pattern": "pat2_1", "Operands": "ops2_1" }, { "Pattern": "pat2_2", "Operands": "ops2_2" }] ------ 3 variants { PATTERN : pat1_1 OPERANDS : ops1_1 IFORM : iform1_1 PATTERN : pat1_2# comment OPERANDS : ops1_2# comment IFORM : iform1_2# comment # comment PATTERN : pat1_3 OPERANDS : ops1_3 IFORM : iform1_3 } { PATTERN : pat2_1 OPERANDS : ops2_1 IFORM : iform2_1 PATTERN : pat2_2 OPERANDS : ops2_2 PATTERN : pat2_3 OPERANDS : ops2_3 } ==== [{ "Iform": "iform1_1", "Pattern": "pat1_1", "Operands": "ops1_1" }, { "Iform": "iform1_2", "Pattern": "pat1_2", "Operands": "ops1_2" }, { "Iform": "iform1_3", "Pattern": "pat1_3", "Operands": "ops1_3" }, { "Iform": "iform2_1", "Pattern": "pat2_1", "Operands": "ops2_1" }, { "Pattern": "pat2_2", "Operands": "ops2_2" }, { "Pattern": "pat2_3", "Operands": "ops2_3" }] ------ stable and unstable instructions (REAL_OPCODE) { ICLASS: STABLE REAL_OPCODE: Y PATTERN : x y z OPERANDS : } { ICLASS: UNSTABLE REAL_OPCODE: N PATTERN : x y z OPERANDS : } ==== [{ "Iclass": "STABLE", "RealOpcode": "Y", "Pattern": "x y z", "Operands": "" }, { "Iclass": "UNSTABLE", "RealOpcode": "N", "Pattern": "x y z", "Operands": "" }] ------ AVXAES objects # Emitting VAESENCLAST { ICLASS : VAESENCLAST EXCEPTIONS: avx-type-4 CPL : 3 CATEGORY : AES EXTENSION : AVXAES PATTERN : VV1 0xDD V66 V0F38 MOD[0b11] MOD=3 REG[rrr] RM[nnn] VL128 OPERANDS : REG0=XMM_R():w:dq REG1=XMM_N():r:dq REG2=XMM_B():r:dq PATTERN : VV1 0xDD V66 V0F38 MOD[mm] MOD!=3 REG[rrr] RM[nnn] MODRM() VL128 OPERANDS : REG0=XMM_R():w:dq REG1=XMM_N():r:dq MEM0:r:dq } # Emitting VAESDEC { ICLASS : VAESDEC EXCEPTIONS: avx-type-4 CPL : 3 CATEGORY : AES EXTENSION : AVXAES PATTERN : VV1 0xDE V66 V0F38 MOD[0b11] MOD=3 REG[rrr] RM[nnn] VL128 OPERANDS : REG0=XMM_R():w:dq REG1=XMM_N():r:dq REG2=XMM_B():r:dq PATTERN : VV1 0xDE V66 V0F38 MOD[mm] MOD!=3 REG[rrr] RM[nnn] MODRM() VL128 OPERANDS : REG0=XMM_R():w:dq REG1=XMM_N():r:dq MEM0:r:dq } ==== [{ "Iclass": "VAESENCLAST", "Exceptions": "avx-type-4", "CPL": "3", "Category": "AES", "Extension": "AVXAES", "Pattern": "VV1 0xDD V66 V0F38 MOD[0b11] MOD=3 REG[rrr] RM[nnn] VL128", "Operands": "REG0=XMM_R():w:dq REG1=XMM_N():r:dq REG2=XMM_B():r:dq" }, { "Iclass": "VAESENCLAST", "Exceptions": "avx-type-4", "CPL": "3", "Category": "AES", "Extension": "AVXAES", "Pattern": "VV1 0xDD V66 V0F38 MOD[mm] MOD!=3 REG[rrr] RM[nnn] MODRM() VL128", "Operands": "REG0=XMM_R():w:dq REG1=XMM_N():r:dq MEM0:r:dq" }, { "Iclass": "VAESDEC", "Exceptions": "avx-type-4", "CPL": "3", "Category": "AES", "Extension": "AVXAES", "Pattern": "VV1 0xDE V66 V0F38 MOD[0b11] MOD=3 REG[rrr] RM[nnn] VL128", "Operands": "REG0=XMM_R():w:dq REG1=XMM_N():r:dq REG2=XMM_B():r:dq" }, { "Iclass": "VAESDEC", "Exceptions": "avx-type-4", "CPL": "3", "Category": "AES", "Extension": "AVXAES", "Pattern": "VV1 0xDE V66 V0F38 MOD[mm] MOD!=3 REG[rrr] RM[nnn] MODRM() VL128", "Operands": "REG0=XMM_R():w:dq REG1=XMM_N():r:dq MEM0:r:dq" }] ------ Two-word disasm { ICLASS : JMP_FAR DISASM_INTEL: jmp far DISASM_ATTSV: ljmp CPL : 3 CATEGORY : UNCOND_BR ATTRIBUTES : FAR_XFER NOTSX EXTENSION : BASE ISA_SET : I86 PATTERN : 0xEA not64 BRDISPz() UIMM16() OPERANDS : PTR:r:p IMM0:r:w REG0=XED_REG_EIP:w:SUPP } ==== [{ "Iclass": "JMP_FAR", "DisasmIntel": "jmp far", "DisasmATTSV": "ljmp", "CPL": "3", "Attributes": "FAR_XFER NOTSX", "Extension": "BASE", "ISASet": "I86", "Pattern": "0xEA not64 BRDISPz() UIMM16()", "Operands": "PTR:r:p IMM0:r:w REG0=XED_REG_EIP:w:SUPP" }] ------ INVALID key token { FOO : 111 } ==== unknown key token: FOO ------ INVALID unterminated object { ==== no matching '}' found ------ INVALID pat+ops { ICLASS: foobar PATTERN : 1 PATTERN : 2 OPERANDS : 3 } ==== foobar: OPERANDS and PATTERN lines mismatch