diff options
author | Cyrill Gorcunov <gorcunov@gmail.com> | 2012-12-03 02:13:37 +0400 |
---|---|---|
committer | Cyrill Gorcunov <gorcunov@gmail.com> | 2012-12-03 02:13:37 +0400 |
commit | dfcc3d3900339df3dc59a5d44a143ad77a0166de (patch) | |
tree | 68f9f2e126b1cd53ec38b216904dea60e95f171d | |
parent | 0564bd8369783d44bbb4759dd23690eb361988c0 (diff) | |
download | nasm-dfcc3d3900339df3dc59a5d44a143ad77a0166de.tar.gz |
assemble: Make emit_rex being a function
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
-rw-r--r-- | assemble.c | 26 |
1 files changed, 16 insertions, 10 deletions
@@ -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 */ |