Любопытные флаги в FPU команд FCOMP и FCOMI
У меня есть вопрос о поведении флагов в fpu после выполнения операции fcomp. У fpu-стека нет переполнений, в обоих фрагментах кода одни и те же значения участвуют в операциях сравнения.
Почему этот код работает:
fldz ;[0]
fadd dword [esp+4] ;[x]
fld1 ;[1][x]
fcomip st0, st1 ;compare 1, x
;[x] because fcomip pops the 1
je xeins ;falls x = 1: special routine
fld1 ;[1][x]
fxch st0, st1 ;[x][1]
fcomi st0, st1 ;compare x, 1
jc xinval ;if x < 1 (carry = 1): special routine
А этот код нет?
fldz ;[0]
fadd dword [esp+4] ;[x]
fld1 ;[1][x]
fcomip st0, st1 ;compare 1, x
;[x] because fcomip pops the 1
je xeins ;if x = 1: special routine
fld1 ;[1][x]
fcomip st0, st1 ;compare x, 1
jc xinval ;if x < 1 (carry = 1): special routine