return v >= -128 && v <= 127;
}
static int64_t calcsize(int32_t segment, int64_t offset, int bits,
- insn * ins, const uint8_t *codes)
+ insn * ins, const uint8_t *codes)
{
int64_t length = 0;
uint8_t c;
int32_t rflags;
uint8_t *p;
int32_t s;
+ enum out_type type;
if (c <= 0177) {
/* pick rfield from operand b */
case 4:
data = ins->oprs[(c >> 3) & 7].offset;
warn_overflow(ea_data.bytes, opx);
- out(offset, segment, &data,
- ea_data.rip ? OUT_REL4ADR : OUT_ADDRESS,
- ea_data.bytes,
- ins->oprs[(c >> 3) & 7].segment,
- ins->oprs[(c >> 3) & 7].wrt);
s += ea_data.bytes;
+ if (ea_data.rip) {
+ data -= insn_end - (offset+ea_data.bytes);
+ type = OUT_REL4ADR;
+ } else {
+ type = OUT_ADDRESS;
+ }
+ out(offset, segment, &data, type, ea_data.bytes,
+ ins->oprs[(c >> 3) & 7].segment,
+ ins->oprs[(c >> 3) & 7].wrt);
break;
}
offset += s;
--- /dev/null
+;Testname=unoptimized; Arguments=-fbin -oriprel2.bin -O0; Files=stdout stderr riprel.bin
+;Testname=optimized; Arguments=-fbin -oriprel2.bin -Ox; Files=stdout stderr riprel.bin
+
+ bits 64
+
+ default rel
+ mov dword [foo],12345678h
+ mov qword [foo],12345678h
+ mov [foo],rax
+ mov dword [foo],12345678h
+foo: