diff options
Diffstat (limited to 'assemble.c')
-rw-r--r-- | assemble.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 1996-2013 The NASM Authors - All Rights Reserved + * Copyright 1996-2014 The NASM Authors - All Rights Reserved * See the file AUTHORS included with the NASM distribution for * the specific copyright holders. * @@ -1365,9 +1365,12 @@ static int64_t calcsize(int32_t segment, int64_t offset, int bits, 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 | REX_EV))) { + if ((ins->rex & REX_REAL) && + !(ins->rex & (REX_V | REX_EV)) && + !ins->rex_done) { int rex = (ins->rex & REX_REAL) | REX_P; out(offset, segment, &rex, OUT_RAWDATA, 1, NO_SEG, NO_SEG); + ins->rex_done = true; return 1; } } @@ -1389,6 +1392,8 @@ static void gencode(int32_t segment, int64_t offset, int bits, uint8_t opex = 0; enum ea_type eat = EA_SCALAR; + ins->rex_done = false; + while (*codes) { c = *codes++; op1 = (c & 3) + ((opex & 1) << 2); |