From 412d5a4039cf2cf9c3817af57fae4df11a38d070 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 12 Sep 2020 17:32:30 +0200 Subject: [PATCH] DynASM/x86: Fix VREG support. --- dynasm/dasm_x86.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/dynasm/dasm_x86.h b/dynasm/dasm_x86.h index 84b9d17f..feb84c14 100644 --- a/dynasm/dasm_x86.h +++ b/dynasm/dasm_x86.h @@ -299,11 +299,13 @@ int dasm_link(Dst_DECL, size_t *szp) while (pos != lastpos) { dasm_ActList p = D->actionlist + b[pos++]; + int op = 0; while (1) { - int op, action = *p++; + int action = *p++; switch (action) { - case DASM_REL_LG: p++; op = p[-3]; goto rel_pc; - case DASM_REL_PC: op = p[-2]; rel_pc: { + case DASM_REL_LG: p++; + /* fallthrough */ + case DASM_REL_PC: { int shrink = op == 0xe9 ? 3 : ((op&0xf0) == 0x80 ? 4 : 0); if (shrink) { /* Shrinkable branch opcode? */ int lofs, lpos = b[pos]; @@ -335,9 +337,10 @@ int dasm_link(Dst_DECL, size_t *szp) case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */ case DASM_ALIGN: ofs -= (b[pos++]+ofs)&*p++; break; /* Adjust ofs. */ case DASM_EXTERN: p += 2; break; - case DASM_ESC: p++; break; + case DASM_ESC: op = *p++; break; case DASM_MARK: break; case DASM_SECTION: case DASM_STOP: goto stop; + default: op = action; break; } } stop: (void)0;