diff --git a/internal/inst/testdata/stdlibopcodes.txt b/internal/inst/testdata/stdlibopcodes.txt index bfc2c2b..20b391f 100644 --- a/internal/inst/testdata/stdlibopcodes.txt +++ b/internal/inst/testdata/stdlibopcodes.txt @@ -22,7 +22,6 @@ BSRQ BSWAPL BSWAPQ BTQ -BYTE CALL CMOVQCC CMOVQCS @@ -51,7 +50,6 @@ DECQ DIVL DIVQ DIVSD -FUNCDATA IMUL3Q IMULQ INCB diff --git a/internal/inst/types.go b/internal/inst/types.go index 0ff1197..f3ae69f 100644 --- a/internal/inst/types.go +++ b/internal/inst/types.go @@ -1,7 +1,5 @@ package inst -//go:generate avogen -data ../data -output ztable.go godata - type Instruction struct { Opcode string Summary string diff --git a/internal/inst/ztable.go b/internal/inst/ztable.go index dab87a4..a5d1be3 100644 --- a/internal/inst/ztable.go +++ b/internal/inst/ztable.go @@ -4732,6 +4732,166 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JA", + Summary: "Jump if above (CF == 0 and ZF == 0) (alias of JHI)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JAE", + Summary: "Jump if above or equal (CF == 0) (alias of JCC)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JB", + Summary: "Jump if below (CF == 1) (alias of JCS)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JBE", + Summary: "Jump if below or equal (CF == 1 or ZF == 1) (alias of JLS)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JC", + Summary: "Jump if below (CF == 1) (alias of JCS)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JCC", Summary: "Jump if above or equal (CF == 0)", @@ -4832,6 +4992,32 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JE", + Summary: "Jump if equal (ZF == 1) (alias of JEQ)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JEQ", Summary: "Jump if equal (ZF == 1)", @@ -4858,6 +5044,32 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JG", + Summary: "Jump if greater (ZF == 0 and SF == OF) (alias of JGT)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JGE", Summary: "Jump if greater or equal (SF == OF)", @@ -4936,6 +5148,68 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JHS", + Summary: "Jump if above or equal (CF == 0) (alias of JCC)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JL", + Summary: "Jump if less (SF != OF) (alias of JLT)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JLE", Summary: "Jump if less or equal (ZF == 1 or SF != OF)", @@ -4962,6 +5236,42 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JLO", + Summary: "Jump if below (CF == 1) (alias of JCS)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JLS", Summary: "Jump if below or equal (CF == 1 or ZF == 1)", @@ -5056,6 +5366,166 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JNA", + Summary: "Jump if below or equal (CF == 1 or ZF == 1) (alias of JLS)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNAE", + Summary: "Jump if below (CF == 1) (alias of JCS)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNB", + Summary: "Jump if above or equal (CF == 0) (alias of JCC)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNBE", + Summary: "Jump if above (CF == 0 and ZF == 0) (alias of JHI)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNC", + Summary: "Jump if above or equal (CF == 0) (alias of JCC)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JNE", Summary: "Jump if not equal (ZF == 0)", @@ -5082,6 +5552,210 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JNG", + Summary: "Jump if less or equal (ZF == 1 or SF != OF) (alias of JLE)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNGE", + Summary: "Jump if less (SF != OF) (alias of JLT)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNL", + Summary: "Jump if greater or equal (SF == OF) (alias of JGE)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNLE", + Summary: "Jump if greater (ZF == 0 and SF == OF) (alias of JGT)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNO", + Summary: "Jump if not overflow (OF == 0) (alias of JOC)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNP", + Summary: "Jump if not parity (PF == 0) (alias of JPC)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNS", + Summary: "Jump if not sign (SF == 0) (alias of JPL)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JNZ", + Summary: "Jump if not equal (ZF == 0) (alias of JNE)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JO", + Summary: "Jump if overflow (OF == 1) (alias of JOS)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JOC", Summary: "Jump if not overflow (OF == 0)", @@ -5114,6 +5788,32 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JP", + Summary: "Jump if parity (PF == 1) (alias of JPS)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JPC", Summary: "Jump if not parity (PF == 0)", @@ -5140,6 +5840,32 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JPE", + Summary: "Jump if parity (PF == 1) (alias of JPS)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JPL", Summary: "Jump if not sign (SF == 0)", @@ -5156,6 +5882,32 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JPO", + Summary: "Jump if not parity (PF == 0) (alias of JPC)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "JPS", Summary: "Jump if parity (PF == 1)", @@ -5182,6 +5934,48 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "JS", + Summary: "Jump if sign (SF == 1) (alias of JMI)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, + { + Opcode: "JZ", + Summary: "Jump if equal (ZF == 1) (alias of JEQ)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel8", Action: 0x0}, + }, + }, + { + Operands: []Operand{ + {Type: "rel32", Action: 0x0}, + }, + }, + }, + }, { Opcode: "LDDQU", Summary: "Load Unaligned Integer 128 Bits", @@ -5313,6 +6107,22 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "MASKMOVDQU", + Summary: "Store Selected Bytes of Double Quadword (alias of MASKMOVOU)", + Forms: []Form{ + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "xmm", Action: 0x1}, + {Type: "xmm", Action: 0x1}, + }, + ImplicitOperands: []ImplicitOperand{ + {Register: "rdi", Action: 0x1}, + }, + }, + }, + }, { Opcode: "MASKMOVOU", Summary: "Store Selected Bytes of Double Quadword", @@ -5774,26 +6584,55 @@ var Instructions = []Instruction{ }, { Opcode: "MOVD", - Summary: "Move Doubleword", + Summary: "Move (alias of MOVQ)", Forms: []Form{ + { + Operands: []Operand{ + {Type: "imm32", Action: 0x0}, + {Type: "r64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "imm64", Action: 0x0}, + {Type: "r64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "r64", Action: 0x1}, + {Type: "r64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "m64", Action: 0x1}, + {Type: "r64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "imm32", Action: 0x0}, + {Type: "m64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "r64", Action: 0x1}, + {Type: "m64", Action: 0x2}, + }, + }, { ISA: []string{"SSE2"}, Operands: []Operand{ {Type: "xmm", Action: 0x1}, - {Type: "r32", Action: 0x2}, + {Type: "r64", Action: 0x2}, }, }, { ISA: []string{"SSE2"}, Operands: []Operand{ - {Type: "r32", Action: 0x1}, - {Type: "xmm", Action: 0x2}, - }, - }, - { - ISA: []string{"SSE2"}, - Operands: []Operand{ - {Type: "m32", Action: 0x1}, + {Type: "r64", Action: 0x1}, {Type: "xmm", Action: 0x2}, }, }, @@ -5801,7 +6640,21 @@ var Instructions = []Instruction{ ISA: []string{"SSE2"}, Operands: []Operand{ {Type: "xmm", Action: 0x1}, - {Type: "m32", Action: 0x2}, + {Type: "xmm", Action: 0x2}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "m64", Action: 0x1}, + {Type: "xmm", Action: 0x2}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "xmm", Action: 0x1}, + {Type: "m64", Action: 0x2}, }, }, }, @@ -5826,6 +6679,83 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "MOVDQ2Q", + Summary: "Move (alias of MOVQ)", + Forms: []Form{ + { + Operands: []Operand{ + {Type: "imm32", Action: 0x0}, + {Type: "r64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "imm64", Action: 0x0}, + {Type: "r64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "r64", Action: 0x1}, + {Type: "r64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "m64", Action: 0x1}, + {Type: "r64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "imm32", Action: 0x0}, + {Type: "m64", Action: 0x2}, + }, + }, + { + Operands: []Operand{ + {Type: "r64", Action: 0x1}, + {Type: "m64", Action: 0x2}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "xmm", Action: 0x1}, + {Type: "r64", Action: 0x2}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "r64", Action: 0x1}, + {Type: "xmm", Action: 0x2}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "xmm", Action: 0x1}, + {Type: "xmm", Action: 0x2}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "m64", Action: 0x1}, + {Type: "xmm", Action: 0x2}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "xmm", Action: 0x1}, + {Type: "m64", Action: 0x2}, + }, + }, + }, + }, { Opcode: "MOVHLPS", Summary: "Move Packed Single-Precision Floating-Point Values High to Low", @@ -6012,6 +6942,19 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "MOVNTDQ", + Summary: "Store Double Quadword Using Non-Temporal Hint (alias of MOVNTO)", + Forms: []Form{ + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "xmm", Action: 0x1}, + {Type: "m128", Action: 0x2}, + }, + }, + }, + }, { Opcode: "MOVNTDQA", Summary: "Load Double Quadword Non-Temporal Aligned Hint", @@ -6117,6 +7060,33 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "MOVOA", + Summary: "Move Aligned Double Quadword (alias of MOVO)", + Forms: []Form{ + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "xmm", Action: 0x1}, + {Type: "xmm", Action: 0x2}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "m128", Action: 0x1}, + {Type: "xmm", Action: 0x2}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "xmm", Action: 0x1}, + {Type: "m128", Action: 0x2}, + }, + }, + }, + }, { Opcode: "MOVOU", Summary: "Move Unaligned Double Quadword", @@ -7286,6 +8256,26 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "PADDD", + Summary: "Add Packed Doubleword Integers (alias of PADDL)", + Forms: []Form{ + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "xmm", Action: 0x1}, + {Type: "xmm", Action: 0x3}, + }, + }, + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "m128", Action: 0x1}, + {Type: "xmm", Action: 0x3}, + }, + }, + }, + }, { Opcode: "PADDL", Summary: "Add Packed Doubleword Integers", @@ -9286,6 +10276,19 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "PSLLDQ", + Summary: "Shift Packed Double Quadword Left Logical (alias of PSLLO)", + Forms: []Form{ + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "imm8", Action: 0x0}, + {Type: "xmm", Action: 0x3}, + }, + }, + }, + }, { Opcode: "PSLLL", Summary: "Shift Packed Doubleword Data Left Logical", @@ -9434,6 +10437,19 @@ var Instructions = []Instruction{ }, }, }, + { + Opcode: "PSRLDQ", + Summary: "Shift Packed Double Quadword Right Logical (alias of PSRLO)", + Forms: []Form{ + { + ISA: []string{"SSE2"}, + Operands: []Operand{ + {Type: "imm8", Action: 0x0}, + {Type: "xmm", Action: 0x3}, + }, + }, + }, + }, { Opcode: "PSRLL", Summary: "Shift Packed Doubleword Data Right Logical", diff --git a/internal/load/annoyingaliases.sh b/internal/load/annoyingaliases.sh new file mode 100755 index 0000000..370d126 --- /dev/null +++ b/internal/load/annoyingaliases.sh @@ -0,0 +1,37 @@ +#!/bin/bash -e + +self=$(basename $0) +output=$1 + +eval $(go env) +arch=${GOROOT}/src/cmd/asm/internal/arch/arch.go + +{ + + echo "// Code generated by ${self}. DO NOT EDIT." + echo + echo 'package load' + echo + echo 'var annoyingaliases = map[string]string{' + + awk ' + /archX86/ { x86=1 } + /^}/ { x86=0 } + + x86 && /x86/ && /instructions\[/ { + from=$1 + to=$3 + + sub(/instructions\[\"/, "", from) + sub(/\"\]/, "", from) + sub(/x86\.A/, "", to) + + if(from != to) { + printf("\t\"%s\": \"%s\",\n", from, to) + } + } + ' ${arch} + + echo '}' + +} | gofmt > ${output} diff --git a/internal/load/load.go b/internal/load/load.go index 39426cb..8e4c2ff 100644 --- a/internal/load/load.go +++ b/internal/load/load.go @@ -62,6 +62,13 @@ func (l *Loader) Load() ([]inst.Instruction, error) { } } + // Apply list of "annoying aliases". + for from, to := range annoyingaliases { + cpy := *im[to] + cpy.Opcode = from + im[from] = &cpy + } + // Convert to a slice, sorted by opcode. is := make([]inst.Instruction, 0, len(im)) for _, i := range im { diff --git a/internal/load/tables.go b/internal/load/tables.go new file mode 100644 index 0000000..471f4de --- /dev/null +++ b/internal/load/tables.go @@ -0,0 +1,68 @@ +package load + +// Go contains a list of self-proclaimed "Annoying aliases", as follows. We use +// a script to automatically extract this list from the source code (see the +// following go:generate line). +// +// Reference: https://github.com/golang/go/blob/048c9164a0c5572df18325e377473e7893dbfb07/src/cmd/asm/internal/arch/arch.go#L126-L182 +// +// } +// // Annoying aliases. +// instructions["JA"] = x86.AJHI /* alternate */ +// instructions["JAE"] = x86.AJCC /* alternate */ +// instructions["JB"] = x86.AJCS /* alternate */ +// instructions["JBE"] = x86.AJLS /* alternate */ +// instructions["JC"] = x86.AJCS /* alternate */ +// instructions["JCC"] = x86.AJCC /* carry clear (CF = 0) */ +// instructions["JCS"] = x86.AJCS /* carry set (CF = 1) */ +// instructions["JE"] = x86.AJEQ /* alternate */ +// instructions["JEQ"] = x86.AJEQ /* equal (ZF = 1) */ +// instructions["JG"] = x86.AJGT /* alternate */ +// instructions["JGE"] = x86.AJGE /* greater than or equal (signed) (SF = OF) */ +// instructions["JGT"] = x86.AJGT /* greater than (signed) (ZF = 0 && SF = OF) */ +// instructions["JHI"] = x86.AJHI /* higher (unsigned) (CF = 0 && ZF = 0) */ +// instructions["JHS"] = x86.AJCC /* alternate */ +// instructions["JL"] = x86.AJLT /* alternate */ +// instructions["JLE"] = x86.AJLE /* less than or equal (signed) (ZF = 1 || SF != OF) */ +// instructions["JLO"] = x86.AJCS /* alternate */ +// instructions["JLS"] = x86.AJLS /* lower or same (unsigned) (CF = 1 || ZF = 1) */ +// instructions["JLT"] = x86.AJLT /* less than (signed) (SF != OF) */ +// instructions["JMI"] = x86.AJMI /* negative (minus) (SF = 1) */ +// instructions["JNA"] = x86.AJLS /* alternate */ +// instructions["JNAE"] = x86.AJCS /* alternate */ +// instructions["JNB"] = x86.AJCC /* alternate */ +// instructions["JNBE"] = x86.AJHI /* alternate */ +// instructions["JNC"] = x86.AJCC /* alternate */ +// instructions["JNE"] = x86.AJNE /* not equal (ZF = 0) */ +// instructions["JNG"] = x86.AJLE /* alternate */ +// instructions["JNGE"] = x86.AJLT /* alternate */ +// instructions["JNL"] = x86.AJGE /* alternate */ +// instructions["JNLE"] = x86.AJGT /* alternate */ +// instructions["JNO"] = x86.AJOC /* alternate */ +// instructions["JNP"] = x86.AJPC /* alternate */ +// instructions["JNS"] = x86.AJPL /* alternate */ +// instructions["JNZ"] = x86.AJNE /* alternate */ +// instructions["JO"] = x86.AJOS /* alternate */ +// instructions["JOC"] = x86.AJOC /* overflow clear (OF = 0) */ +// instructions["JOS"] = x86.AJOS /* overflow set (OF = 1) */ +// instructions["JP"] = x86.AJPS /* alternate */ +// instructions["JPC"] = x86.AJPC /* parity clear (PF = 0) */ +// instructions["JPE"] = x86.AJPS /* alternate */ +// instructions["JPL"] = x86.AJPL /* non-negative (plus) (SF = 0) */ +// instructions["JPO"] = x86.AJPC /* alternate */ +// instructions["JPS"] = x86.AJPS /* parity set (PF = 1) */ +// instructions["JS"] = x86.AJMI /* alternate */ +// instructions["JZ"] = x86.AJEQ /* alternate */ +// instructions["MASKMOVDQU"] = x86.AMASKMOVOU +// instructions["MOVD"] = x86.AMOVQ +// instructions["MOVDQ2Q"] = x86.AMOVQ +// instructions["MOVNTDQ"] = x86.AMOVNTO +// instructions["MOVOA"] = x86.AMOVO +// instructions["PSLLDQ"] = x86.APSLLO +// instructions["PSRLDQ"] = x86.APSRLO +// instructions["PADDD"] = x86.APADDL +// +// return &Arch{ +// + +//go:generate ./annoyingaliases.sh zannoyingaliases.go diff --git a/internal/load/zannoyingaliases.go b/internal/load/zannoyingaliases.go new file mode 100644 index 0000000..65ad69f --- /dev/null +++ b/internal/load/zannoyingaliases.go @@ -0,0 +1,43 @@ +// Code generated by annoyingaliases.sh. DO NOT EDIT. + +package load + +var annoyingaliases = map[string]string{ + "JA": "JHI", + "JAE": "JCC", + "JB": "JCS", + "JBE": "JLS", + "JC": "JCS", + "JE": "JEQ", + "JG": "JGT", + "JHS": "JCC", + "JL": "JLT", + "JLO": "JCS", + "JNA": "JLS", + "JNAE": "JCS", + "JNB": "JCC", + "JNBE": "JHI", + "JNC": "JCC", + "JNG": "JLE", + "JNGE": "JLT", + "JNL": "JGE", + "JNLE": "JGT", + "JNO": "JOC", + "JNP": "JPC", + "JNS": "JPL", + "JNZ": "JNE", + "JO": "JOS", + "JP": "JPS", + "JPE": "JPS", + "JPO": "JPC", + "JS": "JMI", + "JZ": "JEQ", + "MASKMOVDQU": "MASKMOVOU", + "MOVD": "MOVQ", + "MOVDQ2Q": "MOVQ", + "MOVNTDQ": "MOVNTO", + "MOVOA": "MOVO", + "PSLLDQ": "PSLLO", + "PSRLDQ": "PSRLO", + "PADDD": "PADDL", +} diff --git a/script/stdlibopcodes b/script/stdlibopcodes index df8147f..7cd02a7 100755 --- a/script/stdlibopcodes +++ b/script/stdlibopcodes @@ -11,12 +11,14 @@ echo '#define get_tls ' > ${include}/go_asm.h # Preprocess all assembly files. asm=${workdir}/all.s -find ${GOROOT}/src -name '*_amd64.s' | while read s; do +find ${GOROOT}/src -name '*_amd64.s' | grep -v testdata | while read s; do gcc -E -I${GOROOT}/pkg/include -I${include} ${s} >>${asm} done # Extract instructions. -awk '/^[[:space:]]+[A-Z0-9]+[[:space:]]+/ { print $1 }' ${asm} | sort | uniq +awk '/^[[:space:]]+[A-Z0-9]+[[:space:]]+/ { print $1 }' ${asm} | \ + sort | uniq | \ + grep -Ev '(TEXT|FUNCDATA|PCDATA|BYTE|WORD)' # Clean. rm -rf ${workdir}