diff options
author | Mike Pall <mike> | 2020-09-12 17:32:30 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2020-09-12 17:32:30 +0200 |
commit | 412d5a4039cf2cf9c3817af57fae4df11a38d070 (patch) | |
tree | 3743418d19275725658446f6291b8242baba06dd | |
parent | 90e65514dda3994253c1e3007f63da7ace8f6b7b (diff) | |
download | luajit-412d5a4039cf2cf9c3817af57fae4df11a38d070.tar.gz luajit-412d5a4039cf2cf9c3817af57fae4df11a38d070.tar.bz2 luajit-412d5a4039cf2cf9c3817af57fae4df11a38d070.zip |
DynASM/x86: Fix VREG support.
-rw-r--r-- | dynasm/dasm_x86.h | 11 |
1 files 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) | |||
299 | 299 | ||
300 | while (pos != lastpos) { | 300 | while (pos != lastpos) { |
301 | dasm_ActList p = D->actionlist + b[pos++]; | 301 | dasm_ActList p = D->actionlist + b[pos++]; |
302 | int op = 0; | ||
302 | while (1) { | 303 | while (1) { |
303 | int op, action = *p++; | 304 | int action = *p++; |
304 | switch (action) { | 305 | switch (action) { |
305 | case DASM_REL_LG: p++; op = p[-3]; goto rel_pc; | 306 | case DASM_REL_LG: p++; |
306 | case DASM_REL_PC: op = p[-2]; rel_pc: { | 307 | /* fallthrough */ |
308 | case DASM_REL_PC: { | ||
307 | int shrink = op == 0xe9 ? 3 : ((op&0xf0) == 0x80 ? 4 : 0); | 309 | int shrink = op == 0xe9 ? 3 : ((op&0xf0) == 0x80 ? 4 : 0); |
308 | if (shrink) { /* Shrinkable branch opcode? */ | 310 | if (shrink) { /* Shrinkable branch opcode? */ |
309 | int lofs, lpos = b[pos]; | 311 | int lofs, lpos = b[pos]; |
@@ -335,9 +337,10 @@ int dasm_link(Dst_DECL, size_t *szp) | |||
335 | case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */ | 337 | case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */ |
336 | case DASM_ALIGN: ofs -= (b[pos++]+ofs)&*p++; break; /* Adjust ofs. */ | 338 | case DASM_ALIGN: ofs -= (b[pos++]+ofs)&*p++; break; /* Adjust ofs. */ |
337 | case DASM_EXTERN: p += 2; break; | 339 | case DASM_EXTERN: p += 2; break; |
338 | case DASM_ESC: p++; break; | 340 | case DASM_ESC: op = *p++; break; |
339 | case DASM_MARK: break; | 341 | case DASM_MARK: break; |
340 | case DASM_SECTION: case DASM_STOP: goto stop; | 342 | case DASM_SECTION: case DASM_STOP: goto stop; |
343 | default: op = action; break; | ||
341 | } | 344 | } |
342 | } | 345 | } |
343 | stop: (void)0; | 346 | stop: (void)0; |