On 22/02/20 13:25, Chen Gang wrote: > On 2020/2/22 下午3:37, Paolo Bonzini wrote: >> On 22/02/20 03:10, Chen Gang wrote: >>> Set C1 to 1 if stack overflow occurred; set to 0 otherwise". >>> >>> In helper_fxam_ST0, I guess, we need "env->fpus |= 0x200" (but I don't >>> know wheter it will be conflict with SIGND(temp)). And we have to still >>> need foverflow, because all env->fptags being 0 doesn't mean overflow. >> >> No, you need to add "env->fpus |= 0x200" and "env->fpus &= ~0x200" >> directly to fpush, fpop, etc. >> > > OK. The content below is my next TODO, welcome your opinions. > > When overflow occurs, for me, we need keep everything no touch except > set C1 flag.
No, push will overwrite the top entry if there is overflow. > In fxam, we don't clear C1, but keep no touch for clearning > C1 in another places. FXAM is neither push nor pop, it just detects an empty slot via fptags. FXAM should be okay with my patch. > When underflow occurs, for me, we need keep everything no touch except > set env->fpstt 8, so the next consecutive fpop/f[i]stp* can be checked > easier, and the next fpush/f[i]ld* can work well in normal. > For fxam, we check env->fpstt == 8 and env->fptags for empty. And when > env->fpstt is 8, it need be set 7 before used in fincstp and ffree_STN. I don't think you need env->fpstt to be set to 8 in any case. Also, pop must mark ST(0) as empty always, even if underflow occurs, and also clear C1 if underflow occurs. Paolo