Dik za clanek.
Jen se mi nejak nezda to vysvetleni ze zjevne redundantni instrukce ISGT (pokud uz mame ISLT) je tam kvuli NaN.
Asi mi neco unika, ale chcete tim rict x<NaN muze dat jiny vysledek nez Nan>x ?
Ja bych spis chapal kdyby to tam bylo proto ze treba existuje jeste ISLTN ktera muze mit jako posledni argument konstantu a kdyz chteli porovnavat s konstantou obracene tak potrebovali IGSTN. No a ty puvodni instrukce, ktere porovnavaji registry tam daly oboje aby to bylo symetricke....
Rekl bych, ze se tu neco pomichalo.
Mohu vymenit ISLT s ISGE, argumenty neprohodim, ale prohodim true a false vetve kodu. Tady je problem s NaN.
Mohu vymenit ISLT s ISGT (nebo ISLE s ISGE) s prohozenim argumentu. Pak neni problem s NaN, ale muze byt problem s tim, ze jeden argument je 8bitovy a druhy 16bitovy (jestli si predchozi dily pamatuju dobre).
V clanku zminene prohozeni ISLT za ISLE je pak kombinace obou vyse zminenych prohozeni, a tedy trpi problemy obou.
Jde o tuto vlastnost cisel reprezentovanych podle IEEE754 (float/double):
local nan = math.sin(1/0) local x = 42 print(nan) print(nan < x) print(nan <= x) print(nan >= x) print(nan > x) print(nan == x) print(nan ~= x)
Coz by melo vypsat:
nan false false false false false true
Dokonce plati:
local nan = math.sin(1/0) local x = nan print(x, nan) print(nan < x) print(nan <= x) print(nan >= x) print(nan > x) print(nan == x) print(nan ~= x)
nan nan false false false false false true
Takze predpoklad, ze <= a > popr. < a >= da vzdy opacnou booleovskou hodnotu zde neplati. Navic autor LuaJITu chtel zachovat semantiku operaci, tj. kdyz je nekde ve zdrojaku a<=b tak to prelozi (pokud to jde!) jako ISLE, ovsem v pripade konstant to nejde, ty haze na pravou stranu.