[PATCH 2/5] opcode: centralize opcode definition, part 1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Opcodes are defined in linearize.c:enum opcode.
The file opcode.c also contains a table with opcodes properties.

Centralize these definitions into a single file: opcode.def that
will then be reused for enum opcode & the table.

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx>
---
 linearize.h | 116 ----------------------------------------------------
 opcode.c    |  47 +++++----------------
 opcode.def  | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++
 opcode.h    |   9 ++++
 4 files changed, 134 insertions(+), 152 deletions(-)
 create mode 100644 opcode.def

diff --git a/linearize.h b/linearize.h
index d1fe7a2f0..53644d0a7 100644
--- a/linearize.h
+++ b/linearize.h
@@ -145,122 +145,6 @@ struct instruction {
 	};
 };
 
-enum opcode {
-	OP_BADOP,
-
-	/* Entry */
-	OP_ENTRY,
-
-	/* Terminator */
-	OP_TERMINATOR,
-	OP_RET = OP_TERMINATOR,
-	OP_BR,
-	OP_CBR,
-	OP_SWITCH,
-	OP_COMPUTEDGOTO,
-	OP_TERMINATOR_END = OP_COMPUTEDGOTO,
-	
-	/* Binary */
-	OP_BINARY,
-	OP_ADD = OP_BINARY,
-	OP_SUB,
-	OP_MUL,
-	OP_DIVU, OP_DIVS,
-	OP_MODU, OP_MODS,
-	OP_SHL,
-	OP_LSR, OP_ASR,
-	
-	/* Floating-point binops */
-	OP_FADD,
-	OP_FSUB,
-	OP_FMUL,
-	OP_FDIV,
-
-	/* Logical */
-	OP_AND,
-	OP_OR,
-	OP_XOR,
-	OP_BINARY_END = OP_XOR,
-
-	/* floating-point comparison */
-	OP_FPCMP,
-	OP_FCMP_ORD = OP_FPCMP,
-	OP_FCMP_OEQ,
-	OP_FCMP_ONE,
-	OP_FCMP_OLE,
-	OP_FCMP_OGE,
-	OP_FCMP_OLT,
-	OP_FCMP_OGT,
-	OP_FCMP_UEQ,
-	OP_FCMP_UNE,
-	OP_FCMP_ULE,
-	OP_FCMP_UGE,
-	OP_FCMP_ULT,
-	OP_FCMP_UGT,
-	OP_FCMP_UNO,
-	OP_FPCMP_END = OP_FCMP_UNO,
-
-	/* Binary comparison */
-	OP_BINCMP,
-	OP_SET_EQ = OP_BINCMP,
-	OP_SET_NE,
-	OP_SET_LE,
-	OP_SET_GE,
-	OP_SET_LT,
-	OP_SET_GT,
-	OP_SET_B,
-	OP_SET_A,
-	OP_SET_BE,
-	OP_SET_AE,
-	OP_BINCMP_END = OP_SET_AE,
-
-	/* Uni */
-	OP_UNOP,
-	OP_NOT = OP_UNOP,
-	OP_NEG,
-	OP_FNEG,
-
-	/* Casts */
-	OP_TRUNC,
-	OP_ZEXT,  OP_SEXT,
-	OP_FCVTU, OP_FCVTS,
-	OP_UCVTF, OP_SCVTF,
-	OP_FCVTF,
-	OP_UTPTR,
-	OP_PTRTU,
-	OP_PTRCAST,
-	OP_UNOP_END = OP_PTRCAST,
-
-	/* Select - three input values */
-	OP_SEL,
-	
-	/* Memory */
-	OP_LOAD,
-	OP_STORE,
-	OP_SETVAL,
-	OP_SETFVAL,
-	OP_SYMADDR,
-
-	/* Other */
-	OP_PHI,
-	OP_PHISOURCE,
-	OP_INLINED_CALL,
-	OP_CALL,
-	OP_SLICE,
-	OP_NOP,
-	OP_DEATHNOTE,
-	OP_ASM,
-
-	/* Sparse tagging (line numbers, context, whatever) */
-	OP_CONTEXT,
-	OP_RANGE,
-
-	/* Needed to translate SSA back to normal form */
-	OP_COPY,
-
-	OP_LAST,			/* keep this one last! */
-};
-
 struct basic_block_list;
 struct instruction_list;
 
