Revision 1b9d9ebb
b/target-i386/helper.c | ||
---|---|---|
1879 | 1879 |
|
1880 | 1880 |
eflags = cc_table[CC_OP].compute_all(); |
1881 | 1881 |
d = ldq(a0); |
1882 |
if (d == (((uint64_t)EDX << 32) | EAX)) { |
|
1883 |
stq(a0, ((uint64_t)ECX << 32) | EBX); |
|
1882 |
if (d == (((uint64_t)EDX << 32) | (uint32_t)EAX)) {
|
|
1883 |
stq(a0, ((uint64_t)ECX << 32) | (uint32_t)EBX);
|
|
1884 | 1884 |
eflags |= CC_Z; |
1885 | 1885 |
} else { |
1886 | 1886 |
EDX = (uint32_t)(d >> 32); |
... | ... | |
1890 | 1890 |
CC_SRC = eflags; |
1891 | 1891 |
} |
1892 | 1892 |
|
1893 |
#ifdef TARGET_X86_64 |
|
1894 |
void helper_cmpxchg16b(target_ulong a0) |
|
1895 |
{ |
|
1896 |
uint64_t d0, d1; |
|
1897 |
int eflags; |
|
1898 |
|
|
1899 |
eflags = cc_table[CC_OP].compute_all(); |
|
1900 |
d0 = ldq(a0); |
|
1901 |
d1 = ldq(a0 + 8); |
|
1902 |
if (d0 == EAX && d1 == EDX) { |
|
1903 |
stq(a0, EBX); |
|
1904 |
stq(a0 + 8, ECX); |
|
1905 |
eflags |= CC_Z; |
|
1906 |
} else { |
|
1907 |
EDX = d1; |
|
1908 |
EAX = d0; |
|
1909 |
eflags &= ~CC_Z; |
|
1910 |
} |
|
1911 |
CC_SRC = eflags; |
|
1912 |
} |
|
1913 |
#endif |
|
1914 |
|
|
1893 | 1915 |
void helper_single_step(void) |
1894 | 1916 |
{ |
1895 | 1917 |
env->dr[6] |= 0x4000; |
b/target-i386/helper.h | ||
---|---|---|
75 | 75 |
void helper_rsm(void); |
76 | 76 |
void helper_into(int next_eip_addend); |
77 | 77 |
void helper_cmpxchg8b(target_ulong a0); |
78 |
#ifdef TARGET_X86_64 |
|
79 |
void helper_cmpxchg16b(target_ulong a0); |
|
80 |
#endif |
|
78 | 81 |
void helper_single_step(void); |
79 | 82 |
void helper_cpuid(void); |
80 | 83 |
void helper_rdtsc(void); |
b/target-i386/translate.c | ||
---|---|---|
4333 | 4333 |
mod = (modrm >> 6) & 3; |
4334 | 4334 |
if ((mod == 3) || ((modrm & 0x38) != 0x8)) |
4335 | 4335 |
goto illegal_op; |
4336 |
gen_jmp_im(pc_start - s->cs_base); |
|
4337 |
if (s->cc_op != CC_OP_DYNAMIC) |
|
4338 |
gen_op_set_cc_op(s->cc_op); |
|
4339 |
gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
|
4340 |
tcg_gen_helper_0_1(helper_cmpxchg8b, cpu_A0); |
|
4336 |
#ifdef TARGET_X86_64 |
|
4337 |
if (dflag == 2) { |
|
4338 |
if (!(s->cpuid_ext_features & CPUID_EXT_CX16)) |
|
4339 |
goto illegal_op; |
|
4340 |
gen_jmp_im(pc_start - s->cs_base); |
|
4341 |
if (s->cc_op != CC_OP_DYNAMIC) |
|
4342 |
gen_op_set_cc_op(s->cc_op); |
|
4343 |
gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
|
4344 |
tcg_gen_helper_0_1(helper_cmpxchg16b, cpu_A0); |
|
4345 |
} else |
|
4346 |
#endif |
|
4347 |
{ |
|
4348 |
if (!(s->cpuid_features & CPUID_CX8)) |
|
4349 |
goto illegal_op; |
|
4350 |
gen_jmp_im(pc_start - s->cs_base); |
|
4351 |
if (s->cc_op != CC_OP_DYNAMIC) |
|
4352 |
gen_op_set_cc_op(s->cc_op); |
|
4353 |
gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
|
4354 |
tcg_gen_helper_0_1(helper_cmpxchg8b, cpu_A0); |
|
4355 |
} |
|
4341 | 4356 |
s->cc_op = CC_OP_EFLAGS; |
4342 | 4357 |
break; |
4343 | 4358 |
|
Also available in: Unified diff