Revision d3c61721
b/target-i386/helper.c | ||
---|---|---|
2915 | 2915 |
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; |
2916 | 2916 |
fptag = 0; |
2917 | 2917 |
for(i = 0; i < 8; i++) { |
2918 |
fptag |= ((!env->fptags[(env->fpstt + i) & 7]) << i);
|
|
2918 |
fptag |= (env->fptags[i] << i);
|
|
2919 | 2919 |
} |
2920 | 2920 |
stw(ptr, env->fpuc); |
2921 | 2921 |
stw(ptr + 2, fpus); |
2922 |
stw(ptr + 4, fptag); |
|
2922 |
stw(ptr + 4, fptag ^ 0xff);
|
|
2923 | 2923 |
|
2924 | 2924 |
addr = ptr + 0x20; |
2925 | 2925 |
for(i = 0;i < 8; i++) { |
... | ... | |
2931 | 2931 |
if (env->cr[4] & CR4_OSFXSR_MASK) { |
2932 | 2932 |
/* XXX: finish it */ |
2933 | 2933 |
stl(ptr + 0x18, env->mxcsr); /* mxcsr */ |
2934 |
stl(ptr + 0x1c, 0); /* mxcsr_mask */ |
|
2934 |
stl(ptr + 0x1c, 0x0000ffff); /* mxcsr_mask */
|
|
2935 | 2935 |
nb_xmm_regs = 8 << data64; |
2936 | 2936 |
addr = ptr + 0xa0; |
2937 | 2937 |
for(i = 0; i < nb_xmm_regs; i++) { |
... | ... | |
2950 | 2950 |
|
2951 | 2951 |
env->fpuc = lduw(ptr); |
2952 | 2952 |
fpus = lduw(ptr + 2); |
2953 |
fptag = ldub(ptr + 4);
|
|
2953 |
fptag = lduw(ptr + 4);
|
|
2954 | 2954 |
env->fpstt = (fpus >> 11) & 7; |
2955 | 2955 |
env->fpus = fpus & ~0x3800; |
2956 | 2956 |
fptag ^= 0xff; |
2957 | 2957 |
for(i = 0;i < 8; i++) { |
2958 |
env->fptags[(env->fpstt + i) & 7] = ((fptag >> i) & 1);
|
|
2958 |
env->fptags[i] = ((fptag >> i) & 1);
|
|
2959 | 2959 |
} |
2960 | 2960 |
|
2961 | 2961 |
addr = ptr + 0x20; |
Also available in: Unified diff