diff --git a/opcode.c b/opcode.c
index d872556e4..67cede02d 100644
--- a/opcode.c
+++ b/opcode.c
@@ -20,42 +20,17 @@
  * THE SOFTWARE.
  */
 
-#include "linearize.h"
+#include "opcode.h"
 
 const struct opcode_table opcode_table[OP_LAST] = {
-	[OP_SET_EQ] = {	.negate = OP_SET_NE, .swap = OP_SET_EQ, .to_float = OP_FCMP_OEQ, },
-	[OP_SET_NE] = {	.negate = OP_SET_EQ, .swap = OP_SET_NE, .to_float = OP_FCMP_UNE, },
-	[OP_SET_LT] = {	.negate = OP_SET_GE, .swap = OP_SET_GT, .to_float = OP_FCMP_OLT, },
-	[OP_SET_LE] = {	.negate = OP_SET_GT, .swap = OP_SET_GE, .to_float = OP_FCMP_OLE, },
-	[OP_SET_GE] = {	.negate = OP_SET_LT, .swap = OP_SET_LE, .to_float = OP_FCMP_OGE, },
-	[OP_SET_GT] = {	.negate = OP_SET_LE, .swap = OP_SET_LT, .to_float = OP_FCMP_OGT, },
-	[OP_SET_B ] = {	.negate = OP_SET_AE, .swap = OP_SET_A , .to_float = OP_FCMP_OLT, },
-	[OP_SET_BE] = {	.negate = OP_SET_A , .swap = OP_SET_AE, .to_float = OP_FCMP_OLE, },
-	[OP_SET_AE] = {	.negate = OP_SET_B , .swap = OP_SET_BE, .to_float = OP_FCMP_OGE, },
-	[OP_SET_A ] = {	.negate = OP_SET_BE, .swap = OP_SET_B , .to_float = OP_FCMP_OGT, },
-
-	[OP_FCMP_ORD] = { .negate = OP_FCMP_UNO, .swap = OP_FCMP_ORD, },
-	[OP_FCMP_UNO] = { .negate = OP_FCMP_ORD, .swap = OP_FCMP_UNO, },
-
-	[OP_FCMP_OEQ] = { .negate = OP_FCMP_UNE, .swap = OP_FCMP_OEQ, },
-	[OP_FCMP_ONE] = { .negate = OP_FCMP_UEQ, .swap = OP_FCMP_ONE, },
-	[OP_FCMP_UEQ] = { .negate = OP_FCMP_ONE, .swap = OP_FCMP_UEQ, },
-	[OP_FCMP_UNE] = { .negate = OP_FCMP_OEQ, .swap = OP_FCMP_UNE, },
-
-	[OP_FCMP_OLT] = { .negate = OP_FCMP_UGE, .swap = OP_FCMP_OGT, },
-	[OP_FCMP_OLE] = { .negate = OP_FCMP_UGT, .swap = OP_FCMP_OGE, },
-	[OP_FCMP_OGE] = { .negate = OP_FCMP_ULT, .swap = OP_FCMP_OLE, },
-	[OP_FCMP_OGT] = { .negate = OP_FCMP_ULE, .swap = OP_FCMP_OLT, },
-
-	[OP_FCMP_ULT] = { .negate = OP_FCMP_OGE, .swap = OP_FCMP_UGT, },
-	[OP_FCMP_ULE] = { .negate = OP_FCMP_OGT, .swap = OP_FCMP_UGE, },
-	[OP_FCMP_UGE] = { .negate = OP_FCMP_OLT, .swap = OP_FCMP_ULE, },
-	[OP_FCMP_UGT] = { .negate = OP_FCMP_OLE, .swap = OP_FCMP_ULT, },
-
-	[OP_ADD] = {	.to_float = OP_FADD, },
-	[OP_SUB] = {	.to_float = OP_FSUB, },
-	[OP_MUL] = {	.to_float = OP_FMUL, },
-	[OP_DIVS] = {	.to_float = OP_FDIV, },
-	[OP_DIVU] = {	.to_float = OP_FDIV, },
-	[OP_NEG] = {	.to_float = OP_FNEG, },
+#define OPCODE(OP,NG,SW,TF)		\
+	[OP_##OP] = {			\
+		.negate   = OP_##NG,	\
+		.swap     = OP_##SW,	\
+		.to_float = OP_##TF,	\
+	},
+#define OPCODE_RANGE(OP,S,E)
+#include "opcode.def"
+#undef OPCODE
+#undef OPCODE_RANGE
 };
