summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2013-12-03 07:45:49 -0500
committerSøren Sandmann Pedersen <ssp@redhat.com>2013-12-27 22:51:35 -0500
commitd179bce3d666fc43cb0590efaf0e0eecb76b9765 (patch)
tree73aa135dd76f95d14c0416831c5b353b172367e2
parent9f327017c40e0ffc2eb5a89ae8c9fc36678f66b4 (diff)
Generate unaries with a macro
-rw-r--r--simplex86.c34
-rw-r--r--simplex86.h2
2 files changed, 17 insertions, 19 deletions
diff --git a/simplex86.c b/simplex86.c
index 53c11af..b2346f3 100644
--- a/simplex86.c
+++ b/simplex86.c
@@ -351,25 +351,21 @@ static const variant_t variants[] =
{ I_js, { A_LABEL }, F_386, E_ANNOTATE, 0x78, ANN_JCC },
{ I_jz, { A_LABEL }, F_386, E_ANNOTATE, 0x74, ANN_JCC },
- /* Neg and not */
- { I_not, { A_RM8 }, F_386, E_M, 0xf6, 2 },
- { I_not, { A_RM16 }, F_386, E_M, 0xf7, 2 },
- { I_not, { A_RM32 }, F_386, E_M, 0xf7, 2 },
- { I_not, { A_RM64 }, F_386, E_M, 0xf7, 2 },
- { I_neg, { A_RM8 }, F_386, E_M, 0xf6, 3 },
- { I_neg, { A_RM16 }, F_386, E_M, 0xf7, 3 },
- { I_neg, { A_RM32 }, F_386, E_M, 0xf7, 3 },
- { I_neg, { A_RM64 }, F_386, E_M, 0xf7, 3 },
-
- /* Multiplication */
- { I_mul, { A_RM8 }, F_386, E_M, 0xf6, 4 },
- { I_mul, { A_RM16 }, F_386, E_M, 0xf7, 4 },
- { I_mul, { A_RM32 }, F_386, E_M, 0xf7, 4 },
- { I_mul, { A_RM64 }, F_386, E_M, 0xf7, 4 },
- { I_imul1, { A_RM8 }, F_386, E_M, 0xf6, 5 },
- { I_imul1, { A_RM16 }, F_386, E_M, 0xf7, 5 },
- { I_imul1, { A_RM32 }, F_386, E_M, 0xf7, 5 },
- { I_imul1, { A_RM64 }, F_386, E_M, 0xf7, 5 },
+ /* Unary ops (neg, not, mul, div) */
+#define UNARY(name, op) \
+ { I_##name, { A_RM8 }, F_386, E_M, 0xf6, op }, \
+ { I_##name, { A_RM16 }, F_386, E_M, 0xf7, op }, \
+ { I_##name, { A_RM32 }, F_386, E_M, 0xf7, op }, \
+ { I_##name, { A_RM64 }, F_386, E_M, 0xf7, op }
+
+ UNARY (not, 2),
+ UNARY (neg, 3),
+ UNARY (mul, 4),
+ UNARY (imul1, 5),
+ UNARY (div, 6),
+ UNARY (idiv, 7),
+
+ /* Other imul variants */
{ I_imul2, { A_R, A_RM }, F_386, E_RM, 0x0faf },
{ I_imul3, { A_R, A_RM, A_I8 }, F_386, E_RM, 0x6B },
{ I_imul3, { A_R16, A_RM, A_I16 }, F_386, E_RM, 0x69 },
diff --git a/simplex86.h b/simplex86.h
index 0014495..b91e24f 100644
--- a/simplex86.h
+++ b/simplex86.h
@@ -404,6 +404,8 @@ typedef enum
PROCESS_INSTRUCTION (not, B, 1) \
PROCESS_INSTRUCTION (neg, B, 1) \
PROCESS_INSTRUCTION (mul, B, 1) \
+ PROCESS_INSTRUCTION (div, B, 1) \
+ PROCESS_INSTRUCTION (idiv, B, 1) \
/* The imul instruction has three different forms, with \
* one, two, and three operands respectively. Since we rely \
* on the ability to determine the number of operands based on \