943 |
|
break; |
944 |
|
} |
945 |
|
break; |
946 |
+ |
#if defined(__x86_64__) |
947 |
+ |
case 0x63: // MOVSXD r64, r/m32 |
948 |
+ |
if (has_rex && rex.W) { |
949 |
+ |
transfer_size = SIZE_LONG; |
950 |
+ |
target_size = SIZE_QUAD; |
951 |
+ |
} |
952 |
+ |
else if (transfer_size != SIZE_WORD) { |
953 |
+ |
transfer_size = SIZE_LONG; |
954 |
+ |
target_size = SIZE_QUAD; |
955 |
+ |
} |
956 |
+ |
switch (eip[1] & 0xc0) { |
957 |
+ |
case 0x80: |
958 |
+ |
reg = (eip[1] >> 3) & 7; |
959 |
+ |
transfer_type = SIGSEGV_TRANSFER_LOAD; |
960 |
+ |
break; |
961 |
+ |
case 0x40: |
962 |
+ |
reg = (eip[1] >> 3) & 7; |
963 |
+ |
transfer_type = SIGSEGV_TRANSFER_LOAD; |
964 |
+ |
break; |
965 |
+ |
case 0x00: |
966 |
+ |
reg = (eip[1] >> 3) & 7; |
967 |
+ |
transfer_type = SIGSEGV_TRANSFER_LOAD; |
968 |
+ |
break; |
969 |
+ |
} |
970 |
+ |
len += 2 + ix86_step_over_modrm(eip + 1); |
971 |
+ |
break; |
972 |
+ |
#endif |
973 |
|
case 0x8a: // MOV r8, r/m8 |
974 |
|
transfer_size = SIZE_BYTE; |
975 |
|
case 0x8b: // MOV r32, r/m32 (or 16-bit operation) |
2216 |
|
0x4c, 0x89, 0x18, // mov %r11,(%rax) |
2217 |
|
0x4a, 0x89, 0x0c, 0x10, // mov %rcx,(%rax,%r10,1) |
2218 |
|
0x4e, 0x89, 0x1c, 0x10, // mov %r11,(%rax,%r10,1) |
2219 |
+ |
0x63, 0x47, 0x04, // movslq 4(%rdi),%eax |
2220 |
+ |
0x48, 0x63, 0x47, 0x04, // movslq 4(%rdi),%rax |
2221 |
|
#endif |
2222 |
|
0 // end |
2223 |
|
}; |