diff --git a/opcode.def b/opcode.def
new file mode 100644
index 000000000..7add0b879
--- /dev/null
+++ b/opcode.def
@@ -0,0 +1,114 @@
+//	OPCODE		negated		swaped		float
+
+OPCODE(BADOP,		BADOP,		BADOP,		BADOP)
+
+/* Entry */
+OPCODE(ENTRY,		BADOP,		BADOP,		BADOP)
+
+/* Terminator */
+OPCODE(RET,		BADOP,		BADOP,		BADOP)
+OPCODE(BR,		BADOP,		BADOP,		BADOP)
+OPCODE(CBR,		BADOP,		BADOP,		BADOP)
+OPCODE(SWITCH,		BADOP,		BADOP,		BADOP)
+OPCODE(COMPUTEDGOTO,	BADOP,		BADOP,		BADOP)
+OPCODE_RANGE(TERMINATOR, RET, COMPUTEDGOTO)
+
+/* Binary */
+OPCODE(ADD,		BADOP,		BADOP,		FADD)
+OPCODE(SUB,		BADOP,		BADOP,		FSUB)
+OPCODE(MUL,		BADOP,		BADOP,		FMUL)
+OPCODE(DIVU,		BADOP,		BADOP,		FDIV)
+OPCODE(DIVS,		BADOP,		BADOP,		FDIV)
+OPCODE(MODU,		BADOP,		BADOP,		BADOP)
+OPCODE(MODS,		BADOP,		BADOP,		BADOP)
+OPCODE(SHL,		BADOP,		BADOP,		BADOP)
+OPCODE(LSR,		BADOP,		BADOP,		BADOP)
+OPCODE(ASR,		BADOP,		BADOP,		BADOP)
+
+/* Floating-point binops */
+OPCODE(FADD,		BADOP,		BADOP,		BADOP)
+OPCODE(FSUB,		BADOP,		BADOP,		BADOP)
+OPCODE(FMUL,		BADOP,		BADOP,		BADOP)
+OPCODE(FDIV,		BADOP,		BADOP,		BADOP)
+
+/* Logical */
+OPCODE(AND_BOOL,	BADOP,		BADOP,		BADOP)
+OPCODE(OR_BOOL,		BADOP,		BADOP,		BADOP)
+OPCODE(AND,		BADOP,		BADOP,		BADOP)
+OPCODE(OR,		BADOP,		BADOP,		BADOP)
+OPCODE(XOR,		BADOP,		BADOP,		BADOP)
+OPCODE_RANGE(BINARY, ADD, XOR)
+
+/* floating-point comparison */
+OPCODE(FCMP_ORD,	FCMP_UNO,	FCMP_ORD,	BADOP)
+OPCODE(FCMP_OEQ,	FCMP_UNE,	FCMP_OEQ,	BADOP)
+OPCODE(FCMP_ONE,	FCMP_UEQ,	FCMP_ONE,	BADOP)
+OPCODE(FCMP_UEQ,	FCMP_ONE,	FCMP_UEQ,	BADOP)
+OPCODE(FCMP_UNE,	FCMP_OEQ,	FCMP_UNE,	BADOP)
+OPCODE(FCMP_OLT,	FCMP_UGE,	FCMP_OGT,	BADOP)
+OPCODE(FCMP_OLE,	FCMP_UGT,	FCMP_OGE,	BADOP)
+OPCODE(FCMP_OGE,	FCMP_ULT,	FCMP_OLE,	BADOP)
+OPCODE(FCMP_OGT,	FCMP_ULE,	FCMP_OLT,	BADOP)
+OPCODE(FCMP_ULT,	FCMP_OGE,	FCMP_UGT,	BADOP)
+OPCODE(FCMP_ULE,	FCMP_OGT,	FCMP_UGE,	BADOP)
+OPCODE(FCMP_UGE,	FCMP_OLT,	FCMP_ULE,	BADOP)
+OPCODE(FCMP_UGT,	FCMP_OLE,	FCMP_ULT,	BADOP)
+OPCODE(FCMP_UNO,	FCMP_ORD,	FCMP_UNO,	BADOP)
+OPCODE_RANGE(FPCMP, FCMP_ORD, FCMP_UNO)
+
+/* Binary comparison */
+OPCODE(SET_EQ,		SET_NE,		SET_EQ,		FCMP_OEQ)
+OPCODE(SET_LT,		SET_GE,		SET_GT,		FCMP_OLT)
+OPCODE(SET_LE,		SET_GT,		SET_GE,		FCMP_OLE)
+OPCODE(SET_GE,		SET_LT,		SET_LE,		FCMP_OGE)
+OPCODE(SET_GT,		SET_LE,		SET_LT,		FCMP_OGT)
+OPCODE(SET_B,		SET_AE,		SET_A,		FCMP_OLT)
+OPCODE(SET_BE,		SET_A,		SET_AE,		FCMP_OLE)
+OPCODE(SET_AE,		SET_B,		SET_BE,		FCMP_OGE)
+OPCODE(SET_A,		SET_BE,		SET_B,		FCMP_OGT)
+OPCODE(SET_NE,		SET_EQ,		SET_NE,		FCMP_UNE)
+OPCODE_RANGE(BINCMP, SET_EQ, SET_NE)
+
+/* Uni */
+OPCODE(NOT,		BADOP,		BADOP,		BADOP)
+OPCODE(NEG,		BADOP,		BADOP,		FNEG)
+OPCODE(FNEG,		BADOP,		BADOP,		BADOP)
+OPCODE(TRUNC,		BADOP,		BADOP,		BADOP)
+OPCODE(ZEXT,		BADOP,		BADOP,		BADOP)
+OPCODE(SEXT,		BADOP,		BADOP,		BADOP)
+OPCODE(FCVTU,		BADOP,		BADOP,		BADOP)
+OPCODE(FCVTS,		BADOP,		BADOP,		BADOP)
+OPCODE(UCVTF,		BADOP,		BADOP,		BADOP)
+OPCODE(SCVTF,		BADOP,		BADOP,		BADOP)
+OPCODE(FCVTF,		BADOP,		BADOP,		BADOP)
+OPCODE(UTPTR,		BADOP,		BADOP,		BADOP)
+OPCODE(PTRTU,		BADOP,		BADOP,		BADOP)
+OPCODE(PTRCAST,		BADOP,		BADOP,		BADOP)
+OPCODE_RANGE(UNOP, NOT, PTRCAST)
+OPCODE(SYMADDR,		BADOP,		BADOP,		BADOP)
+OPCODE(SLICE,		BADOP,		BADOP,		BADOP)
+
+/* Select - three input values */
+OPCODE(SEL,		BADOP,		BADOP,		BADOP)
+
+/* Memory */
+OPCODE(LOAD,		BADOP,		BADOP,		BADOP)
+OPCODE(STORE,		BADOP,		BADOP,		BADOP)
+
+/* Other */
+OPCODE(PHISOURCE,	BADOP,		BADOP,		BADOP)
+OPCODE(PHI,		BADOP,		BADOP,		BADOP)
+OPCODE(SETVAL,		BADOP,		BADOP,		BADOP)
+OPCODE(SETFVAL,		BADOP,		BADOP,		BADOP)
+OPCODE(CALL,		BADOP,		BADOP,		BADOP)
+OPCODE(INLINED_CALL,	BADOP,		BADOP,		BADOP)
+OPCODE(NOP,		BADOP,		BADOP,		BADOP)
+OPCODE(DEATHNOTE,	BADOP,		BADOP,		BADOP)
+OPCODE(ASM,		BADOP,		BADOP,		BADOP)
+
+/* Sparse tagging (line numbers, context, whatever) */
+OPCODE(CONTEXT,		BADOP,		BADOP,		BADOP)
+OPCODE(RANGE,		BADOP,		BADOP,		BADOP)
+
+/* Needed to translate SSA back to normal form */
+OPCODE(COPY,		BADOP,		BADOP,		BADOP)
diff --git a/opcode.h b/opcode.h
index eda4c3a74..171df36fc 100644
--- a/opcode.h
+++ b/opcode.h
@@ -3,6 +3,15 @@
 
 #include "symbol.h"
 
+enum opcode {
+#define OPCODE(OP,NG,SW,TF)	OP_##OP,
+#define OPCODE_RANGE(OP,S,E)	OP_##OP = OP_##S, OP_##OP##_END = OP_##E,
+#include "opcode.def"
+#undef  OPCODE
+#undef  OPCODE_RANGE
+	OP_LAST,			/* keep this one last! */
+};
+
 extern const struct opcode_table {
 	int	negate:8;
 	int	swap:8;
-- 
2.18.0




[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux