diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2013-12-03 07:45:49 -0500 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2013-12-27 22:51:35 -0500 |
commit | d179bce3d666fc43cb0590efaf0e0eecb76b9765 (patch) | |
tree | 73aa135dd76f95d14c0416831c5b353b172367e2 | |
parent | 9f327017c40e0ffc2eb5a89ae8c9fc36678f66b4 (diff) |
Generate unaries with a macro
-rw-r--r-- | simplex86.c | 34 | ||||
-rw-r--r-- | simplex86.h | 2 |
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 \ |