Revision 1b9d9ebb target-i386/helper.c
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; |
Also available in: Unified diff