x86: fix bug in relative jump. reported by Joxean
diff --git a/arch/X86/X86Disassembler.c b/arch/X86/X86Disassembler.c
index ef29a00..1dcbd81 100644
--- a/arch/X86/X86Disassembler.c
+++ b/arch/X86/X86Disassembler.c
@@ -86,6 +86,29 @@
 {
 	OperandType type = (OperandType)operand->type;
 
+	if (type == TYPE_RELv) {
+		//isBranch = true;
+		//pcrel = insn->startLocation + insn->immediateOffset + insn->immediateSize;
+		switch (insn->displacementSize) {
+			case 1:
+				if (immediate & 0x80)
+					immediate |= ~(0xffull);
+				break;
+			case 2:
+				if (immediate & 0x8000)
+					immediate |= ~(0xffffull);
+				break;
+			case 4:
+				if (immediate & 0x80000000)
+					immediate |= ~(0xffffffffull);
+				break;
+			case 8:
+				break;
+			default:
+				break;
+		}
+	}
+
 	switch (type) {
 		case TYPE_XMM32:
 		case TYPE_XMM64:
diff --git a/tests/test_x86.c b/tests/test_x86.c
index d8ddf9f..9b085bd 100644
--- a/tests/test_x86.c
+++ b/tests/test_x86.c
@@ -108,6 +108,7 @@
 //#define X86_CODE32 "\xb4\xc6"	// mov	ah, 0x6c
 //#define X86_CODE32 "\x77\x04"	// ja +6
 #define X86_CODE64 "\x55\x48\x8b\x05\xb8\x13\x00\x00"
+//#define X86_CODE64 "\xe9\x79\xff\xff\xff"	// jmp 0xf7e
 
 #define X86_CODE16 "\x8d\x4c\x32\x08\x01\xd8\x81\xc6\x34\x12\x00\x00\x05\x23\x01\x00\x00\x36\x8b\x84\x91\x23\x01\x00\x00\x41\x8d\x84\x39\x89\x67\x00\x00\x8d\x87\x89\x67\x00\x00\xb4\xc6"
 //#define X86_CODE16 "\x67\x00\x18"
@@ -117,7 +118,6 @@
 //#define X86_CODE32 "\xd1\xe1"	// shl ecx, 1
 //#define X86_CODE32 "\xd1\xc8"	// ror eax, 1
 //#define X86_CODE32 "\xcd\x80"		// int 0x80
-//#define X86_CODE32 "\x24\xb8"		// int 0x80
 //#define X86_CODE32 "\x83\xC0\x80"	// add	eax, -x80
 //#define X86_CODE32 "\x24\xb8"		// and    $0xb8,%al