summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrill Gorcunov <gorcunov@gmail.com>2012-12-03 02:13:37 +0400
committerCyrill Gorcunov <gorcunov@gmail.com>2012-12-03 02:13:37 +0400
commitdfcc3d3900339df3dc59a5d44a143ad77a0166de (patch)
tree68f9f2e126b1cd53ec38b216904dea60e95f171d
parent0564bd8369783d44bbb4759dd23690eb361988c0 (diff)
downloadnasm-dfcc3d3900339df3dc59a5d44a143ad77a0166de.tar.gz
assemble: Make emit_rex being a function
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
-rw-r--r--assemble.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/assemble.c b/assemble.c
index 1e268d96..00637eb7 100644
--- a/assemble.c
+++ b/assemble.c
@@ -1247,14 +1247,20 @@ static int64_t calcsize(int32_t segment, int64_t offset, int bits,
return length;
}
-#define EMIT_REX() \
- if (!(ins->rex & REX_V) && (ins->rex & REX_REAL) && (bits == 64)) { \
- ins->rex = (ins->rex & REX_REAL)|REX_P; \
- out(offset, segment, &ins->rex, OUT_RAWDATA, 1, NO_SEG, NO_SEG); \
- ins->rex = 0; \
- offset += 1; \
+static inline unsigned int emit_rex(insn *ins, int32_t segment, int64_t offset, int bits)
+{
+ if (bits == 64) {
+ if ((ins->rex & REX_REAL) && !(ins->rex & REX_V)) {
+ ins->rex = (ins->rex & REX_REAL) | REX_P;
+ out(offset, segment, &ins->rex, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
+ ins->rex = 0;
+ return 1;
+ }
}
+ return 0;
+}
+
static void gencode(int32_t segment, int64_t offset, int bits,
insn * ins, const struct itemplate *temp,
int64_t insn_end)
@@ -1286,7 +1292,7 @@ static void gencode(int32_t segment, int64_t offset, int bits,
case 02:
case 03:
case 04:
- EMIT_REX();
+ offset += emit_rex(ins, segment, offset, bits);
out(offset, segment, codes, OUT_RAWDATA, c, NO_SEG, NO_SEG);
codes += c;
offset += c;
@@ -1299,7 +1305,7 @@ static void gencode(int32_t segment, int64_t offset, int bits,
break;
case4(010):
- EMIT_REX();
+ offset += emit_rex(ins, segment, offset, bits);
bytes[0] = *codes++ + (regval(opx) & 7);
out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG);
offset += 1;
@@ -1496,7 +1502,7 @@ static void gencode(int32_t segment, int64_t offset, int bits,
break;
case4(0144):
- EMIT_REX();
+ offset += emit_rex(ins, segment, offset, bits);
bytes[0] = *codes++;
if (is_sbyte16(opx))
bytes[0] |= 2; /* s-bit */
@@ -1520,7 +1526,7 @@ static void gencode(int32_t segment, int64_t offset, int bits,
break;
case4(0154):
- EMIT_REX();
+ offset += emit_rex(ins, segment, offset, bits);
bytes[0] = *codes++;
if (is_sbyte32(opx))
bytes[0] |= 2; /* s-bit */