aboutsummaryrefslogtreecommitdiff
path: root/dynasm/dasm_x86.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dynasm/dasm_x86.h14
1 files changed, 12 insertions, 2 deletions
diff --git a/dynasm/dasm_x86.h b/dynasm/dasm_x86.h
index f9260b0c..8ae911df 100644
--- a/dynasm/dasm_x86.h
+++ b/dynasm/dasm_x86.h
@@ -194,12 +194,13 @@ void dasm_put(Dst_DECL, int start, ...)
194 switch (action) { 194 switch (action) {
195 case DASM_DISP: 195 case DASM_DISP:
196 if (n == 0) { if ((mrm&7) == 4) mrm = p[-2]; if ((mrm&7) != 5) break; } 196 if (n == 0) { if ((mrm&7) == 4) mrm = p[-2]; if ((mrm&7) != 5) break; }
197 case DASM_IMM_DB: if (((n+128)&-256) == 0) goto ob; 197 /* fallthrough */
198 case DASM_IMM_DB: if (((n+128)&-256) == 0) goto ob; /* fallthrough */
198 case DASM_REL_A: /* Assumes ptrdiff_t is int. !x64 */ 199 case DASM_REL_A: /* Assumes ptrdiff_t is int. !x64 */
199 case DASM_IMM_D: ofs += 4; break; 200 case DASM_IMM_D: ofs += 4; break;
200 case DASM_IMM_S: CK(((n+128)&-256) == 0, RANGE_I); goto ob; 201 case DASM_IMM_S: CK(((n+128)&-256) == 0, RANGE_I); goto ob;
201 case DASM_IMM_B: CK((n&-256) == 0, RANGE_I); ob: ofs++; break; 202 case DASM_IMM_B: CK((n&-256) == 0, RANGE_I); ob: ofs++; break;
202 case DASM_IMM_WB: if (((n+128)&-256) == 0) goto ob; 203 case DASM_IMM_WB: if (((n+128)&-256) == 0) goto ob; /* fallthrough */
203 case DASM_IMM_W: CK((n&-65536) == 0, RANGE_I); ofs += 2; break; 204 case DASM_IMM_W: CK((n&-65536) == 0, RANGE_I); ofs += 2; break;
204 case DASM_SPACE: p++; ofs += n; break; 205 case DASM_SPACE: p++; ofs += n; break;
205 case DASM_SETLABEL: b[pos-2] = -0x40000000; break; /* Neg. label ofs. */ 206 case DASM_SETLABEL: b[pos-2] = -0x40000000; break; /* Neg. label ofs. */
@@ -323,11 +324,14 @@ int dasm_link(Dst_DECL, size_t *szp)
323 pos += 2; 324 pos += 2;
324 break; 325 break;
325 } 326 }
327 /* fallthrough */
326 case DASM_SPACE: case DASM_IMM_LG: case DASM_VREG: p++; 328 case DASM_SPACE: case DASM_IMM_LG: case DASM_VREG: p++;
329 /* fallthrough */
327 case DASM_DISP: case DASM_IMM_S: case DASM_IMM_B: case DASM_IMM_W: 330 case DASM_DISP: case DASM_IMM_S: case DASM_IMM_B: case DASM_IMM_W:
328 case DASM_IMM_D: case DASM_IMM_WB: case DASM_IMM_DB: 331 case DASM_IMM_D: case DASM_IMM_WB: case DASM_IMM_DB:
329 case DASM_SETLABEL: case DASM_REL_A: case DASM_IMM_PC: pos++; break; 332 case DASM_SETLABEL: case DASM_REL_A: case DASM_IMM_PC: pos++; break;
330 case DASM_LABEL_LG: p++; 333 case DASM_LABEL_LG: p++;
334 /* fallthrough */
331 case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */ 335 case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */
332 case DASM_ALIGN: ofs -= (b[pos++]+ofs)&*p++; break; /* Adjust ofs. */ 336 case DASM_ALIGN: ofs -= (b[pos++]+ofs)&*p++; break; /* Adjust ofs. */
333 case DASM_EXTERN: p += 2; break; 337 case DASM_EXTERN: p += 2; break;
@@ -385,16 +389,20 @@ int dasm_encode(Dst_DECL, void *buffer)
385 if (mrm != 5) { mm[-1] -= 0x80; break; } } 389 if (mrm != 5) { mm[-1] -= 0x80; break; } }
386 if (((n+128) & -256) != 0) goto wd; else mm[-1] -= 0x40; 390 if (((n+128) & -256) != 0) goto wd; else mm[-1] -= 0x40;
387 } 391 }
392 /* fallthrough */
388 case DASM_IMM_S: case DASM_IMM_B: wb: dasmb(n); break; 393 case DASM_IMM_S: case DASM_IMM_B: wb: dasmb(n); break;
389 case DASM_IMM_DB: if (((n+128)&-256) == 0) { 394 case DASM_IMM_DB: if (((n+128)&-256) == 0) {
390 db: if (!mark) mark = cp; mark[-2] += 2; mark = NULL; goto wb; 395 db: if (!mark) mark = cp; mark[-2] += 2; mark = NULL; goto wb;
391 } else mark = NULL; 396 } else mark = NULL;
397 /* fallthrough */
392 case DASM_IMM_D: wd: dasmd(n); break; 398 case DASM_IMM_D: wd: dasmd(n); break;
393 case DASM_IMM_WB: if (((n+128)&-256) == 0) goto db; else mark = NULL; 399 case DASM_IMM_WB: if (((n+128)&-256) == 0) goto db; else mark = NULL;
400 /* fallthrough */
394 case DASM_IMM_W: dasmw(n); break; 401 case DASM_IMM_W: dasmw(n); break;
395 case DASM_VREG: { int t = *p++; if (t >= 2) n<<=3; cp[-1] |= n; break; } 402 case DASM_VREG: { int t = *p++; if (t >= 2) n<<=3; cp[-1] |= n; break; }
396 case DASM_REL_LG: p++; if (n >= 0) goto rel_pc; 403 case DASM_REL_LG: p++; if (n >= 0) goto rel_pc;
397 b++; n = (int)(ptrdiff_t)D->globals[-n]; 404 b++; n = (int)(ptrdiff_t)D->globals[-n];
405 /* fallthrough */
398 case DASM_REL_A: rel_a: 406 case DASM_REL_A: rel_a:
399 n -= (unsigned int)(ptrdiff_t)(cp+4); goto wd; /* !x64 */ 407 n -= (unsigned int)(ptrdiff_t)(cp+4); goto wd; /* !x64 */
400 case DASM_REL_PC: rel_pc: { 408 case DASM_REL_PC: rel_pc: {
@@ -407,6 +415,7 @@ int dasm_encode(Dst_DECL, void *buffer)
407 } 415 }
408 case DASM_IMM_LG: 416 case DASM_IMM_LG:
409 p++; if (n < 0) { n = (int)(ptrdiff_t)D->globals[-n]; goto wd; } 417 p++; if (n < 0) { n = (int)(ptrdiff_t)D->globals[-n]; goto wd; }
418 /* fallthrough */
410 case DASM_IMM_PC: { 419 case DASM_IMM_PC: {
411 int *pb = DASM_POS2PTR(D, n); 420 int *pb = DASM_POS2PTR(D, n);
412 n = *pb < 0 ? pb[1] : (*pb + (int)(ptrdiff_t)base); 421 n = *pb < 0 ? pb[1] : (*pb + (int)(ptrdiff_t)base);
@@ -427,6 +436,7 @@ int dasm_encode(Dst_DECL, void *buffer)
427 case DASM_EXTERN: n = DASM_EXTERN(Dst, cp, p[1], *p); p += 2; goto wd; 436 case DASM_EXTERN: n = DASM_EXTERN(Dst, cp, p[1], *p); p += 2; goto wd;
428 case DASM_MARK: mark = cp; break; 437 case DASM_MARK: mark = cp; break;
429 case DASM_ESC: action = *p++; 438 case DASM_ESC: action = *p++;
439 /* fallthrough */
430 default: *cp++ = action; break; 440 default: *cp++ = action; break;
431 case DASM_SECTION: case DASM_STOP: goto stop; 441 case DASM_SECTION: case DASM_STOP: goto stop;
432 } 442 }