Názor k článku Procesory s architekturou RISC v pracovních stanicích a serverech od Pavel Píša - Co se týče celočíselné aritmetiky, tak varianty bez...

  • Článek je starý, nové názory již nelze přidávat.
  • 31. 5. 2011 14:04

    Pavel Píša (neregistrovaný)

    Co se týče celočíselné aritmetiky, tak varianty bez U (add/addi) při přetečení znaménkové aritmetiky ve dvojkovém doplňku (výsled je mimo rozsah -0x80000000,+0­X7FFFFFFF) dojde k vyvolání výjimky. U instrukcí addu a addiu dochází k běžnému tichému přetečení/omezení modulo aritmetiky. Určitou kuriozitou je, že i pro addiu se přímý operand rozšiřuje znaménkově. Jména s U tedy jen vyjadřují vztah k výjimkám a přímo implementace s tímto používáním počítají.

    Zajímavostí je, že se nakonec kvůli přenositelnosti kódu ani v C kompilátoru (GCC) na MIPSu i pro celočíselnou aritmetiku triktně používají variantu s U a zajímavá vlastnost architektury k odhalení runtime chyb s přetečením není využita. Dokonce i při volbě mips-elf-gcc -ftrapv GCC-4.4.4 nevygeneruje místo instrukce add volání __addvsi3, které provádí kontrolu a případně volá abort. Je to docela škoda.

    Co se týče přetékaní ve znaménkové aritmetice, tak norma C přímo říká, že pro signed čísla není chování definované => výjimka by tedy nebyla problém.

    Zajímavé informace o chybách (např. i mylnými předpoklady o přetékání znaménkové aritmetiky) v SW spůsobených v současné době agresivnějšími optimalizacemi v LLVM jsou v článku

    http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_21.html

    Co se týče MIPSu, tak popis jak použít sice starý, ale pro pochopení myšlení autorů nedocenitelný, nástroj MipsIT najdete na stránkách k našemu předmětu

    https://edux.feld.cvut.cz/courses/A0B36APO/tutorials/03/start

    MipsIT je bohužel z Linuxu použitelný jen přes Wine, ale řetezce pro kompilaci kódu spustitelného v MipsIT jsme připravili i pro Linux.